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 43 44 45 46 47 48 49 50
| struct DSU { std::vector<int> f, siz;
DSU() {} DSU(int n) { init(n); }
void init(int n) { f.resize(n); std::iota(f.begin(), f.end(), 0); siz.assign(n, 1); }
int find(int x) { while (x != f[x]) { x = f[x] = f[f[x]]; } return x; }
bool same(int x, int y) { return find(x) == find(y); }
void merge(int x, int y) { x = find(x); y = find(y); if (x == y) { return; } if (x > y) f[y] = x; else f[x] = y; }
int size(int x) { return siz[find(x)]; } };
|