树的直径

写在前面
为什么要写篇这个呢?
在某澡堂的NOIProfessional模拟赛中,由于本蒟蒻不知道还有树的直径这种东西太弱了,导致比赛结果很不理想.
因此写篇学习笔记来纪念它.

树的直径

定义

定义很简单:树中的最长路.
(树的重心即为直径的中点,可由此建立较优的树)

性质

  1. 距某个点最远的叶子节点一定是树的某一条直径的端点
  2. 树的直径的长度一定会是某个点的最长距离f[i]与次长距离g[i]之和

求法

1. 两次BFS(DFS)

先任选一个起点BFS(DFS)找到最长路的终点,再从终点进行BFS(DFS),第二次BFS(DFS)找到的最长路即为树的直径
2. dp

可根据性质2来求:
显然最长路的两个端点必然是叶子或者根节点.设f(i)表示到i最远的叶子,g(i)表示到i次远的叶子,则有

f(i)=max{f(j)}+1;
g(i)=second{f(j)}+1;

其中j必须是i的儿子,计算顺序是自底向上.
最终答案为
max{f(i)+g(i)}+1

原理与证明

由于求法1比较常用,现仅给出求法1的证明
设起点为u,第一次BFS(DFS)找到的终点v一定是树的直径中的一个端点

证明
  1. 若u是直径上的点,则v显然是直径的终点(如果v不是的话,则必定存在另一个点w使得u到w的距离更长,矛盾)

  2. 若u不是直径上的点,则u到v必然于树的直径相交(反证),那么交点到v必然就是直径的后半段了

练习

(这些题均为一些dalao博客上讲解的例题,有一定代表性,因此拿来做练习)

Hdu2196:对于树上(双向边)的每一个节点求出与其距离最远的点的距离
Poj1985:树的直径
蓝桥杯-大臣的旅费:树的直径
Toj1056:可行的最长的路的长度
Toj3517:生成树最长的路的长度

显示 Gitment 评论