并查集模板

并查集是一种优秀的数据结构、最基本的其能够做快速判断两个元素是否同属一个集合、根据这个特点其能够做的事情就非常多了!举个例子就是能够判断无向图的连通性、优化链式查找、帮助构建最小生成树等等。并查集能存储的元素加上向量后还能存储一系列的关系,解决一些问题矛盾判断问题,总之并查集好理解又好写,是必备的技能!

算法原理请参考 ==> http://blog.csdn.net/qq_34594236/article/details/51834882

 

下面是带路径压缩的模板、但是注意要结合题目分析、有些时候带了路径压缩反而错了!

int c[maxn], N;

inline void init()
{
    for(int i=0; i<=N; i++){
        c[i] = i;
    }
}

int Findset(int x)
{
    int root = x;
    while(c[root] != root)
        root = c[root];

    int idx;
    while(c[x] != root){ /// 路径压缩
        idx = c[x];
        c[x] = root;
        x = idx;
    }
    return root;
}

inline void Join(int a, int b)
{
    int A = Findset(a);
    int B = Findset(b);
    if(A != B) c[A] = B;
}
模板
原文地址:https://www.cnblogs.com/qwertiLH/p/7702212.html