题目:某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
想法:并查集的基础题,至于什么是并查集,如果不知道的看这个并查集详解上面讲的肯定比我解释的好。(语文不好不解释)一些解释会在代码里注释,应该比较详细的了吧。(写这东西就是给自己以后看的 肯定会忘的)刚看了并查集,还没做过的人,看代码应该就懂了怎么操作的。
#include<iostream>
using namespace std;
int father[1000],n,m;
void xxx() //这个函数用来初始化,每个节点的初始父节点是它本身
{
for(int i=1;i<=n;i++)
father[i]=i;
}
int find(int x)//这个函数找父节点
{
while(father[x]!=x)x=father[x];//如果它的父节点不是它自己。。。。。。到找到最终的那个根节点为止
return x;
}
void compar(int a,int b)//两条路连接
{
int temp_a=find(a);
int temp_b=find(b);
if(temp_a!=temp_b)father[temp_a]=temp_b;//因为这是两条路连接了 所以根节点就要变成同一个
}
int resu()
{
int su=0;
for(int i=1;i<=n;i++)//找到几个父节点,数量减一就是要修的最少的路
{
if(father[i]==i)su++;
}
return su;
}
int main()
{
while(cin>>n&&n!=0)
{
cin>>m;
if(m==0)
{
cout<<n-1<<endl;
continue;
}
xxx();
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
compar(a,b);
}
int h=resu();
cout<<h-1<<endl;
}
return 0;
}