【问题标题】:Proof of correctness: Algorithm for diameter of a tree in graph theory正确性证明:图论中树的直径算法
【发布时间】:2013-11-15 20:58:22
【问题描述】:

为了找到树的直径,我可以从树中取出任何节点,执行 BFS 以找到离它最远的节点,然后在该节点上执行 BFS。距第二个 BFS 的最大距离将产生直径。

不过,我不确定如何证明这一点?我尝试过对节点数使用归纳法,但是案例太多了。

任何想法将不胜感激......

【问题讨论】:

  • 您能告诉我您所说的案例太多是什么意思吗?理论上,所有子案例也应该通过归纳证明。

标签: algorithm tree graph-theory proof-of-correctness


【解决方案1】:

让我们调用第一个 BFS x 找到的端点。关键的一步是证明在第一步中找到的 x 总是“有效的”——也就是说,它总是在某个最长路径的一端。 (请注意,一般情况下,可能有不止一条等长的路径。)如果我们能确定这一点,很容易看出以 x 为根的 BFS 会找到离 x 尽可能远的某个节点,因此它必须是一个整体最长的路径。

提示:假设(相反)在两个顶点 u 和 v 之间有一条更长的路径,而这两个顶点都不是 x。

请注意,在 u 和 v 之间的唯一路径上,必须有一些最高(最接近根)顶点 h。有两种可能性:要么 h 在从 BFS 的根到 x 的路径上,要么不在。通过表明在这两种情况下,通过将其中的某些路径段替换为到 x 的路径,可以使 u-v 路径至少与它一样长。

[编辑] 其实,这两种情况毕竟可能没有必要分开处理。但我经常发现将配置分解为几个(甚至多个)情况并分别处理每个情况更容易。在这里,h 在从 BFS 根到 x 的路径上的情况更容易处理,并为其他情况提供了线索。

[EDIT 2] 稍后回到这个,现在在我看来需要考虑的两种情况是(i)uv 路径与从根到 x 的路径相交(在 some 顶点 y,不一定在 uv 路径的最高点 h); (ii) 它没有。我们仍然需要 h 来证明每个案例。

【讨论】:

    【解决方案2】:

    我要去锻炼j_random_hacker's hint。让s, t 成为最远的一对。让u 成为任意顶点。我们有一个类似的示意图

        u
        |
        |
        |
        x
       / \
      /   \
     /     \
    s       t ,
    

    其中xs, t, u 的交汇点(即位于这些顶点之间的三个路径中的每一个上的唯一顶点)。

    假设v 是一个离u 最大距离的顶点。如果原理图现在看起来像

        u
        |
        |
        |
        x   v
       / \ /
      /   *
     /     \
    s       t ,
    

    然后

    d(s, t) = d(s, x) + d(x, t) <= d(s, x) + d(x, v) = d(s, v),
    

    因为d(u, t) = d(u, x) + d(x, t)d(u, v) = d(u, x) + d(x, v) 存在不等式。有一种对称情况,v 附加在sx 之间,而不是在xt 之间。

    另一种情况看起来像

        u
        |
        *---v
        |
        x
       / \
      /   \
     /     \
    s       t .
    

    现在,

    d(u, s) <= d(u, v) <= d(u, x) + d(x, v)
    d(u, t) <= d(u, v) <= d(u, x) + d(x, v)
    
    d(s, t)  = d(s, x) + d(x, t)
             = d(u, s) + d(u, t) - 2 d(u, x)
            <= 2 d(x, v)
    
    2 d(s, t) <= d(s, t) + 2 d(x, v)
               = d(s, x) + d(x, v) + d(v, x) + d(x, t)
               = d(v, s) + d(v, t),
    

    所以 max(d(v, s), d(v, t)) &gt;= d(s, t) 通过平均参数,v 属于最大距离对。

    【讨论】:

      【解决方案3】:

      这是另一种查看方式:

      假设 G = ( V, E ) 是具有顶点集 V 和边集 E 的非空有限树。

      考虑以下算法:

      1. count = 0。让 E 中的所有边最初都是无色的。让 C 最初等于 V
      2. 考虑 V 的子集 V',其中包含恰好有一条未着色边的所有顶点:
        • 如果 V' 为空,则令 d = count * 2,然后停止。
        • 如果 V' 恰好包含两个元素,则将它们的相互(未着色)边缘着色为绿色,让 d = count em> * 2 + 1,然后停止。
        • 否则,V' 至少包含三个顶点;进行如下操作:
      3. count 加一。
      4. C 中删除所有没有未着色边的顶点。
      5. 对于 V 中具有两条或多条未着色边的每个顶点,将其每条绿色边重新着色为红色(某些顶点的此类边可能为零)。李>
      6. 对于 V' 中的每个顶点,将其未着色的边缘涂成绿色。
      7. 返回步骤 (2)。

      这基本上是从叶子向内对图表进行着色,将与叶子的最大距离标记为绿色,将距离较短的路径标记为红色。同时,中心C的节点与叶子的最大距离较短,直到C只包含到叶子的最大距离最大的一两个节点。

      通过构造,从叶顶点到其最近中心顶点且仅穿过绿色边缘的所有简单路径的长度相同(count),以及从叶顶点到其最近中心的所有其他简单路径顶点(至少穿过一条红边)更短。还可以证明

      • 该算法总是在给定条件下终止,G 的每条边都被染成红色或绿色,而 C 包含一个或两个元素。
      • 在算法终止时,dG 的直径,以边为单位测量。
      • 给定V中的顶点vG中的最大长度简单路径v 开始的 /strong> 正是那些包含中心的所有顶点,终止于叶子,并且仅遍历中心和远端点之间的绿色边缘的那些。它们从 v 穿过中心,到达离中心最远的叶子之一。

      现在根据上述情况考虑您的算法,它可能更实用。从任意一个顶点v开始,从那个顶点只有一个简单的路径p,结束于一个中心顶点,并包含所有顶点中心(因为G是一棵树,如果C中有两个顶点,那么它们共享一条边) .可以看出,G中以v为端点的最大简单路径都具有p 从中心到叶子的简单路径仅穿过绿色边缘。

      我们的关键点是另一个端点的传入边缘必须是绿色的。因此,当我们搜索从那里开始的最长路径时,我们可以访问那些仅从叶子穿过(所有顶点)中心到另一个叶子的绿色边缘的路径。这些正是 G 中的最大长度简单路径,因此我们可以确信第二次搜索确实会揭示图形直径。

      【讨论】:

        【解决方案4】:

        1:procedureTreeDiameter(T)

        2:选择任意顶点v,其中v∈V

        3:u = BFS (T, v)

        4:t = BFS (T, u)

        5:返回距离(u,t)

        结果:复杂度 = O(|V|)

        【讨论】:

        • 问题问的是算法为什么起作用,而不是算法的步骤。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-27
        • 1970-01-01
        • 2016-05-16
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        相关资源
        最近更新 更多