《洛谷深入浅出基础篇》P1551亲戚——集合——并查集P1551亲戚

news2025/2/25 20:28:07

上链接:P1551 亲戚 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1551

上题干: 

题目背景

若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。

题目描述

规定:x 和 y 是亲戚,y 和 z 是亲戚,那么 x 和 z 也是亲戚。如果x,y 是亲戚,那么 �x 的亲戚都是 y 的亲戚,y 的亲戚也都是 x 的亲戚。

输入格式

第一行:三个整数 n,m,p,(n,m,p≤5000),分别表示有 n 个人,m 个亲戚关系,询问 p 对亲戚关系。

以下 m 行:每行两个数 Mi​,Mj​,1≤Mi​, Mj​≤n,表示 Mi​ 和 Mj​ 具有亲戚关系。

接下来 p 行:每行两个数 Pi​,Pj​,询问 Pi​ 和 Pj​ 是否具有亲戚关系。

输出格式

p 行,每行一个 Yes 或 No。表示第 i 个询问的答案为“具有”或“不具有”亲戚关系。

输入输出样例

输入 #1复制

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

输出 #1复制

Yes
Yes
No

 我们拿样例来模拟一下:

一共有6给予5个亲戚关系进行3次查找
亲戚关系:12
15
34
52
13
查询是否具有亲戚关系14
23
56

由于题目说了,如果x,y是亲戚,那么x的亲戚就是y的亲戚,y的亲戚就是x的亲戚

所以我们把互相为亲戚的人放入一个集合中

当我们需要查询任意两个人是否为亲戚关系的时候,我们就可以查询这两个人是否在同一个集合中

那么如何判断这两个人是否在一个集合之中呢?

我们给这个集合创造一个特性,并且集合里面的人都满足这个特性,所以我们只需要判断要查询的人是否满足这种特性,就可以知道他们是不是在同一个集合里面。

这个特性就是祖先关系。

当一群人的祖先是同一个人的时候,这群人互相是亲戚。

首先,并查集的初始化:

将每个人初始化为自己家族的祖先:(我是我爹)

fa[i]=i;、

合并:

然后我们会循环输入亲戚关系

比如样例中的,先输入 1   2 , 代表这两个人是亲戚

所以我们需要将 1 , 2 的家族合并,使得他们的祖先为同一个人,可以为1,也可以为2.

fa[fa[1]]=fa[2];

代表将家族1的祖先 并入家族2中当族人

第二次输入  1  5  

我们操作的目的是:代表将家族1的祖先 并入家族5中当族人

而家族1的祖先是2,说明2是家族5中的族人,说明,1,2被并入5了。

即:

fa[fa[1]] = fa[5]

第三次输入  3  4

同理,将家族3的祖先并入家族4中当族人

fa[fa[3]]=fa[4]

第四次输入  5 2

我们发现家族5的祖先是5,家族2的祖先是2,所以不需要合并

第五次输入:1,3

将家族1的祖先并入家族3

fa[fa[1]]=fa[3]

即将5并入家族3当族人

那么模拟完了之后,我们可以得到如下的关系

家族a1,2,3,4,5(加粗的为祖先)
家族b6

进行完这些操作之后,我们创建完了一个并查集,就可以查询元素是否属于某个集合了。

上代码:

const int N = 5e3 + 10;
int fa[N];
int find1(int x)
{
	if (fa[x]==x)return fa[x]; //如果家族x的祖先是x,返回祖先
	else return fa[x] = find1(fa[x]);//如果不是,查找 (家族x的祖先)(假设是家族y)是不是其家族(家族y)的祖先
}//不断递归,最终返回的是 x 的祖先
void join1(int c1, int c2)
{
	int f1 = find1(c1), f2 = find1(c2);//找到c1,c2的祖先f1,f2
	if (f1 != f2)fa[f1] = f2;//如果不是同一个人,那么将家族f1并入家族f2
}
int main()
{
	int n, m, p;
	cin >> n >> m >> p;
	for (int i = 1; i <= n; i++)fa[i] = i;//初始化父节点
	for (int i = 1; i <= m; i++)
	{
		int x, y;
		cin >> x >> y;
		join1(x, y);
	}
	for (int i = 1; i <= p; i++)
	{
		int x, y;
		cin >> x >> y;
		find1(x) == find1(y) ? cout << "Yes" << endl : cout << "No"<<endl;
	}
}

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

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

相关文章

LINMP搭建wordpress-数据库不分离

目录 一、nginx部署 1.安装nginx前的系统依赖环境检查 2.下载nginx源代码包 3.解压缩源码包 4.创建普通的nginx用户 5.开始编译安装nginx服务 6.创建一个软连接以供集中管理 7.配置nginx环境变量 二、mysql 1.创建普通mysql用户 2.下载mysql二进制代码包 3.创建mys…

windows的远程桌面服务RDS存在弱加密证书的漏洞处理

背景 漏洞扫描检测windows服务器的远程桌面服务使用了弱加密的ssl证书 思路 按照报告描述&#xff0c;试图使用强加密的新证书更换默认证书 解决 生成证书 通过openssl1.1.1生成&#xff08;linux自带openssl&#xff0c;windows安装的是openssl1.1.1w&#xff09;&#x…

基于Vue+SpringBoot的农村物流配送系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理&#xff1a;2.2.2 位置信息管理&#xff1a;2.2.3 配送人员分配&#xff1a;2.2.4 路线规划&#xff1a;2.2.5 个人中心&#xff1a;2.2.6 退换快递处理&#xff1a;…

智能电网短路故障接地故障模拟柜

智能电网短路故障接地故障模拟柜是一种用于模拟智能电网中短路故障和接地故障的设备&#xff0c;它可以模拟电网中的各种故障情况&#xff0c;帮助电力工程师进行故障诊断和维修。智能电网中的短路故障是指电路中出现了异常的电流路径&#xff0c;导致电流过大&#xff0c;可能…

利用ffmpeg实现rtmp和rtsp推流

环境说明 windows11 : ffmpeg VLC Linux Unbuntu20.04 : SRS MediaMTX 可选&#xff1a;GStreamer win11下载ffmpeg和ffplay ffmpeg官网 添加环境变量&#xff1a;添加ffmpeg/bin所在的路径。 D:\ffmpeg\ffmpeg-master-latest-win64-lgpl-shared\bin win11查看本机电脑的设备…

基于单片机的水位检测系统仿真设计

**单片机设计介绍&#xff0c; 基于单片机的水位检测系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的水位检测系统仿真系统是一种用于模拟水位检测系统的工作过程&#xff0c;以验证设计方案的可行性和优…

赢麻了……腾讯1面核心9问,小伙伴过了提42W offer

说在前面 在40岁老架构师尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常有小伙伴&#xff0c;需要面试腾讯、美团、京东、阿里、 百度、头条等大厂。 下面是一个小伙伴成功拿到通过了腾讯面试&#xff0c;并且最终拿到offer&#xff0c;一毕业就年薪42W&#x…

UniApp中的数据存储与获取指南

目录 介绍 数据存储方案 1. 本地存储 2. 数据库存储 3. 网络存储 实战演练 1. 本地存储实例 2. 数据库存储实例 3. 网络存储实例 注意事项与最佳实践 结语 介绍 在移动应用开发中&#xff0c;数据的存储和获取是至关重要的一部分。UniApp作为一款跨平台应用开发框架…

C++入门(2)—函数重载、引用

目录 一、函数重载 1、参数类型不同 2、参数个数不同 3、参数顺序不同 4、 链接中如何区分函数重载 二、引用 1、规则 2、特征 3、使用场景 做参数 做返回值 4、常引用 5、传值、传引用效率比较 6、引用和指针的区别 接上一小节C入门(1)—命名空间、缺省参数 一…

Nutz框架如何自定义SQL?

Nutz框架基本的简单sql已经封装了&#xff0c;但是一些叫为复杂的sql需要手动去写&#xff0c;那如何实现像Mybatis那样通过配置文件编写呢&#xff1f;如有不明白详见官方文档&#xff1a;自定义 SQL - Nutzhttps://nutzam.com/core/dao/customized_sql.html#ndoc-4 一 新建…

Navicat for mysql 无法连接到虚拟机的linux系统下的mysql

原创/朱季谦 最近在linux Centos7版本的虚拟机上安装了一个MySql数据库&#xff0c;发现本地可以正常ping通虚拟机&#xff0c;但Navicat则无法正常连接到虚拟机里的MySql数据库&#xff0c;经过一番琢磨&#xff0c;发现解决这个问题的方式&#xff0c;很简单&#xff0c;总共…

CTFhub-RCE-过滤cat

查看当前目录&#xff1a;输入:127.0.0.1|ls 127.0.0.1|cat flag_42211411527984.php 无输出内容 使用单引号绕过 127.0.0.1|cat flag_42211411527984.php|base 64 使用双引号绕过 127.0.0.1|c""at flag_42211411527984.php|base64 使用特殊变量绕过 127.0.0.…

2016Outlook显示正在启动无法进入Outlook

2016Outlook显示正在启动无法进入Outlook 故障现象&#xff1a; 因上次非正常关闭&#xff0c;导致Outlook启动时&#xff0c;一直处于启动界面&#xff0c;无法进入主界面正常工作 故障截图&#xff1a; 故障原因&#xff1a; 数据文件异常导致 解决方案&#xff1a; 1、关…

asp.net core mvc 之 依赖注入

一、视图中使用依赖注入 1、core目录下添加 LogHelperService.cs 类 public class LogHelperService{public void Add(){}public string Read(){return "日志读取";}} 2、Startup.cs 文件中 注入依赖注入 3、Views目录中 _ViewImports.cshtml 添加引用 4、视图使用…

HTML5+CSS3小实例:悬停放大图片的旅游画廊

实例:悬停放大图片的旅游画廊 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&…

【linux】nmon 工具使用

nmon 介绍 nmon是奈杰尔的性能监视器的缩写&#xff0c;适用于POWER、x86、x86_64、Mainframe和现在的ARM&#xff08;Raspberry Pi&#xff09;上的Linux。同样适用于nmon for AIX的工具&#xff08;与IBM的AIX一起提供&#xff09;。njmon与之类似&#xff0c;但将数据保存为…

波束形成中的主瓣宽度

阵列信号处理相关基础知识及主瓣宽度 导向矢量阵列方向图确知波束形成普通波束形成主瓣宽度确知波束形成主瓣宽度普通波束形成主瓣宽度 在讨论主瓣宽度之前&#xff0c;首先得了解导向矢量、波束形成、阵列方向图的概念&#xff0c;这些是阵列信号处理中最基础的知识。 导向矢量…

【LeetCode刷题-滑动窗口】--1423.可获得的最大点数

1423.可获得的最大点数 思路&#xff1a; 数组cardPoints的长度为n&#xff0c;由于只能从开头和末尾拿k张卡牌&#xff0c;所以最后剩下的必然是连续的n-k张卡牌&#xff0c;可以通过求出剩余卡牌点数之和的最小值&#xff0c;来求出拿走卡牌点数之和的最大值 算法&#xff…

centos7升级python2到python3.6.8使用yum安装问题

背景 公司爬虫需要使用python3.6.8版本&#xff0c;因此升级centos的python2到python3.6.8。但是当使用yum安装包时 &#xff0c;出现如下异常&#xff1a; [rootlocalhost bin]# yum install npm -y Loaded plugins: fastestmirror, product-id, search-disabled-repos, sub…