BFS + Topological Sort
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { int[] inDegrees = new int[numCourses]; Map<Integer, List<Integer>> nodeToNodeList = new HashMap<>(); for (int[] prerequisite : prerequisites) { int from = prerequisite[1], to = prerequisite[0]; inDegrees[to]++; nodeToNodeList.computeIfAbsent(from, k -> new ArrayList<>()) .add(to); }
Queue<Integer> zeroInDegreeCourseQueue = new LinkedList<>(); for (int i = 0; i < inDegrees.length; i++) { if (inDegrees[i] == 0) { zeroInDegreeCourseQueue.offer(i); } } while (!zeroInDegreeCourseQueue.isEmpty()) { int course = zeroInDegreeCourseQueue.poll(); numCourses--;
List<Integer> toList = nodeToNodeList.getOrDefault(course, Collections.emptyList()); for (int to : toList) { if (--inDegrees[to] == 0) { zeroInDegreeCourseQueue.offer(to); } } }
return numCourses == 0; } }
|
DFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { List<List<Integer>> edgeList = new ArrayList<>(numCourses); for (int i = 0; i < numCourses; i++) { edgeList.add(new ArrayList<>()); }
for (int[] prerequisite : prerequisites) { int from = prerequisite[1], to = prerequisite[0]; edgeList.get(from).add(to); }
int[] visitStatuses = new int[numCourses]; for (int i = 0; i < numCourses; i++) { if (!dfs(edgeList, i, visitStatuses)) { return false; } }
return true; }
private boolean dfs(List<List<Integer>> edgeList, int course, int[] visitStatuses) { if (visitStatuses[course] == 2) { return true; } if (visitStatuses[course] == 1) { return false; }
visitStatuses[course] = 1; for (int to : edgeList.get(course)) { if (!dfs(edgeList, to, visitStatuses)) { return false; } } visitStatuses[course] = 2;
return true; } }
|
References
207. Course Schedule
compileflow/DirectedGraph.java at v1.1.0 · alibaba/compileflow · GitHub