牛客-牛客练习赛24-B 凤 凰

链接: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
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>n;
	int u,v;
	for(int i=1;i>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<

 

你可能感兴趣的:(并查集,牛客)