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

Posted

技术标签:

【中文标题】给定一组顶点,如何生成具有接近最少边数的强连通有向图?【英文标题】:Given a set of vertices, how do you generate a strongly-connected directed graph with a near-minimal amount of edges? 【发布时间】:2015-01-09 00:00:10 【问题描述】:

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

问题: 给定一组顶点 V,你如何生成一个强连接的有向图,它的边比相同顶点上的密集图的边要少得多?

我正在考虑简单地执行以下操作:

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

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

【问题讨论】:

【参考方案1】:

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

这往往会生成非常稀疏的图,因此根据您的用例,您可能还想加入一些额外的随机边。

编辑:直觉上,我认为在决定在一次迭代中合并多少个组件时,您会想要使用指数分布。不过,我对此没有任何真正的支持。

【讨论】:

这与建议的其他答案相似,听起来是解决问题的好方法,感谢您的意见。【参考方案2】:

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

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

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

编辑:

如果之后你想要一个更随机的拓扑,你可以在不同簇的顶点之间添加随机边。这不会使规则无效,并为您的算法创建更复杂的遍历路径。

【讨论】:

非常有趣的响应,实现起来也很有趣,我会告诉你它是如何工作的。现在,我正在对具有 2000 个顶点和 422,000 个边的随机正权重的图运行 dijkstras 搜索,每次搜索平均需要 0.188 秒(超过 350 次随机搜索)。我一直在寻找一种方法来强连接 2k 顶点而没有这么多边的问题。

以上是关于给定一组顶点,如何生成具有接近最少边数的强连通有向图?的主要内容,如果未能解决你的问题,请参考以下文章

『Tarjan算法 有向图的强连通分量』

有向图的强连通算法 -- tarjan算法

UVALive-4287 Proving Equivalences 有向图的强连通分量+缩点

tarjan有向图的强连通

如何找到最小化边数的方法?

poj2186 Popular Cows