拓扑排序(完整案列及C语言完整代码实现)

写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做自己以后不会留有遗憾的事,做自己觉得有意义的事,不浪费这大好的青春年华。博主写博客目的是记录所学到的知识并方便自己复习,在记录知识的同时获得部分浏览量,得到更多人的认可,满足小小的成就感,同时在写博客的途中结交更多志同道合的朋友,让自己在技术的路上并不孤单。

目录:
1.全序和偏序
2.拓扑排序的方法
3.拓扑排序C语言完整代码实现
4.拓扑排序小结

1.全序和偏序

拓扑排序指的是将有向无环图(又称“DAG”图)中的顶点按照图中指定的先后顺序进行排序。

在这里插入图片描述

例如,上图 中的两个图都是有向无环图,都可以使用拓扑排序对图中的顶点进行排序,两个图形的区别是:左图中的 V2 和 V3之间没有明确的前后顺序;而右图中任意两个顶点之间都有前后顺序。

所以,左图中顶点之间的关系被称为“偏序”关系;右图中顶点之间的关系被称为”全序“关系。全序是偏序的一种特殊情况。对于任意一个有向无环图来说,通过拓扑排序得到的序列首先一定是偏序,如果任意两个顶点都具有前后顺序,那么此序列是全序。

2.拓扑排序的方法

对有向无环图进行拓扑排序,只需要遵循两个原则:

  1. 在图中选择一个没有前驱的顶点 V;
  2. 从图中删除顶点 V 和所有以该顶点为尾的弧

上面左图拓扑排序如下:
在这里插入图片描述

对于此图来说,拓扑排序有两种:

1.V1 -> V2 -> V3 -> V4
2.V1 -> V3 -> V2 -> V4
如果顶点之间只是具有偏序关系,那么拓扑排序的结果肯定不唯一;如果顶点之间是全序关系,那么拓扑排序得到的序列唯一

有向无环图如果顶点本身具有某种实际意义,例如用有向无环图表示大学期间所学习的全部课程,每个顶点都表示一门课程,有向边表示课程学习的先后次序,例如要先学《程序设计基础》和《离散数学》,然后才能学习《数据结构》。所以用来表示某种活动间的优先关系的有向图简称为“AOV 网”。

3.拓扑排序C语言完整代码实现

在编写程序解决拓扑排序的问题时,大致思路为:首先通过邻接表将 AOV 网进行存储,由于拓扑排序的整个过程中,都是以顶 点的入度为依据进行排序,所以需要根据建立的邻接表统计出各顶点的入度。 在得到各顶点的入度后,首先找到入度为 0 的顶点作为拓扑排序的起始点,然后查找以该顶点为起始点的所有顶点,如果入度 为 1,说明如果删除前一个顶点后,该顶点的入度为 0,为拓扑排序的下一个对象

#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20//最大顶点个数
#define VertexType int//顶点数据的类型
typedef enum{
   false,true} bool;
typedef struct ArcNode{
   
   int adjvex;//邻接点在数组中的位置下标
   struct ArcNode * nextarc;//指向下一个邻接点的指针
}ArcNode;
typedef struct VNode{
   
   VertexType data;//顶点的数据域
   ArcNode * firstarc;//指向邻接点的指针
}VNode,AdjList[MAX_VERTEX_NUM];//存储各链表头结点的数组
typedef struct {
   
   AdjList vertices;//图中顶点及各邻接点数组
   int vexnum,arcnum;//记录图中顶点数和边或弧数
}ALGraph;
//找到顶点对应在邻接表数组中的位置下标
int LocateVex(ALGraph G,VertexType u){
   
   for (int i=0; i<G.vexnum; i++) {
   
    if (G.vertices[i
  • 65
    点赞
  • 345
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值