Skip to content

Latest commit

 

History

History
37 lines (31 loc) · 583 Bytes

dsu.md

File metadata and controls

37 lines (31 loc) · 583 Bytes

Система непересекающихся множеств

struct Dsu {
	int n;
	vector<int> leader, rang, sz;

	Dsu(int _n): leader(_n), rang(_n), sz(_n, 1) {
		iota(begin(leader), end(leader), 0);
	}

	int get(int v) {
		return v == leader[v] ? v : leader[v] = get(leader[v]);
	}

	int size(int v) {
		return sz[get(v)];
	}

	bool merge(int u, int v) {
		u = get(u), v = get(v);
		if (u == v) {
			return false;
		}
		if (rang[u] < rang[v]) {
			swap(u, v);
		}
		leader[v] = u;
		sz[u]+=sz[v];
		if (rang[u] == rang[v]) {
			++rang[u];
		}
		return true;
	}
};