【并查集模板】

来源:互联网 发布:淘宝敲诈 编辑:程序博客网 时间:2024/05/02 09:47



#include <stdio.h>//有的写法用到了树的深度,就是重新开一个数组ran[maxn];//用来记录每个树的深度,合并的时候把深度较小的合并到较大的上边,防止出现最极端的情况。//但是用上路径压缩的话就不需要这个数组,因为压缩过后深度都是 2 ,随意操作;//压缩就是把/* */里面的 par[x] = 加上,不加上去的话只查找,没有压缩;//附上带ran[]数组的合并;//如果用ran[]数组,尽量不要用rank[] rank再后边学习的时候是一个关键字; void unite(){int fa = find(a);int fb = find(b);if (fa == fb)return ;if (ran[fa] < ran[fb]) //如果a树的深度小于b树 就把a树忘b树上合并; par[fa] = fb;else{par[fb] = fa;if (ran[fa] == ran[fb])ran[fa]++;}}const int maxn = 1e6 + 10;int par[maxn];void init(int n){for (int i = 0; i <= n; i++)par[i] = i;}//压缩和不压缩的都要知道,后边有时会处理不压缩的; int find(int x){1.if ( x!= par[x])return /* */find(par[x]);return x;2.return x == par[x] ? x : /* */find(par[x]);3.int p = x, q = x;while (x != par[x])x = par[x];/*while (par[q] != x){int j = par[q];par[q] = x;q = j;}*/return par[x];}void unite(int a, int b){int fa = find(a);int fb = find(b);if (fa != fb)par[fa] = fb;}int main(){return 0;}