给定一组顶点,如何生成具有接近最小边数的强连通有向图?

时间:2015-01-09 00:00:10

标签: c++ search graph dijkstra

我正在尝试对我的图表类的dijkstras算法进行测试。为此,我生成一个包含几千个顶点的图形,然后通过随机添加数千条边来连接图形,直到连接图形为止。然后,我可以反复在任意两个随机顶点之间进行搜索,并确保它们之间存在路径。问题是,我经常最终得到一个几乎密集的图形,因为我使用邻接列表表示,导致我的搜索算法非常慢。

问题: 给定一组顶点V,如何生成一个强连通的有向图,其边缘明显少于相同顶点上的密集图?

我在考虑简单地做以下事情:

vertex 1 <--> vertex 2, vertex 2 <--> vertex 3, ..., vertex n-1 <--> vertex n

然后在整个图表中随机添加类似n / 10的边缘,但这似乎不是提出随机图形结构来测试我的搜索算法的最佳方式。

2 个答案:

答案 0 :(得分:1)

一种方法是维护一组强连通组件(从|V|单顶点组件开始),并在每次迭代中,通过连接随机顶点将它们的一些随机子集合并为单个连通组件每一个到下一个的随机顶点,形成一个循环。

这会产生非常稀疏的图形,因此根据您的使用情况,您可能还需要抛出一些额外的随机边缘。

编辑:直觉我认为你在决定在一次迭代中合并多少个组件时想要使用指数分布。但是,我并没有真正的支持。

答案 1 :(得分:1)

我不知道是否有更好的方法,但至少这似乎有效:

  • 我会在随机顶点之间添加E(有向)边。这将生成几个顶点簇。
  • 然后,我需要连接这些集群以形成一个集群链,从而确保从集群中我可以到达任何其他集群。为此我可以将每个簇的随机顶点标记为&#34; master&#34;顶点,并连接主顶点形成一个循环。因此,您有一个由 cluster 组成的强连接有向图(尚未顶点)。最后一个主设备应该连接回第一个主设备,从而创建一个循环。
  • 现在,为了将它变成由顶点组成的强连通有向图,我需要使每个簇本身成为一个强连接的有向图。但是,如果我从群集的主节点开始运行DFS并且每次找到叶子时,我都很容易从该叶子添加边缘到其主顶点。请注意,DFS不得遍历群集。

我认为这可能有用,虽然拓扑结构不是真正随机的,但它会像一个由连接在一起的较小图形组成的大循环一样循环。但是根据您需要测试的算法,这可能会派上用场。

<强> 编辑:

  • 如果之后您想要具有更随机的拓扑,则可以在不同群集的顶点之间添加随机边。这并不会使规则无效,并为您的算法创建更复杂的路径。