删除k个顶点后连接组件的数量

时间:2016-10-30 15:07:49

标签: algorithm graph connected-components

我正在尝试解决以下图形问题:

  

给出了一般的未加权和无向图以及k(k <| V |)个顶点   事先已经知道。顶点按顺序删除。后   每次删除,有多少连通组件?

我想在每一步使用tarjan算法检查当前要删除的顶点是否是切割顶点,以便在执行删除时,我们可以简单地将邻居数添加到连接数组件。该算法的复杂性为O(V(V + E))。

我被告知有一个O(V + E)算法来执行此任务。但我无法弄明白。谷歌的研究也没有透露太多。有人可以告诉我吗?

1 个答案:

答案 0 :(得分:2)

我们可以使用事先知道顶点的事实。

让我们解决&#34;反向&#34;问题:给定一个图形和一个按顺序添加的列表顶点,计算每个加法结构后图形中连接组件的数量。

解决方案非常简单:我们可以维护一个不相交的集合联合结构,并将入射到顶点的所有边缘添加到图形中(它很容易保留此结构中的组件数量:最初,它是相等的到顶点的数量,当一个联合实际发生时减少一个)。

原来的问题被缩减为&#34;反向&#34;以下列方式之一:

  1. 让我们将所有未删除顶点的边缘添加到不相交的集合联合中。

  2. 现在我们可以反转已删除顶点的列表,并按上述方法逐个添加它们。

  3. 之后,我们需要撤消包含组件数量的结果列表。

  4. 注意:此解决方案实际上不是O(V + E),而是O(V + E * alpha(V)),其中alpha(x)是Ackermann的反函数。对于所有实际目的,它非常接近线性。