进阶数据结构图——拓扑排序(三)
三、拓扑排序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/8/31 22:32:41 阅读更多 →
# (免费领源码)SpringBoot+Vue 生鲜水果商城平台‑计算机毕设 JAVA、PHP、python、数据集、APP、小程序、C#C++、单片机、网络工程、大数据、全套文案

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

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

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

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

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

2026/8/31 22:31:41 阅读更多 →

最新新闻

2026 提示词注入攻击:黑客一句“忽略之前的指令“就能攻破你的 AI 应用(MonkeyCode 实战)

2026 提示词注入攻击:黑客一句“忽略之前的指令“就能攻破你的 AI 应用(MonkeyCode 实战)

2026 提示词注入攻击:黑客一句"忽略之前的指令"就能攻破你的 AI 应用(MonkeyCode 实战)你以为的 AI 应用:聪明、可靠、只做你让它做的事。 黑客眼里的 AI 应用:一个会被一句话调包的可编程机器人。一、先讲个…

2026/8/31 23:07:02 阅读更多 →
从 Mini Shell 到 Linux 进程通信:深入理解 fork、pipe 与文件描述符

从 Mini Shell 到 Linux 进程通信:深入理解 fork、pipe 与文件描述符

一、引言首先看一条shell指令echo hello | grep hello | wc -c我们平时认为这是“一条命令”,但实际上 Linux 内核看到的是:Shell│├── fork → echo│├── fork → grep│└── fork → wcecho ── pipe ──> grep ── pipe ──> wc那么…

2026/8/31 23:07:02 阅读更多 →
低GI大米怎么选?看报告更看口感

低GI大米怎么选?看报告更看口感

要弄清低gi大米哪个品牌好,别盯包装上印了多少粗粮图案,唯一的硬指标是看它有没有正规检测报告证明GI值小于55。据《控糖主食赛道观察报告》2026年8月的数据,国内需要关注主食血糖反应的人群已超4.5亿。但真能兼顾数据达标和白米饭口感的产品…

2026/8/31 23:07:02 阅读更多 →
隔离型USB转串口桥接器从零设计:原理、选型与调试全攻略

隔离型USB转串口桥接器从零设计:原理、选型与调试全攻略

最近在整理调试工具,手头攒了不少“Isolated USB Serial Bridge”的小板子,也就是隔离型USB转串口桥接器。这名字听起来有点绕,其实干的事很直接:一边是USB口接电脑,另一边是UART TTL电平接目标板子,但中间…

2026/8/31 23:07:02 阅读更多 →
功率因数校正实战指南:从力调电费到电容补偿柜选型

功率因数校正实战指南:从力调电费到电容补偿柜选型

说到功率因数校正(Power Factor Correction),我最早接触这个名词是在一家机械加工厂的配电房。当时那家厂每个月都被供电公司扣一笔“力调电费”,少则两千,多则五六千,老板心疼又搞不清楚原因。我们拿着电费…

2026/8/31 23:07:02 阅读更多 →
程序员大面积“认知萎缩“:几亿人用 AI 编程,能懂代码的却在灭绝!

程序员大面积“认知萎缩“:几亿人用 AI 编程,能懂代码的却在灭绝!

AI一键生成的代码正以每天数十亿行的速度涌入生产环境, 在此情形下, 真正能读懂底层逻辑的人为何在急剧减少? 在效率呈现狂欢态势之际, 我们是不是正在把“思考本身”外包给一个无法解释的黑盒?下面这场深度对话, 是关于AI与编程的, 或许能给出一些真实的答案。事实上, 很多程…

2026/8/31 23:06:01 阅读更多 →

日新闻

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形

接到一个仪表类项目,要在 LAT1189 上输出几种不同波形:正弦、三角、带可调死区的脉冲,频率和幅度都得能实时改。板子上没有 DAC,就一个定时器加几个 DMA 通道。我一开始觉得在定时器中断里改比较寄存器也能应付,后来把…

2026/8/31 0:00:05 阅读更多 →
Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查

Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查

前两周调试一块带着Cortex-M3内核的板子,IDE里下载固件时突然弹出一行刺眼的错误: error: flash download failed - cortex-m3 。这种报错在嵌入式开发里太常见了,常见到很多人第一反应就是换根数据线、重插一下调试器,但重启三…

2026/8/31 0:00:05 阅读更多 →
STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

做STM32 GUI开发的朋友应该都有体会——界面搭得再漂亮,一旦屏幕切换卡成PPT,整个产品的档次瞬间就没了。早期我在LAT1212这个基于STM32的GUI工程上用TouchGFX做二次开发,最头疼的不是画界面,而是怎么让切换动画既流畅又自然。Tou…

2026/8/31 0:00:05 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/8/31 13:13:27 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

2026/8/31 9:02:46 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/8/31 14:32:14 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/30 21:10:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/30 18:07:21 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/30 21:10:44 阅读更多 →