代码来源:https://leetcode.com/problems/course-schedule/discuss/58524/Java-DFS-and-BFS-solution (我以为写的很完美,直接搬来用了)java
既能够按照“入度”的方式进行拓扑排序,也能够按照“出度”的方式进行排序 出度:数组
public boolean canFinish(int numCourses, int[][] prerequisites) { ArrayList<Integer>[] graph = new ArrayList[numCourses]; int[] degree = new int[numCourses]; Queue<Integer> queue = new LinkedList<>(); ArrayList<Integer> order = new ArrayList<>(); int count = 0; for (int i = 0; i < numCourses; i++) { graph[i] = new ArrayList<>(); } for (int i = 0; i < prerequisites.length; i++) { degree[prerequisites[i][1]]++; graph[prerequisites[i][0]].add(prerequisites[i][1]); } for (int i = 0; i < degree.length; i++) { if (degree[i] == 0) { order.add(i); queue.add(i); count++; } } while (queue.size() != 0) { int course = queue.poll(); ArrayList<Integer> list = graph[course]; for (int i = 0; i < list.size(); i++) { int pointer = list.get(i); degree[pointer]--; if (degree[pointer] == 0) { order.add(pointer); queue.add(pointer); count++; } } } if (count == numCourses) return true; return false; }
入度的话,将ui
degree[prerequisites[i][1]]++; graph[prerequisites[i][0]].add(prerequisites[i][1]);
改成.net
degree[prerequisites[i][0]]++; graph[prerequisites[i][1]].add(prerequisites[i][0]);
对于Course Schedule 2code
只要用数组保存每次 degree[i]=0 时的课程序号就获得了课程的前后顺序blog
可是注意,使用 出度 排序的时候,课程顺序是逆的,须要咱们额外的逆转数组排序
使用 入度 排序的时候,课程顺序恰好是正的leetcode
相关连接: 深刻理解拓扑排序(Topological sort) 拓扑排序入门get