您的位置:首页 > 其它

POJ2524-宗教问题-并查集-ACM

2014-10-06 19:46 253 查看
太难的搞不过,只能来写简单的了

POJ2524

无所不在的宗教

世界上宗教何其多。假设你对自己学校的学生总共有多少种宗教信仰很感兴趣。学校有n个学生,但是你不能直接问学生的信仰,不然他会感到很不舒服的。有另外一个方法是问m对同学,是否信仰同一宗教。根据这些数据,相信聪明的你是能够计算学校最多有多少种宗教信仰的。

【输入格式】

可以输入多个测试用例(Case),每一个用例的第一行包含整数n和m,n表示学生编号(1-n),在接下来的m行中,每一行包含两个整数,对应信仰同一宗教的两名学生的编号,输入结束行为n
= m=0。

【输出格式】

输出每一个测试用例中包含的学生信仰的最大宗教数量。

样例输入

10 9
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
10 4
2 3
4 5
4 8
5 8
0 0


样例输出

Case 1: 1
Case 2: 7


代码

#include <iostream>
using namespace std;

const int MAXN=50001;
int pa[MAXN];
int rank[MAXN];

void make_set(int x){
pa[x] = x;
rank[x] = 0;
}

int find_set(int x){
if(x != pa[x]){
pa[x] = find_set(pa[x]);
}
return pa[x];
}

void union_set(int x,int y){
x = find_set(x);
y = find_set(y);

if(rank[x] >  rank[y]){
pa[y] = x;
}
else{
pa[x] = y;
if(rank[x] == rank[y]){
rank[y]++;
}
}
}

int main(void){
int n,m,kase=0,count;
while(scanf("%d%d",&n,&m) == 2 && n!=0 && m!=0){
int i;
for(i=1;i<=n;i++){
make_set(i);
}
for(i=0;i<m;i++){
int a,b;
scanf("%d%d",&a,&b);
union_set(a,b);
}
count = 0;
for(i=1;i<=n;i++){
if(i == pa[i]){
count++;
}
}
printf("Case %d: %d\n",++kase,count);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: