题目链接:LeeCode207课程表
题目描述:
这道题就是拓扑排序模板题,不用多说,如果不知道什么叫拓扑排序可以看拓扑排序这篇文章。
class Solution {
public static boolean canFinish(int numCourses, int[][] prerequisites) {
if(prerequisites.length==0||prerequisites.length==1)return true;
int[][] edges=new int[numCourses][numCourses];
int[] indegree=new int[numCourses];
Queue<Integer> queue=new LinkedList();
List<Integer> list=new ArrayList<>();
for (int i = 0; i < prerequisites.length; i++) {
//根据题意存成图应该是后面的指向前面的
edges[prerequisites[i][1]][prerequisites[i][0]]=1;
//求入度
indegree[prerequisites[i][0]]++;
}
for (int i = 0; i < numCourses; i++) {
//将入度是0的放入队列
if(indegree[i]==0)queue.offer(i);
}
while(!queue.isEmpty()){
int poll = queue.poll();
list.add(poll);
//每次删掉一个节点之后判断有没有点的入度变成了0
for (int i = 0; i < numCourses; i++) {
if(edges[poll][i]==1){
indegree[i]--;
//如果有那么入队
if(indegree[i]==0){
queue.offer(i);
}
}
}
}
if(list.size()==numCourses)return true;
return false;
}
}