hdu More is better

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1856

 

题意:王老师要找一些男生帮助他完成一项工程。要求最后挑选出的男生之间都是朋友关系,可以说直接的,也可以是间接地。问最多可以挑选出几个男生(最少挑一个)。
         这是一个有关并查集的题目。只不过不是求有几个集合,而是求每个集合中元素的个数,进而求出个数的最大值。和求集合个数的方法差不多,只需要在合并两个集合时处理一下,让这两个集合的元素个数也合并一下就行了。接下来只需要找出最大值即可。要注意的一个地方就是:当n=0时,要输出1。
 
各种坑......
 
代码:
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <ctype.h>
 7 #include <iomanip>
 8 #include <queue>
 9 #include <stdlib.h>
10 using namespace std;
11 
12 int f[10000010],num[10000010];
13 int n,m;
14 
15 void init()
16 {
17     for(int i=0;i<=10000010;i++){
18         f[i]=i;
19         num[i]=1;
20     }
21 }
22 
23 int find(int x)
24 {
25     if(x!=f[x])
26         f[x]=find(f[x]);
27     return f[x];
28 }
29 
30 void Union(int x,int y)
31 {
32     int p=find(x);
33     int q=find(y);
34     if(p != q){  
35         f[p] = q;
36         num[q]+=num[p];
37     }
38 }
39 
40 int main()
41 {
42     int n,m,i,j,a,b;
43     while(~scanf("%d",&n)){
44         if(n==0){
45             printf("1\n");  
46             continue;  
47         }
48         init();
49         int max=0;
50         for(i=0;i<n;i++){
51             scanf("%d%d",&a,&b);
52             Union(a,b);
53         }
54         for(j=0;j<=10000010;j++){
55             if(num[j]>max)
56                 max=num[j];
57         }
58         printf("%d\n",max);
59     }
60 }

 

posted @ 2015-11-11 21:38  Vmetrio  阅读(229)  评论(0编辑  收藏  举报