首页
学习
活动
专区
圈层
工具
发布

并查集

并查集是一种用互质的集合对数据进行分类管理的数据结构。 并查集主要实现了两个功能:合并与查询 我们用一个数组fa[i]来表示第i个元素所在集合的根节点。 根节点的父节点指向它自身。...对于题目 DSL_1_A 来说,题目要求实现一个简单的并查集,代码如下: #include #include using namespace std; #define...]==x) return x; int t = find_root(fa[x]); fa[x] = t; return t; } 按秩合并 并查集的按秩合并说白了就是把高度矮的树合并到高度高的树上...只有使用了路径压缩+按秩合并的并查集,时间复杂度才会低于O(logn) 我们需要使用一个数组Rank[i]来存储第i个节点作为根节点时,它的树的高度。...带权并查集 带权并查集就是在并查集的树的连边上附上权值。 带权并查集的合并,需要把权值也加起来。 其实理解并不困难,就是用一个数组s[i],来存储当前节点到路径压缩后的父节点的权值和。

91640
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    并查集

    简介 并查集是一种高效的数据结构,常用来解决集合的合并和查找问题,常见于图论问题中。 2. 操作 2.1 构建 并查集一般构建为初始时每个节点所属的集合编号即为自己的节点编号。...// 寻找并查集的根节点 int findfather(int x) { return x == father[x] ?...[x] 改变的只是 x 的根节点,而不是整个并查集的根节点,因为并查集本质是依靠其根节点来维护的,所以应该将并查集的根节点的 father 修改为已另一个集合的根节点,从而保证前一个集合被合并到了后一个集合中...stdc++.h> using namespace std; #ifndef _DSF_ #define _DSF_ #define ll long long #define MAXN 505 // 并查集...x : (father[x] = findfather(father[x])); } // 合并并查集(将 x 节点所在并查集合并到 y 节点所在并查集) void mergefather

    70930

    并查集

    Sample Input 6 M 1 6 C 1 M 2 4 M 2 6 C 3 C 4 Sample Output 1 0 2 题目链接POJ-1988-Cube Stacking 解题思路...把递归和并查集完美的结合在一起的,我们需要先设置三个数组分别 用于 1,找该节点的父节点,2该节点到其祖先节点的距离,3以该节点为祖先节点的点有几个;每次查找然后更新一旦遇到C,就用该节点的祖先节点包含的点数减去这个点到其祖先节点的数量就可以啦...,&c); if(c=='M') { scanf("%d%d",&x,&y); jion(...y的队伍里面,Q x表示查询x然后需要输出x现在的祖先节点是谁,这个节点一共有几个成员,x被移动了几次;另外每组开始的时候需要输出Case x:(这是第几组测试) 解题思路 这个题真的是麻烦,还是带权并查集...这个题意识属于带权并查集,构图之类的都很容易但是如何确定关系呢?我怎么确定这两个点冲突了呢?

    1K20

    并查集

    本篇博客参照了如下博客内容: http://www.cnblogs.com/horizonice/p/3658176.html 并查集 并查集是一种树形结构,又叫“不相交集合”,保持了一组不相交的动态集合...---- 初始化 用数组来建立一个并查集,数组下标代表元素,下标对应的值代表父节点,全部初始化为-1,根节点为一个集合的元素个数,数组的长度为并查集的初始连通分量的个数。...并查集要求各集合是不相交的,因此要求x没有在其他集合中出现过。...这里对并操作有两种优化:根节点存树高的相反数或者根节点存集合的个数的相反数,这两种方法统称按秩归并。通常选用第二种方法。 归并过程如下图: ?...iostream> #include using namespace std; class UF{ private: int* array; //并查集中的联通分量的个数

    60220

    并查集

    ​ 在我们需要判断某一些事物之间是否存在一定的关系的时候,我们最好的办法不是使用图而是使用并查集。因为我们关心的是他们之间是否有关系,而不是关心的他们到底存在怎样的关系。 ​...并查集,简单来说就是 n 个集合,我们通过 union 操作来建立两个节点之间的关系。通过 connected 来判断两个节点之间的关系。...那么现在我们知道了 并查集的基本操作就是 union 和 connected 。 逻辑结构: 并查集一开始我们初始化都是初始化 n 个不相关的独立集合。...} } } ​ 好了现在代码看起来会比较完美了,该用的技巧我们都已经用上了,现在合并操作的时间复杂度是常数,而查找操作的复杂度则是 n+nlogn 应用: ​ 接下来一个并查集的小应用的例子...,就是迷宫是否有解,我们就可以使用并查集来找最上面,和最下面一行之间是不是有联通的节点,如果有的话我们就能找到迷宫的解。 ​

    1.6K70

    并查集入门

    请勿转载@HanKin 简介 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中...性质 并查集算法不支持分割一个集合。 算法思想 用集合中的某个元素来代表这个集合,该元素称为集合的代表元。 一个集合内的所有元素组织成以代表元为根的树形结构。...判断两个元素是否属于同一集合,只需要看他们的代表元是否相同即可。 路径压缩 每次查找的时候,如果路径较长,则修改信息,以便下次查找的时候速度更快。...其实本题只是一个对分离集合(并查集)操作的问题。 我们可以给每个人建立一个集合,集合的元素值有他自己,表示最开始时他不知道任何人是它的亲戚。...并查集的“路径压缩”算法:在集合的查找过程中顺便将树的深度降低。采用路径压缩后,每一次查询所用的时间复杂度为增长极为缓慢的ackerman函数的反函数—α(x)。

    95120

    【C++】并查集的原理与使用

    也欢迎关注我的blog主页: 落羽的落羽 一、并查集的概念 在一些场景中,需要将n个不同元素划分为一些不相交的集合。开始时,每个元素各成一个元素,然后按一定的规律将属于同一组的元素合并。...适合用于这种场景的数据结构是并查集(Union-Find Set)!...我们可以规定并查集用数组下标代表每个元素,数组内容代表元素之间的关系: 数组下标代表元素编号 如果数组内容为负整数,代表这个下标是根,绝对值表示它这棵树的元素个数 如果数组内容为非负整数,代表这个下标不是根...通过并查集的特点,可以看出并查集一般能解决: 查找元素属于哪个集合:沿着数组一直找到元素为负数,就是根 查看两个元素是否属于一个集合:看看这两个元素的根是否相同 将两个集合归并为一个集合:假如要将下标a...的树合并到下标b的树中,arr[b] += arr[a],arr[a] = b即可,即令1成为0的一个孩子 统计集合的个数:统计数组中元素为负数的个数 二、并查集的实现 #pragma once #include

    19210

    什么是 “并查集” ?

    导语:并查集是一种精巧的算法,本身并不难理解,却很常用,在许多场景下都能找到并查集的身影。 本文作者封承成,年仅12岁,非常感谢他的投稿。 ? 并查集是什么 并查集,是一种判断“远房亲戚”的算法。...并查集是专门用来解决这样的问题的,和搜索不同,并查集在构建图的时候同时就标记出了哪个“人”属于哪个“团伙”(一团伙中的点两两联通)。 ? 并查集的操作 1....初始化 并查集的思想是通过标记确定该顶点所在的组。...不要小瞧并查集代码短,在很多时候并查集都会派上用场,比如著名的克鲁斯卡尔算法,就是通过并查集判断两个顶点是否相连的。更重要的是体会并查集的思想,用这种思想来优化代码。...好了,今天的并查集就介绍到这里,希望大家能好好消化吸收,欢迎点个在看哦~~ —————END—————

    1.5K40
    领券