链接:https://www.nowcoder.com/acm/contest/157/B
来源:牛客网
题目描述
凤凰于飞,翙翙其羽,亦集爰止。
——《诗经·卷阿》
传说,凤凰是百鸟之王。有一天,凤凰要召开百鸟大会,百鸟国是一个由n个节点组成的树,每个节点有一只鸟,开会的节点定在1号节点。每只鸟可以花费1s通过一条边,由于每根树枝(边)的载重有限,只允许一只鸟同时通过。作为会议的策划师,HtBest想知道百鸟国的所有鸟在1点集合最少需要多少秒。
输入描述:
第一行有一个正整数n,表示百鸟国节点个数。i
接下来n-1行,第i行两个正整数a
,bi
用空格隔开,表示树上节点ai
,bi
之间有一条边。
输出描述:
第一行一个整数,表示集合最少需要的时间。
备注:
这个题卡了好久没想到...>_<...
观察后会发现,每条边每时每刻都会有鸟在上面走而且不会间断,除非这条边以下已经没有鸟了。我们只要统计一下根对应的每个子树的节点个数取一个最大值就是答案。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<map> 5 #include<set> 6 #include<vector> 7 #include<algorithm> 8 #include<cmath> 9 using namespace std; 10 #define LL long long 11 #define PI acos(-1.0) 12 vector<int>g[1000100]; 13 int dfs(int u,int fa){ 14 int maxn=0,sum=1; 15 for(int i=0;i<g[u].size();++i){ 16 if(g[u][i]==fa)continue; 17 int len=dfs(g[u][i],u); 18 sum+=len; 19 maxn=max(maxn,len); 20 } 21 if(u==1) return maxn; 22 else return sum; 23 } 24 int main() 25 { 26 int m,n,i,j,k; 27 int u,v; 28 while(scanf("%d",&n)==1){ 29 for(i=1;i<=n;++i)g[i].clear(); 30 for(i=1;i<n;++i){ 31 scanf("%d%d",&u,&v); 32 g[u].push_back(v); 33 g[v].push_back(u); 34 } 35 printf("%d ",dfs(1,0)); 36 } 37 return 0; 38 }
对于100%的测试数据:
1 ≤ n ≤ 1000000
数据量较大,注意使用更快的输入输出方式。