简述图之拓扑排序(python)实现

要想知道什么是拓扑排序,那首先得有数学功底嘛,所以我们先来说说离散数学中的偏序和全序的概念。

偏序: 集合内只有部分元素之间在这个关系下是可以比较的
比如:比如复数集中并不是所有的数都可以比较大小,那么“大小”就是复数集的一个偏序关系

全序: 集合内任何一对元素在在这个关系下都是相互可比较的
比如:有限长度的序列按字典序是全序的~(最常见的是单词在字典中是全序的)

当然我们来看看标准定义:
偏序的定义:
设R是集合A上的一个二元关系,若R满足:
Ⅰ 自反性: 对任意x∈A,有xRx;
Ⅱ 反对称性(即反对称关系): 对任意x,y∈A,若xRy,且yRx,则x=y;
**Ⅲ 传递性:**对任意x, y,z∈A,若xRy,且yRz,则xRz。
则称R为A上的偏序关系。

全序的定义:
设集合X上有一全序关系,如果我们把这种关系用 ≤ 表述,则下列陈述对于 X 中的所有 a, b 和 c 成立:
如果 a ≤ b 且 b ≤ a 则 a = b (反对称性)
如果 a ≤ b 且 b ≤ c 则 a ≤ c (传递性)
a ≤ b 或 b ≤ a (完全性)

当然了全序关系必然是偏序关系

了解了偏序,全序关系,现在来说说拓扑排序了。
拓扑排序: 简单地说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作就称之为拓扑排序。

那么拓扑排序有啥用呢?为啥要有它呢?这就是重点了。
一个表示偏序的有向图可用来表示一个流程图,它或者是一个施工流程图,或者是一个产品生产的流程图,又或者是一个数据流图(每个顶点表示一个过程),图中的每一条边表示两个子工程之间的次序关系(领先关系)。这种使用顶点表示活动,用弧(边)表示活动间的优先关系的有向图称为顶点表示活动的网(Activity On Vertrx Network),简称AOV网。在网中,若顶点 i 到顶点 j 有一条有向路径,则 i 是 j 的前驱;j 是 i 的后继。若<i,j>是网中的一条弧,则i是j的直接前驱;j是i的直接后继。

在AOV网中,不应该存在有向环,某项活动的先决条件是它本身,这是矛盾的。因此我们先得检查图中是否存在有向环。那么检测的办法就是对有向图构造其顶点的拓扑有向序列,若序列中所有顶点都在,则必然不存在环。

于是乎,构造这个拓扑有向序序列的方法就是拓扑排序。

到底怎样进行拓扑排序呢?

拓扑排序的步骤:
1、在有向图中选择一个没有钱去的顶点且输出它;
2、从图中删除该顶点和所有以它为尾的弧;
3、重复上面的两步,直到所有的顶点均已输出,或者当前图中不存在无前驱的顶点为止,其实后者就说明图中存在环。

举个例子,例如下图:
在这里插入图片描述
我们按照拓扑排序的步骤来写出该图的一个拓扑有序序列:
(1)找到没有前驱的顶点V1或者V6并输出,我们就选V6吧。
(2)删除V6以及以V6为尾的弧。注意(弧的箭头处为弧头,没有箭头的一端为弧尾)
在这里插入图片描述
(3)找到没有前驱的顶点V1,输出并删除
在这里插入图片描述
(4)找到V4,输出并删除
在这里插入图片描述
(5)找到V3,输出并删除
在这里插入图片描述
(6)找到V2,输出并删除
在这里插入图片描述
最后得到该图的一个拓扑有序序列为:
在这里插入图片描述
下面我们用键值对来存储有向无环图,然后再进行拓扑排序

构建及存储有向无环图:

'''有向无环图的存储'''
class Graph():
    def __init__(self):
        nodelist = list(map(str,input('请输入图中的结点,以空格分开:').split<
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值