并查集的以下几种优化和类型。
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;