首页 > 其他分享 >浅谈并查集

浅谈并查集

时间:2024-11-28 19:33:52浏览次数:3  
标签:return 浅谈 int void 查集 getf fa

普通并查集

就是开一个 \(fa[i]\) 数组表示 \(i\) 的祖先节点。

初始化

for(int i=1;i<=n;i++)fa[i]=i,siz[i]=1;
//fa[i]初始状态一定是只像自己的,siz[i]:表示 以 i 为根的子树大小

查询

inline int getf(int x)
{
    if(x==fa[x])return x;
    return getf(fa[x]);
}

合并

inline void merge(int u,int v)
{
    u=getf(u),v=getf(v);
    if(u!=v)
    {
        fa[u]=v;
    }
}

优化

路径压缩

这个优化在查询中,就是在返回自己最高级祖先时,顺便更新自己的值。

inline int getf(int x)
{
    if(x==fa[x])return x;
    return fa[x]=getf(fa[x]);//就是这里
}

按秩合并

虽然在merge(u,v)中,但是优化的是查询,原理是子树小的接子树大的(这也是树上启发式合并的雏形)。

inline void merge(int u,int v)
{
    u=getf(u),v=getf(v);
    if(u!=v)
    {
        if(siz[u]<siz[v])swap(u,v);
        f[v]=u,siz[u]+=siz[v];//v小u大
    }
}

扩展域并查集

根据名字,扩展域并查集的含义就是将领域扩展。

经典题目

比如说扩展至 \(2*n\),那么可以用 \([1,n]\) 表示本身,\([n+1,2*n]\) 表示敌人(比如说 \(i\) 的敌人就是 \(i+n\)),非常好理解。

可撤销并查集

根据名字,可撤销并查集的含义就是能够撤销的并查集(但是只能按照加入的时间先后顺序撤销)。

直接上代码讲解:

int n,fa[N],siz[N],st[N],top=0;
il void getf(int x)
{
    if(x==fa[x])return x;
    return getf(fa[x]);
    //由于后面需要支持撤销,故这里不因使用路径压缩,fa[i]数组只记录i的一级祖先
}
il void merge(int u,int v)
{
    u=getf(u),v=getf(v);
    if(u!=v)
    {
        if(siz[u]<siz[v])swap(u,v);
        fa[v]=u,siz[u]+=siz[v];
    }
}
il void upd()///删除上一条加入的边
{
    if(top==0)return;
    int x=s[top--];
    siz[fa[x]]-=siz[x],fa[x]=x;
    //将 x 从他父亲底下扯下去(删除 x 到 fa[x] 这条边更新siz,fa数组)
}

可持久化并查集

因该是个好东西,可惜我只会可持久化线段树Q_Q

标签:return,浅谈,int,void,查集,getf,fa
From: https://www.cnblogs.com/tyccyt/p/18575024

相关文章

  • 浅谈AXI协议及搭建自己的AXI IP核-01(协议解读)
    一、什么是AXI协议?AXI(AdvancedeXtensibleInterface)是一种总线协议,该协议是ARM公司提出的AMBA(AdvancedMicrocontrollerBusArchitecture)3.0协议中最重要的部分,AMBA包括以下几个部分:AdvancedHigh-performanceBus(AHB):高性能总线,用于连接高性能主设备,如处理器和DMA控制器等......
  • 并查集 - 2
    >1樱子的爱好题目https://codeforces.com/contest/2008/problem/D思路以5413210011为例i=1,p1=5,s5=1-->i=5,p5=2,s2=0-->i=2,p2=4,s4=1-->i=4,p4=3,s3=0-->i=3,p3=1,s1=1无论i=1还是5,2,4,3,最终黑色的个数都一......
  • 浅谈Java库之SLF4j
    一、SLF4J介绍        SLF4J(SimpleLoggingFacadeforJava)是一个简单日志门面,它为各种日志框架提供了一个统一的抽象层。SLF4J允许开发者在部署时选择所需的日志框架,而不需要在代码中硬编码具体的日志实现。这种设计使得在不同的日志框架之间切换变得非常简单,只需......
  • 浅谈Java库之Spring Framework
    一、SpringFramework介绍        SpringFramework是一个功能强大的Java应用程序框架,旨在提供高效且可扩展的开发环境。它结合了轻量级的容器和依赖注入功能,提供了一种使用POJO进行容器配置和面向切面的编程的简单方法,以及一组用于AOP的模块。Spring框架还支......
  • GaussDB数据库SQL系列-SQL与ETL浅谈
    一、前言在SQL语言中,ETL(抽取、转换和加载)是一种用于将数据从源系统抽取到目标系统的过程。ETL过程通常包括三个阶段:抽取(Extract)、转换(Transform)和加载(Load)。但这些其实都脱离不了数据库系统,本节从GaussDB数据库生态出发,给大家简单讲一下SQL与ETL的过程与关系。二、SQL与ETL的......
  • 浅谈Vue.js
    支持一对一答疑的购买网址Vue.js简介Vue.js的作者为EvanYou(尤雨溪),曾任职于GoogleCreativeLab,虽然是Vue是一个个人项目,但在发展前景上个人认为绝不输于Google的AngularJs,下面我会将Vue与Angular(Angular1.0+版本)做一些简单的比较。Vue的主要特点就和它官网(http://cn.vue......
  • [复习] 种类并查集
    [复习]种类并查集种类并查集也可叫做扩展域并查集。前言自从两年多前刚学并查集时过了食物链后,就再也没有写过种类并查集。今天回顾一下。例题1食物链P2024[NOI2001]食物链。题目大意:有\(n\)个动物,每个动物属于\(A,B,C\)种中的一种,\(A\)吃\(B\),\(B\)吃\(C\),\(......
  • 维护带权并查集
    大概叫这个名字吧https://atcoder.jp/contests/abc380/tasks/abc380_e#include<bits/stdc++.h>#defineendl'\n'#definelowbit(x)(x&-x)usingnamespacestd;typedeflonglongll;typedefpair<int,int>pii;typedefpair<ll,ll>pll;c......
  • 并查集
    板子intfind(intx);voiduniona(intx,inty);------------------------------------------------------------intp[N],r[N]={0};//p是父亲数组,r是根节点的深度for(inti=1;i<=n;i++)p[i]=i;//初始化intp1=find(a),p2=find(b);//单独写出来,避......
  • 并查集-亲戚
    题目背景若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。题目描述规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。输入格式......