拓撲排序

所謂的拓撲排序中的「排序」,並非是由小到大或由大到小。而是誰先誰後,是先後的問題。

無向圖

分支度

有向圖

出分支度

入分支度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.util.Arrays;
import java.util.LinkedList;

public class Topology {
  private int[][] matrix;
  private int vertexLen = 3;
  private int[] degree;
  private boolean[] visted;

  public Topology() {
    matrix = new int[vertexLen][vertexLen];
    matrix[0] = new int[]{0, 1, 0};
    matrix[1] = new int[]{1, 0, 1};
    matrix[2] = new int[]{0, 1, 0};
    degree = new int[vertexLen];
    visted = new boolean[vertexLen];
    for (int i = 0; i < vertexLen; i++) {
      for (int j = 0; j < vertexLen; j++) {
        if (matrix[i][j] == 1) {
          degree[i]++;
        }
      }
    }
    System.out.println(Arrays.toString(degree));
  }

  public boolean checkCircle() {
    LinkedList<Integer> queue = new LinkedList<Integer>();
    int cnt = 0;
    for (int i = 0; i < degree.length; i++) {
      if (!visted[i] && degree[i] == 1) {
        queue.add(i);
        visted[i] = true;
        cnt++;
      }
    }
    while (!queue.isEmpty()) {
      int vertex = queue.poll();
      degree[vertex]--;
      for (int j = 0; j < vertexLen; j++) {
        if (!visted[j] && matrix[vertex][j] == 1) {
          degree[j]--;
          if (degree[j] == 1) {
            queue.add(j);
            visted[j] = true;
            cnt++;
          }
        }
      }
    }
    return cnt != vertexLen;
  }

  public static void main(String[] args) {
    Topology topology = new Topology();
    boolean hasCircle = topology.checkCircle();
    System.out.println(hasCircle);
  }
}

results matching ""

    No results matching ""