P2024 [NOI2001] 食物链 带权并查集 循环关系

题目: 

P2024 [NOI2001] 食物链 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 

本文学习自: 

题解 P2024 【食物链】 - RE: 从零开始的异世界信竞生活 - 洛谷博客 (luogu.com.cn) 

————

关系并查集其实就是在普通并查集的基础上额外开个数组re,用来表示每个点与其根节点的关系。

这个其实很好理解。设0为同类,1为该点吃根节点,2为根节点吃该点。 

难处理的就是合并,以及压缩并查集时,re关系数组如何处理。

只需理解这个图:

 

为什么有这个等式,其实这个等式左右两边表示的都是A与F2的关系 。(A到F2的两条路径和)

再结合关系是循环的(A吃B,B吃C,C吃D,那么A和D就是同类,构成循环了)。

然后就是注意,减法可能减负的,可以加个模数再取模。

代码: 

两个find,第一个是压缩时,循环处理re关系数组

第二个注释掉的是递归法,回溯的时候处理re关系数组

int fa[50005];
//带权并查集
int rela[50005];

void init(int _size)
{
	for (int i = 0; i <= _size; i++)
		fa[i] = i;
}
int find(int aim)
{
	int cur = aim;
	int sum = 0;
	while (fa[aim] != aim)
	{
		sum += rela[aim];//存
		aim = fa[aim];
	}
	while (fa[cur] != cur)
	{
		int tmp = cur;
		cur = fa[cur];
		fa[tmp] = aim;

		sum -= rela[tmp];
		rela[tmp] = (sum+rela[tmp]) % 3;
	}
	return aim;
}
//int find(int aim)//从根往下更新
//{
//	int father = fa[aim];
//	if (fa[aim] == aim)
//		return aim;
//	fa[aim] = find(father);
//	rela[aim] = (rela[aim] + rela[father]) % 3;
//	return fa[aim];
//}
void join(int a, int b,int op)
{
	int oa = a, ob = b;
	a = find(a);
	b = find(b);
	fa[a] = b;
	rela[a] = (op + rela[ob] - rela[oa]+3)%3;

	//只处理祖先就好了,其余在压缩的时候处理
	//并查集就是合并根
}


void solve()
{
	int n, k;
	cin >> n >> k;
	init(n);
	int op, a, b;
	int ans = 0;
	for (int i = 1; i <= k; i++)
	{
		cin >> op >> a >> b;
		if (a > n || b > n)
		{
			ans++;
			continue;
		}
		if (op == 1)
		{
			if (find(a) == find(b))
			{
				if(rela[a] != rela[b])
					ans++;			
			}
			else
			{
				join(a, b,0);
			}
		}
		else
		{
			if (a == b)
			{
				ans++;
				continue;
			}
			//如果在一个集合中,要判断关系是否正确
			if (find(a) == find(b))
			{
				if (rela[a] != (1 + rela[b]) % 3)
				{
					ans++;
				}
			}
			else
				join(a, b,1);
		}
	}
	cout << ans << endl;
}
signed main()
{
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int t = 1;
	//cin >> t;
	while (t--)
	{
		solve();
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pandas Series Mastery: 从基础到高级应用的完整指南【第83篇—Series Mastery】

Pandas Series Mastery: 从基础到高级应用的完整指南 Pandas是Python中一流的数据处理库&#xff0c;它为数据科学家和分析师提供了强大的工具&#xff0c;简化了数据清理、分析和可视化的流程。在Pandas中&#xff0c;Series对象是最基本的数据结构之一&#xff0c;它为我们处…

【STM32 CubeMX】SPI层次结构SPI协议与SPI控制器结构

文章目录 前言一、SPI 程序层次1.1 硬件原理图1.2 硬件框图1.3 软件层次 二、SPI协议2.1 硬件连线2.2 如何访问SPI设备2.3 SPI 框图 总结 前言 随着嵌入式系统的迅猛发展&#xff0c;STM32系列微控制器在各种应用中得到广泛应用。在嵌入式系统设计中&#xff0c;串行外设接口&…

洗眼镜机是什么原理?眼镜适合用超声波清洗机洗吗?

洗眼镜机是一种通过超声波技术进行清洗的设备&#xff0c;它利用超声波振动在清洗液中产生微小气泡并将其释放到眼镜表面&#xff0c;从而去除污垢、油脂和细菌。洗眼镜机也是相当于超声波清洗机&#xff0c;超声波清洗机能够清洗的物品是有非常的多&#xff0c;不止可以清洗眼…

phpstrom创建thinkphp项目

安装php和composer 参考 安装phpstrom 创建项目 查看thinkphp版本 https://packagist.org/packages/topthink/think 打开所在项目编辑配置 即可调试运行

清除Django的管理员admin站点中“Recent Actions“最近活动面板上的所有信息

清除Django的管理员admin站点中"Recent Actions"最近活动面板上的所有信息 本文主要介绍了如何清除Django的管理员admin站点中"Recent Actions"最近活动面板上的所有信息 操作步骤如下 进入Django项目目录中运行代python manage.py shell进入Django shell…

没有PFMEA分析的检测过程会有什么风险?

随着科技的快速发展&#xff0c;产品复杂度不断提升&#xff0c;检测过程的重要性日益凸显。然而&#xff0c;在这个过程中&#xff0c;如果没有进行PFMEA分析&#xff0c;将会带来怎样的风险呢&#xff1f;本文将对此进行深入探讨。 众所周知&#xff0c;检测是确保产品质量的…

挑战杯 YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快&#xff0c;YOLOv6还没用熟YOLOv7就来了&#xff0c;如果有同学的毕设项目想用上最新的技术&#xff0c;不妨看看学长的这篇文章&#xff0c;学长带大家简单的…

JDK1.8安装教程

目录 下载安装环境配置打开系统高级设置环境配置 验证安装是否成功 下载 https://www.oracle.com/java/technologies/downloads/#java8-windows 安装 打开安装包&#xff0c;点击下一步。 选择好自己熟悉的目的安装目录&#xff0c;点击下一步。 等待安装 选择好jre的安装目…

【深度优先搜索】【图论】【树】2646. 最小化旅行的价格总和

作者推荐 【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 涉及知识点 深度优先搜索 图论 树 LeetCode2646. 最小化旅行的价格总和 现有一棵无向、无根的树&#xff0c;树中有 n 个节点&#xff0c;按从 0 到 n - 1 编号。给你一个整数 n 和一个长…

elementui 中el-date-picker 选择年后输出的是Wed Jan 01 2025 00:00:00 GMT+0800 (中国标准时间)

文章目录 问题分析 问题 在使用 el-date-picker 做只选择年份的控制器时&#xff0c;出现如下问题&#xff1a;el-date-picker选择年后输出的是Wed Jan 01 2025 00:00:00 GMT0800 (中国标准时间)&#xff0c;输出了两次如下 分析 在 el-date-picker 中&#xff0c;我们使用…

核心篇 - 集成IS-IS配置实战

文章目录 一. 实验专题1.1. 实验1&#xff1a;配置单区域集成IS-IS1.1.1. 实验目的1.1.2. 实验拓扑1.1.3. 实验步骤&#xff08;1&#xff09;配置IP地址&#xff08;2&#xff09;配置IS-IS 1.1.4. 实验调试&#xff08;1&#xff09;查看邻接表&#xff08;2&#xff09;查看…

Elasticsearch从入门到精通

目录 &#x1f9c2;1.简单介绍 &#x1f953;2.安装与下载 &#x1f32d;3.安装启动es &#x1f37f;4.安装启动kibana &#x1f95e;5.初步检索 &#x1f9c8;6.进阶检索 &#x1fad3;7.Elasticsearch整合 1.简单介绍&#x1f697;&#x1f697;&#x1f697; Elat…

使用一根网线,让Ubuntu和正点原子I.MX6ULL开发板互相ping通

1.硬件准备 准备一根网线即可 2. 让windows和I.MX6ULLping通 2.1 找根网线将I.MX6ULL和电脑连起来 2.2 让I.MX6ULL通电运行起来&#xff0c;我这里使用的是正点原子版本的内核、 2.3 进入电脑的网络连接后&#xff0c;按照如下步骤操作 2.4 将ip地址、子网掩码、默认网关…

数据结构-双指针法

介绍 双指针法是一种可以在O&#xff08;n&#xff09;时间复杂度内解决数组、链表、字符串等数据结构相关的问题的方法。核心思想为使用两个指针在不同位置遍历数组或链表&#xff0c;从而实现特定操作。 常见的双指针法有 1.快慢指针&#xff1a;快指针每次移动两步&…

阿里云服务器配置怎么选?CPU内存带宽配置多大?

阿里云服务器配置怎么选择&#xff1f;根据实际使用场景选择&#xff0c;个人搭建网站可选2核2G配置&#xff0c;访问量大的话可以选择2核4G配置&#xff0c;企业部署Java、Python等开发环境可以选择2核8G配置&#xff0c;企业数据库、Web应用或APP可以选择4核8G配置或4核16G配…

入门OpenCV:图像阈值处理

基本概念 图像阈值是一种简单、高效的图像分割方法&#xff0c;目的是将图像转换成二值图像。这个过程涉及比较像素值和阈值&#xff0c;根据比较结果来确定每个像素点的状态&#xff08;前景或背景&#xff09;。图像阈值在处理二维码、文本识别、物体跟踪等领域中非常有用。…

【前端工程化面试题】webpack proxy的工作原理,为什么能解决跨域问题

在 webpack 的配置文件 webpack.config.js 中有一个配置项 devServer 里面有一个属性是 proxy&#xff0c;这里面可以配置代理服务器&#xff0c;解决跨域问题&#xff0c;请参考官网。 一般来说 webpack 的代理就是说的开发服务器 webpack-dev-server。 其实不光是 webpack 其…

“挖矿”系列:细说Python、conda 和 pip 之间的关系

继续挖矿&#xff0c;挖“金矿”&#xff01; 1. Python、conda 和 pip&#xff08;挖“金矿”工具&#xff09; Python、conda 和 pip 是在现代数据科学和软件开发中常用的工具&#xff0c;它们各自有不同的作用&#xff0c;但相互之间存在密切的关系&#xff1a; Python&…

AIGC实战——能量模型(Energy-Based Model)

AIGC实战——能量模型 0. 前言1. 能量模型1.1 模型原理1.2 MNIST 数据集1.3 能量函数 2. 使用 Langevin 动力学进行采样2.1 随机梯度 Langevin 动力学2.2 实现 Langevin 采样函数 3. 利用对比散度训练小结系列链接 0. 前言 能量模型 (Energy-based Model, EBM) 是一类常见的生…

《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(6)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术&#xff08;5&#xff09; 13.2 ATS&#xff08;Address Translation Services&#xff09; 单纯使用IOMMU并不能充分发挥处理器系统的效率&#xff0c;从图13-2中可以发现&…