int num[max];
void initial()
{
for(int i=0;i<max;i++)
num[i]=i;
}
void getn(int v)
{ if(num[v]==v)
{
return v;
}
else
{num[v]=getn(num[v])
return num[v];
}
}
void merge(int a,int b)
{int t1,t2;
t1=getn[a];
t2=getn[b];
if(t1!=t2)
num[t2]=t1;
}
Problem - 1232 http://acm.hdu.edu.cn/showproblem.php?pid=1232
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 1005
using namespace std;
int num[MAXN];
void init()
{
int i;
for(i=1;i<MAXN;i++)
num[i]=i;
}
int getn(int v)
{
if(num[v]==v)
return v;//如果找到的結點正好是下標那麼該點一定是頭
//並且一次遞歸地返回到前一層是每一個前面的結點也更新爲它的子節點!
else
{
num[v]=getn(num[v]);
return num[v];
}
}
void merge(int a,int b)
{
int t1,t2;
t1=getn(a);
t2=getn(b);
if(t1!=t2)
{
num[t2]=t1;//只要將它的根結點更新,即把t1賦給num[t2],在下一次更新時只需將原t2下的結點全部變爲他
//t1的子節點
}
}
int main()
{
int n,m,s;
while(~scanf("%d",&n))
{
s=0;
if(n==0)
break;
scanf("%d",&m);
init();
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
merge(a,b);
}
for(int j=1;j<=n;j++)
{
if(num[j]==j)
s++;
}
s=s-1;
printf("%d\n",s);
}
return 0;
}