简单并查集。这里要注意一点:当n>0且m为0是此时应该输出1。其它就是并查集的典型水题了。
下面是代码:352K+313MS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#define Max 50010
#define Maxx(a,b) (a)>(b)?(a):(b)
#define Min(a,b) (a)<(b)?(a):(b)
using namespace std;
int set[Max];
int find(int x){
int j=x;
while(x!=set[x])
x=set[x];
int temp;
while(j!=x){
temp=set[j];
set[j]=x;
j=temp;
}
return x;
}
int n,m;
int main(){
int Case=1;
while(scanf("%d%d",&n,&m)){
if(n==0)
break;
int a,b,x,y;
for(int i=1;i<=n;i++)
set[i]=i;
for(int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
x=find(a);
y=find(b);
if(x!=y)
set[Maxx(x,y)]=Min(x,y);
}
for(int i=1;i<=n;i++)
set[i]=find(i);
sort(set+1,set+1+n);
int ans=1;
for(int i=2;i<=n;i++)
if(set[i]!=set[i-1])
ans++;
printf("Case %d: %d\n",Case++,ans);
}
return 0;
}