并查集find,merge操作

一、find操作

//find操作路径压缩版
inline int find(int x){
    if(fa[x]==x) return x;
    int t=find(fa[x]);
    fa[x]=t;
    return t;
}

二、merge操作

//此处为正常版,启发式的merge在大多数题中不需要。
//一般配合find使用,find路径压缩已经够快了(除毒瘤)
//再说,启发式merge写起来很费代码量
inline void merge(int x,int y){
    x=find(x);
    y=find(y);
    if(x==y) return;
    fa[x]=y;
}

Note:

一般在使用的时候,find路径压缩和merge配合使用。

而在初始化的时候,

不要忘了:

memset(fa,0,sizeof(fa));
for(int i=1;i<=n;i++) fa[i]=i;

------------------------------------------------------THE END------------------------------------------------------------

猜你喜欢

转载自www.cnblogs.com/RiaOIer-Blog/p/12370364.html