数据结构 5-4-1 并查集
一、概念
并查集本质上是对树的知识的利用,常用于集合的相关表示,不同于一般的二叉树,并查集用的是指向双亲节点的指针,便于分类而不便于找子节点,
二、代码实现
简单的并查集主要有三个函数,初始化、合并、查询。
初始化有很多种方法。可以全部初始化为自己,相当于开始状态看做每个节点都是单独的一棵树,这些树只有一个根节点,让其都指向自己。也可以全部初始化为-1.这种初始化的好处是可以在最顶上的节点保存这个集合有多少个节点。
void init()
{for(int i=1;i<=n;i++)data[i]=i;
}
//初始化为自己
void init()
{for(int i=1;i<=n;i++)data[i]=-1;
}
//初始化为-1
合并根据初始化的方式不同,也有细微的差别,但主要思路都是一样的,比较两个节点是不是在一个集合里,如果不在,说明可以合并,用查找函数找到集合的根节点,然后让一个根节点指向另一个,就可以完成合并的操作。
void merge(int x,int y)
{int tx=find(x);int ty=find(y);if(tx!=ty)data[tx]=data[ty];//初始化为-1时可以补一句data[ty]+=data[tx],这样数组值的绝对值表示的就是集合中元素的个数
}
查找根据初始化的不同,应该设置不同的查找结束标志。采用初始化为自己时,查找结束的标志是对应位置的值等于自己的下标。初始化为-1时,查找结束的标志是对应位置的值小于零。
int find(int x)
{while(data[x]!=x)x=data[x];return x;
}
//初始化为自己
int find(int x)
{while(data[x]>=0)x=data[x];return x;
}
int find(int n)
{if(pre[n]==n)return n;elsereturn pre[n]=find(pre[n]);
}
//递归实现
并查集本身不难,前面搞蓝桥ACM时学长都说不难,理解好向上查找的这个过程即可。完整代码如下
#include<bits/stdc++.h>
using namespace std;
int data[1005];
int m,n,choice=0;
void init()
{for(int i=1;i<=n;i++)data[i]=i;
}
int find(int x)
{while(data[x]!=x)x=data[x];return x;
}
void merge(int x,int y)
{int tx=find(x);int ty=find(y);if(tx!=ty)data[tx]=data[ty];
}
int main()
{scanf("%d %d",&m,&n);init();for(int i=0;i<m;i++){int x,y;scanf("%d %d",&x,&y);merge(x,y);}scanf("%d",&choice);while(choice!=-1){printf("%d\n",find(choice));scanf("%d",&choice);}return 0;}
数据结构 5-4-1 并查集相关推荐
- python【数据结构与算法】并查集引入
文章目录 1 并查集 2 策略 3 代码 1 并查集 Disjoint Set,实际上字面翻译是不相交的集合. 中文名 "并查集" 实际上源自其基本操作: union(X,Y):求 ...
- [重修数据结构0x03]并查集、堆、优先队列(2021.8.11)
前言 在做遍历的题目的时候,发现掌握一些特殊的数据结构和技巧有时对解决题目有着决定性的作用,不可不学.因此特地拿出来两天学习一下并查集.堆.优先队列.以后有更多思考和感悟再加补充吧.内容来自算法笔记, ...
- 【数据结构与算法基础】并查集原理、封装实现及例题解析(C和java)
前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...
- 关于 并查集(union find) 算法基本原理 以及 其 在分布式图场景的应用
二月的最后一篇水文-想写一些有意思的东西. 文章目录 环检测在图数据结构中的应用 深度/广度优先 检测环 并查集数据结构 (Union-Find) 基本概念 初始化 合并 union 查找祖先 优化1 ...
- 最小生成树kruskal算法并查集版 C语言实现
今天数据结构课讲了最小生成树的Kruskal算法和Prim算法,不过都只是概念,可能是怕他们听不懂吧,反正算法实现一概不讲...囧 下午抱着<算法导论>跑去图书馆看Kruskal算法,发现 ...
- 【BZOJ4025】二分图(可撤销并查集+线段树分治)
题目: BZOJ4025 分析: 定理:一个图是二分图的充要条件是不存在奇环. 先考虑一个弱化的问题:保证所有边出现的时间段不会交叉,只会包含或相离. 还是不会?再考虑一个更弱化的问题:边只会出现不会 ...
- 20211229[按秩合并并查集 最小生成树][BZOJ4668]冷战
20211229[按秩合并并查集.最小生成树][BZOJ4668]冷战 题意:给定N点,动态加边与询问两点最早是哪条边开始连通,强制在线 首先如果离线的话可以直接跑最小生成树,不过代码不好处理. 当然 ...
- c 语言中并查集的用法,并查集基本介绍
前言 今天在力扣上做了一道每日一题,接触到了并查集这个概念,以前没有了解过,记录在此. 定义 并查集(Disjoint-Set)是一种可以动态维护若干个不重叠的集合,并支持合并与查询两种操作的一种数据 ...
- 基于C语言,详解Kruskal算法(利用并查集)实现构建最小生成树
目录 一.Kruskal算法的基本介绍 具体做法:找出森林中连接任意两棵树的所有边中,具有最小权值的边,如果将它加入生成树中不产生回路,则它就是生成树中的一条边.这里的关键就是如何判断"将它 ...
- 【原创】并查集之扩展域与边带权
[前言] 并查集是一种可以动态维护若干个不重叠的集合,并支持合并于查询的数据结构. 并查集的基本概念很简单,但是这样一种思想的用途十分广泛. 个人理解:这是一种很巧妙的,可以很好的处理对象之间关系的数 ...
最新文章
- DotNet的JSON序列化与反序列化
- html hover图片效果,CSS第9款:Imagehover.css 纯CSS打造的图片悬停效果
- Tomcat5.5 配置mysql数据库连接池
- 重载session存储方式–session_set_save_handler()
- windows7安装和问题排除,绝对有用!
- LMS Virtual Lab对发动机噪声进行仿真的2种方法
- 时间复杂度与空间复杂度的研究
- java特定用户登录_求教!!!用 jsp+servlet 怎样控制指定用户名登录页面啊!
- [转]测试的三重境界
- C# 使用 Response 导出 Excel 单元格格式设置为文本格式
- 公司老总直接面试 我该如何准备
- 差分贴片晶振使最强军事武器出世
- React中实现插槽
- STM32寻迹智能车
- webpack打包 --- 打包工具
- 3D ConvNet Demo运行
- 子域名查询(python)
- 腾讯私有云MySQL解决方案—TDSQL
- 31省份全体居民、城镇居民、农村居民人均消费支出(1990-2022)
- 使用Platium库开发dlna投屏功能