题目已知N个城镇和M条道路,输出最小建立多少通道使所有城镇相互连通。这题用并查集的思想来解决。并查集思路:
1.初始化:把每个数组的数值设置为下标本身
2.查找:查找每个数组元素的根节点
3.合并:将两个元素的根节点合并成一个根节点
#include<iostream> using namespace std; int a[1200]; int find(int x) { while (a[x] != x) x = a[x]; return x; } void combine(int b, int c) { if (find(b) != find(c)) { a[find(c)] = find(b); } } int main() { int n, m; int b, c; int ans; while (cin >> n >> m) { if (n == 0) break; ans = 0; for (int i = 1; i <= n; i++) a[i] = i; for (int i = 1; i <= m; i++) { cin >> b >> c; combine(b, c); } for (int i = 1; i <= n; i++) { if (a[i] == i) ans++; } cout << ans - 1 << endl; } return 0; }