裸并查集没啥说的
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cstdlib>
#include<cmath>
using namespace std;
int uf[50050];
int find(int x)
{
int r=x;
while(uf[r]!=r)
r=uf[r];
return r;
}
void merge(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
uf[fy]=fx;
}
int main()
{
int n,m,k=1;
while(scanf("%d%d",&n,&m)&&(n||m))
{
for(int i=1;i<=n;i++)
uf[i]=i;
for(int i=0;i<m;i++)
{
int v1,v2;
scanf("%d%d",&v1,&v2);
merge(v1,v2);
}
int cnt=0;
for(int i=1;i<=n;i++)
if(uf[i]==i)
cnt++;
printf("Case %d: %d\n",k++,cnt);
}
}