怀疑如何用邻接列表表示图形

时间:2014-07-30 17:10:32

标签: java graph adjacency-list

我必须编写一个实现以下接口的类:

public interface Graph<V> {
    /**
     * Adds vertex to the graph.
     */
    boolean addVertex(V vertex);

    /**
     * Adds the edge (vertex1, vertex2) to the graph.
     */
    boolean addEdge(V vertex1, V vertex2);

    /**
     * Return true if graph contains vertex.
     */ 
    boolean hasVertex(V vertex);

    /**
     * Return true if graph contains the edge (vertex1, vertex2).
     */
    boolean hasEdge(V vertex1, V vertex2);

    /** 
     * Returns the line of vertices of the graph.
     */
    ArrayList<V> vertices();

    /** 
     * Returns the line adjacency of vertex.
     */
    ArrayList<V> neighbors(V vertex);
}

所以我必须创建一个类,允许您使用adjacency-list创建和编辑有向加权的图形。

我的问题是我不知道如何开始。 我以为我会用这种方式创建一个Edge类:

public class Edge { 

    public V v1; //first node
    public V v2; //second node
    public int weight; //edge's weight

    public Edge() {
        v1 = "";
        v2 = "";
        peso = 0;
    }

    public Edge(V v1, V v2, int weight) {
        this.v1 = v1;
        this.v2 = v2;
        this.weight = weight;
    }   

}

然后我开始编写一个实现SparseGraph Graph的类:

public class SparseGraph<V> implements Graph<V> {

    public List<V> vertices = new ArrayList<V>(); //contains all the vertices (nodes)
    public List<???> neighbors = new ArrayList<???>(); //adjacency lists

    public SparseGraph<V>() {
        //empty
    } 

    public boolean addVertex(V vertex) {
        return true;
    }

    public boolean addEdge(V vertex1, V vertex2) {
        return true;
    }

    public boolean hasVertex(V vertex) {
        return true;
    }

    public boolean hasEdge(V vertex1, V vertex2) {
        return true;
    }

    public ArrayList<V> vertices() {
        return null;
    }

    public ArrayList<V> neighbors(V vertex) {
        return null;
    }

}

如何表示数据类型节点?交付说:&#34; 图表必须在通用类型V &#34;的节点上定义。 所以我创建了一个单独的Vertex类。但是现在如何创建一个节点包含(例如)数字的图形? 也就是说,我希望我能给图表的节点一个标识符。 我在编写测试时这样写:

SparseGraph<Integer> g = new SparseGraph<Integer>(); 

我错了吗? 现在我如何表示邻接列表?

我非常困惑......

感谢任何想要帮助我的人! PS:我不想要方法的代码,我只想提供一些关于如何创建邻接列表的建议..并且想知道代码的其余部分是否正确.. Edge类可能以这种方式完成工作吗? SparseGraph类?

谢谢

1 个答案:

答案 0 :(得分:0)

您通过以下方式实例化特定顶点类型的图表是正确的:

SparseGraph<Integer> g = new SparseGraph<Integer>();

您的Edge类还应包含泛型类型参数V,因为它引用它。

public class Edge<V> ...

最后,图表应该包含所有边缘的列表。 它可以存储在列表中:

public List<Edge<V>> neighbors = new ArrayList<Edge<V>>(); 

但是,您可能希望维护其他数据结构,以便有效地实施neighborshasEdge方法。 例如,您可以使用一个Map,其键在Vertex(V)中,其值是在该顶点中开始或结束的所有边的Set。