我们主要讨论一下方面:
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->w,说明v的优先级比w高。

本文介绍了有向图的概念及其表示方法,通过邻接表矩阵展示有向图,并探讨了有向图在任务调度中的应用。接着详细阐述了拓扑排序的原理和实现,包括如何判断有向图是否存在环。此外,文章还讲解了有向图的强连通分量,提出了kosaraju算法来找出强连通分量。最后指出,有向图的最短路径问题可以使用广搜解决,与无向图的处理方式类似。
最低0.47元/天 解锁文章
6351

被折叠的 条评论
为什么被折叠?



