题目大意
桃花一簇开无主,可爱深红映浅红。
——《题百叶桃花》
桃花长在桃树上,树的每个节点有一个桃花,调皮的HtBest想摘尽可能多的桃花。HtBest有一个魔法棒,摘到树上任意一条链上的所有桃花,由于HtBest法力有限,只能使用一次魔法棒,请求出Htbest最多可以摘到多少个桃花。
输入描述:
第一行有一个正整数n,表示桃树的节点个数。接下来n-1行,第i行两个正整数ai,bi ,表示桃树上的节点ai,bi之间有一条边。
输出描述:
第一行一个整数,表示HtBest使用一次魔法棒最多可以摘到多少桃花。
示例1
输入
3
1 2
2 3
输出
3
示例2
输入
3
1 2
1 3
输出
3
示例3
输入
4
1 2
2 3
3 4
输出
4
分析
一句话,就是求一条链上的最多点数,因为边权都是1,所以相当于求树的直径再加1,树的直径两次bfs就可求得。
上代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ver[2000010],nxt[2000010],hed[2000010],tot,d[1000010],mx,mb;
bool vis[1000010];
void dfs(int u){
vis[u]=1;
for(int i=hed[u],v;i;i=nxt[i]){
v=ver[i];
if(!vis[v]){
d[v]=d[u]+1;
dfs(v);
}
}
}
void add(int x,int y){
ver[++tot]=y,nxt[tot]=hed[x],hed[x]=tot;
}
int main(){
scanf("%d",&n);
for(int i=1,x,y;i<n;i++){
scanf("%d%d",&x,&y);
add(x,y),add(y,x);
}
memset(vis,0,sizeof(vis));
memset(d,0x3f,sizeof(d));
vis[1]=1,mx=-1,d[1]=0;
dfs(1);
for(int i=2;i<=n;i++){
if((mx<d[i])&&(d[i]<1000000))
mx=d[i],mb=i;
}
memset(vis,0,sizeof(vis));
memset(d,0x3f,sizeof(d));
vis[mb]=1,mx=-1,d[mb]=0;
dfs(mb);
for(int i=1;i<=n;i++){
if(i==mb)
continue;
if((mx<d[i])&&(d[i]<1000000))
mx=d[i];
}
printf("%d",mx+1);
}