J - 食物链 POJ - 1182

news2024/9/24 1:17:31

 

 思路:

首先我们要理清楚三种动物之间的关系,那么可以用A到B的距离为1代表为A吃B,

那么就有下图的关系

那么我们用d=1表示吃,d=2表示被吃,d=3表示是同类

对于另一张图也是符合的

 然后我们去找每个点和他的根节点的关系

那么对于每个点和根节点的关系,就是它的d对应的关系(如C->A,d=2,那么C被A吃)

然后我们去推导任意两个点的关系(通过根节点)

B到根节点的d是1,C到根节点的d是2,那么C和B的关系是2-1=1,即C吃B;

如果是D和B的关系也一样:B到根节点的d是1,D到根节点的关系是3,那么关系是3-1=2,于是D(A)被B吃。

我们可以发现,X动物到Y动物到根节点的关系相减如果%3是1的话,就是X吃Y,如果%3为2的话,就是X被Y吃,如果%3为0的话,那么就是同类的关系。

那么对于D=1的情况

先找到x和y的头节点tx和ty。

如果tx不等于ty(即不在一个集合中),那么就不存在错误的可能,就把他们两个加入到一起中,

(p[tx]=ty)并且要满足(d[x]+d[tx])%3=d[y]%3,那么d[tx]=(d[y]-d[x]+3)%3

如果tx==ty,那么就说明这两个动物已经存在了一种关系,就判断一下两个动物到根节点的值的差%3是不是0就可以了

如果D=2

一样也是先找到x和y的头节点tx,ty

如果tx不等于ty(即不在一个集合中),那么就不存在错误的可能,就把他们两个加入到一起中,

(p[tx]=ty)并且要满足(d[x]+d[tx]-d[y])%3=1,那么d[tx]=(d[y]-d[x]-1+3)%3

如果tx==ty,那么就说明这两个动物已经存在了一种关系,就判断一下两个动物到根节点的值的差%3是不是1就可以了(图画的有点丑咳咳)

 

 

 对于find函数:

因为是要找到他的根节点,并且要在找根节点的途中去更新他到根节点的距离

那么可以通过调用递归函数先算出根节点,然后通过根节点的d去更新后面的d。

    if (p[x] != x)

    {

        int t = find(p[x]);

        d[x] += d[p[x]];

        d[x] %= 3;

        p[x] = t;

    }

    return p[x];

代码:

/**
 *  ┏┓   ┏┓+ +
 * ┏┛┻━━━┛┻┓ + +
 * ┃       ┃
 * ┃   ━   ┃ ++ + + +
 *  ████━████+
 *  ◥██◤ ◥██◤ +
 * ┃   ┻   ┃
 * ┃       ┃ + +
 * ┗━┓   ┏━┛
 *   ┃   ┃ + + + +Code is far away from  
 *   ┃   ┃ + bug with the animal protecting
 *   ┃    ┗━━━┓ 神兽保佑,代码无bug 
 *   ┃  	    ┣┓
 *    ┃        ┏┛
 *     ┗┓┓┏━┳┓┏┛ + + + +
 *    ┃┫┫ ┃┫┫
 *    ┗┻┛ ┗┻┛+ + + +
 */

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#define sc_int(x) scanf("%d", &x)
#define sc_ll(x) scanf("%lld", &x)
#define pr_ll(x) printf("%lld", x)
#define pr_ll_n(x) printf("%lld\n", x)
#define pr_int_n(x) printf("%d\n", x)
#define ll long long
using namespace std;

const int N = 1000000 + 100;
int n, m, h;
int p[N], d[N];

int find(int x)
{
	if (p[x] != x)
	{
		int t = find(p[x]);
		d[x] += d[p[x]];
		d[x] %= 3;
		p[x] = t;
	}
	return p[x];
}

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		p[i] = i;

	int res = 0;
	while (m--)
	{
		int x, y;
		sc_int(h),sc_int(x),sc_int(y);
		if (x > n || x < 1 || y > n || y < 1 || (x == y&&h==2))
		{
			res++;
			continue;
		}
		int hx = find(x), hy = find(y);
		if (h == 1)
		{
			if (hx == hy && ((d[x] - d[y] + 3) % 3))
				res++; // 根节点相同并且到根节点的距离不一样
			else if (hx != hy)
			{
				p[hx] = hy;
				d[hx] = (d[y] - d[x] + 3) % 3;
			}
		}
		else
		{
			if (hx == hy && (d[x] - d[y] + 3) % 3 != 1)
				res++;
			else if (hx != hy)
			{
				p[hx] = hy;
				d[hx] = (d[y] - d[x] + 1 + 3) % 3;
			}
		}
	}
	cout << res << endl;

	return 0;
}

 

 ending:咳咳,因为自己是个蒻蒻,所以写题解肯定是没有其他大佬写的好,就当是分享自己的思路了?希望有所帮助吧~

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

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

相关文章

resnet(4)------全连接层与softmax

文章目录1. 全连接层2. SoftMax算法1. 全连接层 全连接层&#xff0c;指的是每一个结点都与上一层的所有结点相连&#xff0c;用来把前面几层提取到的特征综合起来。 举个例子&#xff0c;前面通过卷积和池化层提取出来的特征有眼睛鼻子和嘴巴&#xff0c;那我们能单独通过这…

基于tensorflow的深层神经网络(一)为什么神经网络需要解决非线性和异或问题

参考为什么神经网络需要解决多层和非线性问题 - 云社区 - 腾讯云 维基百科对深度学习的精确定义为“一类通过多层非线性变换对高复杂性数据建模算法的合集”。因为深度神经网络是实现“多层非线性变换”最常用的一种方法&#xff0c;所以在实际中基本上可以认为深度学习就是深度…

音频信号特征

1.声音 音信号是由空气压力的变化而产生的&#xff0c;可以测量压力变化的强度&#xff0c;并绘制这些测量值随时间的变化。 声音信号经常在规律的、固定的区间内重复&#xff0c;每个波都具有相同形状&#xff0c;高度表示声音的强度&#xff0c;称之为振幅。 信号完成一个…

论文笔记-时序预测-FEDformer

论文标题&#xff1a;FEDformer: Frequency Enhanced Decomposed Transformer for Long-term Series Forecasting 论文链接&#xff1a; https://arxiv.org/abs/2201.12740 代码链接&#xff1a; https://github.com/DAMO-DI-ML/ICML2022-FEDformer 摘要 尽管基于变压器的方法…

笔记--Ubuntu20.04安装Nvidia驱动、CUDA Toolkit和CUDA CuDNN

目录 1--安装Nvidia驱动 2--安装CUDA 2-1--禁用nouveau 2-2--选择CUDA Toolkit 2-3--下载和安装CUDA Toolkit 2-4--配置环境变量 2-5--测试是否安装成功&#xff1a; 3--安装CUDA CuDNN 4--测试pytorch能否使用Cuda 1--安装Nvidia驱动 ① 查看可安装的Nvidia驱动版本…

Matplotlib学习笔记(第二章 2.13 Matplotlib中的图形(一))

在这里&#xff0c;您将发现大量示例图&#xff0c;其中包含生成它们的代码。 线图(Line Plot) 下面是如何使用plot()创建带有文本标签的线图。 Fig. 1: Simple Plot 多个绘图区域(Multiple subplots in one figure) 多个绘图区域由subplot()函数创建&#xff1a; Fig. 2:…

【小程序】内容滚动方案,视频或者照片上方不随滚动而滚动

&#x1f4ad;&#x1f4ad; ✨&#xff1a;内容滚动方案&#xff0c;视频或者照片上方不随滚动而滚动   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: 优于别人&#xff0c;并不高贵&#xff0c;真正的高贵应该是优于过去的自己。——海明威&#x1f49c;&a…

【图像去噪】基于自适应滤波器消除椒盐噪声图像附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

web前端课程设计(HTML和CSS实现餐饮美食文化网站)静态HTML网页制作

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

论文笔记-时序预测-Informer

论文标题&#xff1a; Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting 论文链接&#xff1a; https://arxiv.org/abs/2012.07436 源码链接&#xff1a; https://github.com/zhouhaoyi/ETDataset 摘要 许多实际应用都需要对长序列时间序列…

游戏开发55课 性能优化12

4.9 带宽优化 带宽优化的目的是减少CPU与GPU之间的数据传输。 4.9.1 LOD&#xff08;Level Of Detail&#xff09; LOD即细节层次&#xff0c;根据物体在画面的大小选用不同级别的资源&#xff0c;以减少渲染和带宽的消耗。LOD在图形渲染中应用广泛&#xff0c;适用的对象有…

au cs6七线阁教程 笔记

01 驱动 asio 02 I 监听 R录音 一般是单声道 03 调整音量声相 04 导出 删除轨道文件 07 删除选区 自定义波形剪辑颜色 录音激活后&#xff0c;监听才能激活 08 自动控制 默认控制音量&#xff1a; 09 效果器&#xff1a; Vst3 dll 插件 独立效果器面板&#xff0c;实时&a…

[附源码]Python计算机毕业设计SSM基于框架预约挂号系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【leetcode】对称二叉树

一、题目描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 二、代码思路 详细题解地址 思路有…

初识Dockerfile

初识Dockerfile Dockerfile 就是用来构建 docker 镜像的构建文件&#xff0c;命令脚本&#xff01; # 创建一个dockerfile文件&#xff0c;建议 Dockerfile # 文件中的内容 指令(大写)FROM centosVOLUME ["volume01","volume02"]CMD echo "-------e…

【总复习】操作系统

操作系统总复习第1章 操作系统引论第2章 进程的描述与控制第3章 处理机调度与死锁第4章 进程同步第5章 存储器管理第6章 虚拟存储器第7章 输入/输出系统第1章 操作系统引论 1、操作系统的概念&#xff08;定义&#xff09; 操作系统&#xff08; Operating System&#xff0c;…

力扣(LeetCode)1691. 堆叠长方体的最大高度(C++)

动态规划 状态计算 : f[i]{cuboids[i][2]if 不存在kmax(f[k])cuboids[i][2]if k∈[1,i−1]f[i] \begin{cases} cuboids[i][2] &\text{if } 不存在k \\ max(f[k])cuboids[i][2] &\text{if } k \in [1,i-1] \end{cases}f[i]{cuboids[i][2]max(f[k])cuboids[i][2]​if 不…

I-02Python自带编辑器IDLE的使用教程

目录 前言 正文 1. 开启行号功能 2. 运行代码&#xff0c;自动保存 3. 放大字体 4. 附常用快捷键 前言 IDLE是在安装python的时候自带的一个编辑器。 拥有基本的python编程的环境&#xff0c; 常用功能点&#xff1a; 代码自动补齐Debug模式python文档 你肯定想说&…

论文笔记-时序预测-Pyraformer

论文标题&#xff1a; Pyraformer: Low-Complexity Pyramidal Attention for Long-Range Time Series Modeling and Forecasting 论文链接&#xff1a; https://openreview.net/pdf?id0EXmFzUn5I 源码链接&#xff1a; https://github.com/alipay/Pyraformer 摘要 根据过去的…

(6)Pytorch常用函数

Pytorch用到的函数 文章目录Pytorch用到的函数1、tensor.eq()和tensor.lt()2、3、torch.pow()4、torch.clamp()5、item()和tolist()说明 1、发现了官方说明文档&#xff0c;使用这一套是最好的&#xff01; 2、in-place操作说明&#xff0c;这是一个要被抛弃的方法&#xff0c;…