参考了geeksforgeeks 有向图寻找环。代码如下:
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
if (prerequisites == null || prerequisites.length == 0) {
return true;
}
Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();
for (int i = 0; i < prerequisites.length; i++) {
int[] pair = prerequisites[i];
int from = pair[1];
int to = pair[0];
if (map.containsKey(from)) {
map.get(from).add(to);
} else {
List<Integer> list = new ArrayList<Integer>();
list.add(to);
map.put(from, list); // map 0, <1> || 1, empty
}
if (!map.containsKey(to)) {
map.put(to, new ArrayList<Integer>());
}
}
boolean[] visited = new boolean[numCourses];
boolean[] recStack = new boolean[numCourses];
for (int i : map.keySet()) {
if (isCyclic(i, visited, recStack, map)) {
return false;
}
}
return true;
}
private boolean isCyclic(int v, boolean[] visited, boolean[] recStack, Map<Integer, List<Integer>> map) {
if (!visited[v]) {
visited[v] = true;
recStack[v] = true;
List<Integer> adj = map.get(v);
for (int i = 0; i < adj.size(); i++) {
int num = adj.get(i);
if (!visited[num] && isCyclic(num, visited, recStack, map)) {
return true;
} else if (recStack[num]) {
return true;
}
}
}
recStack[v] = false;
return false;
}
}