zoukankan      html  css  js  c++  java
  • 树的直径 算法导论22.27

    这是《算法导论》中的一个例题(22.2-7),题目描述如下:树T=(V,E)的直径(diameter)定义为max(u,v),亦即,树的直径是树中所有最短路径长度中的最大值。试写出计算树的直径的有效算法,并分析算法的运行时间。

    算法:

    1》 从任意一点u开始,做BFS(广度优先搜索),找到最远点d(1).

    2》 从d(1)开始做BFS,所找到的最远路径(d(1)~~d(2))即为树的直径

    解释:

    第一步找到的d(1)为直径的一个端点,从d(1)开始做BFS得到的自然是直径,问题的关键在于为什么d(1)为直径的一个端点!下面对此加以说明:

    首先,若u为直径上一点,那么d(1)为直径的一个端点

      证明(反证法):假设d(1)不是直径的端点,那么必然存在另外一点w(例如直径的一个端点)使得u到w的距离大于u到d(1)的距离,这与d(1)为距离u最远的定义冲突,得证。

    其次,若u不是直径上的一点,那么直径必然同u到d(1)的路径相交与一点,设为x,那么x到d(1)的路径即可作为直径的一半,也就是说d(1)为直径的一个端点

      

    证明:

      若直径(d(1)~~d(2))同u到d(1)的路径不交叉,如上图所示。

    由u~~d(1)为从u出发的最长简单路径可知,x~~d(1)的长度比x~x1~~y以及x~y~~d2长,否则u到d1就不是最长简单路径了。故而d2~x1~x~d1的长度比d1~x1~d2的长度长,可知前者才是真正的直径!

     以上只是一个说明,并不是严谨的证明,细节之处还有待考究

  • 相关阅读:
    Codeforces Round #581 div.2 A,B,C
    19年牛客多校第十场记录
    tarjan 学习笔记
    POJ 3177 Redundant Paths (tarjan无向图求缩点)
    hdu 4738 Caocao's Bridges (tarjan求桥)
    hdu 1540 Tunnel Warfare (线段树维护一维联通区间)
    遍历 redis 数据库
    非web 的 java程序 打成jar包 在linux上运行
    java-疑问-远程连接linux服务器找不到文件路径
    java-查询图片url导出到本地
  • 原文地址:https://www.cnblogs.com/xubenben/p/2837971.html
Copyright © 2011-2022 走看看