并查集中的路径压缩

转自:http://www.cnblogs.com/naix-x/archive/2012/06/13/2548228.html

 做最小生成树的时候,用kruskal做稠密图。。怎么都是超时,等等试一下Prim看看能不能过。。期间优化下并查集的部分,看的杭电上的文档,文档上讲的很好,讲了两种方式。

   1.把小树合并到大树上去。

   2.通过查找时,把树给压缩了。

   看文档上讲的比较好。。。

   关键代码:

 1 int find(int x)//通过查找压缩路径
 2  {
 3      int i,r,j;
 4      r = x;
 5      while(r != o[r])//找到根
 6      {
 7          r = o[r];
 8      }
 9      i = x;
10      while (r != i)//把这条路上的节点直接连到根上
11      {
12          j = o[i];
13          o[i] = r;
14          i = j;
15      }
16      return r;
17  }
18  void merge(int x,int y,int w)//通过把小树合并到大树上
19  {
20      x = find(x);
21      y = find(y);
22      if(x != y)
23      {
24          if(height[x] == height[y])//如果两个树一样高
25          {
26              height[x] = height[x] + 1;
27              o[y] = x;
28          }
29          else if(height[x] < height[y])//不一样高的时候合并到高度大的树上
30          {
31              o[x] = y;
32          }
33          else
34          o[y] = x;
35          min += w;
36          num ++;
37      }
38  }
原文地址:https://www.cnblogs.com/XBWer/p/2620204.html