关闭

可持久化并查集(外传)——[按秩启发式合并]

标签: 启发式合并路径压缩并查集合并BZOJ
389人阅读 评论(0) 收藏 举报
分类:

重新开坑

奉上最近觉得的神作(至少从小说与这首曲子来说是这样的)。

之前写到过可持久化并查集三部曲,现在想来,唯独没有提到按秩合并,在研习了启发式合并后,决定重新为并查集写一份外传,记录并查集的另一作用。

什么是按秩合并,就小编来看,其实就是启发式合并的一种,在满足不路径压缩改变fa[x]的前提下,能够使得并查集的深度为logn级别的。

但是提醒,这里的按秩合并与路径压缩并不矛盾,按秩合并关键在union函数,而路径压缩是在find函数中,若只是普通并查集,就只需要上路径压缩就可以了,应该没有哪个丧尽天良的出题人为了卡路径压缩要求两个优化都用才能AC。。。。

如何实现,先上代码。

int fa[N],f[N];
int siz[N],dpn[N];  
int cnt_merge = 0;  
int find(int x){  
    if(fa[x]==x)return x;  
    int k=findfather(fa[x]);  
    dpn[x]=dpn[fa[x]]+1;//合并时以类似求前缀的方式维护dfn中的值。  
    return k;  
}
inline void merge(int x,int y){  //uniona函数,按秩合并 
    x=find(x),y=find(y);
    if(x==y)return void(++cnt_merge);  
    if(siz[x]>siz[y])fa[y]=x,f[y]=++cnt_merge,siz[x]+= siz[y];  
    else fth[x]=y,f[x]=++cnt_merge,siz[y]+=siz[x];  
}

这样写有什么用呢,或者说为什么这么写?
在两个不同子集连接时,如果我们按照rank来连接,把rank低的连在rank高的下面,让rank高的做father,那么我们就相当于维护了一棵树,保证了类似于启发式合并一样的树高最坏logn

神奇吧,来一道题清爽一下。

BZOJ4668传送门

//by anantheparty
#include<cstdio>
const int N=5e5+5;
int f[N],d[N],r[N],p[N];
int find(int i){
    if(p[i]==i)return i;
    register int j=find(p[i]);
    d[i]=d[p[i]]+1;
    return j;
}
int unionn(int i,int j){
    i=find(i),j=find(j);
    if(i==j)return 0;
    if(r[i]==r[j])++r[j];
    if(r[i]<r[j]){
        p[i]=j;
        return i;
    }
    p[j]=i;
    return j;
}
int query(int i,int j){
    register int s=0;
    if(find(i)==find(j))
        while(i!=j)
            if(d[i]>d[j])s<f[i]?s=f[i]:0,i=p[i];
            else s<f[j]?s=f[j]:0,j=p[j];
    return s;
}
inline void read(int &res){
    static char ch;
    while((ch=getchar())<'0'||ch>'9');res=ch-48;
    while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-48;
}
int main(){
    register int n,m,k,s,t,last=0;
    read(n),read(m);
    for(;n;--n)p[n]=n;
    while(m--){
        read(k),read(s),read(t);
        s^=last,t^=last;
        if(k)printf("%d\n",last=query(s,t));
        else f[unionn(s,t)]=++n;
    }
    return 0;
}

哈哈我可没有忘记并查集系列的看板娘

这里写图片描述

1
0
查看评论

并查集-按秩合并

1239: 中山学院 ACM小组 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 79  Solved: 21 [Submit][Status][Web Board...
  • qq_24489717
  • qq_24489717
  • 2015-06-16 21:40
  • 1096

并查集的两种优化(按秩合并,路径压缩)

并查集是建立在对不相交集合进行的两种基本操作的基础之上的。操作之一:检索某元素属于哪个集合;操作之二:合并两个集合。黑书上说了,这种结构显然可以用链表或森林实现,显然用链表进行查询时间复杂度应该是O(n)级别的,而使用森林进行查访如果处理的好时间复杂度就应该是O(logn)。对于用森林来实现并查集,...
  • u010255534
  • u010255534
  • 2013-08-04 22:14
  • 1436

图论算法----并查集中的启发式合并

一、启发式合并的算法原理 一听这名字,感觉好高大上,实际上很简单。 之前讲过并查集的大部分时间都浪费在了find()函数上,于是就对find()函数进行了优化,其实还有一种算法可以使find()函数的时间复杂度控制在O(logn)左右,这种算法就是启发式合并。 并查集是一种树型的数据结构,而树也有它...
  • C20180602_csq
  • C20180602_csq
  • 2017-02-25 11:28
  • 1042

并查集的启发式合并 和 路径压缩

并查集,就是Union-Find Set,也称不相交集合 (Disjoint Set)。 并查集是建立在对不相交集合进行的两种基本操作的基础之上的。操作之一:检索某元素属于哪个集合;操作之二:合并两个集合 启发式合并:让深度小的数成为深度较大的树的子树 路径压缩:找到u所在...
  • u014141559
  • u014141559
  • 2014-07-08 22:07
  • 1638

hdu6109(并查集+启发式合并)

题面 题意就是有n个数,不断给你条件,如i=j或i!=j 你要把条件扔进一个栈里。 若出现一个条件和栈里的条件出现冲突 输出栈的大小+1&&清空栈 等于是满足传递性的,故等于关系可以用并查集维护,同一个集合的表示它们都相等。 若出现不等关系,且它们在同一个集合里,则冲突,...
  • q582116859
  • q582116859
  • 2017-08-14 16:37
  • 134

UVA 11354 - Bond(并查集-按秩合并)

题目链接:点击打开链接 题意:给出一张n个点m条边的无向图, 每条边有一个危险度,有q个询问, 每次给出两个点s、t,找一条路, 使得路径上的最大危险度最小。 思路:首先,我们可以发现,如果求一个最小生成树, 那么任意两点, 在生成树上有唯一路径, 而且这条路径上的最大危险值一定最小。 但是n和...
  • weizhuwyzc000
  • weizhuwyzc000
  • 2016-02-15 16:14
  • 2168

并查集(按秩合并、路径压缩)

算法分类: 数据结构 算法原理: 通过find函数找出该节点的根节点, 通过UNION函数将两棵树合并。 加入rank[N]来记录每个节点的秩(即树的高度),并按秩进行合并,可避免合并时的最糟糕情况,(树形为一条直线) 通过路径压缩可以减少每次寻找根节点的次数。 算法时...
  • jokes000
  • jokes000
  • 2012-04-30 11:15
  • 8602

关于可持久化并查集的学习和思考

鉴于noip比赛前集训时SAKER前辈教了我这个蒟蒻可持久化线段树以来,我懂得了如何维护一个支持历史查询的线段树。于是我就开始异想天开了:可不可以快速维护一个支持历史查询的数组呢? 就在这时,我上网看到了一个新的算法:可持久化并查集。先用例题来讲吧: BZOJ3674:可持久化并查集加强版 Desc...
  • KsCla
  • KsCla
  • 2016-12-12 19:55
  • 2634

HDU 5923 Prediction [可持久化并查集]【数据结构】

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5923 ——————————————————————————-. PredictionTime Limit: 5000/2500 MS (Java/Others) Memory Limit: 6...
  • qq_33184171
  • qq_33184171
  • 2017-01-21 16:26
  • 494

可持久化并查集(三)——从动态到可持久化

其实在上一篇:可持久化并查集(二)——从镜像到动态中已经可以算是一个伪可持久化了,但是对于历史查询等操作无能为力。。所以本篇重点介绍可持久化操作 BZOJ 3673题目连接 这题不知道出题人什么做法,但是代码很短的样子 UPD:出题人用的是rope,即stl中的可持久化平衡树 Ku...
  • lemonoil
  • lemonoil
  • 2017-02-26 16:05
  • 3577
    RES
    假作真时真亦假
    REZ
    无为有处有还无
    个人资料
    • 访问:21594次
    • 积分:2988
    • 等级:
    • 排名:第13942名
    • 原创:204篇
    • 转载:22篇
    • 译文:0篇
    • 评论:35条
    博客专栏
    文章分类
    最新评论