什么是拓扑排序?

拓扑排序的英文名是Topologicalsorting。拓扑排序要解决的问题是给一个图的所有节点排序。

一、什么是拓扑排序

在图论中,拓扑排序(TopologicalSorting)是一个有向无环图(DAG,DirectedAcyclicGraph)的所有顶点的线性序列。且该序列必须满足下面两个条件:

(1)每个顶点出现且只出现一次。

(2)若存在一条从顶点A到顶点B的路径,那么在序列中顶点A出现在顶点B的前面。

有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。

例如,下面这个图:

它是一个DAG图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法:

(1)从DAG图中选择一个没有前驱(即入度为0)的顶点并输出。

(2)从图中删除该顶点和所有以它为起点的有向边。

(3)重复1和2直到当前的DAG图为空或当前图中不存在无前驱的顶点为止。后一种情况说明有向图中必然存在环。

于是,得到拓扑排序后的结果是{1,2,4,3,5}。

通常,一个有向无环图可以有一个或多个拓扑排序序列。

二、拓扑排序的应用

拓扑排序通常用来“排序”具有依赖关系的任务。

比如,如果用一个DAG图来表示一个工程,其中每个顶点表示工程中的一个任务,用有向边表示在做任务B之前必须先完成任务A。故在这个工程中,任意两个任务要么具有确定的先后关系,要么是没有关系,绝对不存在互相矛盾的关系(即环路)。

三、拓扑排序的实现

根据上面讲的方法,我们关键是要维护一个入度为0的顶点的集合。

图的存储方式有两种:邻接矩阵和邻接表。这里我们采用邻接表来存储图,C++代码如下:

intmain(){Graphg(6);//创建图g.addEdge(5,2);g.addEdge(5,0);g.addEdge(4,0);g.addEdge(4,1);g.addEdge(2,3);g.addEdge(3,1);g.topological_sort();return0;}输出结果是4,5,2,0,3,1。这是该图的拓扑排序序列之一。

每次在入度为0的集合中取顶点,并没有特殊的取出规则,随机取出也行,这里使用的queue。取顶点的顺序不同会得到不同的拓扑排序序列,当然前提是该图存在多个拓扑排序序列。

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

THE END
1.初阶数据结构常见五大排序算法及部分算法优化讨论如下图,对于只有一个数字3来说,它就是有序的,这时如果我们要插入44,则跟前面已经排好的3比较,44大于3,44插入在3的后面,排序完成,要插入38,38跟前面的数据比较,38小于44,44往后挪,33大于3,33插入在3的后面,数据有序,排序结束,后面同理。 代码语言:javascripthttps://cloud.tencent.com.cn/developer/article/2476881
2.2026考研计算机知识点盘点:排序考研今天新东方在线考研频道小编为各位考生整理了“2026考研计算机知识点盘点:排序”,相关内容。专业、实用的计算机考研复习备考内容,能使大家更有效率的掌握相关知识点,避免盲目学!更多计算机考研复习精彩内容,时刻关注新东方在线考研频道! 点击下载>考研计算机408历年真题|考试大纲 https://kaoyan.koolearn.com/20241220/1789631.html
3.Day14中高难度算法挑战拓扑排序拓扑排序,基本原理是每次都把入度为0的点移除。注意这些点的先后顺序其实是没有关系的。 fromtypingimportListfromcollectionsimportdefaultdict,dequeclassSolution:""" @param num_courses: a total of n courses @param prerequisites: a list of prerequisite pairs https://www.bilibili.com/read/cv25624858
4.数据结构与算法——拓扑排序(引例拓扑排序伪代码代码关键简介:数据结构与算法——拓扑排序(引例、拓扑排序、伪代码、代码、关键路径问题) 引例 以一个例子开始引进拓扑排序: 根据这个表,我们可以每个课程表示为图的顶点,<V,W>表示边,V为W的预修课程,画出图: 这样就构成了一个AOV网络,即Activity On Vertex 网络。 https://developer.aliyun.com/article/1531072
5.拓扑排序两种实现的代码示例腾讯云开发者社区如果拓扑排序结果中的节点数量等于图中的节点数量,说明排序成功;否则,图中存在环。 下面是 Kahn 算法的 Java 代码实现: import java.util.*; /** * Kahn 算法 * */ public class TopologicalSort { public static List<Integer> kahnTopologicalSort(Map<Integer, List<Integer>> graph, int numNodes) { https://cloud.tencent.com/developer/news/1883128
6.拓扑排序伪代码有向无环图topological sorting with DFS O(n) foreach node:ifnot marked:if(dfs(node)==CYCLE)returnCYCLEreturnOKdfs(node):ifnodeismarkedasvisited:returnOKifnodeismarkedasvisiting:returnCYCLE mark nodeasvisitingforeach new_nodeinnode.neighbors:ifdfs(new_node)==CYCPEreturnCYCLE https://www.jianshu.com/p/9fff9e3be46a
7.拓扑排序示例运行结果 代码简介 代码仓库 作者 SorveyWu(sorvey) 编辑于:2024-10-11 14:49 拓扑排序示例 提示:本站严禁涉政、违法等无关技术的内容 发送 学习嵌入式的绝佳套件,esp8266开源小电视成品,比自己去买开发板+屏幕还要便宜,省去了焊接不当搞坏的风险。 蜂鸣版+触控升级仅36元,更强的硬件、价格全网最低。https://jsrun.net/KYtKp
8.详解Java实现拓扑排序算法java但只要满足即是拓扑排序序列。 另外观察 1 2 4 3 6 5 7 9这个序列满足我们所说的有关系的节点指向的在前面,被指向的在后面。如果完全没关系那不一定前后(例如1,2) 三、拓扑排序代码实现 对于拓扑排序,如何用代码实现呢?对于拓扑排序,虽然在上面详细介绍了思路和流程,也很通俗易懂。但是实际上代码的实现还是https://www.jb51.net/article/214992.htm
9.拓扑排序C++代码实现51CTO博客拓扑排序 C++代码实现,#include<iostream>usingnamespacestd;#defineMAX10000000#defineMAX_VERTEX_NUM20/*顺序栈的定义*/#defineStack_https://blog.51cto.com/u_5173797/7251949
10.拓扑排序c++代码拓扑排序c++代码 什么是拓扑排序 拓扑排序是对一个有向图构造拓扑序列的过程,使得该序列满足:每个顶点出现且只出现一次;若存在一条从顶点A到顶点B的路径,那么在序列中顶点A出现在顶点B的前面。拓扑排序可以用来判断一个有向图是否为DAG (有向无环图)。如果一个有向图可以被拓扑排序,那么这个有向图就是DAGhttps://wenku.baidu.com/view/d6fe9487142ded630b1c59eef8c75fbfc77d94f4.html
11.拓扑排序·NOIP·看云拓扑排序指的是将有向无环(又称“DAG”图)中的顶点按照图中指定的先后顺序进行排序。 图的拓扑排序是对有向无环图来说的,无向图和有环图没有拓扑排序,或者说不存在拓扑排序,对于一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若图G存在边,则u在线性序列中https://www.kancloud.cn/dream_fly/test/981925
12.C语言数据结构拓扑排序(代码演示)拓扑排序代码拓扑排序是对有向图进行排序的一种算法,它可以得到一个顶点的线性序列,使得对于图中的任意一条有向边 (u, v),顶点 u 在序列中都出现在顶点 v 的前面。换句话说,如果存在一条有向边 (u, v),那么在排序后的序列中,顶点 u 出现在顶点 v 的前面。 https://blog.csdn.net/m0_74000825/article/details/135004907
13.同步语言的时间可预测多线程代码生成方法?4.2 基于S-CGA的数据依赖图构造 在串行代码生成中,我们将属于同一个时钟等价类的 S-CGA 等式放在同一个时钟节点上,并对这些等式按 照读写数据依赖关系进行排序(如果为偏序,则采用拓扑排序).从而按照时钟树的顺序,生成串行代码的控制结 构.而在控制结构内,按照经过排序的 S-CGA 等式生成对应的程序代码. 在多https://jos.org.cn/jos/article/pdf/4984
14.换一种角度理解拓扑排序概念 拓扑排序可以用来解决调度问题,比如一些任务之间存在依赖关系,必须先完成某些任务再做其它任务 上图是一些任务之间的依赖关系,按书本上的定义是: 0依赖1 2依赖0和3 那么可能的任务调度顺序是:1,0,3,2或3,1,0,2 因为任务数量比较少,所以比较容易看出拓扑序 https://zhuanlan.zhihu.com/p/663375464