模板:并查集
int ds[N], n;
void init() { memset(ds, -1, sizeof ds); }
int find(int x) { return (ds[x] < 0) ? x : (ds[x] = find(ds[x])); }
void merge(int x, int y) {
if ((x = find(x)) == (y = find(y))) return;
if (ds[x] > ds[y]) swap(x, y);
ds[x] += ds[y], ds[y] = x;
}

浙公网安备 33010602011771号