数据结构——并查集

news2024/9/23 21:32:39

1.并查集的定义

并查集其实也是一种树形结构,在使用中通常用森林的方式来表示

并查集的逻辑结构其实就是集合

并查集一般可以通过双亲写法(顺序结构)来完成,即通过一个数组存储父亲结点的下标

int s[10005];
int main()
{
    for(int i=1; i<=n; i++)
    {
        s[i]=-1;
//为什么一开始都归属于-1呢,我们要从定义入手,我们的数组存储的是父亲结点的下标,若从-1开始,
//可以意味着,他们一开始都是单独的元素,方便后续的查和并操作
    }
}

2.并查集能进行的操作

1.查:寻找一个元素归属于哪个集合或者说判断两个元素是否同属于一            个集合

int cha(int x)
{
    while(s[x]>=0)//当指针不为-1时就会一直向前搜索,直到搜索出根结点
        x=s[x];
    return x;//返回根结点的下标
}

2.并:将两个子树并在一起,通常是将小子树并在大子树上面

void bing(int root1,int root2)
{
    if(root1==root2) return;//传进来两个根节点一样的本来就是本身,不用合并,直接返回就好
    s[root2]=root1;//将子树2的指针指向子树1的下标
}

3.并查集相关例题

第一题:并查集

 题解,这题也是十分简单,合并操作就是用上述的并,判断是否在一个集合就要用查了,如果相等,则证明在一个集合里

看AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;

int a[20005];//定义一个双亲写法的数
int z,x,y;
int cha(int x)//查
{
    while(a[x]>=0)
    {
        x=a[x];
    }
    return x;
}
void bing(int root1,int root2)//并
{
    if(root1==root2)
        return;
    a[root2]=root1;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        a[i]=-1;
    }
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&z,&x,&y);
        if(z==1)
        {
            bing(cha(x),cha(y));//合并树的时候合并的是根
        }
        if(z==2)
        {
            int p=cha(x);
            int q=cha(y);
            if(p==q)
                printf("Y\n");
            else
                printf("N\n");
        }
    }
    return 0;
}

第二题:亲戚

 题解:这题也是很简单,判断是否是亲戚,只需要判断是否在一个结点就可以,因此上面那题差不多

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,p;
int s[10005];
int x,y;
int cha(int x)
{
    while(s[x]>=0)
        x=s[x];
    return x;
}
void bing(int root1,int root2)
{
    if(root1==root2) return;
    s[root2]=root1;
}
int main()
{
    scanf("%d%d%d",&n,&m,&p);
    for(int i=0; i<m; i++)//    for(int i=1; i<=n; i++)
    {
        s[i]=-1;
    }

    {
        scanf("%d%d",&x,&y);
        bing(cha(x),cha(y));
    }
    int r,t;
    for(int i=0; i<p; i++)
    {
        scanf("%d%d",&r,&t);
        int te=cha(r);
        int re=cha(t);
        if(te==re)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

第三题:朋友

 题解,我们只需要放置两个数组,判断那边的子树的节点更少就可以

AC代码

#include<bits/stdc++.h>
using namespace std;
int n,m,p,q;
int x,y,z,t;
int a[10005];
int b[10005];

int cha(int x,int s[])
{
    while(s[x]>=0)
        x=s[x];
    return x;
}
void bing(int root1,int root2,int z[])//唯一要处理的就是尽量往小明和小红身上连接子树
{
    if(root1==root2)
        return ;
    if(root1==1)
    {
        z[root2]=root1;
    }
    else if(root2==1)
    {
        z[root1]=root2;
    }
    else
    {
        z[root2]=root1;
    }
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&p,&q);
    for(int i=1; i<=n; i++)
    {
        a[i]=-1;
    }
    for(int i=1; i<=m; i++)
    {
        b[i]=-1;
    }
    for(int i=0; i<p; i++)
    {
        scanf("%d%d",&x,&y);
        bing(cha(x,a),cha(y,a),a);
    }
    for(int i=0; i<q; i++)
    {
        scanf("%d%d",&z,&t);
        bing(cha(-z,b),cha(-t,b),b);
    }
    int sum1=0,sum2=0;
    for(int i=1; i<=n; i++)
    {
        if(cha(i,a)==1)
            sum1++;
    }
    for(int i=1; i<=m; i++)
    {
        if(cha(i,b)==1)
        {
            sum2++;
        }
    }
    printf("%d\n",min(sum1,sum2));
    return 0;
}

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

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

相关文章

共享的IP隔一段时间就变?用这种方法可以不需要知道电脑IP

前言 一般来说,电脑接入路由器之后,IP是由路由器自动分配的(DHCP),但如果隔一段时间不开机连接路由器,或者更换了别的网卡进行连接,自动分配的IP就会更改。 比如你手机连接着电脑的共享IP:192.168.1.10,但过段时间之后,电脑的IP突然变成了192.168.1.11,那么你的所有…

UDP/TCP协议特点

1.前置知识 定义应用层协议 1.确定客户端和服务端要传递哪些信息 2.约定传输格式 网络上传输的一般是二进制数据/字符串 结构化数据转二进制/字符串 称为序列化 反之称之为反序列化 下面就是传输层了 在TCP/IP协议中,我们以 目的端口,目的IP 源端口 源IP 协议号这样一个五…

20240129收获

今天终于发现《八部金刚功》第五部我一直做的是错的&#xff0c;嗨。这里这个写法非常聪明&#xff0c;创立的数组&#xff0c;以及用obj[key] item[key]这样的写法&#xff0c;这个写法充分展示了js常规写法中只有等号右边会去参与运算&#xff0c;等号左边就是普通的键的写法…

【c++】类和对象3

拷贝构造函数 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存在的类类型对象创建新对象时由编译器自动调用。 拷贝构造函数是构造函数的一个重载形式。 函数名相同&#xff0c;参数不同 先定义一个类…

【pytest系列】- parametrize参数化

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Springboot校验注解

Spring Boot 提供了一组基于 Hibernate Validator 的校验注解&#xff0c;用于验证请求参数、实体对象等数据的合法性。下面是一些常用的 Spring Boot 校验注解及其功能&#xff1a; 导入依赖 <dependency><groupId>org.springframework.boot</groupId><…

正则表达式补充以及sed awk

正则表达式&#xff1a; 下划线算 在单词里面 解释一下过程&#xff1a; 在第二行hello world当中&#xff0c;hello中的h 与后面第一个h相匹配&#xff0c;所以hello中的ello可以和abcde匹配 在world中&#xff0c;w先匹配h匹配不上&#xff0c;则在看0&#xff0c;r&#…

代码随想录算法训练营第二十一天 |530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236.二叉树的最近公共祖先(待补充)

530.二叉搜索树的最小绝对差 1、题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2、文章讲解&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 3、题目&#xff1a; 给你一棵所有节点为非…

Docker基于Dockerfile多级构建LNMP,实现缩小镜像体积

目录 实验准备&#xff1a; 1.创建nginx镜像 2.创建mysql镜像 3.创建php镜像 4.完成对接 创建网络 创建nginx容器 创建mysql容器 创建WordPress库 创建php容器 5.登录验证 6.镜像体积是不是越小越好&#xff1f;为什么要缩减镜像体积&#xff1f; 7.缩小镜像体积的…

防御保护 笔记整理

一、ASPF--- 针对应用层的包过滤 ASPF --- 针对应用层的包过滤 --- 用来抓取多通道协议中协商端口的关键数据包&#xff0c;之后&#xff0c;将端 口算出&#xff0c;将结果记录在sever-map表中&#xff0c;相当于开辟了一条隐形的通道。 FTP --- 文件传输协议 FTP协议是一个典…

数学算法知识编程

&#xff08;1&#xff09;辗转相除法求最大公约数&#xff08;gcd&#xff09; 辗转相除法&#xff0c; 又名欧几里德算法&#xff08;Euclidean algorithm&#xff09;&#xff0c;是求最大公约数的一种方法。它的具体做法是&#xff1a;用较小数除较大数&#xff0c;再用出现…

I.MX6ULL_Linux_驱动篇(53)linux USB驱动

I.MX6ULL USB 接口简介 I.MX6ULL 内部集成了两个独立的 USB 控制器&#xff0c;这两个 USB 控制器都支持 OTG 功能。I.MX6ULL 内部 USB 控制器特性如下&#xff1a; ①、有两个 USB2.0 控制器内核分别为 Core0 和 Core1&#xff0c;这两个 Core 分别连接到 OTG1 和OTG2。 ②、…

基于STM32的CAN通信协议选择与实现

基于STM32的控制器区域网络&#xff08;CAN&#xff09;通信协议是一种常见的实时数据通信方案&#xff0c;适用于需要高速、可靠通信的应用场景&#xff0c;比如汽车网络、工业控制系统等。在这里&#xff0c;我们将详细介绍基于STM32的CAN通信协议的选择与实现。 ✅作者简介&…

使用Win32API实现贪吃蛇小游戏

目录 C语言贪吃蛇项目 基本功能 需要的基础内容 Win32API 介绍 控制台程序部分指令 设置控制台窗口的长宽 设置控制台的名字 控制台在屏幕上的坐标位置结构体COORD 检索指定标准设备的句柄&#xff08;标准输入、标准输出或标准错误&#xff09; 光标信息结构体类型CONSOLE_CUR…

excel给数据库初始化/旧数据处理(自动sql拼装)

思路&#xff1a; 首先导出数据到excel编写单条数据操作的sql利用excel CONCATENATE 函数自动生成&#xff0c;每一行数据的操作sql 小技巧:对于需要套娃的字段值&#xff0c;可以加一个临时列同样使用CONCATENATE函数进行sql拼装 案例&#xff1a; 1.临时列:CONCATENATE(C2, …

HBase(docker版)简单部署和HBase shell操作实践

文章目录 说明HBase部署访问HBase Shell常见命令数据定义语言(DDL) 数据操作语言(DML)通用操作访问HBase WebUI 说明 本文适合HBase初学者快速搭建HBase环境&#xff0c;练习常见shell使用本文参考资料 《大数据技术原理和应用》&#xff08;林子雨 编著 第三版&#xff09;zh…

一文彻底搞懂redis数据结构及应用

文章目录 1. Redis介绍2.五种基本类型2.1 String字符串2.2 List列表2.3 Set集合2.4 Zset有序集合2.5 Hash散列 3. 三种基本类型3.1 Bitmap &#xff08;位存储&#xff09;3.2 HyperLogLogs&#xff08;基数统计&#xff09;3.3 geospatial (地理位置) 4. Stream详解4.1 Stream…

NTRU-Based GSW-Like FHE:Faster Blind Rotation

参考文献&#xff1a; [XZD23] Xiang, B., Zhang, J., Deng, Y., Dai, Y., Feng, D. (2023). Fast Blind Rotation for Bootstrapping FHEs. In: Handschuh, H., Lysyanskaya, A. (eds) Advances in Cryptology – CRYPTO 2023. CRYPTO 2023. Lecture Notes in Computer Scien…

C++_list

目录 一、模拟实现list 1、list的基本结构 2、迭代器封装 2.1 正向迭代器 2.2 反向迭代器 3、指定位置插入 4、指定位置删除 5、结语 前言&#xff1a; list是STL(标准模板库)中的八大容器之一&#xff0c;而STL属于C标准库的一部分&#xff0c;因此在C中可以直接使用…

实现扫码登录

扫码登录是如何实现的&#xff1f; 二维码信息里主要包括唯一的二维码ID,过期的时间&#xff0c;还有扫描状态&#xff1a;未扫描、已扫描、已失效。 扫码登录流程 用户打开网站登录页面的时候&#xff0c;浏览器会向二维码服务器发送一个获取登录二维码的请求。二维码服务器收…