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)\) 不是树的直径的结论。

    故结论正确。

  • 相关阅读:
    Checking Types Against the Real World in TypeScript
    nexus pip proxy config
    go.rice 强大灵活的golang 静态资源嵌入包
    几个golang 静态资源嵌入包
    rpm 子包创建学习
    Rpm Creating Subpackages
    ava 类似jest snapshot 功能试用
    ava js 测试框架基本试用
    The Architectural Principles Behind Vrbo’s GraphQL Implementation
    graphql-compose graphql schema 生成工具集
  • 原文地址:https://www.cnblogs.com/tztqwq/p/11625268.html
Copyright © 2011-2022 走看看