简单的并查集写法
#include <bits/stdc++.h>
const int N = 1e6+10;
int fa[N];///某个节点的父节点
int Rank[N];///
void init()
{
for(int i=1;i<=N;i++)
{
fa[i]=i;///初始化,每一个点都代表自己
Rank[i]=1; ///每个节点都是一棵树,深度为1
}
}
int Find(int x)///找到x的根节点
{
if(fa[x]==x)
return fa[x];
return fa[x] = Find(fa[x]); ///完成路径压缩,x的节点直接变成根节点
}
bool is_same(int x,int y)///判断两个节点是否联通
{
return fa[x]==fa[y];
}
int unite (int x,int y)
{
int rootx = Find(x);
int rooty = Find(y);
if(rootx == rooty)
return ;
else
{
if(Rank[rootx]> Rank[rooty])
{
fa[rooty] = rootx;
}
else
{
if(Rank[rootx] == Rank[rooty])
Rank[rooty]++;
}
fa[rootx] = rooty;
}
}