网易首页 > 网易号 > 正文 申请入驻

拓扑排序原理详解:有向无环图的排序方法

0
分享至

做番茄炒蛋这事,其实藏着个经典的算法问题。你得先洗番茄才能切番茄,先打蛋才能搅拌蛋液,切番茄和搅拌蛋液可以同时干,但都备好了才能下锅。这一串"谁必须在谁前面"的约束,就是拓扑排序要解决的活儿。

说白了,拓扑排序干的事很简单:给一个有向无环图(DAG)的所有顶点排个序,规则就一条——如果 A 指向 B,那 A 必须排在 B 前面。

注意,前提是"无环"。如果 A 依赖 B、B 又依赖 A,那就成了死循环,谁也排不了。这也是为什么拓扑排序只能用在 DAG 上——有环的图根本排不出一个合理的顺序来。



那具体怎么排?最经典的思路叫 Kahn 算法,也叫入度法。入度,就是有多少个节点指向它。比如节点 1 被两个节点指着,入度就是 2;节点 2 没人指,入度就是 0。

整个流程就三步:

第一步,把图中所有入度为 0 的节点找出来,塞进一个队列。入度为 0 意味着没有前置依赖,随时可以开工。



第二步,从队列里取出一个节点,输出它,然后把它指向的所有节点的入度减 1。相当于这个活干完了,它罩着的那些兄弟少了一个依赖。



第三步,重复第二步,过程中一旦有节点入度变成 0,就把它加进队列。直到队列空了,输出的顺序就是答案。





这算法时间复杂度 O(V+E),每个节点每条边都过一遍,效率很高,代码也不难写:

#include
usingnamespacestd;
vector e[105];// e[i] 存 i 指向的所有节点
queue q; // 存放入度为 0 的节点
intd[105], vis[105];
intmain(){
intn; cin >> n;
for(inti =1; i <= n; i++) {
while(1) {
inta; cin >> a;
e[i].push_back(a);
if(a ==0)break;
d[a]++;// 记录入度
}
}
for(inti =1; i <= n; i++) {
if(d[i] ==0) { q.push(i); vis[i] =1; }
}
while(!q.empty()) {
intx = q.front(); q.pop();
cout << x <<" ";
for(inti : e[x]) {
if(vis[i])continue;
d[i]--;
if(d[i] ==0) { vis[i] =1; q.push(i); }
}
}
return0;
}

写代码的时候有几个坑要注意:一是要标记已访问,防止同一个节点重复入队;二是入度减完之后要立刻判断是不是 0,是 0 才入队,不然队列里会混进还没准备好的节点。

光讲概念没意思,来看道真题。洛谷 P4017 最大食物链计数,给你一个食物网,数出最大食物链的数量。生物意义上,最左端是不会捕食其他生物的生产者,最右端是不会被捕食的消费者。

这题就是拓扑排序加 DP:dp[i] 表示到达节点 i 的路径数。把所有入度为 0 的生产者初始化为 1,然后按拓扑序往下推,每经过一条边就把路径数累加过去,最后把出度为 0 的消费者节点的 dp 值加起来,就是答案。

讲道理,拓扑排序在真实项目里到处都是:编译器做依赖分析、构建工具排任务的执行顺序、课程表排先修课、包管理器解决依赖关系……你天天在用,只是没意识到它叫这个名字。

我个人觉得,这种"基础算法"反而是最值得花时间吃透的,因为它是很多工程问题的底层骨架。你在项目里用过拓扑排序吗?评论区聊聊你的场景。

声明:内容由AI生成

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
美军现役中将认为,中国实力不是接近美国,而是已经和美国对等

美军现役中将认为,中国实力不是接近美国,而是已经和美国对等

共工之锚
2026-09-03 00:16:16
中共中央批准,开除岳普煜党籍

中共中央批准,开除岳普煜党籍

新京报政事儿
2026-09-02 18:14:05
美股三大指数期货跳水,美股芯片股、中概股盘前下跌,黄金逼近4300美元,全球债市抛售潮继续蔓延

美股三大指数期货跳水,美股芯片股、中概股盘前下跌,黄金逼近4300美元,全球债市抛售潮继续蔓延

21世纪经济报道
2026-09-02 18:47:22
开豪车住别墅打造“富婆”人设!网红“曲靖丽姐”涉嫌刑案被警方调查

开豪车住别墅打造“富婆”人设!网红“曲靖丽姐”涉嫌刑案被警方调查

红星新闻
2026-09-01 15:28:36
牡丹花下死?汪峰将森林北踢出局,这次终于彻底印证葛荟婕的评价

牡丹花下死?汪峰将森林北踢出局,这次终于彻底印证葛荟婕的评价

历史的烟火
2026-08-14 15:48:04
民政部、中央社会工作部、财政部、全国老龄办、中国老龄协会,联合印发通知

民政部、中央社会工作部、财政部、全国老龄办、中国老龄协会,联合印发通知

政知新媒体
2026-09-02 16:34:53
一物降一物!杨瀚森强势崛起,彻底压制三位国产中锋,处境集体尴尬

一物降一物!杨瀚森强势崛起,彻底压制三位国产中锋,处境集体尴尬

体育见习官
2026-09-01 19:05:16
卷款18亿移民英国、窃取杨振宁研究成果,翁帆身上哪个标签是真的

卷款18亿移民英国、窃取杨振宁研究成果,翁帆身上哪个标签是真的

知法而形
2026-07-18 00:12:15
星宇不怕网友抵制,他们的客户还有:奇瑞大众理想丰田赛利斯蔚来小鹏等

星宇不怕网友抵制,他们的客户还有:奇瑞大众理想丰田赛利斯蔚来小鹏等

曹莽看世界
2026-09-02 18:03:43
广东佛山拟规定:临街阳台和窗外不得晾晒有碍市容的物品 违者最高罚500元

广东佛山拟规定:临街阳台和窗外不得晾晒有碍市容的物品 违者最高罚500元

每日经济新闻
2026-09-02 23:45:13
“断子绝孙”还有救?联合国曾预言:2050年,中国人口将出乎意料

“断子绝孙”还有救?联合国曾预言:2050年,中国人口将出乎意料

悦心知足
2026-08-23 03:55:40
这个社会怎么了?国家连年给退休人员涨养老金,还有人吐槽没必要

这个社会怎么了?国家连年给退休人员涨养老金,还有人吐槽没必要

兵卒史
2026-08-13 13:02:09
劝退107名应届生引爆连锁反应!星宇事件后,有车企供应商怕丢欧美订单,不敢随便裁员

劝退107名应届生引爆连锁反应!星宇事件后,有车企供应商怕丢欧美订单,不敢随便裁员

火山詩话
2026-09-02 05:32:35
一边鞠躬道歉,一边投诉媒体!星宇再次道歉,不是知错,是亏怕了

一边鞠躬道歉,一边投诉媒体!星宇再次道歉,不是知错,是亏怕了

生活新鲜市
2026-09-03 01:45:44
局势还是走到了这一步,伊朗万万没想到,哈马斯居然跪在了黎明前

局势还是走到了这一步,伊朗万万没想到,哈马斯居然跪在了黎明前

午夜搭车a
2026-08-25 23:22:55
“一个月陪睡一两次”:网红魏莹的榜一大哥照片曝光,他身价过亿,是个大企业家

“一个月陪睡一两次”:网红魏莹的榜一大哥照片曝光,他身价过亿,是个大企业家

江山挥笔
2026-08-25 16:40:36
参考美国案例,甲醛白菜应该判刑4287年,罚款1914亿

参考美国案例,甲醛白菜应该判刑4287年,罚款1914亿

小小河
2026-08-23 18:33:09
TA:曼联是唯一没有引进‘亿元先生’的传统BIG6俱乐部;记者:曼联认为已为肖提供足够多的替补人选

TA:曼联是唯一没有引进‘亿元先生’的传统BIG6俱乐部;记者:曼联认为已为肖提供足够多的替补人选

MUREDS
2026-09-02 23:47:16
尼泊尔“楼坚强”走红网络!网友:这个打叉三角结构非常重要,坚固原因就在于此,建议新的海关边检大楼也要这样设计

尼泊尔“楼坚强”走红网络!网友:这个打叉三角结构非常重要,坚固原因就在于此,建议新的海关边检大楼也要这样设计

火山詩话
2026-09-01 16:33:31
为什么今年新生名字开始回归典籍雅韵了

为什么今年新生名字开始回归典籍雅韵了

风铃草语
2026-09-02 06:48:02
2026-09-03 03:04:49
千纸鹤安安
千纸鹤安安
大自然的搬运工
105文章数 3关注度
往期回顾 全部

科技要闻

凌晨最强模型上新,Claude Fable 5.1发布

头条要闻

游客拍下疑冰崩画面:土石翻涌 山间有黑色物体涌出

头条要闻

游客拍下疑冰崩画面:土石翻涌 山间有黑色物体涌出

体育要闻

一次有奖问答,让他成为欧冠主帅

娱乐要闻

香港武打影星陈观泰离世,终年80岁

财经要闻

星宇股份的麻烦,才刚开始

汽车要闻

配双腔空悬+机械差速锁 传祺越7预售权益价17.18万起

态度原创

房产
教育
亲子
手机
军事航空

房产要闻

新四代住宅 新样板间开放丨以艺术之名 赴一场迭代之约

教育要闻

一学期只能紧急上一次厕所!县中越卷越离谱,学生憋尿能上清北?

亲子要闻

为啥老人一定要给儿子带小孩儿!网友:这是看到过的很正确的解释

手机要闻

三天连着!OPPO、荣耀、vivo齐发布新款系统,到底谁会是最终选择?

军事要闻

特朗普威胁伊朗终极打击蓄势待发

无障碍浏览 进入关怀版