是否有一种简单的算法来生成随机无向双向图(给定多个顶点作为输入)?我理解如何确定一个给定的图是否是双连的,但我正在努力以编程方式生成一个。
答案 0 :(得分:4)
你可以做一个非常简单的概率方法:
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)对顶点,这也是此算法的预期运行时间,因为此过程生成的random graph将是双连接的with high probability。< / p>
因此,最后要确保您的图表真正是双向连接的,您只需运行您已经知道的常规程序。
对于(非常不可能)检查返回&#34;图形不是双连接&#34;的情况,只需重复该过程。
真正有趣的问题是&#34;为什么我会得到一个biconnected图w.h.p.?"。我会省略一些有点单调乏味的正式证据以及你的要求,我认为你只是想要一些有用的东西而你并不在乎为什么它有效。如果我错了,你确实需要一个证明,我建议你在mathoverflow上提问或者你给我发表评论 - 如果我找到时间的话,我可以试着让它成为正式。
目前,为了让您直截了当地说明为什么会有效,请考虑以下方法来证明:
请注意,不双连接的图形数量等于至少有一个关节顶点的图形数量。
让我们粗略计算单个顶点成为关节点的概率:想法是如果v
是关节顶点,那么它将n
顶点分成两个不相交的集合大小为k
和n-k
,使得这些集之间没有边缘。现在直观地说,k*(n-k)
硬币翻转应该或多或少地清楚所有必须导致&#34;无边缘&#34;是不太可能的(基本上是(1/2)^(k*(n-k))
)。我们仍然需要乘以n
(因为对于每个节点),但这仍然没有显着差异,正如您现在可能看到的那样,非常对于足够大的& #39; N&#39;没有双向连接。
(仍然缺少的是考虑&#34;对于每个可能的分区&#34;,即k
的不同选择,然后可能会更加小心,因为它实际上是{ {1}}和((n-1)-k)
,而不是k
和(n-k)
因为正在考虑的顶点不属于任何2套...我只是说这些东西为了说明一个人仍然需要担心的正式证明......)
答案 1 :(得分:0)
一种简单的方法是创建随机最大平面(三连通)图:
你可以在这里停止 - 由于图形是三连接的,它也是双连接的。
但是,如果你想删除边缘并确保你仍然有一个双连通图形,那么只删除两个入射顶点都是3度或更多度的边缘,并在移除前使用Hopcroft & Tarjan's Depth-First Search Algorithm to find Biconnected Components测试每个边缘来检查没有那边的双重性。
注意 - 这将始终创建一个平面图。