并查集路径压缩_第二十五天:并查集
今天是释然发题解的第二十五天,以后会经常和大家分享学习路上的心得,希望和大家一起进步,一起享受coding的乐趣
本文约1400字,预计阅读5分钟
昨天我们学习了动态规划之线性规划,忘记的小伙伴们可以看一下哦:
[动态规划之线性规划](第十八天:动态规划之线性规划问题_释然的成长之路-CSDN博客)
今天我们来聊一聊并查集,明天和大家分享树的问题的相关题目:
@[TOC](并查集)
## 什么是并查集?
N 个不同的元素分布在若干个互不相交集合中,需要多次进行以下3个操作:
1. 合并a,b两个元素所在的集合 Merge(a,b)
2. 查询一个元素在哪个集合
3. 查询两个元素是否属于同一集合 Query(a,b)
## 用树表示集合
如何表示并查集呢?我们可以用树来表示,如果两个元素的根节点相同,就说明他们属于同一个集合,通过递归的方式从要找的元素开始寻找树根,如果找到就返回树根,没有找到就继续递归查找:
```cpp
parent[i]=j;//表示元素i的父亲是j
parent[i]=i;//表示i是一棵树的根节点void initial(int *parent[],int n)
{for(int i=1;i<=n;i++){parent[i]=i;}
}
```
## 获取树根
```cpp
int parent[n];
//输入数据
int GetRoot(int a) //求a树根
{if(parent[a]==a)return a;return GetRoot(parent[a]);
}//也可以这样写
int GetRoot(int a) //求a树根
{if( parent[a] != a)parent[a] = GetRoot(parent[a]);return parent[a];
}
```
## 合并
这里考虑两种方式:
### 第一种:
把深度浅的直接挂在另一棵树下面,假如说两棵树都很深但是深度一样,那么树的深度必然增加,就不够理想
### 第二种:路径压缩
当我们查询一个结点的时候,直接将该节点到跟路径上的每一个结点数值解挂在根的下面
```cpp
Merge(a,b)//表示的是将b的树根的父亲设置为a的树根,将b合并到a
Query(a,b)//比较
```
```cpp
int parent[N];
int merge(int a,int b)//合并
{parent[GetRoot(b)] = GetRoot(a);//b的树根的父亲是a的树根
}
bool Query(int a,int b)//查找只需要判断a和b在不在一个集合里面就可以啦
{return GetRoot(a) == GetRoot(b);
}
```
接下来就是判断并查集的复杂度了,因为存储了每一个元素的父亲,所以空间复杂度是O(n),这个很好理解,而时间复杂度就是为了找到根花的时间,就是Getroot的复杂度,如果说我们使用路径压缩的存储方式,那么这个复杂度平均一下在N不是很大的时候是常数,不会超过4
## 例题一:POJ1611
[题目链接](1611 -- The Suspects)
今年很可能会有这样的题目哦,今年新冠疫情爆发了,很可能回往这方面出题。~~我的猜测
这是翻译的题目:
就是有n个学生,编号0到 n-1, 以及m个团体,(0 < n <= 30000 , 0 <= m <= 500) 一个学生可以属于多个团体,也可以不属于任何团体。如果一个学生疑似患病,则它所属的整个团体都疑似患病。
已知0号学生疑似患病,以及每个团体都由哪些学生构成,求一共多少个学生疑似患病。
样例输入:
100 4 //100人,4团体
2 1 2 //团体有2人 编号是1和2
5 10 13 11 12 14
2 0 1
2 99 2
200 2//200人,2团体
1 5
5 1 2 3 4 5
1 0
0 0 //代表终止输入
样例输出:
4
1
1
解释如下:
总共三组测试数据
100人,4团体。200人,2团体。1人,0团体
只有当且仅当人数为0并且团体为0时终止输入,属于多组输入
## 问题分析
所有的互相感染的都放在一个集合里面,就是问0所在的集合有多少个元素,我们把0作为这个感染集合的根节点
```cpp
int parent[MAXN+5];
int total[MAXN+5];//表示每一个集合的人数,在每一次合并的时候直接更新
//合并函数
void Merge(int a,int b)
{p1=GetRoot(a);p2=GetRoot(b);if(p1==p2)return ;//不需要合并total[p1]+=total[p2];parent[p2]=p1;//把b的根挂到a的根
}
```
```cpp
int main()
{while (true) //为了多组输入{cin >> n >> m;if (n == 0 && m == 0)break;for (int i = 0; i < n; ++i){parent[i] = i;total[i] = 1;}//之前这是每一组测试数据for (int i = 0; i < m; ++i){int h, s;scanf("%d", &k);//k个学生scanf("%d", &h);//我们把第一个学生当做这个组的根for (int j = 1; j < k; ++j){scanf("%d", &s);Merge(h, s);//建树}}printf("%dn",total[GetRoot(0)]);}
}
```
好了,今天的并查集就到这里。
释然每天发布一点自己学习的知识,希望1年后我们也能在ACM的赛场上见面,一起去追寻自己的程序猿之路吧!
后期也会和大家一起分享学习心得和学习经验呢,明天我们不见不散哦!
下期预告:
## 树的遍历
如果大家有什么建议或者要求请后台留言,释然也想和大家一起进步呀!
联系方式:shirandexiaowo@foxmail.com
并查集路径压缩_第二十五天:并查集相关推荐
- 并查集路径压缩_并查集(UnionFind)技巧总结
什么是并查集 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(Union-find Algorithm)定义了两个用 ...
- 标签地址src路径拼接_第二十四天HTML一些常见的标签
先来看标题标签,它总共有<h1> - <h6> 这6中标签.数字越大,它所显示的字体越小. <body> <h1>This is heading 1&l ...
- 新版标准日本语中级_第二十五课
语法 1. 出席の予定です:在跟出席.努力等表示动作的名词进行组合时,除使用~する外,还可以使用の. さらに,張一心もゲスト審査員として出席の予定です(并且,张一心也将作为嘉宾评委出席) 皆さんの ...
- Rochambeau POJ - 2912 (枚举和加权并查集+路径压缩)找唯一裁判
题意:有n个人玩石头剪刀布,有且只有一个裁判.除了裁判每个人的出拳形式都是一样的. a<b表示b打败a,a=b表示a和b出拳一样,平手.a>b表示a打败b. 给出m个回合的游戏结果,问能否 ...
- 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第二十五章RTC实时时钟实验 实时时钟是很常用的一个外设 ...
- 陈艾盐:春燕百集访谈节目第二十五集
<春燕姐姐>访谈节目共120集,每月分10集播出,记录了上百位企业家对"慈善"的各种不同见解,通过讲述社会真善美的故事,让更多的人了解慈善.发扬慈善精神,构建更加美好, ...
- 笑话集原创笑话精品展第二十四期
1.有一个多次在大巴车上实施的罪犯在法庭上受审. 法官:这位被告,公诉机关指控你在客车上用暴力.控吓等不正当手段强行夺取他人钱财,你可知道你的行为已构成什么犯罪行为? 罪犯:知道. 法官:什么罪? 罪 ...
- 我的团长我的团第二十五集
我的团长我的团第二十五集 豆饼首先发现了异常. 脚下的土地居然有庄稼苗,而周围别的地块全都没有. 果然,走不多远,就发现树林里藏着几个农人.一家老小. 老乡了解了他们的身份后,带路送他们来到一条没有鬼 ...
- 【正点原子MP157连载】第二十五章 pinctrl和gpio子系统实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
最新文章
- vue中style的scoped属性的设计方式
- c语言文件分类二进制,C语言实现文件版(二进制文件版)通讯录
- 相对URL拼接为绝对URL的过程
- 《数据结构题集》2.12
- 动态代理-cglib
- word标题级别编号设置
- java mock when return can not resolve method xxxx error
- 将土豆或者youku 的视频放到自己的网站上面.
- AS3933, 125K 接收
- python手机自动回复_用python itchat写一个微信机器人自动回复
- 3分钟学会在C ++中以编程方式合并Excel工作表中的单元格
- 智能冰箱APP开发定制制作
- 计算机能连上手机热点却无法连上无线网络,Win10电脑能连接到手机热点却无法上网怎么解决...
- 学了那么久Python还什么都做不了,我觉得你该试试这个方法了
- 自然图像抠图/视频抠像技术梳理(image matting, video matting)
- IBM 的另一面http://www-31.ibm.com/innovation/cn/iter/2011v17/
- EFI基本概念之HOB
- 【Vant相关知识】
- 关于使用SQLALCHEMY 出现warning 的问题解决【SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and】
- 计算机毕业设计Java高校实习实训管理系统(源码+系统+mysql数据库+Lw文档)
热门文章
- python numpy库_numpy库学习总结(基础知识)
- java in array_ArrayList to Array Conversion in Java
- libxml2如何配合php使用,libxml2实现xml文档的节点的修改
- java版我的世界光追,老瓶装新酒 光追版《我的世界》将至你心动了吗
- 操作系统 第一章 计算机系统概述
- Altium AD20原理图从库中更新变动,库中模型修改后同步到原理图中
- Linux之SWIG安装(无需安装pcre依赖)
- Python报错it could not find or load the Qt platform plugin windows
- markdown编辑数学公式
- JadClipse反编译工具在MyEclipse中的安装(先看Eclipse的配置方式)