来源于:HDUOJ
精华部分;
find函数和join函数;
int find(int x)
{
while(x!=pre[x])
{
x=pre[x];
}
return x;
}
void join (int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
pre[fx]=fy;
}
全文;
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int pre[1001];
int find(int x)
{
while(x!=pre[x])
{
x=pre[x];
}//寻找到最高节点。
return x;
}
void join (int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
pre[fx]=fy;// 将fx连入fy的节点。
}
int main()
{
int n,m,count;
while(~scanf("%d",&n)&&n!=0)
{
count=0;
scanf("%d",&m);
int i;
for(i=1;i<=n;i++)
{
pre[i]=i;
}//自己联通自己。
for(i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
join(a,b);//将a与b所在子集联通。
}
for(int i=1;i<=n;i++)
{
if(pre[i]==i)
{
count++;
}
}
printf("%d\n",count-1);
}
}