并查集中的路径压缩

   做最小生成树的时候,用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 }

 

 

  

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