【leetcode】207. 课程表

79 阅读1分钟

leetcode-207.png

比较典型的图论题目,要看这个图是否构成一个环
如果改题里面不存在环,且能从一个入度为0的节点开始,遍历完整个图(链表),那么就可以返回true,否则返回false

var canFinish = function (numCourses, prerequisites) {
    // 邻接表存储图的结构
    let graph = new Array(numCourses).fill(0).map(() => [])
    // 每个节点的入度
    let inDegree = new Array(numCourses).fill(0)

    for (let [after, pre] of prerequisites) {
        graph[pre].push(after)
        inDegree[after]++
    }

    // 存储当前入度为0的节点
    // 后续可以从这些入度为0的节点开始遍历
    let queue = []
    for (let i = 0; i < numCourses; ++i) {
        if (inDegree[i] === 0) {
            queue.push(i)
        }
    }

    let cnt = 0
    while (queue.length > 0) {
        // 取出入度为0的节点
        let pre = queue.shift()
        // 记录学习的课程数量
        cnt++
        for (let course of graph[pre]) {
            // 对于后续需要学习的课程的入度 -- 
            inDegree[course]--
            if (inDegree[course] === 0) {
                // 入度为0的时候推入队列
                queue.push(course)
            }
        }
    }
    return numCourses === cnt
};