并查集中的路径压缩

转自: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  }

 

你可能感兴趣的:(并查集)