链接:https://www.nowcoder.com/acm/contest/157/B
来源:牛客网
题目描述
凤凰于飞,翙翙其羽,亦集爰止。
——《诗经·卷阿》
传说,凤凰是百鸟之王。有一天,凤凰要召开百鸟大会,百鸟国是一个由n个节点组成的树,每个节点有一只鸟,开会的节点定在1号节点。每只鸟可以花费1s通过一条边,由于每根树枝(边)的载重有限,只允许一只鸟同时通过。作为会议的策划师,HtBest想知道百鸟国的所有鸟在1点集合最少需要多少秒。
输入描述:
第一行有一个正整数n,表示百鸟国节点个数。 接下来n-1行,第i行两个正整数ai,bi用空格隔开,表示树上节点ai,bi之间有一条边。
输出描述:
第一行一个整数,表示集合最少需要的时间。
备注:
对于100%的测试数据: 1 ≤ n ≤ 1000000 数据量较大,注意使用更快的输入输出方式。
思路:对于与1相连的各个子节点 ai 之间是没有联系的,可以分开讨论,对于ai所在的子树,其与节点1只有一条边可到达,而所有的点都可以同时去往他的父亲节点上,这就相当于在 ai节点上一直都有点在,因此ai所在的子树到节点1的最大时间就是子树的节点总个数,而到节点1的最大时间就是与1相连的ai所在子树的节点数的最大值。
Code :
#include<iostream>
using namespace std;
const int MAX_N=1000005;
int n,ans;
int id[MAX_N],d[MAX_N];
int Find(int x)
{
if(id[x]!=x) id[x]=Find(id[x]);
return id[x];
}
int main()
{
ios::sync_with_stdio(false);
for(int i=0;i<MAX_N;++i)
id[i]=i;
cin>>n;
int u,v;
for(int i=1;i<n;++i)
{
cin>>u>>v;
if(u!=1&&v!=1) id[Find(u)]=Find(v);
}
for(int i=1;i<=n;++i)
++d[Find(i)];
for(int i=1;i<=n;++i)
ans=max(ans,d[i]);
cout<<ans<<endl;
return 0;
}