并查集
Posted amaris-diana
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并查集相关的知识,希望对你有一定的参考价值。
并查集的以下几种优化和类型。
1.路径压缩
1 int pre[maxv]; 2 void init(int n) 3 4 /*初始化w*/ 5 for (int i= 0; i<= n; i ++) pre[i]= i; 6 7 int findFa(int x) 8 9 /*寻找树的根节点,并路径压缩w*/ 10 if (pre[x]== x) return x; 11 return pre[x]= findFa(pre[x]); 12 13 void join(int x, int y) 14 15 /*把x 所在的树并在y 所在的树的根节点下w*/ 16 pre[findFa(x)]= findFa(y); 17
2.按秩合并
1 int pre[maxv]; 2 int _rank[maxv]; 3 void init(int n) 4 5 for (int i= 0; i<= n; i ++) pre[i]= i; 6 for (int i= 0; i<= n; i ++) _rank[i]= 1; 7 8 int findFa(int x) 9 10 /*寻找树的根节点,并路径压缩w*/ 11 if (pre[x]== x) return x; 12 return pre[x]= findFa(pre[x]); 13 14 void join(int x, int y) 15 16 /*按秩合并,秩为树的大小*/ 17 int fx= findFa(x); 18 int fy= findFa(y); 19 if (_rank[fx]> _rank[fy]) 20 21 pre[fy]= fx; 22 _rank[fx]= _rank[fx]+ _rank[fy]; 23 24 else 25 26 pre[fx]= fy; 27 _rank[fy]= _rank[fy]+ _rank[fx]; 28 29
1 int pre[maxv]; 2 int _rank[maxv]; 3 void init(int n) 4 5 for (int i= 0; i<= n; i ++) pre[i]= i; 6 for (int i= 0; i<= n; i ++) _rank[i]= 1; 7 8 int findFa(int x) 9 10 /*寻找树的根节点,并路径压缩w*/ 11 if (pre[x]== x) return x; 12 return pre[x]= findFa(pre[x]); 13 14 void join(int x, int y) 15 16 /*按秩合并,秩为树的高*/ 17 /*ps: 有路径压缩感觉这个没什么用*/ 18 int fx= findFa(x); 19 int fy= findFa(y); 20 if (_rank[fx]> _rank[fy]) 21 22 pre[fy]= fx; 23 _rank[fx]= min(_rank[fx], _rank[fy]+ 1); 24 25 else 26 27 pre[fx]= fy; 28 _rank[fy]= min(_rank[fy], _rank[fx]+ 1); 29 30
end;
以上是关于并查集的主要内容,如果未能解决你的问题,请参考以下文章