题目链接
法一(拓扑排序)
private int[] inDegree;
private List<Integer>[] graph;
private void createGraphByAdjList(int numCourses, int[][] prerequisites) {
graph = new LinkedList[numCourses];
for (int i = 0; i < numCourses; i++) {
graph[i] = new LinkedList<>();
}
inDegree = new int[numCourses];
for (int[] pre : prerequisites) {
int from = pre[1], to = pre[0];
graph[from].add(to);
inDegree[to]++;
}
}
public boolean canFinish(int numCourses, int[][] prerequisites) {
createGraphByAdjList(numCourses, prerequisites);
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < numCourses; i++) {
if (inDegree[i] == 0) {
queue.offer(i);
}
}
int num = 0;
while (!queue.isEmpty()) {
int from = queue.poll();
for (int to : graph[from]) {
inDegree[to]--;
if (inDegree[to] == 0) {
queue.offer(to);
}
}
num++;
}
return num == numCourses;
}
法二(DFS)
private List<Integer>[] graph;
private int[] visited;
private boolean hasCircle = false;
private void createGraphByInverseAdjList(int numCourses, int[][] prerequisites) {
graph = new LinkedList[numCourses];
for (int i = 0; i < numCourses; i++) {
graph[i] = new LinkedList<>();
}
for (int[] pre : prerequisites) {
int from = pre[1], to = pre[0];
graph[to].add(from);
}
}
private void findCircle(int to) {
visited[to] = 1;
for (int from : graph[to]) {
if (visited[from] == 0) {
findCircle(from);
} else if (visited[from] == 1) {
hasCircle = true;
return;
}
}
visited[to] = 2;
}
public boolean canFinish_2(int numCourses, int[][] prerequisites) {
createGraphByInverseAdjList(numCourses, prerequisites);
visited = new int[numCourses];
for (int i = 0; i < numCourses; i++) {
if (visited[i] == 0) {
findCircle(i);
}
}
return hasCircle ? false : true;
}
本地测试
lay.showTitle(207);
Solution207 sol207 = new Solution207();
int numCourses207 = 5;
int[][] prerequisites207 = new int[][]{{1, 4}, {2, 4}, {3, 1}, {3, 2}};
arrayOpt.showIntTwoDimArray(prerequisites207, prerequisites207.length);
System.out.println(sol207.canFinish(numCourses207, prerequisites207));
System.out.println(sol207.canFinish_2(numCourses207, prerequisites207));