关于并查集

news/2024/9/18 3:47:58/文章来源:https://www.cnblogs.com/Elaina-0/p/18356926

关于冰茶姬

简述

冰茶姬是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的元素。

顾名思义,冰茶姬支持两种操作:

  • 合并(Union):合并两个元素所属集合(合并对应的树)

  • 查询(Find):查询某个元素所属集合(查询对应的树的根节点),这可以用于判断两个元素是否属于同一集合

冰茶姬在经过修改后可以支持单个元素的删除、移动;使用动态开点线段树还可以实现可持久化冰茶姬。

Code

Elaina's Code
int n,m;struct DSU{int fa[N];void init(){for(int i=1;i<=n;i++){fa[i]=i;//初始化自己的fa为自己}}int find(int x){//查询return x==fa[x]?x:fa[x]=find(fa[x]);//压缩路径//return x==fa[x]?x:find(fa[x]);//当然也可以不压缩}void unionn(int x,int y){//合并x=find(x),y=find(y);fa[y]=x;}bool check(int x,int y){//判断x=find(x),y=find(y);if(x==y) return 1;else return 0;}
}dsu;signed main(){n=rd,m=rd;while(m--){int op=rd,x=rd,y=rd;if(op==1){dsu.unionn(x,y);}else{if(dsu.check(x,y)) puts("Y");else puts("N");}}return Elaina;
}

启发式合并

过程

将节点较少或深度较小的树连到另一棵,以免发生退化。

Code

Elaina's Code
void unionn(int x,int y){x=find(x),y=find(y);if(x==y) return ;if(siz[x]<siz[y]) swap(x,y);fa[y]=x;siz[x]+=siz[y];
}//初始化
void init(){for(int i=1;i<=n;i++){fa[i]=i,siz[i]=1;}
}

带权冰茶姬

过程

开个数组 sum 记个和就完了。

直接看个例题吧。

例题

Almost Union-Find

题意

实现类似冰茶姬的数据结构,支持以下操作:

  1. 合并两个元素所属集合
  2. 移动单个元素
  3. 查询某个元素所属集合的大小及元素和

分析

操作1、3冰茶姬板子 乱糊就行

操作2嘛...他就挺有意思的...显然不能直接套冰茶姬。

举个例子,某次操作后如下图:

现要将 节点\(1\) 移动到 节点\(5\) 上,若正常套冰茶姬如下图

发现 节点\(3\) 和 节点\(2\) 也跟着一块飞过来了,会出现这种情况的原因是在第一个集合内,节点\(1\) 是这个集合内某一颗子树的根节点,也就是说,我们不想让这种情况发生,只能让所有的节点为这个集合/树的叶子节点,才能保证它们安然无恙的离开。

所以引入了一个概念:虚点。

具体操作是这样的:

我们可以对每个数 ii 建立虚点 i + ni+n 为它的上司。还是用上面那个栗子来理解:

然后建立虚点就会变成酱紫:

然后再进行上述操作就是酱紫

妙啊~ 很妙啊~

Code

Elaina's Code
int n,m;struct DSU{int fa[N<<1],sum[N],siz[N];void init(){for(int i=1;i<=n;i++){sum[i+n]=i;fa[i]=i+n;}for(int i=n+1;i<=n*2;i++){fa[i]=i,siz[i]=1;//xu dian}}int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}void unionn(int x,int y){x=find(x),y=find(y);if(x==y) return;if(siz[x]<siz[y]) swap(x,y);fa[y]=x;siz[x]+=siz[y],sum[x]+=sum[y];}void split(int x,int y){int fx=find(x),fy=find(y);if(fx==fy) return;--siz[fx],sum[fx]-=x;++siz[fy],sum[fy]+=x;fa[x]=fy;}
}dsu;signed main(){while(cin>>n>>m){dsu.init();while(m--){int op=rd,x,y;if(op==1){x=rd,y=rd;dsu.unionn(x,y);}else if(op==2){x=rd,y=rd;dsu.split(x,y);}else{x=rd;printf("%lld %lld\n",dsu.siz[dsu.find(x)],dsu.sum[dsu.find(x)]);}}}return Elaina;
}

可撤销冰茶姬

过程

用一个启发式合并的冰茶姬加上栈来存储合并信息即可.

Code

代码有猪食哦~

Elaina's Code
struct DSU{stack<int> sta;int fa[N],siz[N];void init(){for(int i=1;i<=n;i++){dis[i]=0,fa[i]=i,siz[i]=1;}}int find(int x){return x==fa[x]?x:find(fa[x]);//不可压缩路径,不然没法撤销了}void unionn(int x,int y){x=find(x),y=find(y);if(x==y) return ;if(siz[x]<siz[y]) swap(x,y);fa[y]=x;siz[x]+=siz[y];sta.push(y);//记录被合并的集合用于以后撤销}void undo(int x){//撤销while(sta.size()>x){//撤销到第x步操作int k=sta.top();sta.pop();siz[fa[k]]-=siz[k];//更新sizefa[k]=k;//分离}}
}dsu;

可持久化冰茶姬

扩展域冰茶姬

对于一个节点 \(i\) ,我们将其拆分为两个节点。一个属于集合 \(S\) ,另一个属于集合 \(T\) 。那么一条边所连接的两个节点就必须在不同的集合中。一个点在 \(S\) 中和在 \(T\) 的两个点属于一个集合,那么这张图就不是二分图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/783326.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cookie、localStorage 和 sessionStorage 的区别及应用实例

在前端开发中,持久化数据存储是一个非常常见的需求。为了实现这一点,浏览器提供了多种方式,包括 Cookie、localStorage 和 sessionStorage。这三者各有优劣,适用于不同的场景 1. Cookie Cookie 是浏览器存储少量数据的一种机制,通常由服务器生成并发送到客户端。每次客户端…

vue脚手架报错error SchoolName is not defined no-undef

将组件命名更改位两个英文单词并采用大驼峰(不过我改后还在运行不了。。。或者在vue.config.js中添加lintOnSave: false,

vue---v-text和v-html绑定数据指令

<p><!-- v-text指令的写法 指令必须写在开始标签上,作为标签的属性存在<开始标签 v-text="data中的变量名"></结束标签>--><span v-text="msg"></span><!-- v-html的用法和v-text用法一直,只不过通过v-html引入的…

0223-IP 协议部分字段解释

环境Time 2022-11-20 WSL-Ubuntu 22.04 Rust 1.65.0 pnet 0.31.0 tun-tap 0.1.3前言 说明 参考:https://docs.rs/pnet/latest/pnet/index.html 参考:RFC 791 目标 上一篇已经看过了 IP 协议的一部分字段,这里继续了解剩下的部分。 main.rs use pnet::packet::ipv4::Ipv4Pack…

Apifox 深度分析:为什么它是不可错过的 API 管理平台

无论是大型企业还是初创公司,高效的 API 管理都是确保业务顺利运行的重要环节。然而,随着项目规模的扩大和团队的壮大,API 的设计、开发、测试和文档管理往往变得越来越复杂。无论是大型企业还是初创公司,高效的 API 管理都是确保业务顺利运行的重要环节。然而,随着项目规…

通过这五个问题,带你深入了解中国式报表

一、什么是中国式报表? 中国式报表,顾名思义具有中国特色的报表,通常指的是中国企业/机构在财务和业务报告方面的特有风格和规范。二、中国式报表有什么特点? 一句话就可以概括中国式报表:结构复杂、数据量大的一种报表。 格式复杂:为了能够展示更为详尽的数据分类和汇总…

unity2022.3.9+Pico更换渲染管线后打包,人物材质不可显示问题

为了解决字体和场景闪烁问题吗,更换渲染管线 旧项目管线是URP 新的项目管线是内置管线 build in()内置管线需要设置两个地方,可以解决人物材质不显示问题 1.PICO-Stereo Rendering Mode 选择 Multi Pass 模式 2,Player-OtherSetting-Auto Graphics API勾选 (注:项目中…

变电站弱电系统集成常见设备

"名称" 规格型号质量技术标准 不间断电源 UPS 输入 220VAC 96VDC/输出 220VAC/容量≥20kVA蓄电池 " UPS 功能 6000W 13 度 1200 万毫安 立式/磷酸铁锂"开关柜储能电机 DC48V/永磁直流电动机开关柜储能电机 DC110V/永磁直流电动机EPS 逆变器 " …

猪脸识别、自动投喂!Apache DolphinScheduler还能做这些?

数字化转型提速中!传统农牧食品行业也寻求搭上数字化转型的快车,通过物联网、大数据、人工智能等现代信息技术,实现生产、加工、流通等环节的智能化和自动化,提高生产效率、优化资源配置、提升产品质量,并满足消费者对食品安全和可追溯性的需求。 在数字化浪潮的推动下,铁…

【YashanDB数据库】YashanDB如何回收表空间

确认表空间高水位线,是否有可回收空间。 select a.tablespace_name,a.high_water_mark,b.user_bytes,b.total_bytes from (SELECT tablespace_name, max(header_block+blocks) * 8192 AS high_water_mark FROM dba_segments WHERE tablespace_name = USERS GROUP BY tablespac…

支付宝当面付快速接入网页h5

支付宝当面付快速接入网页h5第一步开放平台申请 网页应用,下载 支付宝开放平台密钥工具 V2.0.3 选择生成【证书】【RSA2】 应用开发设置 【接口加签方式(密钥/证书)】 上传 ,私钥在本地已经生成,其他3个crt应用申请上传CSR文件.csr 后下载即可| appPrivateKey: appPu…

PbootCMS上传图片被压缩怎么解决

PbootCMS上传图片被压缩怎么解决pb默认是大于1000宽或者高的,自动压缩,所以图片质量损失了,想解决这个,直接打开根目录config文件夹下的config.php和core文件夹下的convention.php,然后找到ico => array(把max_width跟max_height参数调大即可。扫码添加技术【解决问题…