当前位置: 首页 > article >正文

并查集知识整理、蓝桥杯修改数组

一、概念:

其结构类似于树林,存储了多个互不相干的树,每棵树的根节点代表着这棵树的全部节点

二、作用:

1.查询(find):查询两个元素是否在同一集合

2.合并(union):将两不相交集合合并为一个集合

三、基操

1.初始化:fa[u]表示节点u的父节点,初始化时fa[u]=u。

2.查询:看根节点是否相同。

(1)路径压缩:o(nlogn)在查询的过程中将所有节点都指向根节点,这样就导致它不能保持一开始树的形态,但是能在一次查询中改变多个节点,后续查询更便捷,因此可持久化并查集等修改代价较高的情况。

3.合并:相当于把两棵树合并起来,也就是公用同一个根节点。

(1)按秩合并、按秩合并:o(nk)将其中一个深度较小的树的根节点的父节点修改为另一个根节点。(为了避免树退化为链式结构,非特殊情况一般为节点个数比较少的,类似连通块)

例题1: 修改数组

输入:
5
2 1 1 3 4
输出:
2 1 3 4 5

 

分析:题意与并查集非常像,最后是要输出每个数的跟节点,如果这个数没有出现过,也就是自成一个集合,也就是自己就是自己的根节点,那么输出它本身;如果一个数在前面出现过,则输出 重复数字+1,直到不重复。所以首先初始化,使在0~N范围内所有数的根节点都为本身,接着再依次输入a[i],求其根节点,并且需要将这个数的根节点fa[a[i]]改为fa[a[i]+1],这样一来,如果后面有与a[i]相同的数出现,直接查询其根节点即可得到正确答案。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
int n,fa[N],a[N];
int find(int x)
{
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]); 
}
signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=0;i<N;i++)
	    fa[i]=i;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		a[i]=find(a[i]);
		fa[a[i]]=find(a[i]+1);
	}
	for(int i=0;i<n;i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;
 } 

 


http://www.kler.cn/a/540132.html

相关文章:

  • 数据仓库和商务智能:洞察数据,驱动决策
  • 【C语言标准库函数】标准输入输出函数详解[4]:二进制文件读写函数
  • sqlite 查看表结构
  • 51单片机之引脚图(详解)
  • 数据结构:单链表
  • 通过Demo案例的形式弄懂Java中的设计模式
  • 【vue】高德地图AMap.Polyline动态更新画折线,逐步绘制
  • 深度学习-神经机器翻译模型
  • 【1.05版】wordpressAI插件批量生成文章、图片、长尾关键词、文章采集、AI对话等
  • 软件工程 项目管理
  • 使用 mkcert 本地部署启动了 TLS/SSL 加密通讯的 MongoDB 副本集和分片集群
  • mysql 学习12 存储引擎,mysql体系结构
  • 技术栈选择:Vue 还是 React
  • gptme - 终端中的个人 AI 助手
  • 《一》深入了解软件测试工具 JMeter-自我介绍
  • 基于lstm+gru+transformer的电池寿命预测健康状态预测-完整数据代码
  • iOS Swift算法之KDF2
  • 【1】深入解析 SD-WAN:从思科 SD-WAN 视角看现代网络发展
  • 题解:P1005 [NOIP 2007 提高组] 矩阵取数游戏
  • win10向windows server服务器传输文件
  • SQLite3实战教程:从入门到精通
  • 基于SeaTunnel同步mysql数据
  • 第18章 不可变对象设计模式(Java高并发编程详解:多线程与系统设计)
  • 优惠券平台(十五):实现兑换/秒杀优惠券功能(2)
  • Untiy3d 配置vs code开发环境
  • MySQL-binlog2sql闪回工具介绍与回滚实战