基础数据结构第八期 并查集

news2024/9/23 15:25:07

前言

并查集这部分还是挺重要的,应该要熟练掌握哦!!!

一、并查集的基本概念

作用:

1、将两个集合合并

 2、查询是否在一个集合内

 基本原理:

每个集合用一棵树来表示,树根的编号就是整个集合的编号,每个节点储存它的父节点,p[x]表示x的父节点。

问题:

1、如何判断树根:if(p[x] == x)

2、如何求x的集合编号:while(p[x] != x) x = p[x]

3、如何合并两个集合:px是x的集合编号,py是y的集合编号,p[x] = y

二、例题

1.合并集合:

#include<iostream>
using namespace std;

const int N = 1e5+10;
// p数组是做什么的?---存储每个节点的根节点
// p[x] != x代表它是一个根节点
int p[N],a,b;

// 递归---先递归到最底层,再开始回溯赋值
// find函数的作用:找到x的根节点并返回,并压缩路径
int find(int x){
    if(p[x] != x) p[x] = find(p[x]); // 压缩路径,将查询x的所有长辈节点直接接在根节点上
    return p[x];
}

int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i = 1;i < n;i++) p[i] = i;
    while(m--){
        char op[2];
        scanf("%s%d%d",op,&a,&b);
        // 合并---让a集合直接连接到b集合的根节点下
        if(*op == 'M') p[find(a)] = p[find(b)];
        else{
            // 查询是否是同一个集合,如果a集合和b集合具有相同的根节点,则它们是同一个集合
            if(find(a) == find(b)) puts("Yes");
            else puts("No");
        }
    }
    return 0;
}

2.连通块中点的数量:


//P23连通块中点的数量
//并查集
#include <iostream>
using namespace std;
const int N = 100010;
int n, m;
//p存储每个点
//size表示每一个集合的大小,每一个集合里元素的个数,就是存储根节点所拥有的子节点数
//只保证根节点的size有意义
int p[N], sizee[N];

int find(int x) {//返回祖宗节点+路径压缩
	if (p[x] != x)
		p[x] = find(p[x]);
	return p[x];
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		p[i] = i;
		sizee[i] = 1;//最开始的时候每一个集合里只有自己一个点
	}
	while (m--) {
		char op[3];
		int a, b;
		scanf("%s", op);
		if (op[0] == 'C') {//连边,就是合并
			scanf("%d%d", &a, &b);
			if (find(a) == find(b))//如果a和b已经在同一个集合里了,就continue跳出
				continue;
			sizee[find(b)] += sizee[find(a)];//将节点数加到新根节点数上
			p[find(a)] = find(b);//a的根节点的根节点等于b的根节点
		} else if (op[1] == '1') {
			scanf("%d%d", &a, &b);
			if (find(a) == find(b))//判断是或在同一个集合里
				puts("Yes");
			else
				puts("No");
		} else {
			scanf("%d", &a);
			printf("%d\n", sizee[find(a)]);
		}
	}
	return 0;
}

3、食物链:

//余1,可以吃根节点
//余2,可以被根节点吃
//余0,与根节点是同类
#include <iostream>
using namespace std;
const  int N = 50010;
int n, m;
int p[N], d[N];

//p[n]是n的父节点,d[n]是n节点到根节点的距离
int find(int x) {
	if (p[x] != x) { //如果当前节点x不是根节点
		int t  = find(p[x]);//先用t存下来x的根节点
		d[x] += d[p[x]]; //把d[x]更新成x到根节点之间的距离
		p[x] =  t; //再把p[x]更新成x到根节点的距离
	}
	return p[x];
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
		p[i] = i;//初始化父节点是自己,d距离初始化都为0
	int res = 0;//记录假话数量
	while (m--) {
		int t, x, y;
		scanf("%d%d%d", &t, &x, &y);
		if (x > n || y > n)
			res++;//如果x,y超出动物总数n,就说明是假话,res++
		else {
			int px = find(x), py = find(y); //先找根节点
			if (t == 1) { //现在x和y是同类
//x和y在同一颗树上,且x到根节点的距离和y到根节点的距离之差模3不等于0,就是假话
				if (px == py && (d[x] - d[y] ) % 3)
					res++;
				else if (px != py) { //如果x和y不在同一颗树上
					p[px] = py;//就把x和y放到同一颗树上
					d[px] = d[y] - d[x];
				}
			} else {//t==2时,表示x吃y
//x和y在同一颗树上,x到根节点的距离应该比y到根节点的距离多1,否则是假话
				if (px == py && (d[x] - d[y] - 1) % 3)
					res++;
				else if (px != py) { //x和y不在同一颗树上
					p[px] = py;//把px更新到py树下,也就是px的父节点更新成py
					d[px] = d[y] + 1 - d[x];
				}
			}
		}
	}
	printf("%d\n", res);
	return 0;
}

总结

以上就是我对这部分的理解,感谢大家的观看谢谢大家!!!

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

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

相关文章

Pixi.js的魅力

摘要&#xff1a;官网 Web开发的时代&#xff0c;图形和动画已经成为了吸引用户注意力的重要手段之一。而 Pixi.js 作为一款高效、易用的2D渲染引擎&#xff0c;已经成为了许多开发者的首选~~ 项目中&#xff0c;有一些图像的处理操作&#xff08;3D图&#xff0c;2D图都有&…

时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价)

时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价) 目录 时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价)预测效果基本介绍程序设计参考资料 预测效果 …

npm 和 Yarn:一场关于包管理的战争(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存&#xff08;C&#xff09;&#xff09; Baumer工业相机Baumer工业相机的图像高速保存的技术背景Baumer工业相机通过NEOAPI SDK函数图像高速保存在NEOAPI SDK里实现线程高速图像保存&#xff1a;工业相机高…

芯片验证入门踩坑指南(1)

因为一些原因&#xff0c;从华为数通C软件开发到海思这边做芯片验证&#xff0c;快一个月&#xff0c;说下一些心得与体会&#xff1a; 如何快速上手&#xff1a; 因为项目非常赶&#xff0c;几乎没有脱产学习时间&#xff0c;就是直接干项目&#xff0c;一开始不需要知道原理…

【leetcode】力扣热门之合并两个有序列表【简单难度】

题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 用例 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[] 输入&#xff1a;l1 []…

开源、云原生且实时分析型的现代数据仓库DataBend的介绍,及其与其它开源文件存储的结合使用实例

DataBend介绍 Databend 是一个开源、云原生且实时分析型的现代数据仓库&#xff0c;旨在提供高效的数据存储和处理能力。它采用 Rust 语言开发&#xff0c;并支持 Apache Arrow 格式以实现高性能列式存储与查询处理。 主要特点&#xff1a; 云原生设计&#xff1a;Databend 构…

[VUE]1-创建vue工程

目录 基于脚手架创建前端工程 1、环境要求 2、操作过程 3、工程结构 4、启动前端服务 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c…

即时战略游戏的AI策略思考

想起来第一次玩RTS游戏&#xff0c;就是框住一大群兵进攻&#xff0c;看他们把对面消灭干净……我接触的第一款游戏是《傲世三国》那会儿是小学&#xff0c;后来高中接触了魔兽地图编辑器&#xff0c;我发现自己喜欢直接看属性而省去争论和试验的步骤——我喜欢能一眼看透的感觉…

20240107移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下调通能上网

20240107移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下调通能上网 2024/1/7 11:17 开发板&#xff1a;Firefly的AIO-3399J【RK3399】SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab …

【Spring实战】25 Spring Boot Admin 应用

文章目录 1. 查看健康信息2. 使用 Micrometer 和 "/metrics"3. 管理包和类的日志级别4. 其他功能总结 Spring Boot Admin 是一个功能强大的工具&#xff0c;用于监控和管理多个 Spring Boot 应用程序。通过上一篇文章 【Spring实战】24 使用 Spring Boot Admin 管理…

Android getApplication()、getApplicationContext的区别

在Android中&#xff0c;getApplication()和getApplicationContext()是两种获取应用程序上下文的方法&#xff0c;但它们有一些细微的区别。 getApplication()方法&#xff1a; getApplication()方法通常用于Activity或Fragment中&#xff0c;它返回当前Activity或Fragment所属…

MySQL-存储引擎

简介&#xff1a;存储引擎是存储数据&#xff0c;建立索引&#xff0c;更新/查询数据等技术的实现方式。存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c; (同一个数据库的不同表可以选择不同的存储引擎) 所以存储引擎也可被称为表类型。 我们输入 SHOW CREATE TAB…

Django 10 表单

表单的使用流程 1. 定义 1. terminal 输入 django-admin startapp the_14回车 2. tutorial子文件夹 settings.py INSTALLED_APPS 中括号添加 "the_14", INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib…

Kafka(五)生产者

目录 Kafka生产者1 配置生产者bootstrap.serverskey.serializervalue.serializerclient.id""acksallbuffer.memory33554432(32MB)compression.typenonebatch.size16384(16KB)max.in.flight.requests.per.connection5max.request.size1048576(1MB)receive.buffer.byte…

Fowsniff

靶场搭建 遇到扫描不到的情况&#xff0c;可以尝试改靶机的网络为NAT模式&#xff0c;在靶机启动时按”esc“&#xff0c;进入Advanced options for Ubantu&#xff0c;选择recovery mode&#xff0c;选择network&#xff0c;按方向键”→“&#xff0c;OK&#xff0c;然后res…

Python爬虫获取百度的图片

一. 爬虫的方式&#xff1a; 主要有2种方式: ①ScrapyXpath (API 静态 爬取-直接post get) ②seleniumXpath (点击 动态 爬取-模拟) ScrapyXpath XPath 是 Scrapy 中常用的一种解析器&#xff0c;可以帮助爬虫定位和提取 HTML 或 XML 文档中的数据。 Scrapy 中使用 …

VMware NAT 模式,网关无法ping通 网关解决办法

开启红框服务即可。。 参考&#xff1a;VMware NAT 模式&#xff0c;网关无法ping通 网关解决办法_vmware设置net,本机ping不通网关-CSDN博客

【代码】Keras3.0:实现残差连接

简介 残差连接是一种非常重要的网络结构创新&#xff0c;最早被广泛应用于ResNet&#xff08;Residual Neural Network&#xff09;模型中&#xff0c;由何凯明等人在2015年的论文"Deep Residual Learning for Image Recognition"中提出。 核心思想 通过引入“short…

【Sharding-Sphere 整合SpringBoot】

Sharding-Jdbc在3.0后改名为Sharding-Sphere。Sharding-Sphere相关资料&#xff0c;请自行网上查阅&#xff0c;这里仅仅介绍了实战相关内容&#xff0c;算是抛砖引玉。 Sharding-Sphere 整合SpringBoot 一、项目准备二、项目实战1. pom.xml及application.yml2. OrderInfoCont…