summaryrefslogtreecommitdiff
path: root/content/datastructures/unionFind.cpp
blob: 88617902ff436c890ae7c16349bccf10c4bf1ee0 (plain)
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
struct UnionFind {
	vector<int> unions; // unions[i] = parent or unions[i] = -size

	UnionFind(int n): unions(n, -1) {}

	int find(int a) {
		return unions[a] < 0 ? a : unions[a] = find(unions[a]);
	}

	bool link(int a, int b) {
		if ((a = find(a)) == (b = find(b))) return false;
		if (unions[b] > unions[a]) swap(a, b);
		unions[b] += unions[a];
		unions[a] = b;
		return true;
	}

	int size(int a) { // optional
		return -unions[find(a)];
	}

	int add() { // optional
		unions.push_back(-1);
		return ssize(unions) - 1;
	}
};