拓扑排序的思想:
1.选择入度为0的顶点,将其输出
2.将该顶点所有的边全部删除
3.如此重复上述步骤,
如果最后输出的顶点的个数等于图中顶点的个数则该图中没有环,否则该图中有环;
```java
public class Solution {
public boolean canFinish(int numCourses, int[][]prerequisites) {
if (numCourses <= 0) {
return false;
}
int[] in_degree=new int[numCourses];
List<Integer>[] adj=new ArrayList[numCourses];
for(int i=0;i<numCourses;i++){
adj[i]=new ArrayList<>();
}
for(int i=0;i<prerequisites.length;i++){
in_degree[prerequisites[i][0]]++;
adj[prerequisites[i][1]].add(prerequisites[i][0]);
}
//维护一个入度为0的队列;
Queue<Integer> q=new LinkedList<>();
for(int i=0;i<numCourses;i++){
if(in_degree[i]==0)
q.add(i);
}
int count=0;
while(!q.isEmpty()){
Integer top=q.poll();
count++;
//每次将入度为0的节点出队时,同时将该节点对应的所有的节点的入度都减1
for(int i=0;i<adj[top].size();i++){
in_degree[adj[top].get(i)]--;
if(in_degree[adj[top].get(i)]==0)
{ //如果入度为0的时候就将其也入队
q.add(adj[top].get(i));
}
}
}
//最后判断得到的节点的个数是否等于课程数;
//如果等于的话则表明该图无环
if(count==numCourses)
return true;
else{
return false;
}
}}