题目:http://acm.hdu.edu.cn/showproblem.php?pid=1232
#include<stdio.h>
int bin[1002];
int findx(int x)
{
int r=x;
while(bin[r]!=r)//利用循环查找根结点,当bin[r]=[r]时,查找到根结点
r=bin[r];
int i=x,j;//路径压缩
while( i != r )
{
j=bin[ i ];//在改变上级之前用临时变量j记录下他的值
bin[ i ]= r ;//把上级改为根节点
i=j;
}
return r;//返回每个集合的根结点
}
void merge(int x,int y)
{
int fx,fy;
fx = findx(x);
fy = findx(y);
if(fx != fy)//如果根结点不相同则合并
bin[fx]=fy;//合并为拥有相同根结点的集合
}
int main()
{
int n,m,i,x,y,count;
while(scanf("%d",&n),n)//当n=0时结束循环
{
for(i=1;i<=n;i++)
bin[i] = i;/*初始每个元素自己一个集合
,并且表示本集合的根结点*/
for(scanf("%d",&m);m>0;m--)
{
scanf("%d %d",&x,&y);
merge(x,y);
}
for(count=-1, i=1;i<=n;i++)
if(bin[i]==i)//根结点有几个就有几个连通分支
count++;
printf("%d\n",count);
}
}
#include<stdio.h>
int bin[1002];
int findx(int x)
{
int r=x;
while(bin[r]!=r)//利用循环查找根结点,当bin[r]=[r]时,查找到根结点
r=bin[r];
int i=x,j;//路径压缩
while( i != r )
{
j=bin[ i ];//在改变上级之前用临时变量j记录下他的值
bin[ i ]= r ;//把上级改为根节点
i=j;
}
return r;//返回每个集合的根结点
}
void merge(int x,int y)
{
int fx,fy;
fx = findx(x);
fy = findx(y);
if(fx != fy)//如果根结点不相同则合并
bin[fx]=fy;//合并为拥有相同根结点的集合
}
int main()
{
int n,m,i,x,y,count;
while(scanf("%d",&n),n)//当n=0时结束循环
{
for(i=1;i<=n;i++)
bin[i] = i;/*初始每个元素自己一个集合
,并且表示本集合的根结点*/
for(scanf("%d",&m);m>0;m--)
{
scanf("%d %d",&x,&y);
merge(x,y);
}
for(count=-1, i=1;i<=n;i++)
if(bin[i]==i)//根结点有几个就有几个连通分支
count++;
printf("%d\n",count);
}
}