博客园 首页 私信博主 显示目录 隐藏目录 管理

树的直径

树的直径

定义

树上的最长简单路。

做法 \(1\)

首先我们先随意找定一个点 \(x\) ,然后 \(Dfs\) 求出 \(x\) 在全图中离他最远的节点 \(y\)

再在图中找到离 \(y\) 最远的节点 \(z\) 那么 \(yz\) 的简单路径就是树的直径。

证明

假设确定了直径的一个端点,那么另一个端点一定是距离这个端点最远的点,所以第二次找最远点的贪心一定正确。

再来证明第一次贪心找出的 \(y\) 一定是树的直径的一端。

假如我们找到的 \(y\) 不是,我们假设 \(x\)\(y\)\(LCA\)\(fa\) 直径为 \(u \to v\)

那么 \(fa \to v > fa \to y\)

那么你 \(x\) 找到的数就会是 \(u\) 了,所以矛盾。

可能讲的不太清楚,不懂可以私信交流。

做法 \(2\)

你对于每个点,找到他的最长链,和不与最长链在同一子树的次长链,相加向上更新。

他的父节点的最长链和次长链也可以从子树更新,因为每次向上都会贡献 \(1\) 的贡献。

做树形 \(dp\) 即可。

性质

\(1.\) 直径两端点一定是两个叶子节点

\(2.\) 距离任意点最远的点一定是直径的一个端点,这个在做法 \(1\) 讲过了

\(3.\) 对于一棵树,如果在一个点的上接一个叶子节点,那么最多会改变直径的一个端点,可以类比树的重心。

\(4.\) 若一棵树存在多条直径,那么这些直径交于一点且交点是这些直径的中点

\(5.\) 对于两棵树,如果第一棵树直径两端点为 \((u, v)\) ,第二棵树直径两端点为 \((x, y)\) ,用一条边将两棵树连接,那么新树的直径一定是 \(u,v,x,y\) 中的两个点

posted @ 2020-10-18 10:31  Flash_plus  阅读(84)  评论(0编辑  收藏  举报