← Graphs

Course Schedule

Medium
Python
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))
Java
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;
}

Key Insight

3-state cycle detection. Python all() elegant. Java needs separate helper.

Python → Java Differences

  • Nested function vs separate method
  • Python all() vs Java loop
  • Cycle detection DFS identical
Python
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))
Java
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;
}

Algorithm Steps

1. Build adjacency list
2. DFS 3-state coloring
3. Cycle: false