有向无环图(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 }
浙公网安备 33010602011771号