并查集主要用于解决连接问题,其基本思想是为每一个数据都打上标签,当标签一致时则为一个集合。但是考虑到求并集的时候的效率问题,这里采用树形结构解决该问题,简单来说就是利用两个节点的根节点是否一致作为是否为一个集合的标志。 实现 查找:为防止该数据结构退化为链表,在每次查找过程中,选择进行路径压缩,使该 ...
分类:
编程语言 时间:
2021-04-29 12:09:20
阅读次数:
0
并查集可以有两个优化方案, 1,平衡性优化:对每个结点标记一个重量值,在进行union操作时,将重量小的添加到重量大的节点上。 2,路径压缩:在进行find操作时,顺便对路径进行压缩 private int find(int x) { while (parent[x] != x) { // 进行路径 ...
分类:
其他好文 时间:
2021-04-22 15:12:28
阅读次数:
0
所谓并查集就是将编号为1~n的n个对象划分为不相交集合,在每个集合中,选择其中的某个元素代表所在集合在这个集合中,并查集的操作有初始化,合并,查找。 #include<bits/stdc++.h> using namespace std; #define IOS ios::sync_with_std ...
分类:
其他好文 时间:
2021-04-20 15:31:02
阅读次数:
0
原题链接 考察:并查集 思路: 很容易想到用并查集的根节点代表此集合的权值和.但是注意在结点合并的时候,会出现本不属于这里的权值.被路径压缩加到子结点上. 这里有两种处理方式: 一、建立虚点. 在x,y之上建立一个结点s,在路径压缩时就不会合并到y集合的权值k. 二、特殊处理x结点权值,在x权值和上 ...
城市和城市连在一块,有多少个省? 一群人里面自己和自己亲戚连在一块,有多少组亲戚? 你俩是不是一个小区的? 他俩是不是有一腿 以上所有问题,抽象,概括为分组问题 老并查集了 这里引用一个知乎大佬的并查集讲解,gang的非常好,我就不赘述了。 并查集讲解 大家主要了解一下并查集的两种优化方法,路径压缩 ...
分类:
其他好文 时间:
2021-01-08 11:38:43
阅读次数:
0
// 并查集模板,包含路径压缩(参考 findset 函数)以及按秩合并(参考 sz 变量) class UF { public: vector<int> fa; vector<int> sz; int n; int comp_cnt; public: UF(int _n): n(_n), comp ...
分类:
其他好文 时间:
2020-12-25 12:01:55
阅读次数:
0
一、理论 并查集的定义: 并查集是一种树型的数据结构,用于处理一些不交集的合并和查询问题。一般用数组实现。 Find:确定元素属于哪一个子集,它可以被用来确定两个元素是否属于同一个子集。 Union:将两个子集合并成同一个集合。 并查集的优化: 优化1: 降低rank,提高查询效率。合并时要考虑ra ...
分类:
其他好文 时间:
2020-12-04 11:19:39
阅读次数:
6
Q:给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。返回使 A 中的每个值都是唯一的最少操作次数。 示例 1: 输入:[1,2,2] 输出:1 解释:经过一次 move 操作,数组将变为 [1, 2, 3]。 示例 2: 输入:[3,2,1,2,1,7] 输出:6 解释 ...
分类:
编程语言 时间:
2020-06-24 12:28:41
阅读次数:
51
//并查集-都要给fa赋初值!!// /*递归版路径压缩*/ const int maxn=2e5+9; int fa[maxn]; int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } void merge(int x,int y) { ...
分类:
其他好文 时间:
2020-05-16 12:36:03
阅读次数:
47
左偏树模板题。 只不过这里要加上并查集的路径压缩(因为要找堆顶),不然复杂度是错的。 因为一个人被杀了,他就没了,为了证明他没了,所以要把他的val设成-1。 #include <iostream> #include <cstdio> using namespace std; const int N ...
分类:
其他好文 时间:
2020-05-10 17:03:27
阅读次数:
55