当前位置: 首页 > news >正文

数据结构与算法图论 并查集

前言

写一道并查集的题

判断是否为亲戚

原题目:现在有若干家族图谱关系,给出了一些亲戚关系,如Marrv和Tom是亲戚,Tom和Ben是亲戚等等。从这些信息中,你可以推导出Marry和Ben是亲戚。请写一个程序,对于我们的关于亲戚关系的提问,以最快速度给出答案。

【输入格式】

第一部分是以N.M开始。N为人数(1<=N<=20000).这些人的编号为1.2.3…N。下面有M行(1<=M<=1000000),每行有两个数a.b.表示a和b是亲戚。
第二部分是以Q开始。以下Q行有Q个询问(1<=Q<=1000000),每行为c,d,表示询问c和d是否为亲戚。

【输出格式】

对于询问c,d,输出一行:若c,d为亲戚,则输出"YES",否则输出“NO”。【输入样例】
10 7
2 4
5 7
1 3
8 9
1 2
5 6
2 3
3
3 4
7 10
8 9
【输出样例】
YES
NO
YES

分析

我们可以使用并查集的思想,我们首先初始化将每个元素的父节点初始化为自己,将有关系的两个元素进行合并,然后判断是否有关系我们只需要查看元素a和元素b的祖先是否为同一个即可,如果是则是亲戚关系

并查集

并查集(Union-Find Set)是一种数据结构,用于处理一些不交集的合并及查询问题。

它主要支持两个操作:
查找(Find):确定某个元素属于哪个集合。这个操作通常涉及到路径压缩,以提高效率。
合并(Union):将两个集合合并成一个集合。为了保持结构的平衡,通常使用按秩合并或按大小合并的方法。
并查集的应用场景包括:
网络连接:确定两个节点是否在同一网络中。
图的连通性:检查图中的不同连通组件。
集合划分:在动态连接的场景中处理不同的集合划分。
在这里插入图片描述

代码如下:

#include <bits/stdc++.h>
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define LL __int128
const int N = 2e5 + 10; // 最大节点数
const int M = 1e3 + 10; // 最大边数(在本代码中不直接使用)
int a[N], p[N]; // p 数组用于存储并查集的父节点using namespace std; // 查找操作,使用路径压缩
int find(int x) {if (p[x] != x) {// 如果 p[x] 不是 x 本身,则递归查找父节点,并进行路径压缩return p[x] = find(p[x]);}return p[x]; // 返回根节点
}signed main() {std::ios::sync_with_stdio(false);std::cin.tie(NULL);int n, m, x, y, q;cin >> n >> m; // 读入节点数 n 和边数 m// 初始化并查集,每个节点的父节点初始化为自身for (int i = 1; i <= n; ++i) {p[i] = i;}// 处理 m 条边for (int i = 1; i <= m; i++) {cin >> x >> y; // 读入边 (x, y)// 合并操作:将 x 和 y 所在的集合合并// 将 x 的根节点的父节点设置为 y 的根节点p[find(x)] = find(y);}cin >> q; // 读入查询数 q// 处理 q 条查询for (int i = 1; i <= q; i++) {cin >> x >> y; // 读入查询对 (x, y)// 查询 x 和 y 是否在同一个集合中if (find(x) == find(y)) {cout << "YES" << endl; // 如果 x 和 y 在同一个集合中,输出 YES} else {cout << "NO" << endl; // 否则,输出 NO}}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【c++】类和对象详解
  • 智能优化算法-鼠群优化算法(RSO)(附源码)
  • Vue 获取参数
  • (20)docke容器
  • JDK22一些新特性
  • 空间数据库概述
  • JS获取URL参数的几种方法
  • swift:qwen2 VL 多模态图文模型lora微调swift
  • 在ros中进行无人机和无人车之间的通信(代码)
  • iframe详解和用途解读
  • WiFi性能测试是评估无线网络性能的重要环节,它涵盖了多个方面的指标,如信号强度、网络速度、延迟时间等。
  • C语言从头学55——学习头文件errno.h、float.h
  • 构建Vue项目的侧边栏组件:Aside
  • 【Windows系统工具】dll综合解决工具,解锁专业版功能!
  • docker的网络模式
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 2017-09-12 前端日报
  • 2017前端实习生面试总结
  • 5、React组件事件详解
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Create React App 使用
  • es6(二):字符串的扩展
  • Javascript弹出层-初探
  • Mocha测试初探
  • 缓存与缓冲
  • 记一次和乔布斯合作最难忘的经历
  • 检测对象或数组
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 删除表内多余的重复数据
  • 通过几道题目学习二叉搜索树
  • 小程序开发之路(一)
  • 终端用户监控:真实用户监控还是模拟监控?
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 阿里云服务器如何修改远程端口?
  • ​iOS实时查看App运行日志
  • ​zookeeper集群配置与启动
  • ​什么是bug?bug的源头在哪里?
  • #### go map 底层结构 ####
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (06)金属布线——为半导体注入生命的连接
  • (1)Jupyter Notebook 下载及安装
  • (C++20) consteval立即函数
  • (libusb) usb口自动刷新
  • (回溯) LeetCode 77. 组合
  • (力扣)1314.矩阵区域和
  • (十六)一篇文章学会Java的常用API
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (五)MySQL的备份及恢复
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转载)深入super,看Python如何解决钻石继承难题
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .net wcf memory gates checking failed
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .Net的DataSet直接与SQL2005交互