有向无环图(DAG)才有拓扑排序。

(1)从拓扑图中找到一个入度为0的点

(2)删除入度为0的点及与其相关联的边(相对应的边的另一端的点的入度会减一)

(3)在删边过程中遇到入度为0的点就加入队列

(4)重复上述操作,直到所有的点入度均变为0

 1 int[] TopologicalSort(List<int>[] edge)
 2 {
 3     int n = edge.Length;
 4     // 每个节点的入度.
 5     int[] inArr = new int[n];
 6     for (int i = 0; i < n; i++)
 7     {
 8         for (int j = 0; j < edge[i].Count; j++)
 9         {
10             inArr[edge[i][j]]++;
11         }
12     }
13     Queue<int> queue = new Queue<int>();
14     for(int i = 0;i < n; i++)
15     {
16         if(inArr[i] == 0)
17             queue.Enqueue(i); // 入度为0的点入队.
18     }
19     List<int> ans = new List<int>();
20     while (queue.Count > 0)
21     {
22         int p = queue.Dequeue();// 选一个入度为0的点出队列.
23         ans.Add(p);
24         for (int i = 0; i < edge[p].Count; i++)
25         {
26             int y = edge[p][i];
27             inArr[y]--; //入度减1
28             if (inArr[y] == 0)
29             {
30                 queue.Enqueue(y);
31             }
32         }
33     }
34     if (ans.Count == n)
35     {
36         // 拓扑排序完成.
37         return ans.ToArray();
38     }
39     else
40     {
41         // 无法拓扑排序.
42         throw new Exception("无法进行拓扑排序");
43     }
44 }