ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

并查集路径压缩学习笔记

2021-08-25 22:31:46  阅读:136  来源: 互联网

标签:路径 查集 笔记 find fa 父亲 节点


前言:

第一次学比较玄学,反正本蒟蒻听出了脑雾现象,后来慢慢接受了,感jio也没那么难(对我来说)。

还是那句话:听课不规范,补课两行泪

正文:

Q:什么是并查集?

A:我也不知道,因为比较玄学(emm…),其实类似于数学里的集合。

 

并查集的两种方式

一种朴素的。

一种路径压缩的。

(当时上课划水导致朴素的根本不会,所以本蒟蒻直接学的路径压缩?)

 

废话不多说,上代码

int find(int x) {
    return fa[x]=x?x:fa[x]=find(fa[x]);
}

用了一个三目运算符,不懂的去百度一下,也不难。

首先我们有一些元素,我们要把他们合并,那开始就令各个元素的父亲是自己

 

for(re int i=1;i<=n;i++){
fa[i]=i; }//就可以了

然后模拟一下找爹合并的过程(借用别的文章的图)

parent[i]指向的是i的父亲的节点,

假设我们起始的并查集如上图所示,现在我们要find[4],首先我们根据parent[4]可以得出,4并不是一个根节点,因此,我们可以在向上继续查询之前,把这个节点往上面挪一挪(路径压缩),首先现在4节点连接到其父亲3节点上,我们可以让4节点不在指向3节点作为父亲节点了,而是让其跳一下,让其指向2节点(即父亲节点的父亲节点)作为新的父亲节点。

这样,我们就发现树的层数由原来的5层变成了现在的4层,即路径被压缩了一下。

递归实现这一过程,使得4的根节点直接指向0,同样4的父节点,4父节点的父节点(这么套娃一直套到根节点)…,最终变成这样:

不明白递归细品一下就明白了,fa[i]一直向前指,指到根节点回溯(这么说也没问题),回溯什么呢?

fa[x]=find(fa[x]) ———>回溯这个;
到根节点之后, find(fa[x]) 指的就是根节点,所以一直归回去就得出了x的根节点,判断联通比较根节点是否为同一个就好了

未完待续……

 

标签:路径,查集,笔记,find,fa,父亲,节点
来源: https://www.cnblogs.com/BlackDan/p/15187248.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有