【问题标题】:Number of connected components after deleting k vertices删除k个顶点后的连通分量数
【发布时间】:2016-10-30 15:07:48
【问题描述】:

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

给定一个通用的无权无向图和 k (k

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

有人告诉我有一个 O(V+E) 算法来执行这个任务。但我无法弄清楚。对谷歌的研究也没有透露太多。谁能给我建议?

【问题讨论】:

    标签: algorithm graph connected-components


    【解决方案1】:

    我们可以利用顶点是预先知道的事实。

    让我们解决一个“逆向”问题:给定一个图和一个按顺序添加到其中的顶点列表,计算每个添加结构后图中连接组件的数量。

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

    通过以下方式将原始问题简化为“反向”问题:

    1. 让我们将不与任何已删除顶点关联的所有边添加到不相交集并集。

    2. 现在我们可以反转删除的顶点列表,并按照上面的描述一个一个添加。

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

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

    【讨论】:

    • 我可以说这种方法只适用于无向图,因为使用了 ufds?
    • @LanceHAOH 是的,它仅适用于无向图。
    猜你喜欢
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2019-01-03
    • 2023-03-08
    • 2021-08-02
    相关资源
    最近更新 更多