1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| struct DSU { std::vector<int> p, siz; int num;
DSU() {} DSU(int n) { init(n); }
void init(int n) { num = n; p.resize(n); std::iota(p.begin(), p.end(), 0); siz.assign(n, 1); }
int find(int u) { if (u != p[u]) { p[u] = find(p[u]); } return p[u]; }
bool same(int u, int v) { return find(u) == find(v); }
bool merge(int u, int v) { int fa_u = find(u), fa_v = find(v); if (fa_u == fa_v) { return false; } siz[fa_u] += siz[fa_v]; p[fa_v] = fa_u; return true; }
int size(int u) { return siz[find(u)]; }
};
|