本文改编自CSDN,作者ZhouMu,原文链接如下:
https://blog.csdn.net/zhoujinyu0713/article/details/10163037?utm_source=tuicool
本文的主要工作是,说明拓扑序的含义及其在生成DAG时的妙用,并给原文代码标注释。
0. 拓扑序
这一部分主要参考自百度百科中的“拓扑排序”词条。原文链接如下:
https://baike.baidu.com/item/%E6%8B%93%E6%89%91%E6%8E%92%E5%BA%8F/5223807?fromtitle=%E6%8B%93%E6%89%91%E5%BA%8F&fromid=17352962&fr=aladdin
定义:
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
定义中所谓的“偏序”是离散数学中的概念,偏序关系指的是,满足(1)自反性(2)反对称性(3)传递性的关系R。自反性指的是,集合中的任一元素x满足:x R x。反对称性指的是,如果x R y, 则 y R x不成立。传递性指的是,若x R y, y R z, 则有 x R z。
定义中所谓的“全序”也是离散数学中的概念。它在偏序关系的基础上加了限制:集合中任意两个元素都能比较大小。
对有向无环图进行拓扑排序的方法:
![](https://i-blog.csdnimg.cn/blog_migrate/46a95d53340c16b82876f6cc5e76bea8.png)
1. 生成DAG的思路
假设要生成含有N个节点的网络。首先随机生成一个 1 到N 的排列。这个排列就是DAG的拓扑序,然后每次随机从前往后连边,这样就可以保证生成的是一个DAG了。
2. Python代码及注释
下面是原文的代码。我对代码存在两个疑问:
1. 为啥要在每条边后面加上随机生成的两个数?有什么用意?难道是权重?
2. 为啥在最后生成k个随机数?有什么用?
希望知道的小伙伴能给我讲讲。