今天做题做到了并查集相关的内容~简单介绍一下关于并查集的东西

就例如一个非常简单的题~

有一堆人 其中某些人是朋友

有如下的规则 如果A和B是朋友 B和C是朋友 那么A和C也是朋友~

最后我们有n次的查询 每次查询问其中两个人是不是朋友?

这个题我们就可以用到集合的思想~

例如A和B是朋友 我们可以把A和B放到一个集合里~

C和D是朋友 我们就把C和D放到一个集合里~

如图

(原谅只会人工画图的笨比)

但如果我们假设A和C也是好朋友

我们就把这两个集合合并起来~

就是这个样子~我们对所有的“朋友对”进行这样的操作 就会把他们分到一个个集合里 这时候查找他们是不是好朋友就很轻松了~

以上这些 就是并查集的思想:

当然我们通过c语言实现并查集也很简单

借助数组!

首先我们定义一个数组!

fa[maxn]

fa代表father的意思 父亲

fa[1]=2就代表1的父亲是2

为什么这么做呢!

因为并查集是一种树状的数组

例如刚才那个例题 我们怎么做才算是把AB,CD分别放到一个集合里呢!

很简单 就是让A的父亲是B,C的父亲是D

fa[A]=B,fa[C]=D

通过这种方式!我们就形象的把A和B连在一起 C和D连在了一起(这样来代表他们是一个集合里的)

之后我们如果知道了A和C是好朋友

我们如何合并(AB)和(CD)这两个集合呢

很简单 我们首先查找A的祖先  然后查找C的祖先

然后让A的祖先 是C的祖先的父亲

fa[A的祖先]=C的祖先

如图:

这样一个非常简单的并查集就做好了~

那么我们如何知道查询呢!

就例如查询A和C是不是好朋友

我们首先找A的祖先

A的父亲=B,再找B的父亲=D 所以A的祖先就是D!

那么我们再找C的祖先

C的父亲=D(这时候上面没人了)所以C的祖先就是D!

那么如果A的祖先和C的祖先是一个人!!

如图 就可以证明 A和C在同一个集合中

----------------------------------------------------------------

以上 就是我们一个简单并查集的两大功能

1合并两个集合

2查找

----------------------------------------------------------------

可能这时候你有了一点点小问题

我们该如何知道某个人上面是不是没人了!

(例如上面我们怎么知道C的父亲=D,D就是他的祖先,在上面就没人了呢?)

我们可以在初始化上做操作!

fa[i]=i;

我们初始化上 让每个人的祖先都是他自己!

而在上面集合(ABCD)中 我们知道祖先是D D作为最大的 他上面没有其他比他辈大的了

所以按照我们初始化的结果!D的祖先还是D,是他自己

因此 我们只需要找 某个元素的祖先是不是自己 就可以完成祖先的判断

如图:

上一波代码实现:

通过三目运算符判断 如果x==x的父亲 那么x就是祖先 如果不是 那么让接着往上寻找父亲的父亲 直到找到一个x=x的父亲的节点 作为祖先

以上为初始化实现(巨简单是不是)

那么如何合并两个集合呢!

也非常简单

首先找到x的祖先 然后找到y的祖先  让(x的祖先)的父亲是(y的祖先)即可!

参考上面例题哦~

以上

就是一个非常简单的并查集啦~

当然还可以进一步的优化等等

我是蒟蒻lsr!下期博客见=-=

原文地址:https://www.cnblogs.com/VAthree/p/12555430.html

时间: 2024-08-28 00:48:24

今天做题做到了并查集相关的内容~简单介绍一下关于并查集的东西的相关文章

富文本内容简单的的增删改查

由于html本身的textarea标签的文本编辑功能较为简单,不能设置文字的样式,因此需要富文本控件来增强textarea的功能.       一些常见的富文本控件有:UEditor.kindeditor.simditor.bootstrap-wysiwyg.wangEditor.CKEditor.tinymce,各有优缺点,网上也有对不介绍,不再赘述. 此处选用tinymce,因其兼容性较好,插入页面也较为简单,此外还有丰富的插件可以扩展功能. 首先,在页面上使用tinymce:1.引入js文

做题总结

这次做题做的不怎么好,随便写点东西给自己一点交代吧!    关于索引这部分说真的不怎么会,所以呢,要好好学一下!在这里总结一下,给自己未来回顾找个节点! 1.SQL Server Management Studio中,按照窗体向导设置索引的相关选项即可.索引的创建与表的主键创建的没有先后顺序要求.一般情况下,先创建主键,当表中数据达到一定数量后再建立索引. 2.视图是一个虚拟表,我们在查询视图的时候,实际上是对基础表的查询.视图不仅可以作为SELECT查询的目标,也可以作为修改语句的目标.理论上

退役前的做题记录5.0

退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树,这样跨越\(mid\)的点对之间的最短路一定会经过\(mid\),因此两点之间的最短路径就可以描述成最短路树上的两段到根路径.对每棵最短路树处理\(dfs\)序,用树状数组维护权值修改即可. [Wannafly挑战赛4F]线路规划 类似SCOI2016萌萌哒一题,并查集\(f_{i,j}\)表示从

FFT/NTT做题方法与调试技巧(+提高码题效率的一些想法)

(其实本文应该写成了"结合FFT讨论的调试技巧+码题方法",语文不好一写文章就偏题QAQ) 有意见欢迎提出,有遗漏欢迎补充! FFT(快速傅里叶变换)/NTT(数论变换)是卷积运算常见而实用的优化 但是FFT/NTT的处理过程并不像暴力运算(差不多是多项式乘法)那样能够直观地反映卷积结果的实时变化. 因此在使用FFT时将会或多或少地加大调试的难度. 如果调试程序时直接跟踪变量,每步手算结果比对,不仅会耽误大量时间,而且效果可能并不理想. 直接肉眼查错效率可能也不太高. 但也正由于FFT

线段树例题及做题误区

学会了一系列的线段树之后发现 除了扫描线还不是很熟之外一些操作基本上是得心应手了. 但是仍是很菜,在此再次深有感悟 以后做题再看题解 直接剁手 我就不信不看题解自己的思路出现错误 每次都当我 有了正确的思路之时 却被一些 很迷的思路 误导去看题解,看完题解之后才恍然大悟 .这点需要注意!!!我想我都窥出正解了为什么不能再多想想呢? 真的是超级没有成就感 感觉是非常难受的 好题被自己一时看了题解毁了这是我作为一个正在学习的人所极不想看见的. . 这道题还不错 对线段树是一个考察 如果能仔细思考的话

后缀自动机做题记录

目录 后缀自动机做题记录 sp1811 sp1812 sp10570 luogu 2463 CF873F TJOI2015 弦论 AHOI2013 差异 HEOI2016/TJOI2016 字符串 HAOI2016 找相同字符 SDOI2016 生成魔咒 ZJOI2015 诸神眷顾的幻想乡 留坑待填 广义SAM 其他 NOI原题练习 后缀自动机做题记录 来填之前的坑了...考后大概会做做有字符串的综合题吧 sp1811 lcs板子,对于第一个串建出SAM,第二个串在上面跑,即可求出对于每一个位置

python做题

Python题目 1.打印一个九九乘法表 #!/usr/bin/env python # -*- coding: utf-8 -*- """ __author__ = 'YeXiaodong' __QQ__= '12519460' __Email__ = '[email protected]' """ x = 1 list_table = [] print('九九乘法表'.center(100,' ')) while x < 10: lis

做题神器风靡:在线教育虚火旺盛的罪魁祸首是谁?

在线教育的巨大潜力有目共睹,不管是创业者还是巨头都纷纷杀入其中.在线教育本身囊括的范围极其广阔,从胎教.学龄前教育.中小学教育.高等教育,再到职业教育,乃至细分化的英语教育.技能教育等,构成一个完整的教育生态圈.但让人无奈的是,国内在线教育最火爆的却还是中小学教育. 而且由于国内教育体系本身存在的弊端,导致中小学教育主要以书山题海为工具,向高分发起追逐.在这样的大背景下,在线教育最火爆的是各种做题神器App.做题神器的风靡,让整个在线教育行业看起来形势一片大好.然而,做题神器真的就是解决在线教育

USACO 做题小结

还记得之前,发过一篇阶段性总结与未来规划..结果由于最近rp爆发(保研成功+进wf)后者显然靠bin神,前者也是运气.因此,放松了一段时间.然后就开始刷usaco了,原因是不用花时间找解题报告在NOCOW上全部都有,很是方便.所以只需单独开一片随笔把每天做题总结一下. Chapter1-Getting started(入门) 都是超级大水题就略过了. Chapter2-Bigger Challenges(更大的挑战) 2.1 castle  这是一道基本的搜索题目,很基础.前面两个值直接搜的,后