赤裸裸的并查集
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int f[50010],vis[50010];
int find(int x)
{
return f[x]==x ? x : find(f[x]);
}
int main()
{
int m,n,i,j,k,t,ans,x,y,p;
t=0;
while(cin>>n>>m)
{
t++;
p=ans=0;
memset(vis,0,sizeof(vis));
if(m==0||n==0) break;
for(i=1;i<=n;i++) f[i]=i;
for(k=0;k<m;k++)
{
cin>>i>>j;
f[find(i)]=find(j);
}
for(i=1;i<=n;i++)
{
if(!vis[find(i)])
{vis[find(i)]=1;ans++;}
}
printf("Case %d: %d\n",t,ans);
}
return 0;
}