如何用Kahn算法结合BFS核心逻辑改写C语言实现图的拓扑排序的入度统计法?
- 内容介绍
- 文章标签
- 相关推荐
本文共计619个文字,预计阅读时间需要3分钟。
直接使用 vector。
怎么初始化入度数组和邻接表
节点编号必须从 0 开始连续,否则下标越界或漏统计。假设总节点数为 n:
-
vector<int> indegree(n, 0)</int>—— 别用map或动态扩容,纯浪费 -
vector<vector>> graph(n)</vector>—— 每个graph[u]存所有u → v的v - 遍历每条边
[u, v]时立刻执行indegree[v]++和graph[u].push_back(v)
为什么必须用 queue 而不是 stack 或 priority_queue
queue 保证 FIFO,符合“谁先没依赖谁先排”的语义;换成 stack 就退化成 DFS 模拟,失去环检测能力;用 priority_queue 只在需要字典序最小拓扑序时才加,否则徒增 O(log n) 常数开销。
本文共计619个文字,预计阅读时间需要3分钟。
直接使用 vector。
怎么初始化入度数组和邻接表
节点编号必须从 0 开始连续,否则下标越界或漏统计。假设总节点数为 n:
-
vector<int> indegree(n, 0)</int>—— 别用map或动态扩容,纯浪费 -
vector<vector>> graph(n)</vector>—— 每个graph[u]存所有u → v的v - 遍历每条边
[u, v]时立刻执行indegree[v]++和graph[u].push_back(v)
为什么必须用 queue 而不是 stack 或 priority_queue
queue 保证 FIFO,符合“谁先没依赖谁先排”的语义;换成 stack 就退化成 DFS 模拟,失去环检测能力;用 priority_queue 只在需要字典序最小拓扑序时才加,否则徒增 O(log n) 常数开销。

