拓扑排序
拓扑排序(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]; }
|