拓扑排序(一)之 C语言详解

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

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

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

拓扑排序算法的基本步骤:

1. 构造一个队列Q(queue) 和 拓扑排序的结果队列T(topological);
2. 把所有没有依赖顶点的节点放入Q;
3. 当Q还有顶点的时候,执行下面步骤:
3.1 从Q中取出一个顶点n(将n从Q中删掉),并放入T(将n加入到结果集中);
3.2 对n每一个邻接点m(n是起点,m是终点);
3.2.1 去掉边

以上图为例,来对拓扑排序进行演示。

第1步:将B和C加入到排序结果中。
顶点B和顶点C都是没有依赖顶点,因此将C和C加入到结果集T中。假设ABCDEFG按顺序存储,因此先访问B,再访问C。访问B之后,去掉边

因此访问顺序是: B -> C -> A -> D -> E -> F -> G

拓扑排序是对有向无向图的排序。下面以邻接表实现的有向图来对拓扑排序进行说明。

1. 基本定义

(01) LGraph是邻接表对应的结构体。 vexnum是顶点数,edgnum是边数;vexs则是保存顶点信息的一维数组。
(02) VNode是邻接表顶点对应的结构体。 data是顶点所包含的数据,而first _edge是该顶点所包含链表的表头指针。
(03) ENode是邻接表顶点所包含的链表的节点对应的结构体。 ivex是该节点所对应的顶点在vexs中的索引,而next_edge是指向下一个节点的。

2. 拓扑排序

说明:
(01) queue的作用就是用来存储没有依赖顶点的顶点。它与前面所说的Q相对应。
(02) tops的作用就是用来存储排序结果。它与前面所说的T相对应。

Original: https://www.cnblogs.com/skywang12345/p/3711489.html
Author: 如果天空不死
Title: 拓扑排序(一)之 C语言详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/536539/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C语言实现简易log工具

    0x0 目的 0x1 不用 cout 0x2 不直接用 printf 0x3 用宏实现,而不用函数实现 0x4 简易实现 0x41 最简实现 0x42 打印行号、文件名、自动换行 …

    C语言 2023年5月29日
    066
  • C语言常见字符串 — 好玩但没怎么用过

    C语言strspn()函数:计算字符串str中连续有几个字符都属于字符串accept C语言strcspn()函数:计算字符串str中连续有几个字符都不属于字符串accept C语…

    C语言 2023年5月29日
    060
  • 最值得学习阅读的10个C语言开源项目代码

    Webbench Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模…

    C语言 2023年5月29日
    062
  • Crystal 软件学堂:每周一练【C语言】

    由于新申请的公众号已经没有留言功能了,所以如果有疑问,可以在公众号私聊我,也可以在博客园留言还可以加入QQ交流群。 今天的题目很有意思,值得一看哦,查看链接,请点击: Crysta…

    C语言 2023年5月29日
    073
  • JavaSE 类继承中函数重写

    (1) /** * 继承时重写方法的返回类型可以不一样 * 这时的返回值类型必须是与父类相同或者为子类。 */ class A { public Object func(){ re…

    C语言 2023年5月29日
    076
  • 理解C语言声明的优先级规则

    A 声明从它的名字开始读取,然后按照优先级顺序依次读取。 B 优先级从高到低依次是: B.1 声明中被括号括起来的那部分 B.2 后缀操作符: 括号()表示这是一个函数,而 方括号…

    C语言 2023年5月29日
    058
  • c语言中gets ,getschar 和fgets 的用法及三者之间的差别,还有scanf

    ① gets——从标准输入接收一串字符,遇到’\n’时结束,但不接收’\n’,把 ‘\n’留存输入缓冲区;把…

    C语言 2023年5月29日
    073
  • c语言文件处理 (上课用)

    源文件: include //写函数void writetext(FILE *fw){char str[80];gets(str);while(strcmp(str,”…

    C语言 2023年5月29日
    071
  • C语言字符串操作总结大全(超详细)

    1)字符串操作strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, …

    C语言 2023年5月29日
    042
  • c语言编译器介绍

    一、IDE(集成开发环境) 1.windows 编译器 2.Mac中使用 二、环境安装 1.windows安装gcc A、进入安装所在目录,找到MinGW. B、找到我的电脑,右键…

    C语言 2023年5月29日
    082
  • C语言声明知识体系总结大学霸IT达人

    C语言声明知识体系总结大学霸IT达人 声明(declaration)决定一个或多个标识符的重要性和属性。所声明的标识符可以是对象的名称、函数的名称等。 对象和函数的标识符可以有各式…

    C语言 2023年5月29日
    071
  • 逆向初级-C语言(二)

    2.1.C语言的汇编表示 c语言代码 int plus(int x,int y) { return 0; } void main() { __asm { mov eax,eax }…

    C语言 2023年5月29日
    052
  • 文件加密的简单实现(C语言)

    需求:以DWORD为单位对文件进行加密,将每个DWORD与0xfcba0000做异或,写入另一个文件 解答: #include #include #define DWORD uns…

    C语言 2023年5月29日
    088
  • 快速学习C语言一: Hello World

    估计不会写C语言的同学也都听过C语言,从头开始快速学一下吧,以后肯定能用的上。 如果使用过其它类C的语言,如JAVA,C#等,学C的语法应该挺快的。 先快速学习并练习一些基本的语言…

    C语言 2023年5月29日
    078
  • 遗传算法的C语言实现(二)—–以求解TSP问题为例

    上一次我们使用遗传算法求解了一个较为复杂的多元非线性函数的极值问题,也基本了解了遗传算法的实现基本步骤。这一次,我再以经典的TSP问题为例,更加深入地说明遗传算法中选择、交叉、变异…

    C语言 2023年5月29日
    072
  • C语言实现粒子群算法(PSO)一

    最近在温习C语言,看的书是《C primer Plus》,忽然想起来以前在参加数学建模的时候,用过的一些智能算法,比如遗传算法、粒子群算法、蚁群算法等等。当时是使用MATLAB来实…

    C语言 2023年5月29日
    059
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球