这是一道并查集的水题,快回寝室了,所以不多解释了
#include <cstdio>
#define MAX 50010
int father[MAX], son[MAX],re,nu = 1;
int unionfind(int x)
{
return (x == father[x] ? x :father[x] = unionfind(father[x]));
}
void join(int x, int y)
{
int p,q;
p = unionfind(x);
q = unionfind(y);
if(p == q)return ;
if(son[p] >= son[q])
{
father[q] = p;
son[p] += q;
}
else
{
father[p] = q;
son[q] += p;
}
re--;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m),n||m)
{
re = n;
for(int i = 1; i <= n; i++)
{
father[i] = i;
son[i] = 1;
}
for(int i = 0; i < m; i++)
{
int x,y;
scanf("%d%d",&x,&y);
join(x,y);
}
printf("Case %d: %d\n",nu++,re);
}
return 0;
}