Graph 随机双连通图的生成

Graph 随机双连通图的生成,graph,graph-theory,graph-algorithm,Graph,Graph Theory,Graph Algorithm,是否有一个简单的算法来生成随机无向双连通图(给定若干顶点作为输入)?我知道如何确定给定的图是否是双连通的,但我很难通过编程生成一个图。您可以使用一种非常简单的概率方法: 1. Create an empty graph with n nodes 2. For each pair of nodes: -Flip a fifty-fifty-coin to decide whether to put an edge in there or not 您有O(n^2)对顶点,这也是此算法的预期运行时

是否有一个简单的算法来生成随机无向双连通图(给定若干顶点作为输入)?我知道如何确定给定的图是否是双连通的,但我很难通过编程生成一个图。

您可以使用一种非常简单的概率方法:

1. Create an empty graph with n nodes
2. For each pair of nodes:
 -Flip a fifty-fifty-coin to decide whether to put an edge in there or not
您有O(n^2)对顶点,这也是此算法的预期运行时间,因为此过程生成的将是双向连接的

因此,最后,为了确保你的图真的是双连通的,你只需运行你已经知道的常规过程

对于检查返回“graph is not bi connected”(图形不双向连接)的(不太可能)场景,只需重复该过程

真正有趣的问题是“为什么我会得到一个双连通图w.h.p.?”。我将略去有点乏味的正式证明,根据你的提问方式,我假设你只是想要一些有效的东西,而你并不太在乎它为什么有效。如果我错了,你真的需要证据,我建议你要么问我,要么给我留言——如果我有时间的话,也许我会试着把它正式化

目前,只要给你一个直觉来解释为什么它会起作用,考虑下面的一个证明如何进行的方法:

  • 注意,非双连通图的数目等于至少有一个连接顶点的图的数目

  • 让我们粗略地计算单个顶点成为关节点的概率:其思想是,如果
    v
    是关节点,则它将
    n
    顶点拆分为两个大小不相交的集合
    k
    n-k
    ,以便这些集合之间没有边。现在直觉上应该或多或少地清楚,
    k*(n-k)
    抛硬币,所有这些都会导致“无边”的可能性不大(基本上是
    (1/2)^(k*(n-k))
    )。我们仍然需要乘以
    n
    (因为对于每个节点),但这仍然不会产生显著的差异,正如您现在可能看到的,对于具有足够大的“n”的图,不可能不进行双连通


(仍然缺少的是考虑每一个可能的分区),即对于不同的选择<代码> k>代码>,然后可能会更加小心,因为它实际上是<代码>((n-1)-k)< /> >和<代码> k>代码>,而不是<代码>(N-K)。和

k
因为所考虑的顶点不是这两个集合中的任何一个集合的一部分……我说这些只是为了说明人们在进行正式证明时仍然需要担心的细节……

一个简单的方法是创建一个随机最大平面(三连通)图:

  • 从循环中连接的3个顶点开始,形成2个三角形面(循环的内部和外部)
  • 若要添加每个后续顶点,请拾取一个随机面,并使用一个顶点和3条边将其三等分
你可以停在这里,因为图形是三连通的,所以它也是双连通的

但是,如果要删除边并确保仍然具有双连通图,则仅删除两个关联顶点次数为3次或以上的边,并在删除前使用检查没有该边的双连通性来测试每条边


注意-这将始终创建一个平面图。

在堆栈溢出时,我们回答问题,但不为您编写代码。@StilesCrisis对我问题中的措词被误解表示歉意,但实际上我没有要求任何人为我编写代码。我问了一些我可以用来解决这个问题的算法的建议。我的问题是,“有没有一种生成随机无向双连通图的简单算法?”如果你认为有必要,我很乐意改写这个问题。这是一种有效的算法,还是一种奇怪的算法?你关心分布吗?@dingalapadum,最好是有效的,因为我将生成非常大的图形。我不在乎分配。我目前正在做的是使用一种蛮力方法和算法来发现双连接组件。本质上,我随机添加节点和边,直到图形被认为是双连通的,然后停止。对于所需数量的双连接组件重复此操作。虽然它可以工作,但速度非常慢。有什么改进的建议吗?在3个顶点的简单情况下,您需要所有3条相邻边来使图双向连接,并且这种情况只会以1/8的概率发生。对于4顶点图,给定顶点有0条或1条入射边的概率为1/2,因此很可能不具有双连通性。我知道,随着顶点数量的增加,非双连通性的概率将迅速下降,但您是否有一个指南,说明在高概率情况下,合理的最小顶点数量是多少?@MT0:w.h.p.不是一个固定的数字。我链接到维基百科的一篇文章,这是一个含义非常明确的表达——看看吧。这意味着您可以使用足够的顶点任意接近1。此外,在使用概率算法时,您只需重复该过程。。。。正如您所指出的:对于3个顶点,我们希望重复该过程8次。对于4,我们期望2次。如果你有更多的顶点,你通常会得到它后,第一次尝试。。。你取的顶点越多,它得到的可能性就越大:这就是w.h.p.的意思。这个算法不是O(n²)-算法的一次迭代是O(n²),如果它碰巧没有生成双连通图,那么你将不得不再次运行它(一次又一次)-最坏的情况(这就是大O符号所表示的)此算法的运行时间为O(无穷大)[但不太可能发生]。但是,您可以声明预期运行时间与n²成比例。@MT0预期运行时间是我实际的意思。。。我是说我们是