树的直径

概念

给出一个树,里面的最长路径就是这棵树的直径

做法_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;
}
posted @ 2024-09-16 22:40  健康铀  阅读(2)  评论(0编辑  收藏  举报