进阶数据结构图——拓扑排序(三)
三、拓扑排序3.1 拓扑排序概述拓扑排序(Topological Sort)是一种用于有向无环图(DAG, Directed Acyclic Graph)的排序算法它将图中的所有顶点排成一个线性序列使得对于图中的每一条有向边(u, v)顶点u在这个序列中都出现在顶点v之前。拓扑排序常用于解决依赖关系问题例如任务调度、课程安排、软件包的安装顺序等。算法步骤计算图中所有顶点的入度指向该顶点的边的数量将所有入度为0的顶点加入队列当队列非空时重复以下步骤从队列中取出一个顶点将其加入结果序列对该顶点的所有邻接顶点将其入度减1如果某个邻接顶点的入度变为0则将其加入队列应用场景任务调度确定任务的执行顺序保证依赖任务先执行编译系统确定程序模块的编译顺序课程安排根据课程的先修关系安排学习顺序软件包管理确定软件包的安装顺序电路分析分析数字电路中的信号传播项目管理项目中各活动的依赖关系分析3.2 拓扑排序实现#include iostream #include vector #include queue #include stack #include unordered_map class TopologicalSort { private: // 图的邻接表表示 std::unordered_mapint, std::vectorint graph; // 顶点数 int numVertices; // DFS辅助函数 void dfs(int u, std::vectorbool visited, std::stackint stack) { visited[u] true; for (int v : graph[u]) { if (!visited[v]) { dfs(v, visited, stack); } } // 在回溯时将顶点加入栈中 stack.push(u); } public: TopologicalSort(int vertices) : numVertices(vertices) { // 初始化图 for (int i 0; i vertices; i) { graph[i] std::vectorint(); } } // 添加有向边 void addEdge(int u, int v) { graph[u].push_back(v); } // 使用Kahn算法进行拓扑排序 std::vectorint topologicalSort() { // 计算所有顶点的入度 std::vectorint inDegree(numVertices, 0); for (int u 0; u numVertices; u) { for (int v : graph[u]) { inDegree[v]; } } // 将所有入度为0的顶点加入队列 std::queueint queue; for (int i 0; i numVertices; i) { if (inDegree[i] 0) { queue.push(i); } } // 存储拓扑排序结果 std::vectorint result; // 从队列中取出顶点并更新其邻接顶点的入度 while (!queue.empty()) { int u queue.front(); queue.pop(); result.push_back(u); for (int v : graph[u]) { inDegree[v]--; if (inDegree[v] 0) { queue.push(v); } } } // 检查是否存在环 if (result.size() ! numVertices) { std::cout 图中存在环无法进行拓扑排序 std::endl; return std::vectorint(); } return result; } // 使用DFS实现拓扑排序 std::vectorint topologicalSortDFS() { std::vectorbool visited(numVertices, false); std::stackint stack; // 对所有未访问的顶点进行DFS for (int i 0; i numVertices; i) { if (!visited[i]) { dfs(i, visited, stack); } } // 将栈中的元素依次取出即为拓扑排序结果 std::vectorint result; while (!stack.empty()) { result.push_back(stack.top()); stack.pop(); } return result; } }; int main() { // 创建图 TopologicalSort g(6); g.addEdge(5, 0); g.addEdge(5, 2); g.addEdge(4, 0); g.addEdge(4, 1); g.addEdge(2, 3); g.addEdge(3, 1); // 使用Kahn算法进行拓扑排序 std::vectorint result g.topologicalSort(); std::cout Kahn算法拓扑排序结果; for (int v : result) { std::cout v ; } std::cout std::endl; // 使用DFS进行拓扑排序 std::vectorint resultDFS g.topologicalSortDFS(); std::cout DFS算法拓扑排序结果; for (int v : resultDFS) { std::cout v ; } std::cout std::endl; return 0; }

相关新闻

这几家光伏逆变器头部厂商半年报出来后,你有没有发现这些问题?

这几家光伏逆变器头部厂商半年报出来后,你有没有发现这些问题?

同一个行业,为什么有人收入下滑,有人接近翻倍,还有人明显增收不增利 图1 半年报上的增减数字,背后其实是产品结构、交付节奏和现金质量的共同结果 先说结论 2026年上半年,逆变器行业不是简单的景气或不景气&#x…

2026/10/26 10:32:18 阅读更多 →
# (免费领源码)SpringBoot+Vue 生鲜水果商城平台‑计算机毕设 JAVA、PHP、python、数据集、APP、小程序、C#C++、单片机、网络工程、大数据、全套文案

# (免费领源码)SpringBoot+Vue 生鲜水果商城平台‑计算机毕设 JAVA、PHP、python、数据集、APP、小程序、C#C++、单片机、网络工程、大数据、全套文案

摘要针对传统生鲜电商功能单一、扩展性不足的问题,基于 SpringBootVueMySQL 开发 B/S 架构生鲜水果商城平台。系统分为普通用户、管理员角色,实现商品浏览购物车、下单评价、水果信息维护、订单管理、ECharts 数据可视化统计等功能。经黑盒、白盒测试&am…

2026/10/26 10:32:28 阅读更多 →
STM32车载CAN总线数据记录与自定义仪表盘开发实战

STM32车载CAN总线数据记录与自定义仪表盘开发实战

连着三个晚上蹲在测试车里,我一直在跟原厂诊断仪较劲。它确实能读出车速、转速这些常规参数,但一旦我想按自己的采样频率记录某个传感器信号,或者把 CAN 总线上的原始报文原封不动抓下来,这台工具就变得很难用。后来我干脆把整套采…

2026/10/26 10:32:28 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/5 12:28:00 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/5 1:08:50 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/5 12:28:01 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/5 12:28:02 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/5 0:54:28 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/4 19:19:54 阅读更多 →

日新闻

周新闻

月新闻