图-lc207

129 阅读1分钟

BFS有向图解法

class Solution {
     //prerequisites数组的[0,1]表示上0这门课需要先修1这们课.
    // 将每门课作为节点相互关联构建为图, 存在先修课的节点,其入度>0,不存在先修课的节点入度为0.
    // 构建一维数组,数组下标表示节点的课程号, 节点值表示节点的入度.
    // 使用二维动态数值创建numsCourses个动态数组, 每个数组的索引代表了课程号,数组内容表示对应出度的值.
    // 遍历数组填充各个课程的出度值.
    // 找到入度为0的课程号,bfs它的邻接节点. 遍历一个点就将这个点的入度减一,如果这个点入度为0就把它压入queue.
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        if (prerequisites.length == 0) return true;
        int[] indegree = new int[numCourses];
        List<List<Integer>> LinkedMap = new ArrayList();
        for (int i = 0; i < numCourses; i++) {
            LinkedMap.add(new ArrayList());
        }
        Queue<Integer> q = new LinkedList<>();
        for (int[] pre: prerequisites) {
            indegree[pre[0]]++;
            LinkedMap.get(pre[1]).add(pre[0]);
        }
        for (int i = 0; i < numCourses; i++) {
            if (indegree[i] == 0) {
                q.add(i);
            }
        }
        while (q.size() != 0) { 
            int tmp = q.poll();
            numCourses--;
            for (int pre : LinkedMap.get(tmp)) {
                indegree[pre]--;
                if (indegree[pre] == 0) {
                    q.add(pre);
                }
            }
        }
        return numCourses == 0;
    }
}

Snipaste_2021-12-05_15-24-37.png