第8章|图与并查集
Unit 06 · LeetCode #207 课程表
仅本次页面有效
U06
Kahn Topological SortBuild Direction → Count Indegree → Remove Zero → Detect Residual Cycle
课程能否修完,取决于依赖图
能否被零入度节点逐步清空。
把先修关系编译成有向边,维护每门课程尚未解除的先修数量。每次完成一门入度为 0 的课程,就释放它的后继;最终仍有课程残留,意味着这些课程被依赖环锁住。
检测到上次学习现场阶段、案例、图状态、问题、槽位、代码、迁移脚手架、编辑器高度和滚动位置均可恢复。
LeetCode #207 · 课程表
共有 numCourses 门课程,编号为 0 到 numCourses - 1。prerequisites[i] = [a, b] 表示要学习课程 a,必须先完成课程 b。若可以完成所有课程,返回 True;否则返回 False。
示例 1
numCourses = 2
prerequisites = [[1,0]]
输出:True
示例 2
numCourses = 2
prerequisites = [[1,0],[0,1]]
输出:False
约束与 Python 签名
1 ≤ numCourses ≤ 2000
0 ≤ prerequisites.length ≤ 5000
prerequisites[i].length == 2
0 ≤ a, b < numCourses
所有先修课程对互不相同
class Solution:
def canFinish(self, numCourses, prerequisites):
...
本实验采用 Kahn 算法:反复处理入度为 0 的节点,并以已处理课程数判断是否存在残留环。
graph[prerequisite]
保存完成该先修课后可以解锁的后继课程。
indegree[course]
当前仍未解除的先修课程数量;只有变为 0 才能进入队列。
completed
已经从零入度队列中正式处理的课程数量。
Directed Edge
[course, prerequisite] 编译为 prerequisite → course。
Indegree
指向当前节点的边数,在本题中等于尚未满足的先修数量。
Topological Order
所有依赖都从较早课程指向较晚课程的线性顺序。
Residual Cycle
队列耗尽后仍未处理的节点,其入度无法降为 0,处于环或被环阻塞。
课程依赖实验步骤 1
第八章 Unit 06 · Skill 卡
有向依赖判环 = 正确建边 + 统计入度 + 批量收集零入度节点 + 逐边释放后继 + 检查是否处理全部节点。零入度队列表示当前已经满足全部先修要求的课程;队列耗尽但仍有残留节点,就是不存在完整拓扑序的证据。
Graph Model[a,b] 编译为 b → a
Stateindegree 保存剩余先修数量
Frontier所有入度为 0 的课程同时入队
Update完成课程后递减每个后继入度
Cycle Testcompleted == numCourses
Complexity时间 O(V+E),空间 O(V+E)
完成后停留在当前页面
不会倒计时或自动跳题。可以返回任意阶段重新观察依赖方向、残留环和迁移轨迹。