Disjoint Set Union
struct DSU {
vector<int> fa;
void init(int n) {
fa.assign(n+1, -1);
}
int root(int x) {
return fa[x] < 0 ? x : fa[x] = root(fa[x]);
}
void unite(int u, int v) {
u = root(u);
v = root(v);
if (u == v) return;
if (fa[u] > fa[v]) swap(u,v);
fa[u] += fa[v];
fa[v] = u;
}
void uniteRoot(int u, int v) {
if (fa[u] > fa[v]) swap(u,v);
fa[u] += fa[v];
fa[v] = u;
}
};
Độ phức tạp: \(O(log(log(N)))\), nếu số lượng đỉnh \(\le 10^6\) thì độ phức tạp \(\approx O(1)\)
Lưu ý:
- Cần phải khởi tạo mảng fa bằng -1.
- Nếu đỉnh i là gốc khi và chỉ khi fa[i] < 0 và -fa[i] là số lượng đỉnh trong tập gốc i (tính cả i).
- Khi sử dụng hàm
uniteRoot(u, v)
thì u và v phải là các đỉnh gốc.