PART1 1.实现: 将每条边按权值从小到大进行排序 (要用并查集维护)容边上两点不在同一个树,则合并 2.时间复杂度: Kruskal 算法的时间复杂度由排序算法决定,若采用快排则时间复杂度为 O(Elog?E) 总时间复杂度为 O(ElogE+V α(V)) 【α(V)近似看作常数】 3.特别 ...
分类:
其他好文 时间:
2021-06-30 18:24:26
阅读次数:
0
两种写法,主要是复杂度的证明上比较有趣 1. 并查集+BFS 对于每个点,最多只会进入队列一次,这部分的复杂度是O(n) 每个点最多会在 for (int i = find(1); i <= n; i = find(i + 1))这段话中被访问 \(edge[i].size() + 1\) 次,因为 ...
分类:
其他好文 时间:
2021-06-28 17:55:38
阅读次数:
0
Solution 对于字典序最小 , 从后往前扫即可满足 . 对于查询冲突 , 通过枚举完全平方数解决 . \(K=1\) 时 , 出现冲突时新分一组即可 . \(K=2\) 时 , 通过拓展域并查集来判断 . 我们把一个数拆成两个点 , 分别为黑点和白点 , 对于冲突的点 , 将它们的黑白点两两相 ...
分类:
其他好文 时间:
2021-06-21 20:03:20
阅读次数:
0
并查集主要用于解决连接问题,其基本思想是为每一个数据都打上标签,当标签一致时则为一个集合。但是考虑到求并集的时候的效率问题,这里采用树形结构解决该问题,简单来说就是利用两个节点的根节点是否一致作为是否为一个集合的标志。 实现 查找:为防止该数据结构退化为链表,在每次查找过程中,选择进行路径压缩,使该 ...
分类:
编程语言 时间:
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权值和上 ...
题目描述 有一个集合组成的list,如果有两个集合有相同的元素,将他们合并。返回最后还剩下几个集合。 集合数 n <= 1000。 每个集合的元素个数 m <= 100。 元素一定是非负整数,且不大于 100000。 样例 样例1: 输入:list = [[1,2,3],[3,9,7],[4,5,1 ...
分类:
其他好文 时间:
2021-04-15 12:24:32
阅读次数:
0
A. x 很容易可以想到分解质因数,使用并查集把相同因子的放一块儿,计算出最终有 \(cnt\) 个块,答案为 \(2^{cnt}-2\) (可以理解为为每个块都有左集合与右集合两个选择,而最终出现2个空集的情形,需要从答案中减去) 然鹅,事情并没有这么简单~ 因为 \(a_i\) 上界为 \(10 ...
分类:
其他好文 时间:
2021-04-02 13:15:06
阅读次数:
0
LG2147 [SDOI2008]洞穴勘测 这个题第一眼是线段树分治吧。 但是这个题和大部分板子不同的是,这里询问不是全图连通性了,是两点的连通性。其实思路没什么大区别,还是要用可撤销并查集维护连通性,把边挂到线段树上相应的时间点上。 只是我们现在的询问不同了,我们可以模仿把边挂在线段树上的方式,把 ...
分类:
其他好文 时间:
2021-03-08 13:37:41
阅读次数:
0