我正在尝试解决以下图形问题:
给出了一般的未加权和无向图以及k(k <| V |)个顶点 事先已经知道。顶点按顺序删除。后 每次删除,有多少连通组件?
我想在每一步使用tarjan算法检查当前要删除的顶点是否是切割顶点,以便在执行删除时,我们可以简单地将邻居数添加到连接数组件。该算法的复杂性为O(V(V + E))。
我被告知有一个O(V + E)算法来执行此任务。但我无法弄明白。谷歌的研究也没有透露太多。有人可以告诉我吗?
答案 0 :(得分:2)
我们可以使用事先知道顶点的事实。
让我们解决&#34;反向&#34;问题:给定一个图形和一个按顺序添加的列表顶点,计算每个加法结构后图形中连接组件的数量。
解决方案非常简单:我们可以维护一个不相交的集合联合结构,并将入射到顶点的所有边缘添加到图形中(它很容易保留此结构中的组件数量:最初,它是相等的到顶点的数量,当一个联合实际发生时减少一个)。
原来的问题被缩减为&#34;反向&#34;以下列方式之一:
让我们将所有未删除顶点的边缘添加到不相交的集合联合中。
现在我们可以反转已删除顶点的列表,并按上述方法逐个添加它们。
之后,我们需要撤消包含组件数量的结果列表。
注意:此解决方案实际上不是O(V + E)
,而是O(V + E * alpha(V))
,其中alpha(x)
是Ackermann的反函数。对于所有实际目的,它非常接近线性。