拆解图算法

时间:2017-03-16 15:06:51

标签: algorithm graph graph-algorithm

图形有n个顶点和m个边。图形开始连接,然后按照它们在列表中出现的顺序删除边缘。在流程结束时,图表将断开连接。

因此,边缘列表中存在特定边缘,使得在移除边缘之前,存在一个连接的组件,其具有多于n / 4个顶点的底面。移除此边后,图中没有连接的组件,其中多于n / 4个顶点。

我将如何设计最佳算法来找到这个优势。我是否只是开始删除边缘,然后每次遍历图形以检查最大连接组件是否足够?这是在O(nm)时间运行,但我觉得必须有一些更快的方式。我认为答案与使用脱节集来查找连接组件有关,但我不确定如何实现它。

1 个答案:

答案 0 :(得分:2)

考虑反向运行此过程 ,添加边缘而不是删除边缘。这个过程与Kruskal的算法非常相似(每个节点都是自己开始的,并且边缘被添加到不同连接组件的链接中),除非你至少有一个至少有一个至少有⌊n/4⌋的连通组件就会停止其中的节点。

解决此问题的一种方法是使用Kruskal算法的修改版本和扩展的联合查找数据结构,以便联合查找结构中的每个代表都存储其连接组件中的节点数。如果端点已经连接则以相反的顺序遍历边缘,在每个点处丢弃边缘并以其他方式链接它们。如果你添加一个边缘,导致至少有⌊n/4⌋节点的连通分量,你就找到了你正在寻找的边缘。如果你使用union-find数据结构的快速实现,这将在时间O(n +mα(n))中运行,这在实践中基本上是线性的。