- 题目大意
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
- 解题思路
运用并查集的知识可以很容易做出。初始化时每个城镇都没有路,所以要连接的路的数量为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; }