给定一组顶点,如何生成具有几乎最少边量的强连接有向图
Given a set of vertices, how do you generate a strongly-connected directed graph with a near-minimal amount of edges?
我正在尝试对我的图类的dijkstras算法进行测试。为此,我生成一个包含几千个顶点的图,然后通过随机添加数千条边来连接图,直到图连接起来。然后,我可以一遍又一遍地在任意两个随机顶点之间运行搜索,并确保它们之间有路径。问题是,我经常得到一个近乎密集的图,因为我使用的是邻接列表表示形式,导致我的搜索算法非常慢。
问题 :给定一组顶点 V,如何生成一个强连接的有向图,其边明显少于相同顶点上的密集图?
我正在考虑简单地执行以下操作:
vertex 1 <--> vertex 2, vertex 2 <--> vertex 3, ..., vertex n-1 <--> vertex n
然后在整个图形中随机添加 n/10 条边,但这似乎不是提出随机图形结构来测试我的搜索算法的最佳方法。
一种方法是维护一组强连接的组件(从|V|
个单顶点组件开始),并在每次迭代中,通过将每个组件的随机顶点连接到下一个顶点的随机顶点,将它们中的某个随机子集合并为单个连接的组件,形成一个循环。
这往往会生成非常稀疏的图形,因此根据您的用例,您可能还想加入一些额外的随机边缘。
编辑:直观地,我认为在决定在一次迭代中合并多少个组件时,您希望使用指数分布。不过,我对此没有任何真正的支持。
我不知道
是否有更好的方法,但至少这似乎有效:
- 我会在随机顶点之间添加 E(定向)边。这将生成多个顶点聚类。
- 然后,我需要连接这些集群以形成集群链,以确保我可以从一个集群到达任何其他集群。为此,我可以将每个聚类的随机顶点标记为"主"顶点,并连接主顶点形成循环。因此,您有一个由聚类(还不是顶点)组成的强连接有向图。最后一个主节点应连接回第一个主节点,从而创建一个循环。
- 现在,为了将其转换为由顶点组成的强连接二合图,我需要使每个聚类本身成为强连接二合图。但是,如果我从集群的主节点开始运行 DFS,并且每次找到叶子时,我都会从该叶子到其主顶点添加一条边,这很容易。请注意,DFS 不得遍历群集外部。
我认为这可能会起作用,尽管拓扑不会是真正随机的,但它会像由连接在一起的较小图形组成的大循环一样循环。但根据您需要测试的算法,这可能会派上用场。
编辑:
- 如果之后您想要更随机的拓扑,则可以在不同聚类的顶点之间添加随机边。这不会使规则无效,并会为算法创建更复杂的路径。
相关文章:
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- C++创建指向有向图中节点的指针数组
- 如何仅在 2 个节点之间获取最短路径,给定邻接列表有向图?
- 有向图 - 如何计算图中彼此顶点可到达的顶点数?
- C++计算有向图中的最短路径
- 使用非递归 DFS 检测有向图中的周期
- 如何将这些节点连接为有向图
- 如何使用广度优先搜索确定是否可以在有向图中到达顶点
- 在有向图中精确访问所有节点一次
- 在有向图中查找第二条最短路径
- 关于如何处理有向图的一个想法
- 找到有向图C 的最短路径
- 分析输入文件以创建有向图C++
- 在使用无序多映射实现的有向图中查找循环
- 如何找到在c++中实现的有向图的所有路径作为邻接列表
- 如何创建具有多个数据的节点的有向图
- 有向图中的广度优先搜索
- 查找路径的有向图邻接矩阵
- 给定一组顶点,如何生成具有几乎最少边量的强连接有向图
- 单连接有向图