zoukankan      html  css  js  c++  java
  • 并查集中的路径压缩

    转自: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  }
  • 相关阅读:
    记坑
    常用模板
    ACM-东北赛划水记
    jzoj 4178游戏
    JZOI 4163
    jzoj 4146踩气球
    jzoj 5589. 缩点
    jzoj 5588 %%%
    jzoj 5571 ffs
    BJOI 2017 Kakuro
  • 原文地址:https://www.cnblogs.com/XBWer/p/2620204.html
Copyright © 2011-2022 走看看