Kahn算法通过入度统计与BFS实现拓扑排序:先建邻接表和入度数组,将入度为0的节点入队;再逐层剥离节点并更新邻接点入度;最后检查拓扑序列长度是否等于顶点数以判断是否存在环。

如果您需要在 C++ 中实现图的拓扑排序,且采用 Kahn 算法(基于入度统计与 BFS 的迭代过程),则核心在于维护每个节点的入度、识别入度为 0 的起始节点,并按层剥离依赖关系。以下是该算法的具体实现步骤:
一、构建邻接表与入度数组
该步骤用于将有向图表示为邻接表结构,同时统计每个顶点的入度,为后续 BFS 遍历提供初始依据。入度为 0 的节点即为拓扑序列的合法起点。
1、定义 vector
2、定义 vector
3、遍历所有有向边 (u, v),执行 adj[u].push_back(v) 并令 indegree[v]++。
二、初始化队列并加入所有入度为 0 的节点
使用标准队列(queue)存储当前可调度的节点,即尚未被访问且无前置依赖的节点。这是 Kahn 算法启动的必要条件。
1、包含头文件
2、声明 queue
3、遍历 0 到 n−1 的每个顶点 i,若 indegree[i] == 0,则执行 q.push(i)。
三、执行 BFS 剥离过程并构造拓扑序列
每次从队列中取出一个入度为 0 的节点,将其加入结果序列,并减少其所有邻接节点的入度;若某邻接节点入度降为 0,则立即入队。该过程模拟了依赖关系的逐层解除。
1、声明 vector
2、当 !q.empty() 时循环执行以下操作:
3、令 int u = q.front(); q.pop();
4、执行 topo.push_back(u)。
5、遍历 adj[u] 中每个邻接点 v,执行 indegree[v]--。
6、若 indegree[v] == 0,则执行 q.push(v)。
四、检测环路并验证拓扑排序有效性
Kahn 算法天然具备环检测能力:若最终拓扑序列长度小于图中顶点总数,则说明图中存在至少一个有向环,无法完成拓扑排序。
1、比较 topo.size() == n 的布尔值。
2、若不相等,表明存在环,此时 topo 不构成有效拓扑序。
3、若相等,topo 即为一个合法的拓扑排序结果。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











