#include<bits/stdc++.h>
using namespace std;
#define MXN 1010
int fa[MXN];
int find(int r)
{
if(r!=fa[r]) fa[r] = find(fa[r]);
return fa[r];
}
void merge(int a,int b)
{
int t1 = find(a);
int t2 = find(b);
if(t1!=t2) fa[t1]=t2;
}
int main ()
{
int n,m,i,x,y,c;
while(scanf("%d",&n),n)
{
scanf("%d",&m);
for(i = 1;i<=n;i++) fa[i] = i;
for(i = 1;i<=m;i++)
{
scanf("%d%d",&x,&y);
merge(x,y);
}
c = -1;
for(i = 1;i<=n;i++) if(i==fa[i]) c++;
printf("%d\n",c);
}
return 0;
}
int find(int r)
{
while(r!=fa[r]){
r = fa[r];
}
return r;
}
``int find(int r)
{
while(r!=fa[r])
r = fa[r];
return r;
}
find()函数的两种实现方式1.递归 "路径压缩:在查询过程中,查询路径上的城镇成为根的儿子"见图示 2.while()函数循环 比递归效率稍慢。在这里插入图片描述[添加链接描述](http://acm.hdu.edu.cn/showproblem.php?pid=1232)
hdu 1232 畅通工程
最新推荐文章于 2021-09-23 13:41:44 发布