首页 > 其他分享 >并查集学习笔记

并查集学习笔记

时间:2024-04-06 23:34:28浏览次数:27  
标签:老大 查集 笔记 学习 fa 集合 节点

并查集学习笔记

本质上还是一个复习笔记。

考虑这样一个问题:

  • 给出 \(x,y\) ,合并 \(x,y\) 所在集合。

  • 给出 \(x,y\),查询 \(x,y\) 是否在同一集合内。

我们把集合当成一棵树,两个点有连边就表示他们在同一个集合内。这棵树的根节点就是这个集合的 “老大”,也就是这个集合里面的第一个数。

我们定义 \(fa[x]\) 表示 \(x\) 所在集合的“老大”,初始的时候 \(fa[x]=x\)。

对于第二个操作,问 \(x,y\) 是否在同一集合以内,那么就是我们找到 \(x,y\) 的所在树“老大” 是否相同即可。

找到这个“老大”的方法就是我们对当前节点 \(x\) 不断找 \(fa[x]\),一直到找到一个 \(y\),使得 \(y=fa[y]\) 即可,也就是根节点。

如果要合并两个 \(x,y\) 集合,我们直接把 \(fa[x]=y\) 即可。

但是按照这样的方法,如果这棵树是链的话,每次查询最坏要 \(O(n)\) 的时间。

考虑路径压缩,也就是我在进行查询操作的时候,我在路径上的所有节点的“老大”最终都应该是根节点,所以找到根节点后我们在回溯的时候把这条路径上所有点的 \(fa\) 值都赋值为这个根。

这样可以减少递归次数,下一次查询他的时候就可以直接跳到这个根而不是一层层跳。

这样的时间复杂度近似于 \(O(1)\)。

带权并查集

其实就是在路径合并的时候顺便维护一些题目要求维护的东西。

P1196 [NOI2002] 银河英雄传说

这一类题指向性都比较强,都有“合并”“在同一集合内”这样的标志。

考虑维护这样两个信息:

  • 给出 \(x,y\),表示合并 \(x,y\) 所在集合。
  • 给出 \(x,y\),问 \(x,y\) 之间点的数量。

考虑维护两个东西 \(sum_x\) 表示 \(x\) 到根的距离,\(cnt_x\) 表示 \(x\) 底下的节点个数。

其他的就比较容易想了,具体可以看代码:

\(Code\)

标签:老大,查集,笔记,学习,fa,集合,节点
From: https://www.cnblogs.com/JuneFailue/p/18118186

相关文章

  • Docker学习笔记(三)Dockerfile指令详解
    文章目录FROM指定基础镜像RUN执行命令COPY复制文件ADD高级文件复制CMD容器启动命令ENTRYPOINT入口点ENV设置环境变量ARG构建参数VOLUME定义匿名卷EXPOSE声明端口WORKDIR指定工作目录USER指定当前用户HEALTHCHECK健康检查ONBUILD构建触发器LABEL添加元数据......
  • C语言学习笔记--(2)基础语法
    我先写点,我不太擅长写,所以各位有问题可以评论说,我看到一定改一.C语言编程的格式    我们可以先看一个关于C语言的基础实例下面是一个简单的C语言程序,用于计算购买商品的总价,并根据折扣计算最终支付金额。#include<stdio.h>//计算购买商品的总价floatcalculat......
  • 后端学习记录~~JavaSE篇(day03-流程控制语句-上)
    if...else与Switch...case语句一、表达式和语句表达式:(1)变量或常量+运算符构成的计算表达式(2)new表达式,结果是一个数组或类的对象。(3)方法调用表达式,结果是方法返回值或void(无返回值)。语句:(1)分支语句:if...else,switch...case(2)循环语句:for,while,do...while(3)跳转语句:brea......
  • React 学习之 Hello World
    React学习之HelloWorldReact简介React是一个用于构建用户界面的JavaScript库,由Facebook开发并维护。React通过声明式的方式来构建UI,使得代码更易于理解和测试。React的核心概念包括组件(Component)和虚拟DOM(VirtualDOM)。组件:在React中,UI被构建为组件的集合。组件是封装了HTM......
  • 2-SAT 学习笔记
    2-SAT学习笔记P4782【模板】2-SAT2-SAT问题模型:构造bool变量\(x_1,x_2...x_n\),使得满足一些限制一对\(x_1\)和\(x_2\)取值的条件合法。很显然根据Floyd传递闭包可以做到\(O(n^3+m)\),但不太行。有\(O(n+m)\)的做法,发现对于每个条件是要我们选择一种取值(选择就很......
  • [笔记]数位dp例题及详解(更新中)
    数位dp的定义引自洛谷日报#84:求出在给定区间\([L,R]\)内,符合条件\(f(i)\)的数\(i\)的个数。条件\(f(i)\)一般与数的大小无关,而与数的组成有关。由于是按位dp,数的大小对复杂度的影响很小。由于数位dp状态的上下文信息比较多,所以一般用记忆化搜索实现,而非递推。P4999烦人的数......
  • 第七周后端学习报告
    CJT的学习报告 本周学习及进展 AOPLogback自定义注解 具体进展使用这三个技术栈实现了日志框架日志框架github地址:cjt666-hhh/sosdDemo(github.com)首先使用AOP技术进行解耦,使得日志框架能够灵活配置到多个方法以及接口,后续对于对于日志框架维护成本降低,仅需修......
  • 吴恩达机器学习-第一周
    吴恩达机器学习-第一周学习视频参考b站:吴恩达机器学习本文是参照视频学习的随手笔记,便于后续回顾。机器学习定义Fieldofstudythatgivescomputerstheabilitytolearnwithoutbeingexplicitlyprogrammed.--ArthurSamuel(1959)编译了跳棋程序,程序自己下棋迭代。Que......
  • SpringBoot学习笔记
    SpringBoot一、SpringBoot3介绍1.1SpringBoot3简介课程使用SpringBoot版本:3.0.5https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started.introducing-spring-boot到目前为止,你已经学习了多种配置Spring程序的方式。......
  • 并查集
    并查集的作用检查图中是否存在环并查集的流程设定一个集合,叫并查集往集合里面添加边,怎么添加呢?取边的起点和终点,判断两点是否都在集合里面。如果都在,则出现了环,如果不在,则将两个点放入集合中。继续添加下一条边,直到没有边。如果最后都没有找到环,就是图中不存在环。并......