并查集(DSU)
并查集(DSU)
2026/2/11
模板
#include <vector>
#include <numeric>
struct DSU {
vector<ll> f, sz;
ll sets; // 连通块个数
DSU(ll n) : f(n+1), sz(n+1, 1), sets(n) {
iota(f.begin(), f.end(), 0);
}
ll find(ll x) {
while (x != f[x]) x = f[x] = f[f[x]]; // 路径减半
return x;
}
void merge(ll x, ll y) {
x = find(x), y = find(y);
if (x == y) return;
if (sz[x] < sz[y]) swap(x, y); // 按规模合并
f[y] = x;
sz[x] += sz[y];
sets--;
}
};Last updated on