题意:
有n个学生,m个关系,每个关系a b,以为a b的宗教相同,问最多有多少种宗教。
思路:
用并查集维护学生的宗教集合,最后遍历统计答案。
代码:
#include <cstdio>
#include <iostream>
using namespace std;
int fa[50010], cnt, t;
bool vis[50010];
int find(int x){
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
int main(){
int n, m;
while(scanf("%d%d", &n, &m) && n+m){
cnt = 0, t ++;
for(int i = 1; i <= n; i ++) fa[i] = i, vis[i] = 0;
for(int i = 1; i <= m; i ++){
int a, b;
scanf("%d%d", &a, &b);
if(find(a) != find(b)) fa[fa[a]] = b;
}
for(int i = 1; i <= n; i ++)
if(!vis[find(i)]) cnt ++, vis[fa[i]] = 1;
printf("Case %d: %d\n", t, cnt);
}
return 0;
}