并查集 谁践踏了优雅 2021-12-15 11:33 371阅读 0赞 ### 并查集 ### 并查集是对树的一种操作,旨在找到某个节点的公共祖先(最老公共祖先)。我们先讲一下并。 ### 并 ### 并就是讲两个节点合并到一个集合里面(这个集合必须是树),每个节点对应一个祖先,最老公共祖先的祖先就是自己,而每个节点在合并前的初始值也是自己,也就是:若有一个节点 a ,设它的祖先为 f\[a\] ,那么它的初始值就是 f\[a\]=a ,。这个合并操作并不难,只要判断一下这两个节点是否有祖先,没有就很好办,直接随便连,比如: a 和 b ,他们都没有祖先(也就是祖先是自己),那么就可以 f\[a\]=b,如果 f\[a\]≠a 那么就让 b 的最老祖先(可能是自己)再往上多一个祖先 f\[a\],此时 b 的最老祖先也就是 aa 的最老祖先了(不一定是 a )。具体算法如下: void unionn(int p,int q,int bj) { int t,p1,q1; p1=find(p);//搜索p的祖先 q1=find(q);//搜索q的祖先 if(p1==q1) return;//祖先都相同了,退出 t=father[p1]+father[q1];//两个集合的总人数,因为初始化时father[]全部都等于-1,利用abs求的集合的人数 if(father[p1]>father[q1]) {father[p1]=q1;father[q1]=t;} else{father[q1]=p1;father[p1]=t;} //哪边人数多就令另外一边的祖先指向人数多的一边 } ### 查 ### 有时候我们需要查某个节点的最老祖先是谁,主要是为了下面判断某两个节点的最老祖先是否相同而准备的。假如有这样一组关系: ![/images/20211214/71a807339f7f484cbe760dfa95d8d447.png][https_cdn.luogu.org_upload_pic_10787.png] 比如我们要找 11 的最老祖先,那么怎么找呢?那么就要通过 33 来找,再往上找,这样的话代码就是: int find(int f[], int x) { if(f[x]>0)return x;//如果是祖先,就返回最老祖先的值 return find(f[x]);//不是最老祖先,那么就往上继续找 } 但是,这样做的话,会有很多重复工作。比如我刚才找 11 ,现在找 22 ,那么你就重复搜索了 22 。此时我们就需要压缩路径,以便后面查找时更便捷。压缩路径的话,就是在查找的时候,顺带把经过的节点的祖先直接指向最老祖先,那么后面找最老祖先的时候,就一步到位了。代码如下: int find(int x) { if(f[x]>0)return x;//如果是祖先,就返回最老祖先的值 return f[x]=find(f[x]);//不是最老祖先,那么就往上继续找,并令当前的x直接指向祖先,压缩路径 } 线性写法: int find(int p) { int i,j; i=p; while(father[i]>=0) i=father[i];//不是最老祖先,那么就往上继续找 while(i!=p) { j=father[p]; father[p]=i; p=j; }//将路径上的所有点全部指向祖先 return i; } 这种方法十分巧妙,压缩路径之后,查找的速度也会快得多。 ### 总结完毕,谢谢 ### 转载于:https://www.cnblogs.com/kurlisjoey/p/10880721.html [https_cdn.luogu.org_upload_pic_10787.png]: /images/20211214/71a807339f7f484cbe760dfa95d8d447.png
相关 并查集 Ⅱ \[poj 1611\] ([http://poj.org/problem?id=1611][http_poj.org_problem_id_1611]) 题目描述: T 古城微笑少年丶/ 2022年08月03日 14:35/ 0 赞/ 252 阅读
相关 并查集 并查集JAVA版框架 并查集是一种用来管理元素分组情况的数据结构。 并查集可以高效地进行如下操作: \--查询元素a和元素b是否属于同一组 落日映苍穹つ/ 2022年06月16日 12:44/ 0 赞/ 287 阅读
相关 并查集 这个文章是几年前水acm的时候转的, 当时也不知道作者是谁, 要是有人知道的话说一下吧 并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的 港控/mmm°/ 2022年06月13日 14:13/ 0 赞/ 276 阅读
相关 并查集 > 题目 > 某学校近期要组织全校同学出去参加某项活动,由于人数众多,学校决定让同学们自行组队,以小组为单位进行活动。假设学校一共n个同学,每个同学有一个唯一的数字作为标签 Myth丶恋晨/ 2022年06月08日 09:24/ 0 赞/ 285 阅读
相关 并查集 森林: 森林是由若干棵互不相交的树组成,两棵树分别独立,没有交集 ![20181112082744488.png][] 并查集: 并查集的结构和森林十分相似,是 Love The Way You Lie/ 2022年04月17日 02:27/ 0 赞/ 344 阅读
相关 并查集 来看一个实例,[杭电1232畅通工程][1232] 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性 我就是我/ 2022年03月29日 10:58/ 0 赞/ 338 阅读
相关 并查集 > 并查集是一种树形的数据结构,用于集合的合并。 与C++STL相比的优势: 1. 可以同时维护多个集合 2. 快速的合并两个集合 \\现实: 用数组实现。fat 左手的ㄟ右手/ 2022年02月05日 00:23/ 0 赞/ 239 阅读
相关 并查集 并查集 并查集是对树的一种操作,旨在找到某个节点的公共祖先(最老公共祖先)。我们先讲一下并。 并 并就是讲两个节点合并到一个集合里面(这个集合必须是树),每个节点 谁践踏了优雅/ 2021年12月15日 11:33/ 0 赞/ 372 阅读
相关 并查集 一、算法解释 用于解决一些有N个元素的集合应用问题。 1、将每个元素初始化为自身单独成为一个集合。用p\[i\]的值表示该元素所在集合。 ![这里写图片描述][S 桃扇骨/ 2021年09月14日 02:56/ 0 赞/ 446 阅读
相关 并查集 并查集的作用就是快速判断两个元素是否在同一个集合中,快速将两个集合合并 基本模板 include <iostream> include <a 比眉伴天荒/ 2021年06月22日 15:37/ 0 赞/ 538 阅读
还没有评论,来说两句吧...