题目传送门
分析题目
实现交通(平面上任意两点必须有一条路径)
第一眼看很像最小生成树,但后来发现我想多了……
因为本题只需计算最小还需要建设几条道路,使用 并查集 即可解决
数据范围:
1 ≤ n < 1000 1 ≤ n < 1000 1≤n<1000
这大小,使用并查集完全没问题
(不会并查集的点击上方的链接阅览即可)
上代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int f[1005];
int x,y,ans;
void init()//初始化
{
ans=-1;//ans即最终的答案,不过因为如果只有一个公共祖先,那么我们其实是不用新建道路的,所以ans赋值为-1
for(int i=1;i<=n;i++)//并查集的初始化
{
f[i]=i;
}
return;
}
int findfather(int x)
{
if(f[x]==x)//如果此节点是自己的父亲,那么直接返回
{
return x;
}
else
{
f[x]=findfather(f[x]);//压缩路径
return f[x];
}
}
void Union(int x,int y)
{
f[findfather(x)]=f[findfather(y)];//合并
return;
}
int main(){
while(true)
{
scanf("%d",&n);
if(n==0)//结束条件
{
break;
}
scanf("%d",&m);
init();
for(int i=1;i<=m;i++)
{
//每输入一次,就合并俩
scanf("%d%d",&x,&y);
Union(x,y);
}
for(int i=1;i<=n;i++)
{
if(f[i]==i)//如果此节点是自己的父亲,那么ans++
{
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}