模板 - 数据结构 - 并查集

百般思念 提交于 2019-12-04 17:55:40

Codeforces Round #600 里面有用到这个,但是真的重新打浪费时间。

不需要什么按秩合并,浪费空间多此一举,让那个合并的常数大了不少。但是循环还是有必要的,比递归快很多。

struct DisjointSetUnion {
    static const int MAXN = 200000;
    int n, fa[MAXN + 5];

    void Init(int _n) {
        n = _n;
        for(int i = 1; i <= n; i++)
            fa[i] = i;
    }

    int Find(int u) {
        int r = fa[u];
        while(fa[r] != r)
            r = fa[r];
        int t;
        while(fa[u] != r) {
            t = fa[u];
            fa[u] = r;
            u = t;
        }
        return r;
    }

    bool Merge(int u, int v) {
        int fu = Find(u), fv = Find(v);
        if(fu == fv)
            return false;
        else {
            fa[v] = fu;
            return true;
        }
    }
} dsu;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!