Java Graph着色程序

时间:2015-11-10 18:20:16

标签: java graph colors edge vertex

我被要求创建一个Java程序,其中我首先接受预定义数量的顶点,然后接受图中存在的所有边数作为数字对。 我的代码应该接受边缘,创建“图形”并为所有顶点着色。 我的问题是着色。方法'setColor'应该在每次调用时接受图形的程度。 getBiggestVertex方法应该返回要着色的顶点。然后它被着色。 然而,出于某种原因,当我显示顶点的颜色时,我总是得到0或1或-1。

我无法弄清楚为什么我会得到这个输出,有人可以帮忙吗?

谢谢

图表类:

import java.util.ArrayList;
import java.util.Scanner;


public class Graph {
    ArrayList <Vertex> vertices = new ArrayList<Vertex>();
    public Graph(){
        Scanner sc = new Scanner(System.in);
        int noOfVertices = sc.nextInt();

        for(int i = 0; i <noOfVertices; i++){
            addVertex();
        }

        String input = sc.next();

        while(!input.equals("-1")){
            String vertex [] = input.split(",");
            addEdge(vertices.get(Integer.parseInt(vertex[0])), vertices.get(Integer.parseInt(vertex[1])));
            input = sc.next();
        }
        for(int i = 0; i<vertices.size(); i++){
            getBiggestVertex().setColor(vertices.size());
        }
    }

    public Vertex getBiggestVertex(){
        Vertex bVertex = new Vertex(-1);
            for(int i = 0; i < vertices.size(); i++){
                Vertex v = vertices.get(i);
                if(v.colour ==-1){
                    if(v.getDegree() > bVertex.getDegree()){
                        bVertex = v;
                    } else if(v.getDegree() == bVertex.getDegree()){
                        if(v.vertexNumber < bVertex.vertexNumber){
                            bVertex = v;
                        }
                    } else if(v.getDegree() < bVertex.getDegree()){

                    }
                }
            }
        return bVertex;
    }
    public void addVertex(){
        vertices.add(new Vertex(vertices.size()));
    }

    public Vertex getVertex(int index){
        return vertices.get(index); 
    }

    public void addEdge(Vertex v1, Vertex v2){
        v1.addAdjacency(v2);
        v2.addAdjacency(v1);
    }

}

顶点类:

    import java.util.LinkedList;


public class Vertex {
    int vertexNumber, colour;
    LinkedList <Vertex> adjacencies = new LinkedList<Vertex>();
    public Vertex(int vertexNum){
        vertexNumber = vertexNum;
        colour = -1;
    }
    public void addAdjacency(Vertex v){
        adjacencies.add(v);
    }
    public boolean isAdjacent(Vertex v){
        boolean adj = false;
        for(int i = 0; i < adjacencies.size(); i++){
            if(adjacencies.get(i) == v){
                adj = true;
            }
        }
        return adj;
    }
    public int getDegree(){
        return adjacencies.size();
    }
    public void setColor(int degree){
        int [] used = new int[degree];
        for(int i = 0; i < adjacencies.size(); i++){
            int c = adjacencies.get(i).colour;
            System.out.println("Color of " + i + " = " + c);
            used[c+1] = 1;

        }
        int unusedColor = 0;
        while(used[unusedColor] == 1){
            unusedColor ++;
        }
        colour = unusedColor;
    }
}

1 个答案:

答案 0 :(得分:0)

我假设-1表示尚未定义的顶点颜色。

您的代码存在一些问题,其中大部分都以setColor方法为中心:

检查相邻顶点的颜色时,颜色代码的范围会移1,以作为使用标记数组used的索引。但是,在访问过所有邻居之后,您测试的第一种颜色是0

此过程为仅具有1的未着色邻居的顶点着色。 如果所有邻居都已着色,则指定的颜色将为0

此外,在getBiggestVertex中,当没有指定颜色的所有剩余顶点都具有outdegree 0((v.vertexNumber < bVertex.vertexNumber)初始化为最小顶点时,条件bVertex将永远不会触发outdegree为0的顶点数字-1,永远不会被重新分配。

这尤其意味着您可以生成相同颜色的顶点路径。值得注意的是,下面的图表将被赋予无效的颜色:

 4,5
 4,6
 4,7
 4,3
 3,8
 3,9
 3,2
 2,10
 2,1
 9,2

导致着色

 c(1)   = -1
 c(2)   = 1
 c(3)   = 1
 c(4)   = 1
 c(5)   = -1
 c(6)   = -1
 c(7)   = -1
 c(8)   = -1
 c(9)   = 0
 c(10)  = -1
 c(11)  = -1

其中节点3需要新颜色2-1是无效颜色(当然,事后可将其解释为有效)。

通过

整理代码
  • 维护双向邻接(因此a,b表示ab相邻,反之亦然)
  • 撰写used[c]而不是used[c+1]

或检查前任顶点的颜色。

除了有缺陷的颜色分配外,请考虑以下建议以改进您的代码:

  • 最大度是图的属性,因此应该是图类的属性。因此,您不需要为used中的setColor数组分配当前顶点数的最坏情况 - 1。

  • 图表中程度最高的节点不需要在每次使用时从头开始重新计算,但也可以是图表类的属性

  • 将上一个建议更进一步,您可以在存储此列表的着色过程之前通过降低度来对图形的顶点进行排序。应该让您免于重复调用getBiggestVertex,您可以按照列表中显示的顺序访问节点。