写数据结构作业时想到的一个问题…

我们不妨先做一些这个随机的有向无环图的假设:

  • 首先,它是个有向无环图,并且没有重边
  • 假设随机从图中取出两个不相同的点,那么它们之间有边的概率为固定值(其实还可以有其他类型的随机)

我们一个一个来解决这些问题

让图无环

让一个图无环,关键在于边的方向。对于一个DAG,一定存在一个拓扑序。对于DAG中的每一条边 ,一定是是拓扑序中靠前的点指向拓扑序中靠后的点。那么我们可以给DAG指定一个随机的拓扑序,然后生成边后,根据边的两个端点指定边的方向。这样可以保证图一定是无环的

让边生成概率固定

我们可以枚举任何两个顶点,然后按照给定 p p p 的概率决定是否生成一条边


en,这样就生成了一个比较随机的DAG了,不过生成的复杂度是 O ( n 2 ) O(n^2) O(n2) 的,其中 n n n 是点的个数。如果生成的图节点数量较少,这样似乎也没什么问题。不过,假设要求DAG的点数和边数都是固定值呢?

随机一个给定点数和边数的DAG

其实这一点也很好办,这个DAG最多有 n ( n − 1 ) 2 \frac{n(n - 1)}{2} 2n(n−1)​ 条边(没有重边的话),那么我们在枚举的过程中,可以维护一下目前还需要添加的边数 $a $和没有枚举的边数 b b b

枚举过程可以化为:

  1. 设置 b b b 初始为 n ( n − 1 ) 2 \frac{n(n - 1)}{2} 2n(n−1)​ , a a a 为给定值
  2. 枚举到编号 i , j i, j i,j 之间的点是否连边
  3. 有 a b \frac a b ba​ 的概率生成一条边,如果生成了一条边,那么 a = a − 1 a = a - 1 a=a−1
  4. 还没有枚举的边少了一条, b = b − 1 b = b - 1 b=b−1
  5. 如果没有枚举完,goto 2

这样生成DAG的时间复杂度为 O ( n 2 ) O(n^2) O(n2) ,其实这就是随机生成一个子集

但如果边数比较少而点数比较多,这样的效率还是挺低下的,因为大部分时间都被浪费在了无意义的枚举上。所以是否能找到一些略微高效的方法呢?

假设要生成 m m m 条边,并且 m m m 远小于 n 2 n ^ 2 n2 ,那么我们可以进行如下的循环:

  1. 随机指定两个顶点
  2. 若这两个顶点之间有边,那么goto 1,否则进行下一步
  3. 在这两个顶点之间添加一条边
  4. m = m − 1 m = m - 1 m=m−1
  5. 如果 m m m 不为 0 0 0 ,goto 1,否则结束

由于 m m m 远小于 n 2 n ^ 2 n2,冲突的概率还是很小的,至于怎么检查两条边之间是否有边,可以用一堆乱七八糟的用于查找的数据结构,包括哈希表,平衡树等…

让这个图有唯一的源点 ,并且连通

先不考虑边是否等概率生成

图有唯一的源点,并且连通,那么对于任意一个不是源点的点,都存在一条源点到它的路径

那么如果除了源点之外每一个边都有至少一条边连向它,那么它就一定可达

我们按照拓扑序枚举边的结束点,然后在拓扑序中这个点之前随机找至少一个点作为边的起始点,这样可以保证每一个点都可达

那么,怎么让边的出现等概率呢?

暂时不会,以后再说…

随机生成一棵树

我们只需要在枚举边的结束点的时候,在拓扑序中更靠前的位置中有且只有指定一个点,然后在这两个点之间连一条边。这样我们既可以保证图是连通的,又可以保证有 n − 1 n-1 n−1 条边,那么这就是一棵树


嗯,懒得画图和放代码了

随机生成一个有向无环图相关推荐

  1. AOV网--拓扑排序(必须是一个有向无环图)

     特点: 1.  AOV网用顶点表示活动,用弧表示活动之间优先关系, 2. AOV网中的弧表示活动之间存在某种制约关系, 3. AOV网中不能出现回路(如果有回路,说明某项活动以自己作为先决条件,不允 ...

  2. LeetCode 2192. 有向无环图中一个节点的所有祖先(拓扑排序)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个正整数 n ,它表示一个 有向无环图 中节点的数目,节点编号为 0 到 n - 1 (包括两者). 给你一个二维整数数组 edges ,其中 ed ...

  3. java 有向无环图 树_拓扑排序-有向无环图(DAG, Directed Acyclic Graph)

    条件: 1.每个顶点出现且只出现一次. 2.若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面. 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说. 一 ...

  4. C#实现有向无环图(DAG)拓扑排序

    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在 ...

  5. 数据驱动应用(三):异构数据服务(基于有向无环图DAG)

    概述 主要概念 数据服务(Data Service):对异构数据源,基于有向无环图,提供异构数据的查询和推送能力. 指标:用于衡量事物发展程度的单位或方法,它还有个IT上常用的名字,也就是度量.例如: ...

  6. 数据结构(六):图的概念、存储方式、基本操作、最小生成树、最短路径、有向无环图、关键路径 | Prim、Kruskal算法 | BFS、Dijkstra、Floyd算法 | 拓扑排序 | 求关键路径

    文章目录 第六章 图 一.图 (一)图的定义 (二)图逻辑结构的应用 (三)无向图.有向图 (四)简单图.多重图 (五)顶点的度.入度.出度 (六)顶点-顶点的关系描述 (七)连通图.强连通图 (八) ...

  7. 数据结构-考研难点代码突破 (C++实现有向无环图的拓扑排序)

    文章目录 1. AOV网 2. 拓扑排序 C++代码 1. AOV网 AOV网∶若用DAG 图(有向无环图)表示一个工程,其顶点表示活动,用有向边<Vi,Vj>表示活动 Vi必须先于活动V ...

  8. 有向无环图(DAG)的温故知新

    当我们学习数据结构的时候,总是觉得很枯燥,而当我们解决实际问题的时候,又往往因为对数据结构了解的匮乏而束手无策.从问题中来,到问题中去,在某一点上的深入思考并且不断的实践积累,或许是个笨办法,但笨办法 ...

  9. 带你了解有向无环图和拓扑排序

    写在前面 如果觉得有所收获,记得点个关注和点个赞,感谢支持. 今天遇到有向无环图的一些问题,感觉挺有意思的,而且这些问题的思路特点都差不多,所以想着记录一下.在图论中,如果一个有向图无法从某个顶点出发 ...

最新文章

  1. Python中“is”和“==”的区别
  2. Rust crates.io换国内镜像源
  3. 1个GPU几分钟搞定强化学习训练,谷歌新引擎让深度学习提速1000倍丨开源
  4. 每个程序员都必须知道的8种数据结构
  5. android 自定义viewgroup onmeasure,一篇文章搞懂Android 自定义Viewgroup的难点
  6. 二项式反演[bzoj3622]已经没有什么好害怕的了
  7. linux常用命令--实用小技巧
  8. Bootstrap3 缩写词样式
  9. 中国净水装置行业市场供需与战略研究报告
  10. 数学建模笔记——评价类模型(三)
  11. c#将byte转为int_C# int转byte[],byte[]转int
  12. win10计算机管理界面模糊,Win10电脑屏幕显示模糊
  13. Go channel详解
  14. 孔明锁三通步骤_32根鲁班锁拼装步骤
  15. python编的俄罗斯方块游戏_Python编写俄罗斯方块小游戏
  16. 关于ca以及证书颁发的一些事
  17. 智慧警保综合管理平台
  18. 物联网-云平台可靠性设计
  19. 读书笔记—YES!产品经理(上册)
  20. Vmware相关技巧

热门文章

  1. 解决找不到gpedit.msc文件方法
  2. bandgap基本知识(转载)
  3. android 手电筒开关,Android 系统开关,wifi、手电筒等的开关
  4. 中国RFID市场规模及结构浅析
  5. Logstash报错:[ERROR][logstash.agent ] Failed to execute action {...
  6. word标题编号消失解决
  7. web前端开发中需要掌握的技术:
  8. 科研级试剂材料磷脂聚乙二醇马来酰亚胺 DSPE-PEG-MAL----为华生物
  9. cf1367E 思维+贪心
  10. e470换高分屏_给ThinkPad E470C 换个高分屏(1080P)