解题思路
利用图的入度这一特性,进行bfs
如果一门课程入度为0,那么说明这门课程可以学习了,因此每一轮都将所有可以学习的课程学习完,并将对应的后置课程入度-1,如此即可
代码
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
int[][] edge = new int[numCourses][numCourses];//构造邻接矩阵
int[] entry = new int[numCourses];//入度记录
for(int i=0;i<prerequisites.length;i++){
int[] tem = prerequisites[i];
edge[tem[1]][tem[0]]=1;
entry[tem[0]]++;//记录入度
}
boolean[] visited = new boolean[numCourses];//标记当前课程是否被加入过队列
LinkedList<Integer> queue = new LinkedList<>();
for(int i=0;i<entry.length;i++){//找到当前所有入度为0的课程,加入队列
if(entry[i]==0){
visited[i]=true;
queue.add(i);
}
}
while(!queue.isEmpty()){
int n = queue.size();
while(n!=0){//每次将当前入度为0的课程学习完
int cur = queue.getFirst();//当前需要学习的课程
queue.removeFirst();
int[] tem = edge[cur];//找到当前课程的后置课程
for(int i=0;i<tem.length;i++){
if(tem[i]==1){//当前课程为第i们课程的前置课程
entry[i]--;//当前课程的后置课程入度--
if(entry[i]==0 && !visited[i]){//课程入度为0,可以学习
visited[i]=true;
queue.add(i);
}
}
}
n--;
}
}
for(int i=0;i<entry.length;i++){
if(entry[i]!=0){//存在环,依然有入度不为0的课程存在
return false;
}
}
return true;
}
}