#include<stdio.h>
int father[1005];
int find(int x) //寻找集合的祖先
{
if(x==father[x])
return father[x];
return father[x]=find(father[x]);//路径压缩//递归
}
void merge(int a,int b) //合并集合
{
int G=find(a);
int H=find(b);
father[G]=H; //归属于同一祖先
}
int main()
{
int N,M,n,m;
while(scanf("%d",&N)&&N)
{
scanf("%d",&M);
int sum=0;
for(int i=1;i<=N;i++)//最初自己属于自己的集合
father[i]=i;
for(int j=0;j<M;j++)
{
scanf("%d%d",&n,&m);//两个连通的村庄
merge(n,m); //合并集合
}
for(int s=1;s<=N;s++)
{
if(father[s]==s) sum++;//查找有几个集合//查找集合有几个根
}
printf("%d\n",sum-1);//所需的道路为集合数-1
}
}
nyist-608
最新推荐文章于 2019-11-25 00:00:01 发布