There are a total of n courses you have to take, labeled from 0
to n - 1
.
Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]
Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?
For example:
2, [[1,0]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.
2, [[1,0],[0,1]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.
/**存储环**/
public class Solution {
private boolean[] marked;
private boolean[] onStack;
private int[] edgeTo;
private Stack<Integer> cycle;
public boolean canFinish(int numCourses, int[][] prerequisites) {
onStack = new boolean[numCourses];
marked = new boolean[numCourses];
edgeTo = new int[numCourses];
ArrayList[] graph = new ArrayList[numCourses];
for(int i=0;i<numCourses;i++)
graph[i] = new ArrayList();
for(int i = 0; i < prerequisites.length; i++) {
graph[prerequisites[i][0]].add(prerequisites[i][1]);
}
for(int i = 0; i < numCourses; i++) {
if(!marked[i]) {
if(!dfs(graph, i)) {
return false;
}
}
}
return true;
}
public boolean dfs(ArrayList[] graph, int course) {
onStack[course] = true;
marked[course] = true;
for(int i = 0; i < graph[course].size(); i++) {
if(!marked[(int)graph[course].get(i)]) {
edgeTo[(int)graph[course].get(i)] = course;
dfs(graph, (int)graph[course].get(i));
} else if(onStack[(int)graph[course].get(i)]) {
cycle = new Stack<Integer>();
for(int x = course; x != (int)graph[course].get(i); x = edgeTo[x]) {
cycle.push(x);
}
cycle.push((int)graph[course].get(i));
cycle.push(course);
}
}
onStack[course] = false;
if(cycle != null) {
return false;
} else {
return true;
}
}
}
/**直接判断**/
public class Solution {
private boolean[] marked;
private boolean[] onStack;
private boolean hasCycle;
public boolean canFinish(int numCourses, int[][] prerequisites) {
onStack = new boolean[numCourses];
marked = new boolean[numCourses];
ArrayList[] graph = new ArrayList[numCourses];
for(int i=0;i<numCourses;i++)
graph[i] = new ArrayList();
for(int i = 0; i < prerequisites.length; i++) {
graph[prerequisites[i][0]].add(prerequisites[i][1]);
}
for(int i = 0; i < numCourses; i++) {
if(!marked[i]) {
if(!dfs(graph, i)) {
return false;
}
}
}
return true;
}
public boolean dfs(ArrayList[] graph, int course) {
onStack[course] = true;
marked[course] = true;
for(int i = 0; i < graph[course].size(); i++) {
if(!marked[(int)graph[course].get(i)]) {
dfs(graph, (int)graph[course].get(i));
} else if(onStack[(int)graph[course].get(i)]) {
hasCycle = true;
}
}
onStack[course] = false;
if(hasCycle) {
return false;
} else {
return true;
}
}
}