拓扑排序(一)之 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)

大家都在看

  • typedef的用法,C语言typedef详解

    http://c.biancheng.net/view/298.html Original: https://www.cnblogs.com/eustoma/p/10534221….

    C语言 2023年5月29日
    052
  • C语言-转

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/JohnABC/p/8458883.htmlAuthor…

    C语言 2023年5月29日
    062
  • c语言 结构体(二)-上课用

    源程序: //编写一个函数print,输出学生的信息,该数组有5个学生的记录,包括://num, sname, score[3],用主函数输入这些记录,用print函数输出这些记录…

    C语言 2023年5月29日
    070
  • C#传委托给C语言的函数指针调用问题

    C代码如下: 多次验证发现在C#中传委托给C中的函数指针,如果委托不带参数则都能成功运行,但是委托一带参数不管是int参数还是string参数或者其他参数,都会报” 尝…

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

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

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

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

    C语言 2023年5月29日
    060
  • 再次实践用c语言来编写webgl

    当年asm.js出来的时候,emscripten这个工具链还不是很好用,不,是很难用。 尝试以后,被一个helloworld 好几兆吓退了。 webassembly 如今已经发育的…

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

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

    C语言 2023年5月29日
    071
  • 【揭秘】C语言类型转换时发生了什么?

    ID:技术让梦想更伟大作者:李肖遥链接:https://mp.weixin.qq.com/s/ZFf3imVaJgeesuhl1Kn9sQ 在C语言中,数据类型指的是用于声明不同类…

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

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

    C语言 2023年5月29日
    071
  • Picoc C语言解释器简介,及STM32平台移植工程

    Picoc是google开源代码项目中看到的一个项目,其初衷貌似是要做一个在小的嵌入设备上的C解释器。它的核心代码只有3500行左右,可读性不错,虽然没有实现完整的ISO C标准,…

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

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

    C语言 2023年5月29日
    073
  • Dijkstra算法(一)之 C语言详解

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 基本…

    C语言 2023年5月29日
    078
  • C语言——if(0)之后的语句真的不会执行吗?

    1、序 学过c语言的都知道,通常:If(0)之后的代码是不执行的,网上也有详细的说明。 1.1、形式: if (表达式) { 语句… } 1.2、解释: 在执行if语句…

    C语言 2023年5月29日
    085
  • C语言函数知识体系大学霸IT达人

    C语言函数知识体系大学霸IT达人 C语言中的函数会集成一条或多条命令(语句)用于实现指定的一个或多个功能。简单的可以将函数理解为一个工具,例如,锤子。锤子的功能是砸东西,木柄和锤头…

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

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

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