我们主要讨论一下方面:
1.有向图的表示
有向图的可达性有向图的路径
2.
判断有向图中是否有环
拓扑排序,优先级限制下的调度问题
3.
有向图的强连通性
有向图的表示
和无向图中的一样,我们也采用邻接表矩阵的方式来表示有向图。只需要修改addEdge方法,只增加一条边,而不是增加双向边就可以了。
public class DiGraph {
private int V; // 节点数
private int E; // 边的数目
private List<Integer>[] adj; // 邻接表矩阵
public DiGraph(int V) { // 创建节点个数为V的没有边的有向图
this.V = V;
this.E = 0;
adj = (List<Integer>[])new List[V];
for (int i = 0; i < V; i++) {
adj[i] = new ArrayList<Integer>();
}
}
public void addEdge(int v, int w) { // 在有向图中增加边v->w
adj[v].add(w);
E++;
}
public List<Integer> adj(int v) { // 返回v节点的相邻节点
return adj[v];
}
public int V() { // 返回节点数
return V;
}
public int E() { // 返回边的数目
return E;
}
public String toString() { // 打印图
String s = V + " 个顶点, " + E + " 条边\n";
for (int i = 0; i < V; i++) {
s += i + ": ";
for (Integer node : adj(i)) {
s += node + " ";
}
s += "\n";
}
return s;
}
public DiGraph reverse() {
DiGraph g = new DiGraph(V);
for (int i = 0; i < V; i++) {
for (Integer node : adj[i]) {
g.addEdge(node, i);
}
}
return g;
}
}
我们在其中增加了reverse方法,获得当前表的反向表,即将所有边的方向反向,例如v->w变成w-v。
有向图的路径和可达性
这个也和无向图中的一样,只需要将图的类改成DiGraph就可以直接使用了。
有向图在许多应用中发挥重要的作用,一个典型的应用就是任务调度。
有向图的一个节点就代表着一个任务,有向图的边代表着优先级,例如v-&g