今天是释然发题解的第二十五天,以后会经常和大家分享学习路上的心得,希望和大家一起进步,一起享受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

并查集路径压缩_第二十五天:并查集相关推荐

  1. 并查集路径压缩_并查集(UnionFind)技巧总结

    什么是并查集 在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(Union-find Algorithm)定义了两个用 ...

  2. 标签地址src路径拼接_第二十四天HTML一些常见的标签

    先来看标题标签,它总共有<h1> - <h6> 这6中标签.数字越大,它所显示的字体越小. <body> <h1>This is heading 1&l ...

  3. 新版标准日本语中级_第二十五课

    语法   1. 出席の予定です:在跟出席.努力等表示动作的名词进行组合时,除使用~する外,还可以使用の. さらに,張一心もゲスト審査員として出席の予定です(并且,张一心也将作为嘉宾评委出席) 皆さんの ...

  4. Rochambeau POJ - 2912 (枚举和加权并查集+路径压缩)找唯一裁判

    题意:有n个人玩石头剪刀布,有且只有一个裁判.除了裁判每个人的出拳形式都是一样的. a<b表示b打败a,a=b表示a和b出拳一样,平手.a>b表示a打败b. 给出m个回合的游戏结果,问能否 ...

  5. 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第二十五章RTC实时时钟实验 实时时钟是很常用的一个外设 ...

  6. 陈艾盐:春燕百集访谈节目第二十五集

    <春燕姐姐>访谈节目共120集,每月分10集播出,记录了上百位企业家对"慈善"的各种不同见解,通过讲述社会真善美的故事,让更多的人了解慈善.发扬慈善精神,构建更加美好, ...

  7. 笑话集原创笑话精品展第二十四期

    1.有一个多次在大巴车上实施的罪犯在法庭上受审. 法官:这位被告,公诉机关指控你在客车上用暴力.控吓等不正当手段强行夺取他人钱财,你可知道你的行为已构成什么犯罪行为? 罪犯:知道. 法官:什么罪? 罪 ...

  8. 我的团长我的团第二十五集

    我的团长我的团第二十五集 豆饼首先发现了异常. 脚下的土地居然有庄稼苗,而周围别的地块全都没有. 果然,走不多远,就发现树林里藏着几个农人.一家老小. 老乡了解了他们的身份后,带路送他们来到一条没有鬼 ...

  9. 【正点原子MP157连载】第二十五章 pinctrl和gpio子系统实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

最新文章

  1. vue中style的scoped属性的设计方式
  2. c语言文件分类二进制,C语言实现文件版(二进制文件版)通讯录
  3. 相对URL拼接为绝对URL的过程
  4. 《数据结构题集》2.12
  5. 动态代理-cglib
  6. word标题级别编号设置
  7. java mock when return can not resolve method xxxx error
  8. 将土豆或者youku 的视频放到自己的网站上面.
  9. AS3933, 125K 接收
  10. python手机自动回复_用python itchat写一个微信机器人自动回复
  11. 3分钟学会在C ++中以编程方式合并Excel工作表中的单元格
  12. 智能冰箱APP开发定制制作
  13. 计算机能连上手机热点却无法连上无线网络,Win10电脑能连接到手机热点却无法上网怎么解决...
  14. 学了那么久Python还什么都做不了,我觉得你该试试这个方法了
  15. 自然图像抠图/视频抠像技术梳理(image matting, video matting)
  16. IBM 的另一面http://www-31.ibm.com/innovation/cn/iter/2011v17/
  17. EFI基本概念之HOB
  18. 【Vant相关知识】
  19. 关于使用SQLALCHEMY 出现warning 的问题解决【SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and】
  20. 计算机毕业设计Java高校实习实训管理系统(源码+系统+mysql数据库+Lw文档)

热门文章

  1. python numpy库_numpy库学习总结(基础知识)
  2. java in array_ArrayList to Array Conversion in Java
  3. libxml2如何配合php使用,libxml2实现xml文档的节点的修改
  4. java版我的世界光追,老瓶装新酒 光追版《我的世界》将至你心动了吗
  5. 操作系统 第一章 计算机系统概述
  6. Altium AD20原理图从库中更新变动,库中模型修改后同步到原理图中
  7. Linux之SWIG安装(无需安装pcre依赖)
  8. Python报错it could not find or load the Qt platform plugin windows
  9. markdown编辑数学公式
  10. JadClipse反编译工具在MyEclipse中的安装(先看Eclipse的配置方式)