H - 畅通工程
题目描述
给若干个城市与若干条已经建设好的道路,问最少还需建设多少条才能使任意两个城市之间可以实现交通(不一定要直接相连)。
题目分析
由题意可知,这题是并查集模板题,按照并查集题目的做法做就完事了。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
//刚开始练习,代码比较丑陋。。
int road[999];
int root_search(int x)
{
if(road[x]==x){
return x;
}
else{
return root_search(road[x]);
}
}
int main()
{
int n,m;
while(scanf("%d",&n)!=EOF&&n&&scanf("%d",&m)!=EOF){
for(int i=1;i<=n;i++)
road[i]=i;
for(int i=1;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
int ra=root_search(a),rb=root_search(b);
if(ra!=rb){
road[ra]=rb;
//printf("%d's father is %d\n",b,road[b]);
}
}
int ans=0;
for(int i=1;i<=n;i++){
if(root_search(road[i])==i)
ans++;
}
printf("%d\n",ans-1);
}
}