树的直径的定义
树的直径:树上最远两点(叶子结点)的距离。
树的直径的求法
例题:【模板】树的直径
两遍暴力dfs
引理:对于树上任意一点 P P P,找到离它最远的节点 Q Q Q。在找到离节点 Q Q Q 最远的节点 W W W。路径 W Q WQ WQ的长度就是树的直径。
这个结论很显然 。(详细证明可以康康神犇IAWTYI的博客传送门)
有了这个结论,我们就可以轻轻松松的写出两遍 d f s dfs dfs的代码。先任意选取一个树上的店,找出离它最远的点并将其记录下来,再从这个点跑一边 d f s dfs dfs,就可以找到离这个点最远的点,所以我们就找到了树的直径。
代码(校OJ100分,但洛谷例题只有90分,很离谱)
#include<bits/stdc++.h>
#define MAXN 500001
#define in read()
using namespace std;
int n,st;
int nex[MAXN<<1],first[MAXN<<1],to[MAXN<<1],val[MAXN<<1],tot=0,ans=0,dis[MAXN];
inline void addedge(int u,int v,int w){
nex[++tot]=first[u];
first[u]=tot;to[tot]=v;
val[tot]=w;
}
void dfs(int u,int fa){
for(int e=first[u];e;e=nex[e]){
int v=to[e];
if(v==fa)continue;
dis[v]=dis[u]+val[e];
if(