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

news2024/9/25 11:12:23

前言

写一道并查集的题

判断是否为亲戚

原题目:现在有若干家族图谱关系,给出了一些亲戚关系,如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;
}

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

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

相关文章

一文读懂在线学习凸优化技术

一文读懂在线学习凸优化技术 在当今的数据驱动时代&#xff0c;机器学习算法已成为解决复杂问题的关键工具。在线学习凸优化作为机器学习中的一项核心技术&#xff0c;不仅在理论研究上具有重要意义&#xff0c;还在实际应用中展现出巨大的潜力。本文将深入浅出地介绍在线学习…

C++(三)----内存管理

1.C/C内存分布 看下面这个问题&#xff08;考考你们之前学的咋样&#xff09;&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] {1, 2, 3, 4};char char2[] "abcd";char* pCh…

【leetcode C++】 动态规划

4. 91 解码方法 题目&#xff1a; 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; "1" -> A "2" -> B ... "25" -> Y "26" -> Z 然而&#xff0c;在 解码 已编码的消息时&#xff0c;你意识到有许多不同的…

数据湖-方案对比

数据湖架构结合了数据湖和数据仓库。虽然它不仅仅是两者之间的简单集成&#xff0c;但其理念是充分发挥两种架构的优势&#xff1a;数据仓库的可靠交易以及数据湖的可扩展性和低成本。 Lakehouse 架构支持管理各种数据类型&#xff0c;例如结构化、半结构化和非结构化数据&…

巧用工具,Vue 集成 medium-zoom 实现图片缩放

文章目录 巧用工具&#xff0c;Vue 集成 medium-zoom 实现图片缩放介绍medium-zoomVue3集成 medium-zoom 示例Vue2集成 medium-zoom 示例进阶 - 可选参数 巧用工具&#xff0c;Vue 集成 medium-zoom 实现图片缩放 在现代网页开发中&#xff0c;为用户提供良好的视觉体验至关重…

爬虫逆向学习(六):补环境过某数四代

声明&#xff1a;本篇文章内容是整理并分享在学习网上各位大佬的优秀知识后的实战与踩坑记录 引用博客&#xff1a; https://blog.csdn.net/shayuchaor/article/details/103629294 https://blog.csdn.net/qq_36291294/article/details/127699273 https://blog.csdn.net/weixin_…

vivo手机已删除的短信还能恢复吗?

虽然现在我们很少使用vivo手机的短信功能&#xff0c;但是我们偶尔还会通过vivo手机短信功能接收一些重要的信息。如果我们在清理垃圾短信的时候误删了vivo手机重要短信&#xff0c;该怎么恢复呢&#xff1f; 方法一&#xff1a;通过vivo云服务恢复 1、确保您已开启vivo云服务…

Go常用正则函数整理

前言 在Go语言中&#xff0c;标准库regexp提供了丰富的API来处理正则表达式&#xff0c;支持编译、匹配、查找、替换等操作。以下是一个Go标准库正则函数的常用大全教程及部分使用示例。 Go标准库常用正则函数 Compile&#xff1a;编译正则表达式&#xff0c;返回一个可用于…

Qt 构建报错 undefined reference to xxx

初次学习使用Qt&#xff0c;在构建时报错。这是个典型报错&#xff0c;熟练vs与c的朋友一眼就可以看出要么是库出问题了&#xff0c;要么是库链接出问题了。那么就可以按照相对明确的方向找问题。 1、确认库与项目配置是否一致。32位还是64位&#xff0c;debug还是release一定…

如何逆转Instagram账号流量减少?4个实用技巧分享

Instagram作为全球十大社媒之一&#xff0c;不仅是个人分享生活的平台&#xff0c;还是跨境卖家进行宣传推广和客户开发的关键工具。在运营Instagram的过程中&#xff0c;稍有不慎就容易出现账号被限流的情况&#xff0c;对于账号状态和运营工作的进行都十分不利。 一、如何判断…

new String(),toString()和Arrays.toString()的区别

下面写了一段代码来展示结果 import javax.sound.midi.Soundbank; import java.util.Arrays; import java.util.Scanner;public class Main {public static void main(String[] args) {String str "abc";System.out.println("str:"str);char[] chars st…

若楠带你初识OpenCV(7) -- 轮廓检测之银行卡号识别

文章目录 银行卡号识别详细流程一、设置参数二、函数准备三、具体步骤1. 得到每个数字的信息2. 银行卡处理3. 找到数字边框4. 模板匹配 总结 银行卡号识别 经过了几篇关于轮廓检测的学习&#xff0c;本篇我们来尝试完成对银行卡号的检测识别&#xff1a; 目标&#xff0c;识别…

获取时间,并将时间按一定的格式输出

一、时间函数 1.获取秒数 CTS 北京时间 2.转换为需要个格式 系统时间的获取: 1.time 获得秒数 time_t time(time_t *t); time_t 类型变量 第一种 准备一个变量 time_t tm; time(&tm) 第二种 tm time(NULL); 功能: 获得1970年到现在的秒数 第一步&#xff0c;先获得秒…

OpenHarmony鸿蒙( Beta5.0)RTSPServer实现播放视频详解

鸿蒙开发往期必看&#xff1a; 一分钟了解”纯血版&#xff01;鸿蒙HarmonyOS Next应用开发&#xff01; “非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路…

JavaScript基础语法(超详细!)

为什么学JS&#xff1f; 1.页面动态效果 2.表单验证 可以包含在文档中的任何地方&#xff0c;只要保证这些代码在被使用前已读取并加载到内存即可 <script>… </script>网页中引用JavaScript的方式&#xff1a; 1.使用<script>标签外部JS文件 <scrip…

层归一化(201607)

Layer Normalization 层归一化 https://arxiv.org/abs/1607.06450 Abstract Training state-of-the-art, deep neural networks is computationally expensive. One way to reduce the training time is to normalize the activities of the neurons. A recently introduced…

gdb 前端:kdbg 安装使用

文章目录 1. 前言2. kdbg 安装使用2.1 安装 kdbg2.2 使用 kdbg 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. kdbg 安装使用 2.1 安装 kdbg kdbg 是 gdb 的图形化界面的前端&#xff0c;在 …

2018年系统架构师案例分析试题五

目录 案例 【题目】 【问题 1】(7 分) 【问题 2】(12 分) 【问题 3】(6 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于 Web 系统设计的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某银行拟将以分行为主体…

多卡微调智谱glm-4-9b-chat

1 什么是微调&#xff1a; 大模型微调&#xff08;Fine-tuning of large models&#xff09;是一种通过对已经训练好的大规模预训练模型进行进一步训练的技术&#xff0c;以便让模型在特定任务或特定领域上表现得更好。微调通常是在已经有了一个通用的、经过大规模数据训练的基…

恐怖类游戏智能体————恐怖探险家

智能体名称&#xff1a;恐怖探险家 链接&#xff1a;文心智能体平台AgentBuilder | 想象即现实 (baidu.com)https://agents.baidu.com/center/agent/preview/MFhBvA0K9EXXVdjHCcUumadWmWesKvw2 角色与目标设定 &#x1f9d1;&#x1f3fb; 角色&#xff1a;恐怖探险家是一位…