public boolean canFinish(int numCourses, int[][] prerequisites) {
List<Set<Integer>> adjList = new ArrayList<>();
for (int i = 0; i < n; i++) {
adjList.add(new HashSet<>());
for (int[] prerequisite : prerequisites) {
adjList.get(prerequisite[1]).add(prerequisite[0]);
boolean[] visited = new boolean[n];
boolean[] onStack = new boolean[n];
for (int i = 0; i < n; i++) {
if (!dfs(i, visited, onStack, adjList)) {
public boolean dfs(int course, boolean[] visited, boolean[] onStack, List<Set<Integer>> adjList) {
for (int nextCourse : adjList.get(course)) {
if (!dfs(nextCourse, visited, onStack, adjList)) {