深度优先遍历,拓扑排序
class Solution {
List<List<Integer>> edges;//
int[] visited;记录课程的访问状态(0表示未访问,1表示正在访问,2表示已完成访问)
boolean valid=true;
public boolean canFinish(int numCourses, int[][] prerequisites) {
edges=new ArrayList<List<Integer>>();
for(int i=0;i<numCourses;++i){
edges.add(new ArrayList<Integer>());//创建邻接表
}
visited=new int[numCourses];
for(int[] info:prerequisites){
edges.get(info[1]).add(info[0]);//这里先搜寻课程需求【a,b】后一门课b,添加前一门课a
}
for(int i=0;i<numCourses&&valid;++i){//这里&&valid是做一个判断,如果valid是false,则当前搜索点为环状图,直接终止循环
if(visited[i]==0){
dfs(i);
}
}
return valid;
}
public void dfs(int u){
visited[u]=1;//将u节点设置为正在访问
for(int v:edges.get(u)){
if(visited[v]==0){
dfs(v);
if(!valid){
return;
}
}else if(visited[v]==1){
valid=false;//发现当前节点的邻接节点 v 在当前路径中正在被访问(访问状态为 1)时,判断存在环,然后提前终止当前的深度优先搜索(DFS)过程。
return;
}
}
visited[u]=2;
}
}