题解 | #畅通工程#
畅通工程
https://www.nowcoder.com/practice/4878e6c6a24e443aac5211d194cf3913
#include <iostream>
using namespace std;
const int N = 100010;
int father[N];//祖宗节点
int height[N];//祖宗节点高度
void initial(int n) {
for (int i = 1; i <= n; i++) {
father[i] = i;
height[i] = 0;
}
}
int find(int x) { //找到祖宗节点
if (father[x] != x) father[x] = find(father[x]);
return father[x];
}
void Union(int a, int b) {
a = find(a);
b = find(b);
if (a != b) {//两个节点不是一个集合
if (height[a] < height[b]) father[a] = b;
else if (height[a] > height[b]) father[b] = a;
else {
father[a] = b;
height[b]++;
}
}
return;
}
int main() {
int n, m;
while (cin >> n >> m) {
if (n == 0) break; //输入结束
initial(n);
while (m--) {
int a, b;
cin >> a>>b;
Union(a, b); //并
}
int ans = -1;
for (int i = 1; i <= n; i++) {
if (find(i) == i) ans++;
}
cout << ans << endl;
}
}
// 64 位输出请用 printf("%lld")
查看13道真题和解析