思路:
靠左合并,将右侧的数值合并到左边。在结束后扫一遍Father数组。有几个不同的关系
#include <iostream>
#include <stdio.h>
using namespace std;
int father[50010];
int relation[50010];
void init(int n)
{
for(int i=1;i<=n;i++)
{
father[i]=i;
}
}
int find(int x)
{
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
}
void Union(int x,int y)
{
int root1=find(x);
int root2=find(y);
if(root1!=root2)
{
father[root2]=root1;
}
}
int main()
{ int Case=1;
int n,m;
while(cin>>n>>m&&n&&m)
{
init(n);
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
Union(x,y);
}
int sum=0;
for(int i=1;i<=n;i++)
if(father[i]==i)
sum++;
printf("Case %d: ",Case++);
printf("%d\n",sum);
}
return 0;
}