题干:
链接:https://ac.nowcoder.com/acm/contest/157/B
来源:牛客网
题目描述
传说,凤凰是百鸟之王。有一天,凤凰要召开百鸟大会,百鸟国是一个由n个节点组成的树,每个节点有一只鸟,开会的节点定在1号节点。每只鸟可以花费1s通过一条边,由于每根树枝(边)的载重有限,只允许一只鸟同时通过。作为会议的策划师,HtBest想知道百鸟国的所有鸟在1点集合最少需要多少秒。
输入描述:
第一行有一个正整数n,表示百鸟国节点个数。
接下来n-1行,第i行两个正整数ai,bi用空格隔开,表示树上节点ai,bi之间有一条边。
输出描述:
第一行一个整数,表示集合最少需要的时间。
示例1
输入
复制
3
1 2
2 3
输出
复制
2
示例2
输入
复制
3
1 2
1 3
输出
复制
1
示例3
输入
复制
4
1 2
2 3
2 4
输出
复制
3
备注:
对于100%的测试数据:
1 ≤ n ≤ 1000000
数据量较大,注意使用更快的输入输出方式。
解题报告:
这题用dfs会超时我也不知道为什么。O(n)的复杂度。。。
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e6 + 5;
int n,m;
vector<int> vv[MAX];
int dfs(int cur,int rt) {int res = 1;for(auto& v : vv[cur]) {if(v == rt) continue;res += dfs(v,cur);}return res;
}
inline int read() {char ch = getchar(); int x = 0, f = 1;while(ch < '0' || ch > '9') {if(ch == '-') f = -1;ch = getchar();} while('0' <= ch && ch <= '9') {x = x * 10 + ch - '0';ch = getchar();} return x * f;
}
int f[MAX],num[MAX];
int getf(int v) {return f[v] == v ? v : f[v] = getf(f[v]);
}
bool merge(int u,int v) {int t1 = getf(u);int t2 = getf(v);if(t1 == t2) {return 1;}else {f[t2] = t1;num[t1] += num[t2];return 0 ;}
}
int main()
{cin>>n;for(int i = 1; i<=n; i++) f[i] = i,num[i]=1;for(int a,b,i = 1; i<=n-1; i++) {a=read();b=read();if(a!=1 && b!=1) merge(a,b);}int ans = 0 ;for(int i = 1; i<=n; i++) {ans = max(ans,num[getf(i)]);}cout << ans;return 0;
}
TLE代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e6 + 5;
int n,m;
vector<int> vv[MAX];
int dfs(int cur,int rt) {int res = 1;for(auto v : vv[cur]) {if(v == rt) continue;res += dfs(v,cur);}return res;
}
int main()
{cin>>n;for(int a,b,i = 1; i<=n-1; i++) {scanf("%d%d",&a,&b);vv[a].pb(b);vv[b].pb(a);}int ans = 0 ;for(auto v : vv[1]) {ans = max(ans,dfs(v,1));}cout << ans;return 0;
}