【算法学习之路】11.并查集

并查集

  • 前言
  • 一.简介
  • 二.基础并查集
  • 三.基础并查集题目
    • 1
    • 2
  • 四.种类并查集(扩展域并查集)
  • 五.种类并查集的题目

前言

我会将一些常用的算法以及对应的题单给写完,形成一套完整的算法体系,以及大量的各个难度的题目,目前算法也写了几篇,题单正在更新,其他的也会陆陆续续的更新,希望大家点赞收藏我会尽快更新的!!!

一.简介

查找两个元素是否在一个(树形)集合中

二.基础并查集

一开始:所有的元素相互独立,每个元素单独成树
给出信息:x,y可以放在同一个集合中分别查找x,y的根节点,把两个树进行合并
查询:a,b看一下a,b是否在同一棵树
对于查找路径的优化:路径压缩
数组模拟树f[i] = x

三.基础并查集题目

1

洛谷P3367 【模板】并查集
在这里插入图片描述

#include <iostream>
using namespace std;
int n, m, z, x, y;
int f[200005];
int find(int k) {if (f[k] == k) {return k;}return f[k] = find(f[k]);//路径压缩
}
int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) {f[i] = i;}for (int i = 1; i <= m; i++) {scanf("%d%d%d", &z, &x, &y);if (z == 1) {f[find(y)] = find(x);}if (z == 2) {if (find(x) == find(y)) {printf("Y\n");}else {printf("N\n");}}}return 0;
}

2

洛谷P1551 亲戚
在这里插入图片描述

#include <iostream>
using namespace std;
int n, m, p, x, y;
int f[5005];
int find(int k) {if (f[k] == k) {return k;}return f[k] = find(f[k]);
}
int main() {scanf("%d%d%d", &n, &m, &p);for (int i = 1; i <= n; i++) {f[i] = i;}for (int i = 0;i < m; i++) {scanf("%d%d", &x, &y);f[find(x)] = find(y);}for (int i = 0; i < p; i++) {scanf("%d%d", &x, &y);if (find(x) == find(y)) {printf("Yes\n");}else {printf("No\n");}}return 0;
}

四.种类并查集(扩展域并查集)

敌人的敌人是朋友
维护对立关系的时候:x,y敌人关系
做两个合并:x与y的假想敌合并
------------------y与x的假想敌合并

并查集能维护连通性、传递性,通俗地说,亲戚的亲戚是亲戚。

然而当我们需要维护一些对立关系,比如 敌人的敌人是朋友 时,正常的并查集就很难满足我们的需求。

这时,种类并查集(扩展域并查集)就诞生了。

常见的做法是将原并查集扩大一倍规模,并划分为两个种类:其中[1,n]表示处于一个种类,[n+1,2n]表示处于另一个种类。

在同个种类的并查集中合并,和原始的并查集没什么区别,仍然表达他们是朋友这个含义。

考虑在不同种类的并查集中合并的意义,其实就表达 他们是敌人 这个含义了。

按照并查集美妙的 传递性,我们就能具体知道某两个元素到底是 敌人 还是 朋友 了。

至于某个元素到底属于两个种类中的哪一个,由于我们不清楚,因此两个种类我们都试试。

五.种类并查集的题目

洛谷P1525 [NOIP 2010 提高组] 关押罪犯
在这里插入图片描述
思路:我们要尽可能让矛盾中值的罪犯在两个监狱里—矛盾值排序。
敌人的敌人就是朋友:两个人a,b有仇,那么把他们放在一起显然会打起来,那么我们把a 与b的其他敌人放在一起。

首先需要并查集初始化
1.先把所有的矛盾关系按照矛盾值从大到小排一遍序,
2.接下来每次操作取出一个关系,看矛盾的两个人x和y是否已经分配到同一个集合中(并查集找父亲即可):

(1)如果在一起那么显然会打起来(会出现矛盾),那么直接输出当前的边权(矛盾值)即可(此时保证是最小矛盾值,因为已经排序了)

(2)如果不在同一组,则按照“敌人的敌人就是朋友”的原则,把x与y的其他敌人分在同一组,y与x的其他敌人分在同一组

不断进行以上操作最终可以得到答案

#include <iostream>
#include <algorithm>
using namespace std;
struct da {int a, b, c;
}d[100005];
int n, m, x, y, z;
int f[40005];
int find(int k) {if (f[k] == k) {return k;}return f[k] = find(f[k]);
}
bool cmp(struct da a, struct da b) {return a.c > b.c;
}
int main() {int ans = 0;scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) {f[i] = i;f[i + n] = i + n;}for (int i = 1; i <= m; i++) {scanf("%d%d%d", &x, &y, &z);d[i].a = x;d[i].b = y;d[i].c = z;}sort(d + 1, d + m + 1, cmp);for (int i = 1; i <= m; i++) {int fa = find(d[i].a);int ffa = find(d[i].a + n);int fb = find(d[i].b);int ffb = find(d[i].b + n);if (fa == fb || ffa == ffb) {ans = d[i].c;break;}else {f[fa] = ffb;f[fb] = ffa;}}printf("%d", ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35201.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微服务】SpringBoot整合LangChain4j 操作AI大模型实战详解

目录 一、前言 二、Langchain4j概述 2.1 Langchain4j 介绍 2.1.1 Langchain4j 是什么 2.1.2 主要特点 2.2 Langchain4j 核心组件介绍 2.3 Langchain4j 核心优势 2.4 Langchain4j 核心应用场景 三、SpringBoot 整合 LangChain4j 组件使用 3.1 前置准备 3.1.1 获取apik…

【图片批量转换合并PDF】多个文件夹的图片以文件夹为单位批量合并成一个PDF,基于wpf的实现方案

项目背景: 多个图片分布在不同文件夹,如何以文件夹为单位批量合并成一个PDF,还要保证文件夹里面图片大小和顺序 实现功能: 1、单张图片的转换PDF:一张图临时转一下 2、多张图片转换成PDF:多张图单独转成PDF 3、多级目录多张图转换成PDF:多级目录多张图单独转成多个PDF…

因果推荐|可解释推荐系统的反事实语言推理

论文&#xff1a;https://arxiv.org/pdf/2503.08051 代码&#xff1a;GitHub - kylokano/CausalX 很新的论文&#xff0c;南大五天前挂到arxiv的&#xff0c;代码基于Recbole&#xff0c;没给全但是提供了足够的验证。 1 动机 可解释推荐不仅提供高质量的推荐&#xff0c;而…

Zabbix安装(保姆级教程)

Zabbix 是一款开源的企业级监控解决方案,能够监控网络的多个参数以及服务器、虚拟机、应用程序、服务、数据库、网站和云的健康状况和完整性。它提供了灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的告警,从而能够快速响应服务器问题。Zabbix 基于存储的数据提供…

【spring boot 实现图片验证码 前后端】

导入hutool依赖 <!--hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.36</version>获取验证码接口 Autowiredprivate Captcha captcha;private final static Long VALIDA…

arthas基础命令

文章目录 1. help2. cat3. grep4. pwd5. cls6. session7. reset8. version9. history10. quit11. stop12. keymapArthas 命令行快捷键后台异步命令相关快捷键小结 1. help 作用&#xff1a;查看命令帮助信息 2. cat 作用&#xff1a;打印文件内容&#xff0c;和linux里的cat命…

痉挛性斜颈护理宝典:重拾生活平衡

痉挛性斜颈会给患者的生活带来诸多不便&#xff0c;有效的健康护理对缓解症状、提升生活质量十分关键。 在日常活动方面&#xff0c;患者应保持正确的姿势。站立和坐姿要挺直脊背&#xff0c;避免长时间低头或歪头&#xff0c;减少颈部肌肉的额外负担。睡眠时&#xff0c;选择高…

虚拟定位 1.2.0.2 | 虚拟定位,上班打卡,校园跑步模拟

Fake Location是一款运行于安卓平台上的功能强大、简单实用的虚拟定位软件。它能够帮助用户自定义位置到地图上的任意地方&#xff0c;以ROOT环境运行不易被检测&#xff0c;同时也支持免ROOT运行。提供路线模拟、步频模拟、WIFI模拟等方式&#xff0c;支持反检测。 大小&…

C++基础 [五] - String的模拟实现

目录 前言 string类的模拟实现 成员函数的实现 构造函数 拷贝构造函数 赋值运算符重载 析构函数 元素访问的实现 operator[ ] Iterator - 迭代器 容量大小的实现 size capacity reserve ​编辑resize 内容修改的实现 push_back append operator(char ch) …

嵌入式硬件--开发工具-AD使用常用操作

ad16.1.12 1.如何显示/隐藏其他图层 在pcb界面点击L--试图界面中找到“视图选项”--单层模式选择 not in single layer mode 在pcb界面点击L--试图界面中找到“视图选项”--单层模式选择 gray scale other layers 【Altium】AD如何只显示一层&#xff0c;隐藏其他层显示&…

浏览器好用的去广告插件和暗黑模式护眼插件

提升浏览体验&#xff1a;Edge浏览器的Adblock和Dark Mode扩展 Adblock&#xff1a;告别广告干扰 功能&#xff1a;高效拦截弹窗、横幅和视频广告&#xff0c;提升网页整洁度&#xff0c;加快加载速度&#xff0c;节省流量。安装链接&#xff1a;安装Adblock Dark Mode for E…

MySQL-基础篇

从数据库的基础的概念特性到数据库当中的SQL语句&#xff0c;再到数据库当中的存储引擎、索引优化以及分库分表、数据库的集群&#xff0c;甚至于数据库的底层原理 MySQL概述SQL函数约束多表查询事务 这块由于上学期学过一些就速过。 MySQL概述 通过SQL就可以操作数据库管理…

fastapi+angular外卖系统

说明&#xff1a; fastapiangular外卖系统 1.美食分类&#xff08;粥&#xff0c;粉&#xff0c;面&#xff0c;炸鸡&#xff0c;炒菜&#xff0c;西餐&#xff0c;奶茶等等&#xff09; 2.商家列表 &#xff08;kfc&#xff0c;兰州拉面&#xff0c;湘菜馆&#xff0c;早餐店…

2025高频面试算法总结篇【递归回溯动态规划】

文章目录 递归&回溯131. 分割回文串面试题 08.12. 八皇后 动态规划72编辑距离5. 最长回文子串279. 完全平方数300. 最长递增子序列139. 单词拆分 递归&回溯 131. 分割回文串 回溯思路&#xff1a; 临界条件&#xff1a; if (start s.length) > 保存 循环遍历这个…

Ubuntu docker安装milvusdb

一、安装docker 1.更新软件包 sudo apt update sudo apt upgrade sudo apt-get install docker-ce docker-ce-cli containerd.io查看是否安装成功 docker -v二、使用国内的镜像下载 milvusdb Docker中国区官方镜像: https://registry.docker-cn.com milvusdb/milvus - Doc…

Redis如何实现持久化

Redis如何实现持久化 Redis默认将所有数据存储在内存中&#xff0c;虽然读写效率极高&#xff0c;但存在两大风险 数据易失性&#xff1a;进程重启或服务器宕机导致内存数据丢失。恢复成本高&#xff1a;无法直接通过内存重建大规模数据集。 Redis作为高性能的键值数据库&…

DeepSeek进阶应用(二):结合Kimi制作PPT(双AI协作教程)

&#x1f31f;引言&#xff1a; DeepSeek作为国产AI大模型&#xff0c;以强大的逻辑推理和结构化内容生成能力著称&#xff0c;擅长根据用户需求生成PPT大纲或Markdown文本&#xff1b;Kimi的PPT助手则能解析结构化内容并套用模板快速生成美观的PPT&#xff0c;两者结合实现“内…

查看分析日志文件、root密码不记得了,那应该怎么解决这些问题

下面我来讲解一下概念以及应该怎么做&#xff1a; 查看分析日志文件 一、主要日志文件 ♣ 内核及系统日志&#xff1a;这种日志数据由系统服务rsyslog统一管理&#xff0c;根据其主配置文件 /etc/rsyslog.conf 中的设置决定将内核消息及各种系统程序信息记录到什么位置。系统中…

mac电脑如何将wps接入deepseek (傻瓜式教学)

我的是mac pro m4 pro版本,版本不同页面或许有些许差异 首先将wps更新到最新的版本,并打开,点击 + 号 新建一个word文档 点击空白文档 点击开发工具,如果没有开发工具,可以先点击工具,在里面找到开发工具,然后点击宏安全性,设置为低,如下图所示

SpringMVC(五)拦截器

目录 拦截器基本概念 一 单个拦截器的执行 1 创建拦截器 2 SpringMVC配置&#xff0c;并指定拦截路径。 3 运行结果展示&#xff1a; 二 多个拦截器的执行顺序 三 拦截器与过滤器的区别 拦截器基本概念 SpringMVC内置拦截器机制&#xff0c;允许在请求被目标方法处理的…