并查集中的路径压缩

   做最小生成树的时候,用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/naix-x/archive/2012/06/13/2548228.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值