LeetCode 207 Course Schedule

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)。

猜你喜欢

转载自blog.csdn.net/Serenity0614/article/details/78719463