课程安排

    //方法一  入度表(广度优先遍历)
    public boolean canFinish(int numCourses,int[][] prerequisites){
        int[] indegrees = new int[numCourses];
        List<List<Integer>> adjacency = new ArrayList<List<Integer>>();
        Queue<Integer> queue = new LinkedList<>();
        for(int i=0;i<numCourses;i++){
            adjacency.add(new ArrayList<Integer>());
        }
        for(int[] cp:prerequisites){
            indegrees[cp[0]]++;
            adjacency.get(cp[1]).add(cp[0]);
        }
        for(int i=0;i<numCourses;i++){
            if(indegrees[i]==0){
                queue.add(i);
            }
        }
        while(!queue.isEmpty()){
            int pre = queue.poll();
            numCourses--;
            for(int cur:adjacency.get(pre)){
                if(--indegrees[cur]==0){
                    queue.add(cur);
                }
            }
        }
        return numCourses == 0;
    }
// 方法二  深度优先遍历
    public boolean canFinish2(int numCourses,int[][] prerequisites){
        List<List<Integer>> adjacency = new ArrayList<List<Integer>>();
        for(int i=0;i<numCourses;i++){
            adjacency.add(new ArrayList<Integer>());
        }
        for(int[] cp:prerequisites){
            adjacency.get(cp[1]).add(cp[0]);
        }
        int[] flags = new int[numCourses];
        for(int i=0;i<numCourses;i++){
            if(!dfs(adjacency,flags,i)){
                return false;
            }
        }
        return true;
    }
    private boolean dfs(List<List<Integer>> adjacency,int[] flags,int i){
        if(flags[i] == 1){
            return false;
        }
        if(flags[i]== -1){
            return true;
        }
        flags[i] = 1;
        for(Integer j:adjacency.get(i)){
            if(!dfs(adjacency, flags, j)){
                return false;
            }
        }
        flags[i] = -1;
        return true;
    }
原文地址:https://www.cnblogs.com/helloworldmybokeyuan/p/13446369.html