生成随机双连通图
Generating random biconnected graph
是否有生成随机无向双连通图的简单算法(给定多个顶点作为输入)?我了解如何确定给定图是否是双连通图,但我正在努力以编程方式生成一个图。
你可以做一个非常简单的概率方法:
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) 对顶点,这也是该算法的预期 运行ning 时间,因为 random graph generated by this procedure will be bi-connected with high probability.
因此,最终要确保您的图确实是双向连接的,您只需运行您已经知道的常规程序。
对于检查 returns "graph is not bi-connected" 的(非常不可能的)场景,只需重复该过程。
真正有趣的问题是"why will I get a biconnected graph w.h.p.?"。我将省略有点乏味的正式证明,根据你的要求,我假设你只是想要一些有用的东西,你不太关心 为什么 它有用。如果我错了,而你确实需要证据,我建议你在 mathoverflow 上提问,或者给我留言——如果我有时间,也许我会尽量让它正式化。
目前,只是为了让您直观地了解为什么这会起作用,请考虑以下证明如何进行的方法:
请注意,非双连通图的数量等于至少有一个关节顶点的图数量。
让我们粗略计算一下单个顶点作为关节点的概率: 思路是,如果v
是一个关节点,那么它将分裂n
个顶点分成大小为 k
和 n-k
的两个不相交的集合,使得这些集合之间没有边。现在从直觉上应该或多或少清楚 所有 必须导致 "no-edge" 的 k*(n-k)
硬币翻转不太可能(基本上 (1/2)^(k*(n-k))
) .我们仍然需要乘以 n
(因为对于每个节点),但这仍然不会产生显着差异,正如您现在可能看到的那样,非常不太可能用于具有足够大 'n' 不会被双向连接。
(还缺少考虑 "for each possible partitioning",即对于 k
的不同选择,然后可能会更加小心,因为它实际上是 ((n-1)-k)
和 k
,而不是 (n-k)
和 k
,因为正在考虑的顶点不属于这两个集合中的任何一个......我只是说这些事情来说明人们仍然会有的那种细节担心正式证明...)
一个简单的方法是创建一个随机最大平面(三连通)图:
- 从形成 2 个三角形面(循环的内部和外部)的循环中连接的 3 个顶点开始。
- 要添加每个后续顶点,请选择一个随机面并用一个顶点和 3 条边将其三等分。
您可以到此为止 - 因为该图是三连接的,所以它也是双连接的。
但是,如果您想删除边并确保您仍然有一个双连通图,那么只删除两个事件顶点的度数为 3 或更多的边,并在删除之前使用 Hopcroft & Tarjan's Depth-First Search Algorithm to find Biconnected Components 测试每条边在没有该边的情况下检查双连通性。
注意 - 这将始终创建一个平面图。
是否有生成随机无向双连通图的简单算法(给定多个顶点作为输入)?我了解如何确定给定图是否是双连通图,但我正在努力以编程方式生成一个图。
你可以做一个非常简单的概率方法:
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) 对顶点,这也是该算法的预期 运行ning 时间,因为 random graph generated by this procedure will be bi-connected with high probability.
因此,最终要确保您的图确实是双向连接的,您只需运行您已经知道的常规程序。
对于检查 returns "graph is not bi-connected" 的(非常不可能的)场景,只需重复该过程。
真正有趣的问题是"why will I get a biconnected graph w.h.p.?"。我将省略有点乏味的正式证明,根据你的要求,我假设你只是想要一些有用的东西,你不太关心 为什么 它有用。如果我错了,而你确实需要证据,我建议你在 mathoverflow 上提问,或者给我留言——如果我有时间,也许我会尽量让它正式化。
目前,只是为了让您直观地了解为什么这会起作用,请考虑以下证明如何进行的方法:
请注意,非双连通图的数量等于至少有一个关节顶点的图数量。
让我们粗略计算一下单个顶点作为关节点的概率: 思路是,如果
v
是一个关节点,那么它将分裂n
个顶点分成大小为k
和n-k
的两个不相交的集合,使得这些集合之间没有边。现在从直觉上应该或多或少清楚 所有 必须导致 "no-edge" 的k*(n-k)
硬币翻转不太可能(基本上(1/2)^(k*(n-k))
) .我们仍然需要乘以n
(因为对于每个节点),但这仍然不会产生显着差异,正如您现在可能看到的那样,非常不太可能用于具有足够大 'n' 不会被双向连接。
(还缺少考虑 "for each possible partitioning",即对于 k
的不同选择,然后可能会更加小心,因为它实际上是 ((n-1)-k)
和 k
,而不是 (n-k)
和 k
,因为正在考虑的顶点不属于这两个集合中的任何一个......我只是说这些事情来说明人们仍然会有的那种细节担心正式证明...)
一个简单的方法是创建一个随机最大平面(三连通)图:
- 从形成 2 个三角形面(循环的内部和外部)的循环中连接的 3 个顶点开始。
- 要添加每个后续顶点,请选择一个随机面并用一个顶点和 3 条边将其三等分。
您可以到此为止 - 因为该图是三连接的,所以它也是双连接的。
但是,如果您想删除边并确保您仍然有一个双连通图,那么只删除两个事件顶点的度数为 3 或更多的边,并在删除之前使用 Hopcroft & Tarjan's Depth-First Search Algorithm to find Biconnected Components 测试每条边在没有该边的情况下检查双连通性。
注意 - 这将始终创建一个平面图。