链接:https://www.nowcoder.com/acm/contest/136/C
来源:牛客网
桃花一簇开无主,可爱深红映浅红。 ——《题百叶桃花》 桃花长在桃树上,树的每个节点有一个桃花,调皮的HtBest想摘尽可能多的桃花。HtBest有一个魔法棒,摘到树上任意一条链上的所有桃花,由于HtBest法力有限,只能使用一次魔法棒,请求出Htbest最多可以摘到多少个桃花。
输入描述:
第一行有一个正整数n,表示桃树的节点个数。接下来n-1行,第i行两个正整数ai,bi ,表示桃树上的节点ai,bi之间有一条边。
输出描述:
第一行一个整数,表示HtBest使用一次魔法棒最多可以摘到多少桃花。
3
1 2
2 3
3
3
1 2
1 3
3
4
1 2
2 3
3 4
说明:本题是求解树的直径,即树的最长的一条路径。原本我的想法是随便找一个点,然后两边延申一条最长的路径相加,但后来发现错了,看了题解才知道,是先从任意一点出发,找到终点,再从终点出发,找到最长的路径,得到答案。画一个图推断点是否在最长的路径上,判断情况。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=1e6+7;
vector<int> v[maxn];
int flag=0,maxv=0;
void dfs(int x,int k,int ans)
{
if(ans>maxv){
maxv=ans;
flag=x;
}
for(int i=0;i<v[x].size();i++){
if(v[x][i]!=k)
dfs(v[x][i],x,ans+1);
}
}
int main()
{
int n,x,y;
scanf("%d",&n);
for(int i=1;i<=n-1;i++){
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1,0,1);
maxv=0;
dfs(flag,0,1);
cout<<maxv;
return 0;
}