题目大意
世界上有许多宗教,你感兴趣的是你学校里的同学信仰多少种宗教。
你的学校有n名学生(0 < n <= 50000),你不太可能询问每个人的宗教信仰,因为他们不太愿意透露。但是当你同时找到2名学生,他们却愿意告诉你他们是否信仰同一宗教,你可以通过很多这样的询问估算学校里的宗教数目的上限。你可以认为每名学生只会信仰最多一种宗教。
输入
输入包括多组数据。
每组数据的第一行包括n和m,0 <= m <= n(n-1)/2,其后m行每行包括两个数字i和j,表示学生i和学生j信仰同一宗教,学生被标号为1至n。输入以一行 n = m = 0 作为结束。
思路分析
并查集基础题
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define MAX 50005
int kind[MAX];
int find(int k) {
if (k == kind[k])return k;
else return kind[k] = find(kind[k]);
}
void unite(int x, int y) {
kind[find(x)] = find(y);
}
int main() {
int n, m, i = 1;
while (cin >> n >> m && m + n > 0) {
int res = 0;
for (int i = 1; i <= n; i++)kind[i] = i;
while (m--) {
int a, b; cin >> a >> b;
unite(a, b);
}
for (int i = 1; i <= n; i++) {
if (find(i) == i) res++;
}
printf("Case %d: %d\n", i++, res);
}
}