您的位置:首页 > 其它

More is better(hdu 1856)

2014-03-13 14:13 429 查看

More is better

[b]TimeLimit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K(Java/Others)

Total Submission(s): 4897 Accepted Submission(s):1824
[/b]

[align=left]Problem Description[/align]
Mr Wang wants some boys to help him witha project. Because the project is rather complex,
the more boyscome, the better it will be. Of course there are certainrequirements.

Mr Wang selected a room big enough to hold the boys. The boy whoare not been chosen has to leave the room immediately. There are10000000 boys in the room numbered from 1 to 10000000 at the verybeginning. After Mr Wang's selection any two of them who are stillin
this room should be friends (direct or indirect), or there isonly one boy left. Given all the direct friend-pairs, you shoulddecide the best way.

[align=left]Input[/align]
The first line of the input contains aninteger n (0 ≤ n ≤ 100 000) - the number of direct friend-pairs.The following n lines each contains a pair of numbers A and Bseparated by a single space that suggests A and B are directfriends. (A ≠ B, 1 ≤ A, B ≤
10000000)

[align=left]Output[/align]
The output in one line contains exactlyone integer equals to the maximum number of boys Mr Wang maykeep.

[align=left]Sample Input[/align]

4 1 2 3 4 56 1 6 4 1 2 3 4 5 6 7 8

[align=left]Sample Output[/align]

4 2

Hint
A and B are friends(direct or indirect), B and C are friends(director indirect), then A and C are also friends(indirect). In the firstsample {1,2,5,6} is the result. In the second sample{1,2},{3,4},{5,6},{7,8} are four kinds of answers.

[align=left]Author[/align]
lxlcrystal@TJU

[align=left]Source[/align]
HDU 2007 Programming Contest - Final

[align=left]Recommend[/align]
lcy
#include<stdio.h>
#define MAX 10000000
long pre[MAX];
long num[10000010];
long find(long x){
return pre[x] == x ? x: pre[x] =find(pre[x]);
}
void marge(long a, long b){
long x = find(a);
long y = find(b);
if(x != y){
pre[x] = y;
}
}
long count (){
long i, max = 0 ;
for (i = 1 ; i <= 10000000 ; i++)num[i] = 0 ;
for (i = 1 ; i <= 10000000 ; i++)num[find(i)]++ ;
for (i = 1 ; i <= 10000000 ; i++)if (num[i] > max) max = num[i] ;
return max ;
}
int main(){
long n, p1, p2, i, max = 0, j, cnt;
while(scanf("%ld", &n) !=EOF){
for(i = 1; i <=MAX; i++)
pre[i] =i;
i = 1;
while(i <=n){
scanf("%ld%ld",&p1, &p2);
if(find(p1)!= find(p2)){
marge(p1,p2);
}
i++;
}
printf("%ld\n", count());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: