注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。
#include<stdio.h>
int father[1001]; //此数组用于存各个城市的父亲
int find(int x) //此函数用递归查找任意一个城市的父亲
{
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
]
//下面函数用于合并集合,当实参两个城市的父亲不同时,令a的父亲的父亲(father[x]==x时,x为是原来的父亲,原来父亲的父 亲)等于b的父亲,这样两个集合就有相同的父亲,也就成为同一集合
void merge(int a,int b)
{
int x,y;
x=find(father[a]);
y=find(father[b]);
if(x!=y)
father[x]=y;
}
int main()
{
int n,m,i,a,b,cnt=0;
while(1)
{
cnt=0;
scanf("%d",&n);
if(n==0)
break;
for(i=1; i<=n; i++) //先让每个城市的父亲等于自身
father[i]=i;
scanf("%d",&m);
for(i=0; i<m; i++)
{
scanf("%d%d",&a,&b);
merge(a,b);
}
for(i=1; i<=n; i++)
if(find(i)==i)
cnt++; //cnt的值为有多少个集合,将这些集合连通,至少还需要修cnt-1条路
printf("%d
",cnt-1);
}
return 0;
}