zoukankan      html  css  js  c++  java
  • 两次bfs求树的直径的正确性

    update on 2020.6.3
    忘了以前写的博客是怎么样的了, 也不想校对, 趁着整理普及图论就重新写了点。

    目录


    new

    树的直径
    可以 树形DP 求, 也可以两次 dfs
    dfs 方法好像得出方案更容易。
    这里给出 dfs方法

    dfs 求树直径的两端点

    • 随便找一个点 \(s\), 随便选一个距离其最远的点 \(u\)
    • 随便选一个距离 \(u\) 最远的点 \(v\)
      那么路径 \(u \rightarrow v\) 就是这棵数的直径

    正确性?
    如果 \(u\) 确实是某条直径上的端点, 那么 \(v\) 就一定是另一个端点。
    为什么 \(u\) 一定是某条直径的一个端点呢? 明明 \(s\) 是随便选的啊!

    可以这样想:假定直径的两个端点分别为 \(u、v\), 不管 \(s\) 在不在直径上, 只要存在任意一点 \(t\) 距离 \(s\) 最远(大于 \(s\)\(u\) 的距离 和 \(s\)\(v\) 的距离), 那么就可以推出
    路径 \(u \rightarrow v\) 不是直径。


    原文

    结论:离树上任意点\(u\)最远的点一定是这颗树直径的一个端点。

    证明:

    若点 \(u\) 在树的直径上,设它与直径两个端点 \(x,y\) 的距离分别为 \(S1\)\(S2\),若距离其最远的点 \(v\) 不是这两个端点,

    \(dist(u,v) > S1\)\(dist(u,v) > S2\), 则必有 \(S1 + dist(u,v) > S1 + S2\)\(S2 + dist(u,v) > S1 + S2\),这与 \((x,y)\) 是直径的

    假设相悖。

    反之 \(u\) 不在树的直径上,则其到直径最近的一点 \(mid\) 的距离为 \(dist(u,mid)\),设直径的两端点分别为 \(x,y\)

    若距离 \(u\) 最远的点不是 \(x,y\) 之一, 设距离 \(u\) 最远的点为 \(v\)

    则路径 \(u->v\) 会出现如下几种情况:

    1.完全经过路径 \(u->mid\)

    2.完全不经过路径 \(u->mid\)

    3.不完全经过路径 \(u->mid\)

    这3种情况都能推出 \((x,y)\) 不是树的直径的结论。

    故结论正确。

  • 相关阅读:
    go channel select如何屏蔽已关闭通道
    go err
    在OneNote中快速插入当前日期和时间
    如何查看Isilon节点的硬件信息?
    一个可用来记录Isilon各个节点的CPU,网络,磁盘性能的命令
    Linux中如何查看文件夹的大小
    如何同步两台Linux机器的时间?
    Linux中的硬链接(hard link)和符号连接(symbolic link)
    在Cygwin里,如何进入到C盘?
    Remote Desktop Session中如何触发Ctrl+Alt+Delete?
  • 原文地址:https://www.cnblogs.com/tztqwq/p/11625268.html
Copyright © 2011-2022 走看看