Skip to content

并查集

优化

一般路径压缩即可,启发式合并很多时候不利于代码的修改

重点

用于维护一种传递关系

模板

cpp
struct DSU {
    std::vector<int> f, siz;
    
    DSU() {}
    DSU(int n) {
        init(n);
    }
    
    void init(int n) {
        f.resize(n);
        std::iota(f.begin(), f.end(), 0);
        siz.assign(n, 1);
    }
    
    int find(int x) {
        while (x != f[x]) {
            x = f[x] = f[f[x]];
        }
        return x;
    }
    
    bool same(int x, int y) {
        return find(x) == find(y);
    }
    
    bool merge(int x, int y) {
        x = find(x);
        y = find(y);
        if (x == y) {
            return false;
        }
        siz[x] += siz[y];
        f[y] = x;
        return true;
    }
    
    int size(int x) {
        return siz[find(x)];
    }
};
py
N=1e5+2
uf=[0]*int(N)
def init(n):
    for i in range(n):
        uf[i]=i
def find(x):
    if uf[x]!=x:
        uf[x]=find(uf[x])
    return uf[x]
def union(x,y):
    uf[find(x)]=find(y)
def check(x,y):
    return find(x)==find(y)

种类并查集

用于维护维护另一种关系:敌人的敌人是朋友

n个关系维护n个并查集即可

网站基于vitepress主题open17💙