def can_finish(num,prereqs):
graph=[[] for _ in range(num)]
for a,b in prereqs: graph[b].append(a)
state=[0]*num
def dfs(v):
if state[v]==1: return False
if state[v]==2: return True
state[v]=1
for nb in graph[v]:
if not dfs(nb): return False
state[v]=2
return True
return all(dfs(i) for i in range(num))
public boolean canFinish(int num,int[][] prereqs){
List<List<Integer>> graph=new ArrayList<>();
for(int i=0;i<num;i++) graph.add(new ArrayList<>());
for(int[] p:prereqs) graph.get(p[1]).add(p[0]);
int[] state=new int[num];
for(int i=0;i<num;i++) if(!dfs(graph,state,i)) return false;
return true;
}
boolean dfs(List<List<Integer>> g,int[] state,int v){
if(state[v]==1) return false;
if(state[v]==2) return true;
state[v]=1;
for(int nb:g.get(v)) if(!dfs(g,state,nb)) return false;
state[v]=2; return true;
}
3-state cycle detection. Python all() elegant. Java needs separate helper.
def can_finish(num,prereqs):
graph=[[] for _ in range(num)]
for a,b in prereqs: graph[b].append(a)
state=[0]*num
def dfs(v):
if state[v]==1: return False
if state[v]==2: return True
state[v]=1
for nb in graph[v]:
if not dfs(nb): return False
state[v]=2
return True
return all(dfs(i) for i in range(num))
public boolean canFinish(int num,int[][] prereqs){
List<List<Integer>> graph=new ArrayList<>();
for(int i=0;i<num;i++) graph.add(new ArrayList<>());
for(int[] p:prereqs) graph.get(p[1]).add(p[0]);
int[] state=new int[num];
for(int i=0;i<num;i++) if(!dfs(graph,state,i)) return false;
return true;
}
boolean dfs(List<List<Integer>> g,int[] state,int v){
if(state[v]==1) return false;
if(state[v]==2) return true;
state[v]=1;
for(int nb:g.get(v)) if(!dfs(g,state,nb)) return false;
state[v]=2; return true;
}
1. Build adjacency list 2. DFS 3-state coloring 3. Cycle: false