This documentation is automatically generated by competitive-verifier/competitive-verifier
#include "graph/dsu.hpp"Disjoint Set Union (DSU) with union by size and path compression. Supports efficient union and find operations in nearly constant time per operation.
DSU(int n)
n elementsvoid reset(int n)
n elements (all in separate sets)int find(int x)
x
bool same(int x, int y)
x and y are in the same setint size(int x)
x
bool merge(int x, int y)
x and y. Returns true if they were in
different setsbool merge(int x, int y, F &&f)
x and y and calls f(rep(x), rep(y)) where
rep(x) is the new roottrue if they were in different sets#pragma once
struct DSU {
vector<int> data;
DSU() : DSU(0) {}
DSU(int n) : data(n, -1) {}
void reset(int n) {
if (data.size() < n) data.resize(n);
fill_n(begin(data), n, -1);
}
int size(int x) { return -data[find(x)]; }
int find(int x) { return data[x] < 0 ? x : data[x] = find(data[x]); }
bool same(int x, int y) { return find(x) == find(y); }
bool merge(int x, int y) {
return merge(x, y, [](auto...) {});
}
template<class F> bool merge(int x, int y, F &&f) {
x = find(x), y = find(y);
if (x == y) return false;
if (data[x] > data[y]) swap(x, y);
data[x] += exchange(data[y], x);
f(x, y);
return true;
}
};
#line 2 "graph/dsu.hpp"
struct DSU {
vector<int> data;
DSU() : DSU(0) {}
DSU(int n) : data(n, -1) {}
void reset(int n) {
if (data.size() < n) data.resize(n);
fill_n(begin(data), n, -1);
}
int size(int x) { return -data[find(x)]; }
int find(int x) { return data[x] < 0 ? x : data[x] = find(data[x]); }
bool same(int x, int y) { return find(x) == find(y); }
bool merge(int x, int y) {
return merge(x, y, [](auto...) {});
}
template<class F> bool merge(int x, int y, F &&f) {
x = find(x), y = find(y);
if (x == y) return false;
if (data[x] > data[y]) swap(x, y);
data[x] += exchange(data[y], x);
f(x, y);
return true;
}
};