并查集是一种优秀的数据结构、最基本的其能够做快速判断两个元素是否同属一个集合、根据这个特点其能够做的事情就非常多了!举个例子就是能够判断无向图的连通性、优化链式查找、帮助构建最小生成树等等。并查集能存储的元素加上向量后还能存储一系列的关系,解决一些问题矛盾判断问题,总之并查集好理解又好写,是必备的技能!
算法原理请参考 ==> http://blog.csdn.net/qq_34594236/article/details/51834882
下面是带路径压缩的模板、但是注意要结合题目分析、有些时候带了路径压缩反而错了!
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; }