class UF {
private:
int count;
vector<int> fa;
vector<int> rank;
public:
UF(int n)
{
count = n;
for (int i = 0; i < n; i++) {
fa.push_back(i);
rank.push_back(1);
}
}
int find(int root)
{
// 路径压缩 树的高度不超过3
while (root != fa[root]) {
fa[root] = fa[fa[root]];
root = fa[root];
}
return root;
}
void union_(int p, int q)
{
int root_p = find(p);
int root_q = find(q);
// if connected
if (root_p == root_q)
return;
// 将节点数较少的树接到节点数较多的树下面
if (rank[root_p] > rank[root_q]) {
fa[root_q] = root_p;
rank[root_p] += rank[root_q];
}
// 相等或者小于的情况下,接到右边节点
else {
fa[root_p] = root_q;
rank[root_q] += rank[root_p];
}
count--;
}
bool connected(int p, int q)
{
return find(p) == find(q);
}
int count_connected()
{
return count;
}
};