树的直径
概念
给出一个树,里面的最长路径就是这棵树的直径
做法_dfs
做两次dfs,第一次寻找距离所选择点最远的点u,把根换为u再第二次寻找距离u最远的点v,此时树的直径就是(u,v)间的路径
模板
寻找两次深度最大的点
#include<bits/stdc++.h>
using namespace std;
struct node{
long long v;
long long nx;
}e[200010];
long long n,d[200010],cnt,maxx,s1,s2,he[200010],d1[200010];
void add(long long x,long long y){
e[++cnt].v=y,e[cnt].nx=he[x],he[x]=cnt;
}
void dfs(long long x,long long f){
for(long long i=he[x];i;i=e[i].nx){
long long v=e[i].v;
if(f!=v){
d[v]=d[x]+1;
dfs(v,x);
}
}
}
int main(){
cin>>n;
for(long long i=1;i<=n-1;i++){
long long x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(1,0);
for(long long i=1;i<=n;i++){
if(d[i]>maxx){
s1=i;
maxx=d[i];
}
d1[i]=d[i];
d[i]=0;
}
maxx=0;
dfs(s1,0);
for(long long i=1;i<=n;i++){
if(d[i]>maxx){
s2=i;
maxx=d[i];
}
}
cout<<d[s2]<<endl;
return 0;
}