GESP2025年9月认证C++七级( 第三部分编程题(1)连通图)




























参考程序:
#include <bits/stdc++.h>
using namespace std;struct DSU {vector<int> p, r;DSU(int n): p(n+1), r(n+1, 0) {for (int i = 1; i <= n; ++i) p[i] = i;}int find(int x) {if (p[x] != x) p[x] = find(p[x]);return p[x];}void unite(int a, int b) {a = find(a); b = find(b);if (a == b) return;if (r[a] < r[b]) swap(a,b);p[b] = a;if (r[a] == r[b]) r[a]++;}
};int main() {int n, m;cin >> n >> m;DSU dsu(n);for (int i = 0; i < m; ++i) {int u, v; cin >> u >> v;if (u >= 1 && u <= n && v >= 1 && v <= n) dsu.unite(u, v);}int components = 0;for (int i = 1; i <= n; ++i) if (dsu.find(i) == i) components++;cout << max(0, components - 1) << "\n";return 0;
}参考程序2(简化):
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 1e5 + 5;
int n, m;
int f[N];
int ans;
int getf(int u)
{ return f[u] ? f[u] = getf(f[u]) : u;
}
int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= m; i++) {int u, v;scanf("%d%d", &u, &v);if (getf(u) != getf(v)) f[getf(u)] = v;}for (int i = 1; i <= n; i++) ans += getf(i) == i;printf("%d\n", ans - 1);return 0;
}