对并查集学习的总结

9 篇文章 0 订阅
3 篇文章 0 订阅
在poj上做了一些题,在贡献ac的同时,贡献了π(e^n)的wa,tl,ml和re。现在就来总结一下这一个多礼拜对并查集的感受,也把并查集的标程写出来以备后用。

  1. // 寻找集合的头元素
  2. // 并对路径进行压缩
  3. // notice: 在main里边要将parent全部初始化为-1
  4. int Find(int x)
  5. {
  6.     if(parent[x] >= 0) {
  7.         parent[x] = Find(parent[x]);
  8.         return parent[x];
  9.     }
  10.     else
  11.         return x;
  12. }
  13. // 另外的一个Find版本,效率较低
  14. //但能避免以上Find可能导致的MLE
  15. int Find(int x)
  16. {
  17.     int px = x,temp;
  18.     while(parent[x] >= 0)
  19.         x = parent[x];
  20.     while(px != x) {
  21.         temp = parent[px];
  22.         parent[px] = x;
  23.         px = temp;
  24.     }
  25.     return x;
  26. }
  27. // 合并集合
  28. // 这里将层次低的加入层次高的
  29. // 这样降低了这棵树的高度和Find的时间复杂度
  30. void Union(int x,int y)
  31. {
  32.     x = Find(x);
  33.     y = Find(y);
  34.     if( x == y)
  35.         return ;
  36.     if(parent[x] < parent[y]) 
  37.         parent[y] = x;
  38.     else
  39.         if(parent[x] > parent[y])
  40.             parent[x] = y;
  41.         else {
  42.             parent[x]--;
  43.             parent[y] = x;
  44.         }
  45. }
经过不断的改进,以上的代码效率已经比较高了。特别要注意的是parent一定要初始化为-1!!!
另外在这里感谢波波和《算法导论》,还有China8848的报告。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值