1.定义

有向图是一副具有方向性的图,是由一组顶点和一组有方向的边组成的,每条方向的边都连着一对有序的顶点。

术语:

出度:
由某个顶点指出的边的个数称为该顶点的出度。
入度:
指向某个顶点的边的个数称为该顶点的入度。
有向路径:
由一系列顶点组成,对于其中的每个顶点都存在一条有向边,从它指向序列中的下一个顶点。
有向环:
一条至少含有一条边,且起点和终点相同的有向路径。
image.png

代码实现:

  1. package 图;
  2. import 线性表.Queue;
  3. public class Digraph {
  4. //顶点数目
  5. private final int V;
  6. //边的数目
  7. private int E;
  8. //邻接表
  9. private Queue<Integer>[] adj;
  10. public Digraph(int V) {
  11. //初始化顶点数量
  12. this.V = V;
  13. //初始化边的数量
  14. this.E = 0;
  15. //初始化邻接表
  16. this.adj = new Queue[V];
  17. //初始化邻接表中的空队列
  18. for (int i = 0; i < adj.length; i++) {
  19. adj[i] = new Queue<Integer>();
  20. }
  21. }
  22. //获取顶点数目
  23. public int V() {
  24. return V;
  25. }
  26. //获取边的数目
  27. public int E() {
  28. return E;
  29. }
  30. //向有向图中添加一条边 v->w
  31. public void addEdge(int v, int w) {
  32. //由于有向图中边是有向的,v->w 边,只需要让w出现在v的邻接表中,而不需要让v出现在w的邻接表中
  33. adj[v].enqueue(w);
  34. //边的数目自增1
  35. E++;
  36. }
  37. //获取由v指出的边所连接的所有顶点
  38. public Queue<Integer> adj(int v) {
  39. return adj[v];
  40. }
  41. //该图的反向图
  42. private Digraph reverse() {
  43. //创建新的有向图对象
  44. Digraph r = new Digraph(V);
  45. //遍历0~V-1所有顶点,拿到每一个顶点v
  46. for (int v = 0; v < V; v++) {
  47. //得到原图中的v顶点对应的邻接表,原图中的边为 v->w,则反向图中边为w->v;
  48. for (Integer w : adj(v)) {
  49. r.addEdge(w, v);
  50. }
  51. }
  52. return r;
  53. }
  54. }