数据结构——并查集

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");elseprintf("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");elseprintf("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.mzph.cn/news/657075.shtml

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

相关文章

【JavaEE】为什么java放jar的文件夹必须是lib

我们来聊聊为何外部jar包放在lib文件夹下 要明白这个&#xff0c;我们先来看看接下来的文章 目录 我们来聊聊为何外部jar包放在lib文件夹下 前言一、为何外部jar包放在lib文件夹下1.1 从lib是什么的简写入手1.2 为什么就非的是lib 二、劝诫总结 前言 在刚开始接触java这门语言…

C# 策略模式(Strategy)

策略模式&#xff08;Strategy&#xff09;&#xff1a;定义一系列的算法&#xff0c;将每一个算法封装起来&#xff0c;并且使它们可以相互替换。 首先&#xff0c;定义一个接口ISortStrategy&#xff0c;表示排序算法的策略&#xff1a; public interface ISortStrategy {…

深入了解Yum:Linux系统的软件包管理利器

目录 软件包 软件包的来源 关于yum yum是什么 yum的相关操作 介绍rzsz rz&#xff08;从Windows本地传到Linux服务器&#xff09; sz&#xff08;从Linux服务器传到Windows本地&#xff09; 注意事项 查看软件包 安装软件 卸载软件 yum的本地配置 为什么要进行配置…

《基于“源启+”的应用重构白皮书》

当前&#xff0c;行业数字化转型驶入“深水区”&#xff0c;全新的市场竞争格局对行业发展提出更高的要求&#xff0c;企业高质量发展需要借助新架构新应用重新定义数字生产力&#xff0c;重塑商业模式与市场核心竞争力。 在中国电子主办&#xff0c;中电金信承办的“数字原生向…

MySQL SQL 注入

本章节将为大家介绍如何防止SQL注入&#xff0c;并通过脚本来过滤SQL中注入的字符。 SQL注入可能是目前互联网上存在的最丰富的编程缺陷。 这是未经授权的人可以访问各种关键和私人数据的漏洞。 SQL注入不是Web或数据库服务器中的缺陷&#xff0c;而是由于编程实践较差且缺乏经…

Git学习笔记(第10章):自建代码托管中心GitLab

目录 10.1 简介 10.2 安装 10.2.1 准备服务器 10.2.2 准备安装包 10.2.3 编写安装脚本 10.2.4 初始化GitLab服务 10.2.5 启动GitLab服务 10.2.6 使用浏览器访问GitLab 10.3 创建远程库 10.4 本地库推送到远程库 10.1 简介 GitLab是由GitLab Inc.开发&#xff0c;使用…

Nacos服务注册源码:客户端

入口 我们就拿nacos自己example下的NamingExample来做测试 public class NamingExample {public static void main(String[] args) throws NacosException, InterruptedException {Properties properties new Properties();properties.setProperty("serverAddr", …

39、FlatFormer:MIT+交大+清华共同提出,更加高效的Transformer[无绳蹦极第一人!]

本文由麻省理工学院、上海交通大学、清华大学于2023年7月14日发表于Arxiv的<Computer Science> 论文&#xff1a; [2301.08739] FlatFormer: Flattened Window Attention for Efficient Point Cloud Transformer (arxiv.org) 代码&#xff1a; github.com Abstract&a…

c语言 ceil() 函数

ceil()是C语言中的一个数学函数&#xff0c;用于向上取整。它的函数原型定义在math.h头文件中。 ceil()函数的作用是返回一个大于或等于给定参数的最小整数值&#xff0c;即将参数向上取整到最接近的整数。返回值的数据类型为double。 以下是ceil()函数的函数原型&#xff1a…

接续奋斗四十载 勇毅前行向未来 2024食品产业高质量发展论坛暨《中国食品报》创刊40周年研讨会在京举行

四十年春华秋实&#xff0c;四十年砥砺奋进。《中国食品报》从改革开放之初的春天里走来&#xff0c;以笔为媒&#xff0c;勇担道义&#xff0c;从拯救中华传统老字号品牌开始&#xff0c;为我国食品产业发展奔走疾呼&#xff0c;为提升我国食品企业融入国际化潮流、提升国际竞…

联合 Maxlinear 迈凌 与 Elitestek 易灵思 - WPI 世平推出基于 FPGA 芯片的好用高效电源解决方案

近期 WPI 世平公司联合 Maxlinear 迈凌电源产品搭配 Elitestek 易灵思 FPGA 共同合作推出基于 FPGA 芯片的好用高效电源解决方案。 Elitestek 易灵思 FPGA 核心产品有 2 大系列 : Trion 系列与钛金系列。Trion 系列主要特点是 : 1. 40nm 工艺 2. 超低功耗 ( 可低至竞争对手的 …

[ESXi 8]安装centos7

文章目录 创建虚拟机创建虚拟机选择centos7选择存储选择镜像文件上传ios镜像文件 安装即将完成 启动虚拟机自动获取ip设置root密码安装成功 创建虚拟机 创建虚拟机 选择centos7 选择存储 选择镜像文件 上传ios镜像文件 如图显示上传进度&#xff0c;上传完毕之后&#xff0c;将…

网络协议与攻击模拟_11DHCP欺骗防护

开启DHCP 监听 ip dhcp snooping 指定监听vlan ip dhcp snooping vlan 1 由于开启监听后&#xff0c;交换机上的接口就全部变成非信任端口&#xff0c; 非信任端口会拒绝DHCP报文&#xff0c;会造成正常的DHCP请求和响应都无法完成。 现在是请求不到IP地址的&#xff0c;…

今日方知-依赖注入

在学习MQ时我遇到了一个问题 Configuration public class RabbitMQConfig { //声明推送的队列名 // private String simplename "spring.lz.silple"; // private String workname "spring.lz.work";/*** 创建一个队列对象&#xff0c;** return*/ Bean …

JS图片二维码识别

前言 js识别QR图片&#xff0c;基于jsQR.js 代码 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title>图片二维码识别</title><script src"https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js">…

vector(顺序表)

vector容器就相当于一个顺序表&#xff0c;只不过他把一些功能分装到了容器里 常用接口及语法 构造&#xff1a;vectro<数据类型> 对象名 输出&#xff1a;和顺序表一样我们需要遍历打印&#xff0c;而不能直接用cout打印 对象.push_back () 尾插 对象.pop_back() 尾删…

NetCore iText7 根据PDF模板 导出PDF

iText 7 是一个用于处理 PDF 文件的流行的开源库&#xff0c;它提供了丰富的功能&#xff0c;包括创建、编辑和处理 PDF 文档。它支持 .NET 平台&#xff0c;因此可以在 .NET Core 中使用该库来处理 PDF 文件。 使用 iText 7&#xff0c;您可以进行以下操作&#xff1a; 1. 创…

【Java-JDK】JDK 的安装与环境变量的配置:Windows Linux

【Java-JDK】JDK的安装与环境变量的配置&#xff1a;Windows & Linux 1&#xff09;Windows安装JDK1.1.下载JDK1.1.安装JDK1.2.JDK环境配置1.3.验证环境变量是否配置成功 2&#xff09;Linux安装JDK2.1.下载JDK2.2.安装JDK2.3.JDK环境配置2.4.验证环境变量配置是否成功 1&a…

Java-并发高频面试题

1.说一下你对Java内存模型&#xff08;JMM&#xff09;的理解&#xff1f; 其实java内存模型是一种抽象的模型&#xff0c;具体来看可以分为工作内存和主内存。 JMM规定所有的变量都会存储再主内存当中&#xff0c;再操作的时候需要从主内存中复制一份到本地内存&#xff08;c…

头歌C++之for循环应用(II)

目录 第1关&#xff1a;百钱买百鸡问题 本关必读 本关任务 测试说明 第2关&#xff1a;找出乒乓球比赛中3对赛手的名单 本关必读 本关任务 测试说明 第3关&#xff1a;计算球第n次落地时经过的距离和反弹的高度 本关必读 本关任务 测试说明 第1关&#xff1a;百钱买…