【问题标题】:Algorithm: non-Articulation vertex算法:非关节顶点
【发布时间】:2015-10-29 01:07:14
【问题描述】:

图 G 的一个关节顶点是一个被删除的顶点 断开 G。令 G 为具有 n 个顶点和 m 个边的图。给一个 简单的 O(n + m) 算法,用于找到 G 的不是 关节顶点——即,其删除不会断开 G。

让初始编号。顶点数为n,那么在删除一个顶点后,我们应该有n-1条边。 我使用 dfs 遍历图形并计算编号。的顶点。如果计数小于n-1,它是一个关节顶点,所以我把它加回来。 否则不是,我增加了一个计数器。

有什么更好的方法可以找到非关节顶点,因为这种方法非常慢而且我需要 O(n+m)。

【问题讨论】:

    标签: c++ c algorithm graph


    【解决方案1】:

    使用 DFS(深度优先搜索)是一种很好的开始方式,因为它本身已经是 O(V + E)。所以这个想法是遍历图一次并能够找出它的属性。旁注:每当做图算法时想想 循环

    证明关节顶点的条件(在 DFS 的思维模式下):

    1. 根节点是一个关节点iff它有多个子节点

    2. 叶子从来都不是关节点

    3. 非叶非根节点 u 是一个关节点 iff 没有非树边从一个子节点超过 u u的某个孩子下面的树

    这涵盖了所有情况:根节点、叶子以及介于两者之间的任何其他节点。


    对于一个非关节顶点,我们只需要找到证明相反的条件:

    1. 根节点是一个非连接点它有一个孩子
    2. 叶子始终是非关节点
    3. 非叶、非根节点 u 是一个非连接点 iff 有一条非树边从下面的子树到达 u 以上u 的一些孩子

    数字 3 可以理解为:如果通过节点 u 在两棵分裂树之间存在另一个连接,则 a.k.a. 一个循环。


    Here is some articulation vertex code。您可能需要对其进行调整。

    【讨论】:

    • 优秀的答案。我刚才说过,您从某个地方运行 DFS,如果您发现一条通往“已访问”节点的边,则可以返回该已访问节点(或您所在的节点)作为答案。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多