并查集中的路径压缩

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

 

 

  

posted @ 2012-06-13 17:31  Naix_x  阅读(347)  评论(4编辑  收藏  举报