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

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

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.

相关推荐
热点推荐
糖化血红蛋白对照表!糖友必存,看懂才知道自己血糖好不好

糖化血红蛋白对照表!糖友必存,看懂才知道自己血糖好不好

健康科普365
2026-09-02 22:35:06
彻底摊牌了?一个欠9亿一个骗13.9亿,董卿被爆猛料,原来她和王丽坤同样困境

彻底摊牌了?一个欠9亿一个骗13.9亿,董卿被爆猛料,原来她和王丽坤同样困境

她时尚丫
2026-08-07 18:55:34
NBA历史得分10+场次占比榜:詹姆斯居首

NBA历史得分10+场次占比榜:詹姆斯居首

林间小温柔
2026-09-02 23:15:47
再见,iPhone 17 Pro Max

再见,iPhone 17 Pro Max

果粉俱乐部
2026-09-02 14:07:24
惨遭停映!女神这部18禁巨作为何引发争议

惨遭停映!女神这部18禁巨作为何引发争议

天天美剧吧
2026-09-01 16:38:01
批评中国20年的加拿大华裔,去了洛杉矶3天后,说要给中国人道歉

批评中国20年的加拿大华裔,去了洛杉矶3天后,说要给中国人道歉

掉了颗大白兔糖
2026-08-25 04:11:32
电视都是谁造的?揭秘各大品牌代工源头,国产供应链实力有多恐怖

电视都是谁造的?揭秘各大品牌代工源头,国产供应链实力有多恐怖

小柱解说游戏
2026-09-02 05:44:37
9月2日俄乌:泽连斯基威胁关闭俄罗斯天空,俄军8月损失再破4万

9月2日俄乌:泽连斯基威胁关闭俄罗斯天空,俄军8月损失再破4万

山河路口
2026-09-02 19:57:15
炮制张氏叔侄十年冤狱,女神探聂海芬,民众为何强烈要求从严追责

炮制张氏叔侄十年冤狱,女神探聂海芬,民众为何强烈要求从严追责

墨策讲历史
2026-07-21 16:45:48
小作文之后, 又有大量聊天记录和照片曝光,孙宇晨和景甜的事彻底翻转了

小作文之后, 又有大量聊天记录和照片曝光,孙宇晨和景甜的事彻底翻转了

七阿姨爱八卦
2026-09-02 22:36:02
批量劝退应届生,大众等作出回应,鸿蒙智行、奇瑞、吉利是否也应发声

批量劝退应届生,大众等作出回应,鸿蒙智行、奇瑞、吉利是否也应发声

青锋看点
2026-09-02 08:30:15
被算出来的“一胎化”:1979年那场影响几亿人的决定,陈云为何说“准备挨骂”

被算出来的“一胎化”:1979年那场影响几亿人的决定,陈云为何说“准备挨骂”

z千年历史老号
2026-08-26 21:25:49
中欧基金管理2542亿基金经理张东波离世

中欧基金管理2542亿基金经理张东波离世

观察者网
2026-09-02 20:45:46
中日交涉谈崩后,在紧急时刻,日本官宣重大决定,中方不再留台阶

中日交涉谈崩后,在紧急时刻,日本官宣重大决定,中方不再留台阶

井普独白
2026-09-02 13:22:06
一场3-0让国足收获大喜讯,邵佳一又有一大发现,喜添边路新猛将

一场3-0让国足收获大喜讯,邵佳一又有一大发现,喜添边路新猛将

零度眼看球
2026-09-02 07:13:08
每体:马竞双面对待阿尔瓦雷斯,1.5亿离队门槛+暗示西蒙尼将离任

每体:马竞双面对待阿尔瓦雷斯,1.5亿离队门槛+暗示西蒙尼将离任

懂球帝
2026-09-02 15:29:13
华为新品突然官宣:9月7日,即将发布

华为新品突然官宣:9月7日,即将发布

搞机小帝
2026-09-02 18:34:02
细思极恐!中国常用的一类降压药,可能让糖尿病患者肾脏风险高出33%!

细思极恐!中国常用的一类降压药,可能让糖尿病患者肾脏风险高出33%!

徐德文科学频道
2026-08-21 20:06:13
普京:如果北京认为有益,俄罗斯愿意将与中国之间的免签制度转为永久性

普京:如果北京认为有益,俄罗斯愿意将与中国之间的免签制度转为永久性

俄罗斯卫星通讯社
2026-09-01 15:23:46
300077,参股存储公司!明日,将见证全球首款无方向盘汽车,这些概念股超跌高增长

300077,参股存储公司!明日,将见证全球首款无方向盘汽车,这些概念股超跌高增长

数据宝
2026-09-02 07:38:50
2026-09-02 23:32:49
千纸鹤安安
千纸鹤安安
大自然的搬运工
105文章数 3关注度
往期回顾 全部

科技要闻

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

头条要闻

章泽天专访何超琼 后者辟谣"赌王传言"公开成长经历

头条要闻

章泽天专访何超琼 后者辟谣"赌王传言"公开成长经历

体育要闻

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

娱乐要闻

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

财经要闻

北京首钢园数采中心停运,“百万小时”产能目标的账还算得过来吗?

汽车要闻

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

态度原创

健康
本地
旅游
房产
公开课

越吃越爆痘?医生讲清7大真相

本地新闻

昆明的雨,解锁汪曾祺的浪漫雨季

旅游要闻

忻州荷花开 遍地是吾乡

房产要闻

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

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版