【七十九】【算法分析与设计】并查集模板!!!并查集的实现_牛客题霸_牛客网,【模板】并查集 - 洛谷,并查集代码!!!

并查集的实现_牛客题霸_牛客网

描述

给定一个没有重复值的整形数组arr,初始时认为arr中每一个数各自都是一个单独的集合。请设计一种叫UnionFind的结构,并提供以下两个操作。

boolean isSameSet(int a, int b): 查询a和b这两个数是否属于一个集合

void union(int a, int b): 把a所在的集合与b所在的集合合并在一起,原本两个集合各自的元素以后都算作同一个集合

[要求]

如果调用isSameSet和union的总次数逼近或超过O(N),请做到单次调用isSameSet或union方法的平均时间复杂度为O(1)

输入描述:

第一行两个整数N, M。分别表示数组大小、操作次数 接下来M行,每行有一个整数opt 若opt = 1,后面有两个数x, y,表示查询(x, y)这两个数是否属于同一个集合 若opt = 2,后面有两个数x, y,表示把x, y所在的集合合并在一起

输出描述:

对于每个opt = 1的操作,若为真则输出"Yes",否则输出"No"

示例1

输入:

4 5 1 1 2 2 2 3 2 1 3 1 1 1 1 2 3

复制

输出:

No Yes Yes

复制

说明:

每次2操作后的集合为 ({1}, {2}, {3}, {4}) ({1}, {2, 3}, {4}) ({1, 2, 3}, {4})

备注:

1 \leqslant N, M \leqslant 10^61⩽N,M⩽106

保证1 \leqslant x, y \leqslant N保证1⩽x,yN

1.

递归转化为迭代,_find的递归写法转化为迭代的写法.

递归的出口是father[i]==i,所以while循环的入口在递归的出口条件前面加上一个!取反.

递归的进入下一层本来是_find(father[i]).转化为迭代就是i=father[i].

中间清理栈的迭代过程也可以想象成是递归的过程.

 
#include<bits/stdc++.h> // 引入常用的头文件
#define int long long // 定义int为长整型,以支持大数据量的处理
#define endl '\n' // 定义换行符为'\n',增加输出速度
#define p pair< long long, long long> // 定义pair类型的别名p,用于存储两个长整型的数值using namespace std; // 使用标准命名空间const int dx[] = { 1, -1, 0, 0 }; // 定义数组dx,用于某些方向操作,此处可能未使用
const int dy[] = { 0, 0, 1, -1 }; // 定义数组dy,用于某些方向操作,此处可能未使用// 全局变量定义区域
int n, m; // n表示数组大小,m表示操作次数
int op, nums1, nums2; // op操作类型,nums1和nums2操作数vector<int> father; // 并查集数组,存储每个元素的父节点
vector<int> _stack; // 辅助栈,用于路径压缩int _find(int i) { // 并查集查找操作,带路径压缩while (!(father[i] == i)) { // 如果i不是自己的父节点,进行路径压缩i = father[i];_stack.push_back(i); // 将当前节点添加到栈中}while (_stack.size()) { // 当栈不为空时,进行路径压缩father[_stack.back()] = i; // 将栈中的每个元素的父节点设置为根节点i_stack.pop_back(); // 弹出栈顶元素}return i; // 返回根节点
}int isSameSet(int x, int y) { // 检查两个元素是否属于同一个集合return _find(x) == _find(y); // 通过查找根节点来判断
}void _union(int x, int y) { // 并查集合并操作if (_find(x) == _find(y)) { // 如果x和y已经属于同一个集合,则不操作return;} else {father[_find(x)] = _find(y); // 将x的根节点的父节点设置为y的根节点,完成合并}
}void init() { // 读取操作和操作数cin >> op >> nums1 >> nums2;
}void solveinit() { // 初始化解决方案,此处未使用
}void solve() { // 根据操作类型执行相应的并查集操作solveinit();if (op == 1) { // 如果是查询操作if (isSameSet(nums1, nums2))cout << "Yes" << endl; // 如果属于同一个集合,输出"Yes"else cout << "No" << endl; // 否则输出"No"} else { // 如果是合并操作_union(nums1, nums2); // 合并nums1和nums2所在的集合}
}signed main() { // 主函数ios::sync_with_stdio(false); // 禁用C和C++的同步,加速cin和coutcin.tie(nullptr); // 解除cin和cout的绑定cout.tie(nullptr);cout << fixed << setprecision(15); // 设置浮点数输出的精度cin >> n >> m; // 读入数组大小和操作次数father.assign(n + 1, 0); // 初始化father数组,大小为n+1for (int i = 0; i <= n; i++) { // 将每个元素的父节点初始化为自己father[i] = i;}while (m--) { // 读取m个操作并执行init();solve();}
}

【模板】并查集 - 洛谷

【模板】并查集

题目描述

如题,现在有一个并查集,你需要完成合并和查询操作。

输入格式

第一行包含两个整数 $$N,$$ ,表示共有 $$$$ 个元素和 $$$$ 个操作。

接下来 $$$$ 行,每行包含三个整数 $$Z_i,X_i,Y_$$ 。

当 $$Z_i=$$ 时,将 $$X_$$ 与 $$Y_$$ 所在的集合合并。

当 $$Z_i=$$ 时,输出 $$X_$$ 与 $$Y_$$ 是否在同一集合内,是的输出

Y ;否则输出 N

输出格式

对于每一个 $$Z_i=$$ 的操作,都有一行输出,每行包含一个大写字母,为 Y 或者 N

样例 #1

样例输入 #1

4 7 2 1 2 1 1 2 2 1 2 1 3 4 2 1 4 1 2 3 2 1 4

样例输出 #1

N Y N Y

提示

对于 $$30\$$ 的数据,$N \le 10$,$M \le 20$。

对于 $$70\$$ 的数据,$N \le 100$,$M \le 10^3$。

对于 $$100\$$ 的数据,$1\le N \le 10^4$,$1\le M \le 2\times 10^5$,$1 \le X_i, Y_i \le N$,$Z_i \in \{ 1, 2 \}$。

 
#include<bits/stdc++.h> // 引入常用的头文件
#define int long long // 定义int为长整型,适用于处理大数据
#define endl '\n' // 定义结束符为'\n',优化输出效率
#define p pair<long long, long long> // 定义pair的别名p,用于存储长整型的键值对using namespace std;const int dx[] = {1, -1, 0, 0}; // 方向数组,可能用于处理四方向问题,本代码未用到
const int dy[] = {0, 0, 1, -1}; // 方向数组,可能用于处理四方向问题,本代码未用到
//----------------------------------------------------int n, m; // n是元素数量,m是操作次数
int op, nums1, nums2; // op是操作类型,nums1和nums2是操作的元素vector<int> father; // 并查集的父节点数组
vector<int> _st; // 辅助栈,用于路径压缩int _find(int i) { // 查找根节点,并应用路径压缩while (!(father[i] == i)) { // 如果节点i不是自己的父节点,继续向上查找_st.push_back(i); // 将当前节点加入栈中i = father[i]; // 移动到父节点}while (_st.size()) { // 路径压缩,将路径上的所有节点直接连接到根节点father[_st.back()] = i;_st.pop_back();}return i; // 返回根节点
}bool isSameSet(int x, int y) { // 判断两个元素是否在同一集合中return _find(x) == _find(y);
}void _union(int x, int y) { // 合并两个集合if (_find(x) == _find(y)) { // 如果已经在同一集合中,则无需合并return;} else {father[_find(x)] = _find(y); // 否则,将一个集合的根节点指向另一个集合的根节点}
}// 初始化函数,读取输入并初始化并查集
void init() {cin >> n >> m;father.assign(n + 1, 0); // 分配并初始化并查集数组for (int i = 0; i <= n; i++) {father[i] = i; // 初始化时,每个元素的父节点是自己}
}// 根据操作类型执行相应的并查集操作
void solve() {if (op == 1) { // 如果是合并操作_union(nums1, nums2);} else { // 如果是查询操作if (isSameSet(nums1, nums2)) cout << "Y" << endl; // 如果在同一集合,输出Yelse cout << "N" << endl; // 否则输出N}
}signed main() {ios::sync_with_stdio(false); // 提高cin和cout的效率cin.tie(nullptr); // 解绑cin和coutcout.tie(nullptr);cout << fixed << setprecision(15); // 设置浮点数精度//----------------------------------------------init(); // 初始化while (m--) { // 处理每个操作cin >> op >> nums1 >> nums2;solve();}
}

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Android 启动提示Android 正在升级...提示源码分析

正常情况下烧录的新机会有这个提示&#xff0c;因为系统启动时候要对系统APP做DexOpt优化&#xff0c;流程如下&#xff1a; 进入performBootDexOpt函数&#xff1a; 提示框代码如下&#xff1a; 而提示框的Tile和Msg如下&#xff1a; 打印Log&#xff1a; 觉得本文对…

炫酷Chrome:插件大礼包

Chrome浏览器以其强大的功能和丰富的扩展插件库而闻名。 其中&#xff0c;有些插件专为提升用户的浏览体验而设计&#xff0c;例如更换Chrome网页背景图、自定义鼠标点击样式&#xff0c;以及提供便捷的页面跳转工具等。 最近&#xff0c;有一款被称为“宝藏插件包”的工具引…

AI图书推荐:Zapier和AI融合来自动化业务流程

这本书《Zapier和AI融合来自动化业务流程》&#xff08;Automate It with Zapier and Generative AI&#xff09;由Kelly Goss撰写&#xff0c;这本书是为想要使用Zapier和AI集成功能来自动化重复性任务、提高生产力的微型、小型或中型企业的业务所有者、运营经理和团队准备的。…

字节跳动(社招)四面算法原题

TikTok 进展 又是一期定时汇报 TikTok 进展的推文。 上周&#xff0c;美国总统拜登签署了价值 950 亿美元的一揽子对外援助法案。 该法案涉及强制字节跳动剥离旗下应用 TikTok 美国业务&#xff0c;即 针对 TikTok 非卖即禁的"强抢行为"开始进入九个月&#xff08;27…

某云eHR PtFjk.mob 任意文件上传漏洞复现

0x01 产品简介 某云eHR是大中型企业广泛采用人力资源管理系统。红海云是国内顶尖的HR软件供应商,是新一代eHR系统的领导者。 0x02 漏洞概述 某云EHR系统PtFjk.mob接口处存在未授权文件上传漏洞,攻击者可上传webshell来命令执行,获取服务器权限。 0x03 复现环境 FOFA:b…

大模型市场爆发式增长,但生成式AI成功的关键是什么?

进入2024年&#xff0c;大模型市场正在爆发式增长。根据相关媒体的总结&#xff0c;2024年1-4 月被统计到的大模型相关中标金额已经达到2023年全部中标项目披露金额的77%左右&#xff1b;其中&#xff0c;从项目数量来看&#xff0c;应用类占63%、算力类占21%、大模型类占13%、…

交换机端口隔离

拓扑图 配置 port-isolate mode命令用来配置端口隔离模式。 缺省情况下&#xff0c;端口隔离模式为二层隔离三层互通。 端口隔离包括双向隔离和单向隔离。接口的单向隔离是指若在接口A上配置它与接口B隔离&#xff0c;则从接口A发送的报文不能到达接口B&#xff0c;但从接口…

MATLAB画图,重磅教程MATLAB的美图及强大的绘图功能|

目录 1.plot() 函数&#xff1a; 2.scatter() 函数&#xff1a; 3.histogram() 函数&#xff1a; 4.bar() 函数&#xff1a; 5.plot3() 函数&#xff1a; 6.imshow() 函数&#xff1a; 7.surf() 函数&#xff1a; 福利&#xff1a;免费送资料 MATLAB&#xff08;Matrix…

【基于 PyTorch 的 Python深度学习】5 机器学习基础(1)

前言 文章性质&#xff1a;学习笔记 &#x1f4d6; 学习资料&#xff1a;吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2 主要内容&#xff1a;根据学习资料撰写的学习笔记&#xff0c;该篇主要介绍了机器学习的基本任务、机器学习的一般流程&…

第七章 TypeScript函数的介绍和使用

函数&#xff0c;一个再熟悉不过的话题了&#xff0c;之前几章里面我们也多次提到过&#xff0c;而且提到过各种各样的 TS 内和函数相关的内容今天&#xff0c;咱们来详细说一下函数内的各种详细内容的使用 文章目录 一、函数的可选参数二、函数内的虚拟 this三、函数的重载 一…

DInet

&#xff08;1&#xff09;数据&#xff1a; 1&#xff09;&#xff1a;随机获取5帧参考帧 2&#xff09;&#xff1a;处理这5帧连续帧&#xff0c;:source_frames:连续5帧的crop_moth b)audio_list:连续5帧的每一帧对应的5帧音频mel特征 c):refs:fintune 固定参考帧&#xff0…

懒洋洋作业讲解

懒洋洋作业讲解 环境配置 1.软件下载&#xff1a;DCloud - HBuilder、HBuilderX、uni-app、uniapp、5、5plus、mui、wap2app、流应用、HTML5、小程序开发、跨平台App、多端框架 2.软件介绍 HBuilder是由DCloud&#xff08;数字天堂&#xff09;推出的一款面向HTML5的Web开发…

【ArcGISPro】后台选项卡详解

添加后台选项卡 添加后的界面 文件变化 Config.daml修改内容对应文件详情 Classname就是我们在点击控件后具体执行的内容 BackstageTab1ViewModel与BackstageTab1 BackstageTabButton 1 执行效果 执行代码 读者直接往OnClick中添加执行的代码即可 尝试修改 代码 效果 Backs…

Java性能优化(一):Java基础-ArrayList和LinkedList

引言 集合作为一种存储数据的容器&#xff0c;是我们日常开发中使用最频繁的对象类型之一。JDK为开发者提供了一系列的集合类型&#xff0c;这些集合类型使用不同的数据结构来实现。因此&#xff0c;不同的集合类型&#xff0c;使用场景也不同。 很多同学在面试的时候&#x…

打破次元壁!Stable Diffusion将现实影像转成二次元动画,推特转赞10k+,网友:都可以重做《神奇宝贝》动漫了

破次元壁计划已启动&#xff01; 就在最近&#xff0c;有网友分享了一个用Stable Diffusion打造二次元动画的工具&#xff0c;直接在网上爆火。 先快来看一波效果。 万物皆可妙化为二次元&#xff0c;耳机也可蜕变成小兔兔&#xff1a; 瞧&#xff01;连易拉罐的拉环也化身成…

考研管理类联考(专业代码199)数学基础【3】函数、方程、不等式

一、函数 1.一次函数 y kx b(k≠0) 的图象及性质 2.二次函数y ax^2 bx c的图象和性质 3.指数函数y a^x &#xff08; a&#xff1e;0&#xff0c;且a≠1&#xff09;的图象和性质 4.对数函数y logₐx ( a&#xff1e;0&#xff0c;且a≠1)的图象与性质 二、方程 1.一元…

开抖音小店需要交多少保证金?全类目选择,一篇了解

哈喽~我是电商月月 做抖音小店前大家都会搜索“入驻抖音小店需要准备什么东西&#xff1f;”其中就包含了一项&#xff1a;类目保证金的缴纳 那到底要交多少钱&#xff1f;很多新手朋友还是不太了解 今天我就给大家解答这个问题&#xff0c;首先&#xff0c;我们要知道抖店的…

Mybatis 源码分析

《黑马架构师_源码系列-主流框架&中间件》-- MyBatis &#xff08;讲师&#xff1a;子慕&#xff09; * 手写持久层框架-仿写mybatis * Mybatis架构设计&主要组件 * Mybatis如何完成的初始化? * Mybatis如何完成的sql解析及执行? * Mybatis如何设置的参数? * Mybat…

List的两种实现

前置知识&#xff1a; 数组 baseAddress&#xff1a;数组的首地址 dataTypeSize&#xff1a;数组中元素类型的大小&#xff0c;如int为4字节 为什么数组索引从0开始&#xff0c;假如从1开始不行吗&#xff1f; 在根据数组索引获取元素的时候&#xff0c;会用索引和寻址公式来计…

网络安全之DHCP详解

DHCP&#xff1a;Dynamic Host Configration Protocol 动态主机配置协议 某一协议的数据是基于UDP封装的&#xff0c;当它想确保自己的可靠性时&#xff0c;这个协议要么选确认重传机制&#xff0c;要么选周期性传输。 DHCP是确认重传&#xff0c;【UDP|DHCP】,当DHCP分配完地…