207. Course Schedule
拓扑排序,算法如下:
1 L -> 排好序的点 2 S -> 所有没有incoming的点 3 当S不为空时: 4 从S中拿出一个点n 5 把n加入L 6 对于每个由n->m得到节点m: 7 把这条边从图里删除 8 如果m也没有incoming的边了 9 把m加入S 10 如果图中仍然有边 11 返回error(图中至少有一个环) 12 否则 13 返回L
1 public boolean canFinish(int numCourses, int[][] prerequisites) { 2 if(numCourses < 1) { 3 return false; 4 } 5 int len = prerequisites.length; 6 int[] indegree = new int[numCourses]; 7 Queue<Integer> queue = new LinkedList<Integer>(); 8 List<Integer> results = new ArrayList<Integer>(); 9 for(int i = 0; i < len; i++) { 10 indegree[prerequisites[i][1]]++; 11 } 12 for(int i = 0; i < numCourses; i++) { 13 if(indegree[i] == 0) { 14 queue.offer(i); 15 } 16 } 17 while(!queue.isEmpty()) { 18 int cur = queue.poll(); 19 results.add(cur); 20 for(int i = 0; i < len; i++) { 21 if(prerequisites[i][0] == cur) { 22 int node = prerequisites[i][1]; 23 indegree[node]--; 24 if(indegree[node] == 0) { 25 queue.offer(node); 26 } 27 } 28 } 29 } 30 for(int i = 0; i < numCourses; i++) { 31 if(indegree[i] != 0) { 32 return false; 33 } 34 } 35 return true; 36 }