To_Heart—题解——树的直径

定义

给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和。树中最远的两个节点(两个节点肯定都是叶子节点)之间的距离被称为树的直径,连接这两点的路径被称为树的最长链。后者通常也可称为直径。

思路

我们设1号节点为根节点,那么最短路径则是到根节点最远的一个节点与次远的一个节点的距离之和

代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
const int MAXM=1000005;

int dp[MAXM];
vector<int> v[MAXN];
int n,ans;
bool f[MAXN];

void DP(int x){
	for(int i=0;i<v[x].size();i++){
		int y=v[x][i];
		if(f[y])
			continue;
		f[y]=1;
		DP(y);
		ans=max(ans,dp[x]+dp[y]+1);
		dp[x]=max(dp[x],dp[y]+1);
	}
}

int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		v[x].push_back(y);
		v[y].push_back(x);
	}
	f[1]=1;
	DP(1);
	printf("%d\n",ans);	
	return 0;	
}

posted @ 2020-10-04 15:09  To_Heart  阅读(46)  评论(0编辑  收藏  举报