当前位置:首页 > C++知识 > 正文内容

拓扑排序

亿万年的星光11个月前 (07-27)C++知识1088

一、定义

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

通俗地说,‌拓扑排序就是由某个集合上的一个偏序得到该集合上的一个全序的操作。‌

二、拓扑排序方法

(1)在有向图中选一个没有前驱的顶点且输出
(2)从图中删除该顶点和所有以他为尾的弧
(3)重复上述步骤,直到所有的顶点均已输出,或者当图中不存在无前驱的顶点为止。

比如下面这个图:

首先选取了没有前驱的顶点A,把它和以它为尾的弧删除后剩下的图如下:

再从中选取一个没有前趋的顶点。这里选择BCD都可以,我们假设选取的是B,那么删除这个顶点和以他为尾的弧,结果如下:

再从中选取一个没有前趋的顶点,选择C和D都可以,假设选取的是C,那么删除这个顶点和以它为尾的弧,结果如下:


从上面图中再选取一个没有前趋的顶点,选择D,然后把D和以D为尾的弧全部删除,结果如下:

最后剩下一个顶点E,那么其中一种拓扑排序就是ABCDE。


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

标签: 数据结构
分享给朋友:

相关文章

【算法】分治算法

前言所谓分治算法就是指分而治之,即将较大规模的问题分解成几个较小规模的问题,通过对较小问题的求解达到对整个问题的求解。当我们将问题分解成两个较小问题求解时的分治方法称为二分法。比如,我们玩过最简单的猜...

CSP-J2021年普及组复赛T2——插入排序

CSP-J2021年普及组复赛T2——插入排序

【题目描述】插入排序是一种非常常见且简单的排序算法。小 Z 是一名大一的新生,今天 H 老 师刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 O(1),则插入排序可以以 O(n 2...

STL入门——容器2:set

一、简单介绍    set是STL中一个很有用的容器,用来存储同一种数据类型的数据结构(可以称之为K的模型),基本功能与数组相似。set与数组不同的是,在set...

【数据结构】栈—表达式括号匹配

【数据结构】栈—表达式括号匹配

【题目描述】假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则...

【数据结构】队列—基本操作

【数据结构】队列—基本操作

一、C++实例分析       C++队列queue模板类的定义在<queue>头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容...

【高级篇】C++ 中string的用法

【高级篇】C++ 中string的用法

0.概述string是C++标准库的一个重要部分,本意是字符串,和字符数组不同的是,字符数组是通过一个一个字符模拟的字符串,而string本身就是字符串,string在处理字符串问题时,十分强大。1....