http://poj.org/problem?id=2524
分析:
并查集模板题
AC代码:
#include <stdio.h>
int pre[50005];
int find(int n){
int flag=n;
while (pre[flag]!=flag){
flag=pre[flag];
}
int temp;
int i=n;
while (i!=flag){
temp=pre[i];
pre[i]=flag;
i=temp;
}
return flag;
}
void join(int x,int y){
int fx=find(x);
int fy=find(y);
if (fx!=fy){
pre[fx]=fy;
}
}
int main (){
int n,m;
int Case=1;
while (scanf("%d%d",&n,&m)&&(n||m)){
for (int i=1;i<=n;i++)
pre[i]=i;
int x,y;
for (int i=0;i<m;i++){
scanf ("%d%d",&x,&y);
join(x,y);
}
int count=0;
for (int i=1;i<=n;i++){
if(pre[i]==i)
count++;
}
printf ("Case %d: %d\n",Case++,count);
}
return 0;
}