【问题标题】:Safe Vertex deletion that won't cause graph disconnection不会导致图形断开的安全顶点删除
【发布时间】:2012-05-06 15:23:53
【问题描述】:

这里有两个关于安全顶点删除的消费税

5-28。图 G 的关节顶点是其删除断开 G 的顶点。设 G 是具有 n 个顶点和 m 个边的图。给出一个简单的 O(n + m) 算法来找到 G 的一个不是关节顶点的顶点——即,其删除不会断开 G。

5-29。继续上一个问题,给出一个 O(n + m) 算法,该算法找到 n 个顶点的删除顺序,使得没有删除会断开图的连接。 (提示:想想 DFS/BFS。)


对于 5-28,这是我的想法:

我只会做一个 dfs,但不完整。 完成处理的第一个顶点将是一个非关节顶点,因为它必须是一个叶子,或者一个后边指向其祖先的叶子(它也不是一个关节顶点) .

5-29 岁

我还不确定如何做得很好。我想到的是,在图中,循环中的任何顶点都不能安全地删除。另外,如果没有循环,那么从 dfs 树中向后删除顶点也是安全的。

谁能给我一些提示或告诉我我的想法是对还是错?

【问题讨论】:

    标签: algorithm graph depth-first-search


    【解决方案1】:

    对于第一个问题,我将从图中删除要测试的顶点,然后从任何其他顶点开始运行 DFS/BFS,计算访问的顶点数。如果小于(original size - 1),则被测顶点为关节顶点。

    同样的想法也适用于第二个问题。您随机选择一个顶点并将其删除,这通常会将图形切割成两个块。如果删除的顶点不是关节顶点,则两个块之一必须为空。否则,两个块都有一些顶点,在这种情况下,两个块中的所有顶点都必须按照最终的“安全删除”顺序列在该顶点的前面,而决定首先完全删除哪个块并不重要.所以我们可以写一个这样的递归函数:

    vertex[] safe_order_cut (vertex[] v)
        if (v.length==0) return empty_vertex_list;
        vertex x = randomly_pick(v);
        vertex v1[], v2[];
        cut_graph(v,x,v1,v2);
        return safe_order_cut(v1) + safe_order_cut(v2) + x;
    

    连通性问题(以及相关的割点问题)已在图论中得到广泛研究。如果您有兴趣,可以阅读 wiki 页面了解更多算法。

    【讨论】:

    • 但是你觉得你的算法够简单,时间复杂度是O(n+m)吗?
    【解决方案2】:

    我认为你对 5-28 的解决方案是正确的,它保证在 O(n+m) 时间内找到一个不是关节的节点。

    对于 5-29,我认为一种方法是基于您对 5-28 的解决方案。在执行 dfs 时,请注意每个节点何时离开堆栈(处理完成的时间)。如您所说,首先离开的必须是叶节点,因此删除它不会断开图的连接。然后你可以删除第二个离开堆栈的节点,当我们删除第一个节点时它也必须是一个叶子节点。 所以我们可以在做DFS的时候按照出栈的相反顺序删除节点。这样做只需要一次DFS,因此运行时间是O(n+m)。 p>

    另一种简单的方法是使用 BFS。对于 5.28,删除任何具有最大深度的节点不会使图形断开连接。因为深度较小的节点可以到达其他节点。所以对于 5.29,我们可以按排序深度降序删除所有节点。而且,我们只需要 1 个 BFS,所以运行时间是 O(n+m)。我认为人们更容易理解这种方法。

    【讨论】:

      【解决方案3】:

      5-29: 从5-28扩展你的想法,当你处理完一个顶点时,它是一个非关节顶点,所以删除它。然后继续 DFS,每次处理完另一个顶点时,也将其删除。由于您删除了先前已完成处理的顶点,因此每次完成对顶点的处理实际上是您第一次完成对顶点的处理(对于没有先前删除的顶点的图)。

      另一种方法,更容易证明,但效率稍低(但仍然 O(V + E)) - 从图中创建一个 DFS 树,然后进行拓扑排序,然后从最后一个开始逐个删除顶点排序图中的一个并移回第一个。在每一步都删除最后一个,并且您确定(因为它是拓扑排序图)它不指向任何其他节点,这意味着除了通向它的边之外不会删除任何边。这意味着所有其他节点仍然可以从第一个节点到达,如果图形是双向的,那么所有节点也可以到达第一个节点,使其连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 2018-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多