There are a total of n courses you have to take, labeled from 0 to n - 1.
Some courses may have prerequisites, for example to take course 0 you have to
first take course 1, which is expressed as a pair: [0,1]
Given the total number of courses and a list of prerequisite pairs, is it possible for
you to finish all courses?
For example:
2, [[1,0]]There are a total of 2 courses to take. To take course 1 you should have finished
course 0. So it is possible.
2, [[1,0],[0,1]]There are a total of 2 courses to take. To take course 1 you should have finished
course 0, and to take course 0 you should also have finished course 1. So it is impossible.
图有两种表示方法,邻接表和邻接矩阵。但这个题只要使用BFS简单处理即可。
找到所有没有先修课程的节点放入队列。数组中存放所有课程,如果课程是先修课程,
就+1。然后使用队列BFS遍历。队列中的课程有先修,则数组中对于的课程-1;如果
此时课程为0,则count+1,最后返回count==numCourses。
这个过程实际上是判断图中是否存在环。
public boolean canFinish(int numCourses, int[][] prerequisites) {
if(prerequisites == null)
throw new IllegalArgumentException("illegal prerequisites array");
int len = prerequisites.length;
if(numCourses == 0 || len == 0)
return true;
// counter for number of prerequisites
int[] pCounter = new int[numCourses];
for(int i=0; i<len; i++)
pCounter[prerequisites[i][0]]++;
//store courses that have no prerequisites
LinkedList<Integer> queue = new LinkedList<Integer>();
for(int i=0; i<numCourses; i++){
if(pCounter[i]==0)
queue.add(i);
}
// number of courses that have no prerequisites
int numNoPre = queue.size();
while(!queue.isEmpty()){
int top = queue.remove();
for(int i=0; i<len; i++){
// if a course's prerequisite can be satisfied by a course in queue
if(prerequisites[i][1]==top){
pCounter[prerequisites[i][0]]--;
if(pCounter[prerequisites[i][0]]==0){
numNoPre++;
queue.add(prerequisites[i][0]);
}
}
}
}
return numNoPre == numCourses;
}