class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
ArrayList[] graph = new ArrayList[numCourses];
int[] degree = new int[numCourses];
Queue queue = new LinkedList();
int count = 0;
for(int i = 0;i<numCourses;i++){
graph[i] = new ArrayList();//针对每一个顶点创建ArrayList
}
for(int i = 0;i<prerequisites.length;i++){
int k = prerequisites[i][1];//图中顶点序号为i的课程的先修课程序号为prerequisites[i][1]即k
degree[k]++;//先修课程顶点出度加1
graph[prerequisites[i][0]].add(k);//在顶点i课程的arraylist中加入先修课程的顶点序号k
}
for(int i = 0;i<degree.length;i++){
if(degree[i] == 0){//如果该课程不是其他任何课程的先修,加入队列,计数加一
queue.add(i);
count++;
}
}
while(queue.size() != 0){
int course = (int) queue.poll();
for(int i = 0;i<graph[course].size();i++){
int pointer = (int) graph[course].get(i);
degree[pointer]--;
if(degree[pointer] == 0){
queue.add(pointer);
count++;
}
}
}
if(count == numCourses)
return true;
else
return false;
}
}
以上是第一种办法,广度优先搜索(BFS)
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
ArrayList[] graph = new ArrayList[numCourses];
for(int i = 0;i<numCourses;i++){
graph[i] = new ArrayList();
}
boolean[] visited = new boolean[numCourses];
for(int i = 0;i<prerequisites.length;i++){
graph[prerequisites[i][1]].add(prerequisites[i][0]);
}//其实就相当于给每个顶点创建了链表,总的就是一个邻接表。每个链表里都是其先修课程序号。
for(int i = 0;i<numCourses;i++){
if(!dfs(graph,visited,i)){//dfs的结果如果是false,则表示有环。
return false;
}
}
return true;
}
private boolean dfs(ArrayList[] graph,boolean[] visited,int course){
if(visited[course])
return false;
else
visited[course] = true;
for(int i = 0;i<graph[course].size();i++){
if(!dfs(graph,visited,(int)graph[course].get(i))){
return false;
}
}
visited[course] = false;//如果只是某个无关联的序号被访问过,作为其他序号的先修课程进行dfs的时候,就需要在dfs前恢复false状态
return true;
}
}
这是深度优先搜索方法(DFS)。