并查集

基本操作

每一个元素初始时都是独立的一个集合

for(int i = 1; i

递归查找的过程,直到找到一个元素值等于其集合的值即其根节点的集

int find_set(int x){
    return x == f[x] ? x : find_set(f[x]);
}

合并两个集合,通过查找操作找到其集的值,若不相等则修改其中一个使两个集的值指向同一个根节点的0值

void union_set(int x, int y){
    x = find_set(x);
    y = find_set(y);
    if(x != y) s[x] = s[y];
}

即统计一个根节点的数量,直接阐述较为抽象故引例

题目大意

偷偷BB,就是求有多少个

#include
#include
#include

using namespace std;
const int N = 1010;
int f[N];
int T, n, m, x, y;
// 初始化
void init_set(){
    for(int i = 1; i

优化原理:找到两个根节点,根据其高度,总使高度较小的集合合并到较大的集合中去,最终减少树的高度

int height[maxn + 1];               // 初始化时用height来定义元素i的高度,并在初始化时修改
void init_set(){
    for(int i = 1; i

优化原理:这个优化的原理很简单,如果每次找父节点都要按照原路径找一遍显然太鸡儿蠢了。

在递归返回时,沿路把路径上的点都直接指向父节点,下次就可以在O(1)的时间内得到结果

上代码!!!

// 递归版本
int find_set(int x){
    if(x != f[x]) f[x] = find_set(f[x]);    // 路径压缩
    return f[x];
}
// 非递归版本
int find_set(x){
    int t = x;
    while(f[t] != t) t = f[t];      // 此时t为根节点
    int i = x, j;
    while(i != t){
        j = f[i];           // 用变量j记录i的父节点
        f[i] = t;           // 把路径上的元素的集改为根节点
        i = j;              // 新的i是原来i的父节点,继续改下一个点
    }
    return t;
}

参考《算法竞赛——入门到进阶》–罗勇军 第五章 5.1并查集
后续习题有时间会发布,敬请期待;o((>ω< ))o# 并查集

Original: https://www.cnblogs.com/hhc-blog/p/15388300.html
Author: hcのBlog
Title: 并查集

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/584626/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • P1848 [USACO12OPEN]Bookshelf G

    简要题意 给你 (N) 本书 ((h_i,w_i)),你要将书分成任意段(顺序不能改变),使得每一段 (j) 中 (\sum\limits_{i \in j} w_i \leq L…

    数据结构和算法 2023年6月12日
    058
  • 表达式求值

    ​ 当初抱着总结所学的想法,硬着头皮写了几篇博客。东拼西凑,理解的不够深刻,再加上写博客不够熟练导致再复盘的时候大多数的注意力放在了怎么写上面,而忽视了应该怎样写,写出来要表达一些…

    数据结构和算法 2023年6月7日
    084
  • Codeforces1575D

    思路分析 此题采用dfs,注意X选中了之后所有的X值相同,所以需要一个flag来存储X的值。 注意前导0要单独讨论,然后就是当’X’或者’_&#…

    数据结构和算法 2023年6月7日
    075
  • C/C++内存泄漏检测方法

    内存泄漏 检测代码 使用链表记录每个malloc返回的指针,释放时从链表中查找并删除找到对应指针的节点。 最终输出链表,该链表记录了所有没有释放的动态内存。 #include #i…

    数据结构和算法 2023年6月8日
    063
  • 动态规划心得总结

    1.1. 常规情况的基本步骤 1.2. 给出递推函数的定义 & 找出递推关系 基本步骤中的第一步、第二步是紧密关联的。递推函数定义的不同会导致递推关系不同,甚至决定了在这种…

    数据结构和算法 2023年6月10日
    068
  • 区间 kth

    本文中的时间复杂度和分数均以实现 P3834 为准。 为了更好地贴合现实,本文代码将更加符合学此算法时的实际情况。 通过选择 / 冒泡 / 插入排序,将区间排序后输出 k 小值。 …

    数据结构和算法 2023年6月12日
    077
  • 快速排序

    题目链接 快速排序板子题,练习快速排序的代码,下面是排序算法的一些对比 快速排序的思路图 快速排序的代码 #include using namespace std; const i…

    数据结构和算法 2023年6月8日
    089
  • C++:制作火把

    时间限制 : 1.000 sec 内存限制 : 128 MB 题目描述: 小红最近在玩一个制作火把的游戏,一开始,小红手里有一根木棍,她希望能够通过这一根木棍通过交易换取制作k个火…

    数据结构和算法 2023年6月8日
    075
  • 题解0015:【模板】最小生成树-uf0_金币灰黄

    题目链接: https://www.luogu.com.cn/problem/P3366 题目描述:给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz &#x3…

    数据结构和算法 2023年6月12日
    081
  • 「赛后总结」20220212模拟赛题解

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/Keven-He/p/15886659.htmlAuth…

    数据结构和算法 2023年6月8日
    084
  • 1291. 顺次数

    我们定义「顺次数」为:每一位上的数字都比前一位上的数字大 1 的整数。 请你返回由 [low, high] 范围内所有顺次数组成的 有序 列表(从小到大排序)。 示例 1: 输出:…

    数据结构和算法 2023年6月8日
    092
  • 题解0012:剪花布条(KMP)-uf0_金币灰黄

    信奥一本通1465 KPM例题 题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1465 题目描述:给出花布条和小饰条(字符…

    数据结构和算法 2023年6月12日
    074
  • G&GH01 注册/安装/设置

    注意事项与声明 平台: Windows 10 作者: JamesNULLiu邮箱: jamesnulliu@outlook.com博客: https://www.cnblogs.c…

    数据结构和算法 2023年6月12日
    095
  • 对Web(Springboot + Vue)实现文件下载功能的改进

    此为 软件开发与创新 课程的作业 对已有项目(非本人)阅读分析 找出软件尚存缺陷 改进其软件做二次开发 整理成一份博客 原项目简介 本篇博客所分析的项目来自于 ジ绯色月下ぎ——vu…

    数据结构和算法 2023年6月12日
    0158
  • Java中比较两个对象

    在Java中比较两个对象我们知道不能使用 ==来进行比较,例如在比较两个字符串时要使用 equals方法来比较。但这里需要注意的是String、Integer等一些包装类已经替我们…

    数据结构和算法 2023年6月8日
    072
  • 将博客搬至CSDN

    本文作者:ztxcsl,使用署名-非商业性使用 4.0 国际进行许可 Original: https://www.cnblogs.com/ztxcsl/p/15880535.htm…

    数据结构和算法 2023年6月12日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球