4.2 有向图
定义:边是单向的,每条边连接的两个顶点是一个有序对,邻接性也是单向的
4.2.1 术语表
- 有向路径
- 有向环
4.2.2 有向图API:public class Digraph
| 返回类型 | 方法 | 描述 |
|---|---|---|
| Digraph(int V) | 创建V个顶点的无边有向图 | |
| Digraph(In in) | 从标准输入in读入一幅有向图 | |
| int | V() | 顶点数 |
| int | E() | 边数 |
| void | addEdge(int v, int w) | 添加边v->w |
| Iterable | adj(int v) | v指向的所有顶点 |
| Digraph | reverse() | 该图的反向图 |
| String | toString() | 对象的字符串表示 |
4.2.2.1 有向图的表示:邻接表
Digraph数据类型
import edu.princeton.cs.algs4.In;public class Digraph {private final int V;//点集private int E;//有向边集private Bag<Integer>[] adj;public Digraph(int V) {this.V = V;E = 0;adj = (Bag<Integer>[]) new Bag[V];for (int i = 0; i < V; i++)adj[i] = new Bag<>();}public Digraph(In in){this(in.readInt());int E = in.readInt();for (int i = 0; i < E; i++){int v = in.readInt();int w = in.readInt();addEdge(v, w);}}public int V() { return V; }public int E() { return E; }public void addEdge(int v, int w) {adj[v].add(w);E++;}public Iterable<Integer> adj(int v) { return adj[v]; }//返回V指向所有结点public Digraph reverse() {Digraph R = new Digraph(V);for (int v = 0; v < V; v++)for (int w : adj(v))R.addEdge(w, v);return R;}}
4.2.3 有向图中的可达性(算法4.4)
4.2.4 环和有向无环图(算法4.5)
4.2.5 有向图的强连通性(算法4.6)
4.2.6 总结
- 4.2中接触到的各种有向图算法只有一种非基于DFS | 问题 | 解决方法 | 参考 | | :—-: | :—-: | :—-: | | 单点/多点可达性 | DirectedDFS | 算法4.4 | | 单点有向路径 | DepthFirstDirectedPaths | 算法4.1(换名) | | 单点最短有向路径 | BreadthFirstDirectedPath | 算法4.2(换名) | | 有向环检测 | DirectedCycle | 算法4.5 | | 深度优先顶点排序 | DirectedFirstOrder | 算法4.5 | | 优先级调度问题 | Topological | 算法4.5 | | 拓扑排序 | Topological | 算法4.5 | | 强连通性 | KosarajuSCC | 算法4.6 | | 顶点对可达性 | TransitiveClosure | 算法4.6 |
