思路:简单的并查集
分析:输入的时候把相同集合的元素合并在一起,那么我们用一个vis数组来标记集合根节点是否出现过。比如某个几个的根节点为5,那么就把vis[5] = 1。这样最后我们只需要
枚举一变所有的点,把最后有个根节点求出来就是最大的集合数量
代码:
#include<set>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 50010;
int father[MAXN];
void init(int n){
for(int i = 0 ; i <= n ; i++)
father[i] = i;
}
int find(int x){
if(father[x] != x)
father[x] = find(father[x]);
return father[x];
}
void solve(int x , int y){
int fx = find(x);
int fy = find(y);
if(fx != fy)
father[fx] = fy;
}
int main(){
int cas = 1;
int n , m;
int x , y;
while(scanf("%d%d" , &n , &m) && n+m){
init(n);
while(m--){
scanf("%d%d" , &x , &y);
solve(x , y);
}
set<int>s;
for(int i = 1 ; i <= n ; i++)
s.insert(find(i));
printf("Case %d: %d\n" , cas++ , s.size());
}
return 0;
}