并查集
参考资料
简介
并查集(Disjoint Set Union,DSU)维护若干不相交集合,支持合并两个集合、查询元素所属集合两种操作。每个集合用一棵树表示,根作为代表元,find 沿父指针上溯到根。配合 路径压缩(查询时把路径上的点直接挂到根)与 按秩合并,单次操作的均摊复杂度为反阿克曼函数 ,近似常数。
实现
struct DSU
{
int fa[N];
void init(int n){for(int i=1;i<=n;i++)fa[i]=i;}
int find(int u){return u==fa[u]?u:fa[u]=find(fa[u]);}
void merge(int u,int v){fa[find(u)]=find(v);}
bool query(int u,int v){return find(u)==find(v);}
};