典型的并查集类型,将联通的点归为一个集合,最后一共有count个集合。则需要修建count-1条道路。
#include<iostream>
using namespace std;
int set[1001];//全局变量模拟n个点
int find(int x)//查找原始祖先
{
int r=x;
while(set[r]!=r)
r=set[r];
return r;
}
void merge(int a,int b)//归并
{
int fa=find(a);
int fb=find(b);
if(fa!=fb)//不属于同一集合则将fa的祖先改为fb,归并为一个集合
set[fa]=fb;
}
int main()
{
int x,y,n,m,i,count;
while(cin>>n&&n)
{
count=0;//初始化集合总数
for(i=0;i<n;i++)
set[i]=i;
cin>>m;
for(i=0;i<m;i++)
{
cin>>x>>y;
merge(x-1,y-1);
}
for(i=0;i<n;i++)
if(set[i]==i)//满足原始祖先的条件则 集合总数加加
count++;
cout<<(count-1)<<endl;
}
return 0;
}