课程表-图

38 阅读1分钟
// 课程表-图  
// 输入:numCourses = 2, prerequisites = [[1,0]]  
// 输出:true  
// 解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的  
public static boolean canFinish(int numCourses,int[][] pre){  
    int[] indegrees = new int[numCourses];  
    List<ArrayList<Integer>> adja = new ArrayList<>();  
    for (int i = 0; i <numCourses ; i++) {  
        adja.add(new ArrayList<>());  
    }  
    for(int[] p :pre){  
        indegrees[p[0]]++;  
        adja.get(p[1]).add(p[0]);  
    }  
    LinkedList<Integer> queue = new LinkedList<>();  
    for (int i = 0; i <numCourses ; i++) {  
        if(indegrees[i]==0){  
            queue.add(i);  
        }  
    }  
    while (!queue.isEmpty()){  
        Integer poll = queue.poll();  
        numCourses--;  
        for(Integer ad:adja.get(poll)){  
            indegrees[ad]--;  
            if(indegrees[ad]==0){  
                queue.add(ad);  
            }  
        }  

    }  
    return numCourses==0;  
}