0%

拓扑排序

拓扑排序

拓扑排序(Topological Order):将一个有向无环图(Directed Acyclic Graph, DAG)进行排序以得到一个有序线性序列,使得如果图中存在一条从A到B的路径,那么该序列中A出现在B的前面。

基于BFS的拓扑排序(入度)

在构建图的过程中统计每个节点的入度,维护一个入度为0的队列,每次选择一个入度为0的节点,将它指向的节点入度减1,重复该过程,直到没有入度为0的节点。

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
public int[] findOrder(int num, int[][] pre) {
if(num <= 0 || pre == null) return null;
int[] indegree = new int[num];
Deque<Integer> que = new ArrayDeque<Integer>();
List<List> graph = new ArrayList<>();
for(int i = 0; i < num; ++i)
graph.add(new ArrayList<Integer>());
for(int i = 0; i < pre.length; ++i) {
graph.get(pre[i][1]).add(pre[i][0]);
indegree[pre[i][0]]++;
}
for(int i = 0; i < num; ++i)
if(indegree[i] == 0)
que.add(i);
int[] result = new int[num];
int i = 0;
while(!que.isEmpty()) {
int zero = que.remove();
result[i++] = zero;
for(int j = 0; j < graph.get(zero).size(); ++j) {
int nei = (int)graph.get(zero).get(j);
indegree[nei]--;
if(indegree[nei] == 0)
que.add(nei);
}
}
if(i == num) return result;
else return new int[0];
}