- 题目大意
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
- 解题思路
运用并查集的知识可以很容易做出。初始化时每个城镇都没有路,所以要连接的路的数量为n-1个,之后在增加路的过程中,先用并查集搜索,如果两个城镇确实不在一个集合,这条路就有用,两个城镇归为一个集合中,要连接的路减一。如果两个城镇之前就已经在一个集合里,增加的这条路就无用,要连接的路不变
- 代码
#include<iostream>
#include<cstdio>
using namespace std;
const int MAX = 1e5 + 50;
int fa[MAX];
void init(int n)
{
for (int i = 0; i <= n; i++)
fa[i] = i;
}
int find(int x)
{
if (x == fa[x])
return x;
else
{
return fa[x] = find(fa[x]);
}
}
int main()
{
int n,m,x, y;
scanf("%d", &n);
while (n != 0)
{
scanf("%d", &m);
init(n);
int sum = n-1;
for (int i = 0; i < m; i++)
{
cin >> x >> y;
int fx = find(x), fy = find(y);
if (fx == fy)
continue;
else
{
fa[fx] = fy;
sum--;
}
}
printf("%d\n", sum);
scanf("%d", &n);
}
return 0;
}