并查集

· · 个人记录

概述

操作

复杂度分析

实现原理

namespace ufs{
    int FA[maxn],rnk[maxn];
    il void init(){iota(FA+1,FA+n+1,1); For(i,1,n) rnk[i]=_rand(); return;}
    il int find(int x){return x==FA[x]?x:FA[x]=find(FA[x]);}
    il void merge(int u,int v){
        static int fau,fav;
        fau=find(u),fav=find(v);
        if(fau==fav) return;
        if(rnk[fau]<rnk[fav]) swap(fau,fav);
        FA[fav]=fau; return;
    }
} 
il int find(int x){
    static int fa,temp; fa=x;
    while(fa!=FA[fa]) fa=FA[fa];
    while(x!=fa){
        temp=FA[x];
        FA[x]=fa;
        x=temp;
    }
    return;
}

扩展

可撤销化

可持久化

与分块结合

lazy tag