Kahn算法必须先统计每个节点入度,因为其核心是每次处理入度为0的节点,初始入度决定起点,动态入度判断后续就绪节点;需用vector indegree(n,0)初始化并遍历边更新,仅当indegree[v]==0时才入队以确保语义正确和环可检。

为什么 Kahn 算法必须先统计每个节点的入度
因为 Kahn 的核心逻辑是「每次只处理入度为 0 的节点」,而入度会随着前驱节点被移除而动态变化。不预先统计初始入度,就无法知道谁是起点;不维护当前入度,就无法判断后续哪些节点已就绪。
常见错误是直接遍历邻接表找“没被访问过的点”,这会导致漏掉中间入度归零但未被发现的节点。正确做法是:用 vector 初始化,建图时对每个 edge[u -> v] 执行 indegree[v]++。
queue 里该存什么、什么时候 push
存的是当前可调度的节点索引(比如 int 类型),不是边或权重。只有当某个节点 v 的 indegree[v] == 0 且尚未入队过,才 push。注意:不能在建图后一次性把所有入度为 0 的点全塞进队列再开始 BFS —— 虽然结果可能对,但失去了“逐层释放依赖”的语义,也掩盖了环检测逻辑。
典型写法:
indegree[v]--
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











