比较典型的图论题目,要看这个图是否构成一个环
如果改题里面不存在环,且能从一个入度为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
};