给定一组顶点,如何生成具有几乎最少边量的强连接有向图

Given a set of vertices, how do you generate a strongly-connected directed graph with a near-minimal amount of edges?

本文关键字:有向图 连接 一组 何生成 顶点      更新时间:2023-10-16

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

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

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

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

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

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

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

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

我不知道

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

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

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

编辑:

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