这是一道并查集的水题,套用模板就行了。
#include<stdio.h>
int arr[50005];
int find(int x)
{
int k, j, r;
r = x;
while(r != arr[r])
r = arr[r];
k = x;
while(k != r)
{
j = arr[k];
arr[k] = r;
k = j;
}
return r;
}
void merge(int a, int b)
{
int fx=find(a);
int fy=find(b);
if(fx!=fy)
arr[fx]=fy;
}
int main()
{
int n,m,count,k=0;
int a,b;
while(~scanf("%d%d",&n,&m),n,m)
{
for(int i=1;i<=n;i++)
arr[i]=i;
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
merge(a,b);
}
count=0;
for(int i=1;i<=n;i++)
{
if(arr[i]==i)
count++;
}
k++;
printf("Case %d: %d\n",k,count);
}
return 0;
}