如何从双连通分量创建图形?

问题描述

我有一张图,我已经使用 Tarjan 算法识别了它的所有双连通分量及其所有关键顶点/关节点。

我正在尝试使用双连通组件创建一个新图:组件将是新顶点,如果两个双连通组件共享至少一个连接点,则它们将被链接

例如,对于下图中的图形,新图形的邻接表为:

(1,3) -> (3,4,5),(1,2)

(1,2) -> (1,3)

(3,5) -> (1,3)

其中 (1,3),2),(3,5) 是双连通分量,1,3 是关节点。 如何以相对最佳的方式创建新图/邻接列表?我可以在图表上运行 Tarjan 时执行此操作吗?

enter image description here

编辑:双连通分量是图顶点的子集,即使您删除图的任何顶点,该子集中的每个顶点仍将保持连接状态。 Wiki page for biconnected component

解决方法

是的,您可以使用 DSU(不相交集联合,又名联合查找)数据结构轻松完成。

关键是注意一些观察:

  • 新图将是一棵树或树林(为什么? - 任何循环都是双连通的,因此它属于同一组件)
  • 结果树的边将成为原始图的桥(结果树也称为“桥树”)

现在我们已经可以做一些 tarjan 修改了:

  • 对于每条边(u,v),如果它是一座桥,请保存以备后用
  • 如果它不是桥,则使用 DSU 合并 uv 所属的不相交集合
  • 要在 tarjan 结束后构建结果树,我们可以使用保存的桥接和剩余的不相交集,
  • (opt) 如果我们愿意,我们可以枚举不相交的集合,但是因为在 2 个不相交的集合之间永远不会有 2 个桥(这会形成一个循环因此矛盾)我们可以只使用不相交的集合标识顶点来创建新图