数据结构——并查集

server/2025/2/5 5:51:17/

 一、并查集原理
 

再一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于哪个集合。适合这种问题的抽象数据结构称为并查集(union-findset)

并查集并查集,就是看你在哪个集合中,并且可以将集合合并的数据结构

它的核心思想是用一个数组来表示每个元素的父节点,从而形成树状结构。
数组的下标通常代表元素本身,而数组的值表示该元素的父节点。
例如,p[i] 表示元素i的父节点,根节点的父节点指向自己。

二、并查集的实现

初始化 init( )
void init(int n){for (int i = 1; i <= n; ++ i) p[i] = i;
}

 开始时,每个元素自成一个单元素集合,所以初始化时,初始化为每个节点的父节点为自己,根节点的父节点指向自己。

查找根节点 find( ) 
int find(int x ){//查询祖宗节点 + 路径压缩if(p[x] != x) p[x] = find(p[x]);//路径压缩return p[x];
}

 通过路径压缩,将每次查询后的元素都指向根节点,这样一来能使每次查找根节点的过程满足近乎O( 1 )的速度,使得效率大大提高。

合并两个集合union( )
void union(int a , int b){p[find(a)] = find(b);
}

先查询a 和 b的祖宗节点(即,根节点)然后将a祖宗节点作为子节点插入到b的祖宗节点下。

在合并过程中,在逻辑模型上,是将a树根节点插入到b树的根节点上,
在物理模型上只是将记录a的根节点对应的数组中的元素,改为b根节点,

原本a根节点的父节点不再指向自己,也就意味着原本的a根节点不再是根节点。

判断两个集合是否在同一个集合check()
bool check(int a , int b){return find(a) == find(b); 
}

在同一个集合中,子节点的祖宗节点相同,所以判断祖宗节点是否一样可以判断是否在同一个集合中 

三、小结

并查集的要点是用一个数组记录每一个元素的父节点,根节点的父节点指向自己
数组下标代表各个元素,而元素的值表示其父节点,两者共同维护了并查集的树形结构,使得查找和合并操作能够高效进行。

四、小试牛刀

1. LeetCode
  • 链接:https://leetcode.com(国际版)
    https://leetcode.cn(中国版)

  • 推荐题目

    • 547. 朋友圈(基础连通性问题)

    • 684. 冗余连接(检测环 + 并查集)

    • 200. 岛屿数量(DFS/BFS/并查集均可)

  • 搜索方法:在题库中搜索关键词 Union-Find 或 并查集


2. 洛谷(Luogu)
  • 链接:https://www.luogu.com.cn

  • 推荐题目

    • P3367 【模板】并查集(模板题)

    • P1551 亲戚(基础应用)

    • P1525 关押罪犯(并查集 + 贪心)

  • 搜索方法:直接搜索题号或关键词 并查集


3. 牛客网(Nowcoder)
  • 链接:https://www.nowcoder.com

  • 推荐题目

    • NC14550 并查集模板题

    • NC50428 食物链(带权并查集)

  • 搜索方法:在题库中筛选 算法 → 并查集 标签。


4. Codeforces
  • 链接:https://codeforces.com

  • 推荐题目

    • Problem 25C - Roads in Berland(动态连通性问题)

    • Problem 445B - DZY Loves Chemistry(连通块计数)

  • 搜索方法:在 Problemset 页面按 Tag 选择 DSU(Disjoint Set Union,即并查集)。


 


http://www.ppmy.cn/server/165079.html

相关文章

javascript-es6 (一)

作用域&#xff08;scope&#xff09; 规定了变量能够被访问的“范围”&#xff0c;离开了这个“范围”变量便不能被访问 局部作用域 函数作用域&#xff1a; 在函数内部声明的变量只能在函数内部被访问&#xff0c;外部无法直接访问 function getSum(){ //函数内部是函数作用…

Vue.js组件开发-实现全屏焦点图片带图标导航按钮控制图片滑动切换

使用 Vue 实现全屏焦点图片带图标导航按钮控制图片滑动切换 步骤 创建 Vue 项目&#xff1a;可以使用 Vue CLI 快速创建一个新的 Vue 项目。设计组件结构&#xff1a;创建一个包含图片展示区域和导航按钮的组件。实现图片滑动切换逻辑&#xff1a;通过点击导航按钮切换图片。…

深入核心:一步步手撕Tomcat搭建自己的Web服务器

介绍&#xff1a; servlet&#xff1a;处理 http 请求 tomcat&#xff1a;服务器 Servlet servlet 接口&#xff1a; 定义 Servlet 声明周期初始化&#xff1a;init服务&#xff1a;service销毁&#xff1a;destory 继承链&#xff1a; Tomcat Tomcat 和 servlet 原理&#x…

简单的SQL语句的快速复习

语法的执行顺序 select 4 字段列表 from 1 表名列表 where 2 条件列表 group by 3 分组前过滤 having 分组后过滤 order by 5 排序字段列表 limit 6 分页参数 聚合函数 count 统计数量 max 最大值 min 最小值 avg 平均 sum 总和 分组查询使…

AJAX笔记原理篇

黑马程序员视频地址&#xff1a; AJAX-Day03-01.XMLHttpRequest_基本使用https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p33https://www.bilibili.com/video/BV1MN411y7pw?vd_sour…

3D图形学与可视化大屏:什么是材质属性,有什么作用?

一、颜色属性 漫反射颜色 漫反射颜色决定了物体表面对入射光进行漫反射后的颜色。当光线照射到物体表面时&#xff0c;一部分光被均匀地向各个方向散射&#xff0c;形成漫反射。漫反射颜色的选择会直接影响物体在光照下的外观。例如&#xff0c;一个红色的漫反射颜色会使物体在…

Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell 循环类型】

文章目录 一、Shell 循环类型二、Shell while 循环三、Shell for 循环四、Shell until 循环五、Shell select 循环六、总结 一、Shell 循环类型 循环是一个强大的编程工具&#xff0c;使您能够重复执行一组命令。在本教程中&#xff0c;您将学习以下类型的循环 Shell 程序&…

【LeetCode 刷题】贪心算法(1)-基础

此博客为《代码随想录》二叉树章节的学习笔记&#xff0c;主要内容为贪心算法基础的相关题目解析。 文章目录 455.分发饼干1005.K次取反后最大化的数组和860.柠檬水找零 455.分发饼干 题目链接 class Solution:def findContentChildren(self, g: List[int], s: List[int]) -…