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     }

 

posted @ 2016-07-22 01:20  warmland  阅读(110)  评论(0编辑  收藏  举报