拓扑排序

一、定义

拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列

这样说,可能理解起来比较抽象。下面通过简单的例子进行说明!
例如,一个项目包括A、B、C、D四个子部分来完成,并且A依赖于B和D,C依赖于D。现在要制定一个计划,写出A、B、C、D的执行顺序。这时,就可以利用到拓扑排序,它就是用来确定事物发生的顺序的。

在拓扑排序中,如果存在一条从顶点A到顶点B的路径,那么在排序结果中B出现在A的后面。

二、算法思想

记录每个节点的入度和出度,入度为0 的节点为拓扑序列头部。

从上一节点得到下一节,从中选择入度最小的节点加入拓扑序列。

当得到加入拓扑序列的节点出度为0时,排序结束。

如果序列中的节点数少于总节点数,说明该图不是DAG,无法进行拓扑排序。

例:

这是一个简单的DAG


拓扑排序步骤如下:
(1)定义一个队列Q,并把所有入度为0的结点加入队列
(2)取队首结点,访问输出,然后删除所有从它出发的边,并令这些边到达的顶点的入度减1,如果某个顶点的入度减为0,则将其加入队列。
(3)重复进行(2)操作,直到队列为空。如果队列为空时入过队的结点数恰好为N,说明拓扑排序成功,图G为有向无环图;否则,拓扑排序失败,图G有环。

结点0和1的入度都为0,可以任意访问,但是结点2必须在结点0和1访问完之后才能访问,同理结点3和4必须在结点2访问完以后才能访问,但是结点3和4 之间没有依赖关系,结点5必须在结点3和结点6访问之后才能访问,等等.....
因此,对于上图的一个拓扑序列可以是:0,1,2,3,4,6,5,7 也可以是:0,1,2,4,6,3,5,7

拓扑排序两种做法:

​ 1、采用朴素做法,使用二维数组存储有向图

​ 2、使用邻接表存储有向图

ACwing848有向图的拓扑序列>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>AC代码

HDU1285确定比赛名次>>>>>>>>>>>>>AC代码1>>>>>>>>>>>>>>AC代码2

posted @   Trirabbits三兔  阅读(293)  评论(0编辑  收藏  举报
编辑推荐:
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· 2025成都.NET开发者Connect圆满结束
· langchain0.3教程:从0到1打造一个智能聊天机器人
点击右上角即可分享
微信分享提示