#include<iostream>
#include<stdio.h>
using namespace std;
int m,n;
int i,j,maxnum;
int father[30005],num[30005];
void makeset(int n)
{
for(i=0;i<n;i++)
{
father[i] = i;
num[i] = 1;
}
}
int findset(int x)
{
if(father[x]!=x)
{
father[x] = findset(father[x]);
}
return father[x];
}
void unionset(int a,int b)
{
int x=findset(a);
int y=findset(b);
if(x==y){
cout<<"maxnum--(1)"<<endl;
return;
}
if(num[x]<=num[y])
{
father[x] = y;
num[y]+=num[x];
maxnum--;
cout<<"maxnum--(2)"<<endl;
}
else
{
father[y] = x;
num[x]+=num[y];
maxnum--;
cout<<"maxnum--(3)"<<endl;
}
}
int main()
{
int cs=1;
while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
{
maxnum = n;
makeset(n);
int a,b;
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
unionset(a,b);
}
cout<<"Result:"<<maxnum<<endl;
}
return 0;
}
//=========================================
这个并查集的实现是利用不想交际和的森林实现的。
主要的思想是:当合并集合的时候,如果待合并的两个元素不在同一个集合,则执行maxnum-1操作,
如果在同一个集合,则当执行findset操作的时候,由于在同一个集合,具有相同的father节点,此时有:x==y直接return,而不执行maxnum--
意思是:当在同一个集合的时候,集合中元素的个数是不变的,当不再同一个集合的时候,集合中的元素个数增加,当时集合的个数减少。