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

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

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

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

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

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

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

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

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

编辑:

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

点赞