kahn实现
- 采用入度,以循环迭代方式实现
算法逻辑
- 使用队列记录indegree为0的节点
- 依次出队,遍历更新其outdegree节点,若其indegree为0,则入队
- 最后,若存在环,则idx < n
int[] topoSort(int n, int[][] edges) {
List<List<Integer>> graph = new ArrayList<>();
for(int i = 0;i < n;i++) {
graph.add(new ArrayList<>());
}
int[] indegree = new int[n];
for(int[] e : edges) {
graph.get(e[0]).add(e[1]);
indegree[e[1]]++;
}
Queue<Integer> q = new ArrayDeque<>();
for(int i = 0;i < n;i++) {
if(indegree[i] == 0) q.offer(i);
}
int[] ans = new int[n];
int idx = 0;
while(!q.isEmpty()) {
int c = q.poll();
ans[idx++] = c;
for(int next : graph.get(c)) {
indegree[next]--;
if(indegree[next] == 0) q.offer(next);
}
}
if(idx < n) return new int[]{};
return ans;
}dfs实现(未学)
- 采用出度,以递归实现
转载请注明出处