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数据类型

  1. import edu.princeton.cs.algs4.In;
  2. public class Digraph {
  3. private final int V;//点集
  4. private int E;//有向边集
  5. private Bag<Integer>[] adj;
  6. public Digraph(int V) {
  7. this.V = V;
  8. E = 0;
  9. adj = (Bag<Integer>[]) new Bag[V];
  10. for (int i = 0; i < V; i++)
  11. adj[i] = new Bag<>();
  12. }
  13. public Digraph(In in){
  14. this(in.readInt());
  15. int E = in.readInt();
  16. for (int i = 0; i < E; i++){
  17. int v = in.readInt();
  18. int w = in.readInt();
  19. addEdge(v, w);
  20. }
  21. }
  22. public int V() { return V; }
  23. public int E() { return E; }
  24. public void addEdge(int v, int w) {
  25. adj[v].add(w);
  26. E++;
  27. }
  28. public Iterable<Integer> adj(int v) { return adj[v]; }//返回V指向所有结点
  29. public Digraph reverse() {
  30. Digraph R = new Digraph(V);
  31. for (int v = 0; v < V; v++)
  32. for (int w : adj(v))
  33. R.addEdge(w, v);
  34. return R;
  35. }
  36. }

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 |