Course Schedule
Example
Given n = 2, prerequisites = [[1,0]]
Return true
Given n = 2, prerequisites = [[1,0],[0,1]]
Return falseBasic Idea:
Java Code:
public class Solution {
/**
* @param numCourses a total of n courses
* @param prerequisites a list of prerequisite pairs
* @return true if can finish all courses or false
*/
public boolean canFinish(int numCourses, int[][] prerequisites) {
if (numCourses < 2) return true;
Map<Integer, Set<Integer>> graph = initGraph(numCourses, prerequisites);
// 得到adjacent list形式的图之后,用BFS进行topological sort,看是否可行
// 先count indegree
Map<Integer, Integer> count = new HashMap<>();
for (int node : graph.keySet()) {
count.put(node, 0);
}
for (int node : graph.keySet()) {
for (int neighbor : graph.get(node)) {
count.put(neighbor, count.get(neighbor) + 1);
}
}
// bfs
Deque<Integer> queue = new LinkedList<>();
for (int node : graph.keySet()) {
if (count.get(node) == 0) queue.addFirst(node);
}
while (! queue.isEmpty()) {
int node = queue.removeLast();
for (int neighbor : graph.get(node)) {
count.put(neighbor, count.get(neighbor) - 1);
if (count.get(neighbor) == 0) queue.addFirst(neighbor);
}
}
return Collections.max(count.values()) <= 0;
}
private Map<Integer, Set<Integer>> initGraph(int n, int[][] edges) {
Map<Integer, Set<Integer>> graph = new HashMap<>();
for (int i = 0; i < n; ++i) {
graph.put(i, new HashSet<Integer>());
}
for (int[] edge : edges) {
int u = edge[0], v = edge[1];
graph.get(u).add(v);
}
return graph;
}
}