public class Graph Graph(int V) 创建一个含有V个顶点但不含有边的图 int V() 顶点数 int E() 边数 void addEdge(int v,int w) 向图中添加一条边v--w Iterable<Integer> adj(int v) 和v相邻的所有顶点 String toString() 对象的字符串表示
典型Graph实现的性能复杂度
数据结构 | 所需空间 | 添加一条边 | 检查v、w是否相邻 | 遍历v所有相邻顶点 |
---|---|---|---|---|
边的列表 | E | 1 | E | E |
邻接矩阵 | V^2 | 1 | 1 | V |
邻接表 | E+V | 1 | degree(V) | degree(V) |
邻接集 | E+V | logV | logV | logV+degree(V) |
public class Graph {
private int V;//顶点数
private int E;//边数
private Bag<Integer>[] adj;//邻接表
public Graph(int V) {
this.V = V;
adj = (Bag<Integer>[]) new Bag[V];
for(int i=0;i<adj.length;i++) {
adj[i] = new Bag<Integer>();
}
}
public int V() {return V;}
public int E() {return E;}
public void addEdge(int v,int w) {
adj[v].add(w);
adj[w].add(v);
E++;
}
public Iterable<Integer> adj(int v){return adj[v];}
}
一般我们会将数据结构和基于数据结构的算法分离。为此,我们会为相关的任务创建相关的类,然后采用组合的方式,在算法类中组合使用数据结构类。在接下来的深度优先遍历和广度优先遍历中可以看到相关实现。