代碼來源: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