Three-colour DFS
Time O(V + E) Space O(V + E)Build b → a edges. DFS from every white node; an edge into a grey node means a cycle.
import java.util.*;
class Solution {
private List<List<Integer>> adj;
private int[] state; // 0 white, 1 grey, 2 black
public boolean canFinish(int numCourses, int[][] prerequisites) {
adj = new ArrayList<>();
for (int i = 0; i < numCourses; i++) adj.add(new ArrayList<>());
for (int[] p : prerequisites) adj.get(p[1]).add(p[0]);
state = new int[numCourses];
for (int i = 0; i < numCourses; i++) if (state[i] == 0 && hasCycle(i)) return false;
return true;
}
private boolean hasCycle(int u) {
state[u] = 1;
for (int v : adj.get(u)) {
if (state[v] == 1) return true;
if (state[v] == 0 && hasCycle(v)) return true;
}
state[u] = 2;
return false;
}
}Verdict: Direct cycle detection.