本文主要是介绍20180818牛客小白月赛6.C,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目大意
桃花一簇开无主,可爱深红映浅红。
——《题百叶桃花》
桃花长在桃树上,树的每个节点有一个桃花,调皮的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);
}
这篇关于20180818牛客小白月赛6.C的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!