package leetcode;
import java.util.ArrayList;
import java.util.List;
public class demo_207 {
int[] visited;
List<ArrayList<Integer>> array;
//表示是否能够完成
boolean isvalid=true;
public boolean canFinish(int numCourses, int[][] prerequisites) {
visited=new int[numCourses];
array=new ArrayList<ArrayList<Integer>>();
//创建一个拓扑图的邻接表
for(int i=0;i<numCourses;i++) {
array.add(new ArrayList<Integer>());
}
//nums[1]必须在nums[0]之前,所以是nums[1]指向nums[0]
for(int[] nums:prerequisites) {
array.get(nums[1]).add(nums[0]);
}
for(int i=0;i<numCourses;i++) {
//为0表示当前节点还未被访问过
if(visited[i]==0) {
dfs(i);
}
}
return isvalid;
}
public void dfs(int v) {
//为1表示当前值正在被访问
visited[v]=1;
for(int u:array.get(v)) {
if(visited[u]==0) {
dfs(u);
if(!isvalid) {
return ;
}
}
else {
//表示当前节点所指向的一个节点也正在被访问,即存在一个环,不能完成
if(visited[u]==1) {
isvalid=false;
return ;
}
}
}
//为2表示当前节点的相邻节点已经被访问完,回溯到当前节点
visited[v]=2;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
demo_207 demo=new demo_207();
int[][] prerequisites= {{1,0},{1,2},{0,1}};
System.out.println(demo.canFinish(3, prerequisites));
}
}