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

2 月 7 日算法练习- 数据结构-并查集

并查集

并查集是一种图形数据结构,用于存储图中结点的连通关系。
每个结点有一个父亲,可以理解为“一只伸出去的手”,会指向另外一个点,初始时指向自己。
一个点的根节点是该点的父亲的父亲的的父亲,直到某个点的父亲是自己 根
当两个点的根相同时,我们就说他们是属于同一类,或者说是连通的。
如下:7、5、1、3、6的根都是3,所以他们是连通的,2、4是连通的,而2、6不连通,因为他们的根不 同
在这里插入图片描述

找根

找根的方法是:
如果当前点不是根,就返回父亲的根。否则就是自己。
用递归的方法实现

int root(int x){if(pre[x]==x)return x;return root(pre[x]);
}

合并

在并查集中,所有的操作都在根上,假如我要使得x和y两个点合并,只需要将root(x)指向 root(y),或使得root(y)指向root(x)。 pre[root(x)]= root(y);
例如我要合并4和6.则需要将2指向3或将3指向2.
在这里插入图片描述

路径压缩

找根函数的复杂度最坏情况下会达到O(n),如果查询次数较多的话效率将会非常低下。
我们可以在找根的过程中,将父亲直接指向根,从而实现路径压缩,这样可以使得找根的总体时间复杂度接近O(1)。如下图,执行一次root(7)之后,沿途的点都会直接指向根3。

int root(int x){return pre[x] = (pre[x]==x?x:root(pre[x]));
}

在这里插入图片描述

在这里插入图片描述

蓝桥幼儿园

在这里插入图片描述

#include<iostream>
using namespace std;
const int N = 2e5+9;
int pre[N],n,m;int root(int x){pre[x] = (pre[x]==x)?x:root(pre[x]);return pre[x];
}int main( ){cin>>n>>m;for(int i=1;i<=n;i++)pre[i]=i;while(m--){int op,x,y;cin>>op>>x>>y;if(op==1){pre[root(x)]=root(y);}else{if(root(x)==root(y))cout<<"YES"<<'\n';else cout<<"NO"<<'\n';}}return 0;
}

修改数组

在这里插入图片描述

思路:并查集的查询修改特性,根是未重复的数,非根是重复的数。初始化并查集 pre[i]=i表示每个根都未重复,遍历数组 a,遍历到 x 时将 x 修改为root(x) 的根,将 root(x) 指向 root(x+1) 的根,表示 x 的过去根已经重复,新根未重复。

#include<iostream>
using namespace std;
const int N = 1e6+10;
int a[N],pre[N];int root(int x){return pre[x] = (pre[x]==x)?x:root(pre[x]);
}int main( ){int n;cin>>n;for(int i=1;i<=N;i++)pre[i]=i;for(int i=1;i<=n;i++){cin>>a[i];a[i] = root(a[i]);pre[a[i]] = root(a[i]+1);}for(int i=1;i<=n;i++)cout<<a[i]<<" \n"[n==i];return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • BTC交易数据 - 文章索引
  • 计算机网络相关题目及答案(第四章)
  • Linux第45步_通过搭建“DNS服务器”学习图形化配置工具
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Web组件
  • 【Make编译控制 08】CMake动静态库
  • 【Maven】依赖、构建管理 继承与聚合 快速学习(3.6.3 )
  • 【大厂AI课学习笔记】【1.6 人工智能基础知识】(1)人工智能、机器学习、深度学习之间的关系
  • STM32的ADC电压采集
  • 七、Nacos源码系列:Nacos服务发现
  • c#多线程
  • 第2节、让电机转起来【51单片机+L298N步进电机系列教程】
  • ArcGIS的UTM与高斯-克吕格投影分带要点总结
  • Qt视频播放器项目
  • VUE学习——数组变化侦测
  • WordPress突然后台无法管理问题
  • 网络传输文件的问题
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • express.js的介绍及使用
  • golang中接口赋值与方法集
  • Java编程基础24——递归练习
  • jquery ajax学习笔记
  • JS数组方法汇总
  • js作用域和this的理解
  • k个最大的数及变种小结
  • python学习笔记 - ThreadLocal
  • React 快速上手 - 07 前端路由 react-router
  • swift基础之_对象 实例方法 对象方法。
  • Vue2.0 实现互斥
  • 闭包--闭包之tab栏切换(四)
  • 基于webpack 的 vue 多页架构
  • 开发基于以太坊智能合约的DApp
  • 马上搞懂 GeoJSON
  • 前端技术周刊 2019-01-14:客户端存储
  • 日剧·日综资源集合(建议收藏)
  • 《天龙八部3D》Unity技术方案揭秘
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​马来语翻译中文去哪比较好?
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (一)appium-desktop定位元素原理
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)项目管理杂谈-我所期望的新人
  • *上位机的定义
  • .Net 6.0 处理跨域的方式
  • .NET 事件模型教程(二)
  • .Net 知识杂记
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET 中让 Task 支持带超时的异步等待
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .net流程开发平台的一些难点(1)
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作