c++如何实现拓扑排序算法_c++ 入度统计与AOV网活动调度【案例】
技术百科
尼克
发布时间:2025-12-29
浏览: 次 拓扑排序的核心判断条件是图中是否存在环,即遍历结束后输出顶点数是否等于总顶点数;若不等则存在环,排序失败。
拓扑排序的核心判断条件是什么
拓扑排序只适用于有向无环图(DAG)。如果图中存在环,indegree[v] == 0 的节点在某轮遍历后彻底消失,队列/栈变空但仍有未访问节点——此时可直接判定环存在,排序失败。
实际编码中不能只看最终是否输出了全部顶点,必须检查输出顶点数是否等于图中顶点总数。否则就是隐含环,比如输入边 0→1、1→2、2→0 时,所有节点入度始终为 1,queue 从不入队,结果为空。
用 vector> 存邻接表 + indegree 数组怎么写
这是最常用、最易调试的实现方式。邻接表用 vector,每个 i 对应出边目标列表;入度单独开 vector,初始化时遍历所有边做 indegree[to]++。
注意:顶点编号建议从 0 开始,避免下标越界;若输入是 1-based,读入后统一减 1 处理。
- 使用
queue实现 BFS 式拓扑序(推荐,顺序稳定) - 入队前务必检查
indegree[i] == 0,且入队后立即置为 -1 或用布尔数组标记已入队,防止重复入队 - 每次从队首取节点
u,
遍历其所有邻接点 v,执行indegree[v]--;若减到 0,立刻入队
vector> graph(n); vector indegree(n, 0); for (auto& e : edges) { int u = e[0], v = e[1]; graph[u].push_back(v); indegree[v]++; } queue q; for (int i = 0; i < n; i++) if (indegree[i] == 0) q.push(i); vector topo; while (!q.empty()) { int u = q.front(); q.pop(); topo.push_back(u); for (int v : graph[u]) { indegree[v]--; if (indegree[v] == 0) q.push(v); } } if (topo.size() != n) cout << "cycle detected" << endl;
为什么不能用 DFS 直接递归输出顺序
DFS 版拓扑排序不是简单地在访问时 push_back,而必须在「所有后继都访问完毕」之后才记录当前节点——即使用逆后序(post-order reverse)。否则顺序错乱,例如 A→B、A→C、B→C,DFS 若从 A 入口先走 B 再走 C,可能输出 A,B,C(错误),正确应是 A,B,C 或 A,C,B,但 C 不能在 B 前(因 B→C)。
常见错误是把 DFS 当成普通遍历,在 visit(u) 开头就加进结果,这实际得到的是某种访问序,不是拓扑序。
- 必须用状态数组区分
unvisited/visiting/visited,遇到visiting就说明成环 - 仅当递归返回前(即退出函数前)把
u加入结果,再 reverse 整个结果 - 多起点时需对每个未访问节点调用 DFS,不能只从 0 开始
AOV 网调度中如何处理多入度依赖与任务权重
AOV 网本身不带权,但实际调度常需扩展:比如任务耗时(权重)、资源约束、或多个前置任务必须全部完成才能开始(这正是入度统计的物理意义)。此时 indegree[u] 就是“还剩几个前置任务未完成”,只有归零才可调度。
若需计算最早开始时间(Earliest Start Time),可在拓扑序上 DP:est[v] = max(est[v], est[u] + duration[u]),前提是图按拓扑序遍历,且 u→v 是依赖边。
- 不要在建图时合并重复边,否则
indegree统计偏小,导致过早调度 - 若输入含重边(如两个文件都声明依赖同一头文件),需去重或用 set 存邻接表
- 并发调度时,同一轮中所有
indegree==0的节点可并行执行,这时 queue 可换为 vector 批量处理
入度统计看着简单,但边界全在细节里:初始化漏节点、重边不判、环检测不校验长度、多起点遗漏——这些都会让 AOV 调度在真实项目中静默失败。
# 的是
# 几个
# 这是
# 看着
# 多个
# 多起
# 图中
# 排序算法
# edge
# 递归
# 并发
# c++
# 编码
# 栈
# 算法
# 遍历
# 或用
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么关闭搜索历史 Win11清除搜索框最
- Win11怎么检查TPM2.0模块_Windows
- Win11怎么设置任务栏透明_Windows11使
- Win10怎样清理C盘浏览器缓存_Win10清理浏
- Mac怎么进行语音输入_Mac听写功能设置与使用【
- C++如何将C风格字符串(char*)转换为std
- Win11怎么设置组合键快捷方式_Windows1
- 如何更改Windows资源管理器的默认启动位置?(
- Win11怎么查看电脑配置_Win11硬件配置详细
- 如何在Golang中实现微服务负载均衡_Golan
- Windows笔记本无法进入睡眠模式怎么办?(电源
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- 如何在Golang中编写异步函数测试_Golang
- C#怎么使用委托和事件 C# delegate与e
- Python对象比较排序规则_集合使用说明【指导】
- 如何使用Golang实现负载均衡_分发请求到多个服
- 如何使用正则表达式提取以编号开头、后接多个注解的逻
- 网站内页做seo排名怎么做?
- Windows10电脑怎么连接蓝牙设备_Win10
- Win10怎样卸载iTunes_Win10卸载iT
- c++怎么用jemalloc c++替换默认内存分
- Windows7如何安装系统镜像_Windows7
- 如何有效拦截拼接式恶意域名的垃圾信息
- 如何使用Golang管理跨项目依赖_Golang多
- Windows蓝屏错误0x00000023怎么修复
- Windows怎样关闭开始菜单广告_Windows
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- Go 中实现 Python urllib.quot
- Win11怎么关闭定位服务 Win11禁止应用获取
- Mac怎么给文件夹加密_Mac创建加密磁盘映像教程
- Win11触摸板没反应怎么办_开启Win11笔记本
- php打包exe怎么传递参数_命令行参数接收方法【
- Python随机数生成_random模块说明【指导
- c++中如何计算坐标系中两点间距离_c++勾股定理
- c++20的std::format怎么用 比pri
- Windows10蓝屏SYSTEM_SERVICE
- 如何在Golang中使用replace替换模块_指
- c# 在高并发场景下,委托和接口调用的性能对比
- Win11怎么开启上帝模式_创建Windows 1
- Win11开始菜单打不开_修复Windows 11
- 如何使用正则表达式批量替换重复的 *- 模式为固定
- Windows10电脑怎么设置自动连接WiFi_W
- php查询数据怎么导出csv_查询结果转csv文件
- Python大文件处理策略_内存优化说明【指导】
- PHP主流架构如何处理会话管理_Session与C
- 如何在JavaScript中动态拼接PHP的bas
- 如何在Golang中写入XML文件_生成符合规范的
- php订单日志怎么导出excel_php导出订单日
- Win11怎么关闭VBS安全性_Windows11
- Windows系统文件被保护机制阻止怎么办_权限不

遍历其所有邻接点
QQ客服