题意很简单:就是求不连通的个数。
//好久没做并查集了,快没感觉了,找了个简单的题目练练。
//以后得注意了,学的东西要及时巩固。
//时间有点长 可以继续优化;
//rank[]的值不可以随便更改。
//但是自己可以增加一个判断常量。
#include<iostream>
#include<cstdio>
#define MAX 50002
int farther[MAX];
int rank[MAX];
int num[MAX];
int check[MAX];
int find(int x)
{
if(farther[x]==x) return x;
farther[x]=find(farther[x]);
return farther[x];
}
void unit(int x,int y)
{
int rx=find(x);
int ry=find(y);
if(rx==ry) return ;
if(rank[rx]>rank[ry])
{
farther[ry]=rx;
}
else
{
//rank[]的值不可以随便更改。
farther[rx]=ry;
if(rank[ry]==rank[rx])
rank[ry]++;
}
}
int main()
{
int a,b;
int x,y;
int ans1,ans2,step=1,res,people;
while(scanf("%d%d",&a,&b),a)
{
ans1=ans2=0;
if(b==0) printf("Case %d: %d",step++,a);
for(int i=1;i<=a;i++)
{
farther[i]=i;
rank[i]=0;
check[i]=0;
}
for(int j=0;j<b;j++)
{
scanf("%d%d",&x,&y);
unit(x,y);
}
int s;
for(int j=1;j<=a;j++)
{
s=find(j);
if(s==j){ans1++;continue;}
else
{
if(check[s]!=0)
ans2++;
check[s]=0;
}
}
printf("Case %d: %d\n",step++,ans1+ans2);
}
return 0;
}