#include <stdio.h>
#define MAX_STDDENTS 50000
int numOfStudents, numOfPairs;
int religion[MAX_STDDENTS + 1];
int rank[MAX_STDDENTS + 1];
void makeSet(){
int student;
for (student = 1; student <= numOfStudents; student++){
religion[student] = student;
rank[student] = 0;
}
}
int findSet(int student){
if (student != religion[student])
//路径压缩
religion[student] = findSet(religion[student]);
return religion[student];
}
void unionSet(int one, int another){
//按秩合并
if (rank[one] > rank[another]){
religion[another] = religion[one];
} else {
religion[one] = religion[another];
//更新秩,秩为集合树的高
if (rank[one] == rank[another])
rank[another]++;
}
}
int main(){
int testcase = 1;
while (1){
scanf("%d%d", &numOfStudents, &numOfPairs);
if (numOfStudents == 0 && numOfPairs == 0)
return 0;
makeSet();
int result = numOfStudents;
int pair;
for (pair = 1; pair <= numOfPairs; pair++){
int one, another;
scanf("%d%d", &one, &another);
one = findSet(one);
another = findSet(another);
if (one != another){
result--;
unionSet(one, another);
}
}
printf("Case %d: %d\n", testcase++, result);
}
}
POJ 2524 Ubiquitous Religions (并查集)
最新推荐文章于 2022-12-25 14:52:12 发布