拓扑排序:课程表问题
一、面试常考点
1. 使用前提
有向无环图(DAG)。
2. Kahn 算法
入度为 0 入队,出队后削减邻接点入度。
二、示例代码
function canFinish(numCourses, prerequisites) {
const g = Array.from({ length: numCourses }, () => [])
const indeg = Array(numCourses).fill(0)
for (const [a, b] of prerequisites) {
g[b].push(a)
indeg[a]++
}
const q = []
for (let i = 0; i < numCourses; i++) if (indeg[i] === 0) q.push(i)
let visited = 0
while (q.length) {
const u = q.shift()
visited++
for (const v of g[u]) if (--indeg[v] === 0) q.push(v)
}
return visited === numCourses
}