并查集的定义:
int fa[N];
fa[i]=i表示i的父节点为i
并查集的操作
初始化:
FOR(i,0,N)
fa[i]=i;
查找:
int findFather(int x)
{
while(x!=fa[x]){
x=fa[x];
}
return x;
}
合并:
void Union(int a,int b)
{
int faA=findFather(a);
int faB=findFather(b);
if(faA!=faB){
fa[faA]=faB;
}
}
优化后的查询操作——路径压缩:
int findFather(int x)
{
int a=x;
while(x!=fa[x]){
x=fa[x];
}
while(a!=fa[a]){
int z=a;
a=fa[a];
fa[z]=x;
}
return x;
}