#include <stdio.h>
int stack[10000];
int find(int x)
{
int k,j;
int r=x;
while(stack[r]!=r)
r=stack[r];
k=x;
while(k!=r) //非递归的缩短路径查找
{
j=stack[k]; //记录父节点
stack[k]=r; //让父节点直接等于根节点
k=j; //依次循环
}
return r; //返回根节点
}
void merge(int x,int y)
{
int fx=find(x); //查找x的根节点
int fy=find(y); //查找y的根节点
if(fx!=fy)
stack[fx]=fy; //如果不相等就合并
}
int main()
{
int n,m,i,x,y;
while(scanf("%d",&n)&&n)
{
for(i=1; i<=n; i++)
stack[i]=i; //每个点自己为一个集合
scanf("%d",&m);
for(i=1; i<=m; i++)
{
scanf("%d %d",&x,&y);
merge(x,y); //两个点建立通道
}
int c=-1;
for(i=1; i<=n; i++)
if(stack[i]==i)
c++;
printf("%d\n",c);
}
}
畅通工程
最新推荐文章于 2021-01-29 11:59:49 发布