题目大意
求不相交集合数
裸并查集
代码
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
namespace Union_Find_Set{
#define MAXN 100005
int fa[MAXN],flag[MAXN];
void Initialize(){
for(int i=0;i<MAXN;i++){
fa[i]=i;flag[i]=0;
}
}
int Find(int x){
return fa[x]==x?x:fa[x]=Find(fa[x]);
}
void Union(int x,int y){
int a=Find(x),b=Find(y);
if(a>b){
fa[b]=a;
}else{
fa[a]=b;
}
}
}
int N,m,ans(0),num(1);
int main() {
while(scanf("%d%d",&N,&m)!=EOF) {
if(N==0&&m==0) break;
using namespace Union_Find_Set;
Initialize();
int a,b;
for(int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
Union(a,b);
}
ans=0;
for(int i=1;i<=N;i++){
int t=Find(i);
if(!flag[t]) ans++;
flag[t]=1;
}
cout<<"Case "<<num++<<": "<<ans<<endl;
}
}