并查集

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;

 

以上是关于并查集的主要内容,如果未能解决你的问题,请参考以下文章

数据结构----并查集

LibreOJ #109. 并查集

数据结构--并查集

数据结构--并查集

数据结构----并查集

数据结构----并查集