package g0201_0300.s0207_course_schedule; // #Medium #Top_100_Liked_Questions #Top_Interview_Questions #Depth_First_Search // #Breadth_First_Search #Graph #Topological_Sort #Top_Interview_150_Graph_General // #Big_O_Time_O(N)_Space_O(N) #2024_11_15_Time_3_ms_(99.99%)_Space_44.8_MB_(88.52%) import java.util.ArrayList; @SuppressWarnings("unchecked") public class Solution { private static final int WHITE = 0; private static final int GRAY = 1; private static final int BLACK = 2; public boolean canFinish(int numCourses, int[][] prerequisites) { ArrayList[] adj = new ArrayList[numCourses]; for (int i = 0; i < numCourses; i++) { adj[i] = new ArrayList<>(); } for (int[] pre : prerequisites) { adj[pre[1]].add(pre[0]); } int[] colors = new int[numCourses]; for (int i = 0; i < numCourses; i++) { if (colors[i] == WHITE && !adj[i].isEmpty() && hasCycle(adj, i, colors)) { return false; } } return true; } private boolean hasCycle(ArrayList[] adj, int node, int[] colors) { colors[node] = GRAY; for (int nei : adj[node]) { if (colors[nei] == GRAY) { return true; } if (colors[nei] == WHITE && hasCycle(adj, nei, colors)) { return true; } } colors[node] = BLACK; return false; } }