我必须编写一个实现以下接口的类:
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类?
谢谢
答案 0 :(得分:0)
您通过以下方式实例化特定顶点类型的图表是正确的:
SparseGraph<Integer> g = new SparseGraph<Integer>();
您的Edge
类还应包含泛型类型参数V,因为它引用它。
public class Edge<V> ...
最后,图表应该包含所有边缘的列表。 它可以存储在列表中:
public List<Edge<V>> neighbors = new ArrayList<Edge<V>>();
但是,您可能希望维护其他数据结构,以便有效地实施neighbors
和hasEdge
方法。
例如,您可以使用一个Map,其键在Vertex(V)中,其值是在该顶点中开始或结束的所有边的Set。