Luogu P2024 [NOI2001]食物链 | 并查集
思路:并查集,因为一开始我们并不知道每一只动物是哪一个种类的,所以我们干脆建立三倍于n的空间,1~n这三分之一用来存第i只动物是A的情况,n+1~2n这三分之一用来存第(i-n)只动物是B的情况,2n+1~3n这三分之一用来存这只动物是C的情况。对于每一句话给出的关系,我们并不知道其中的两个动物分别是属于哪一个种类的,所以我们就把每一种情况都处理一遍。当两个属于同一个区间的动物被合并时,就代表它们是同一个种类的;当两个属于不同区间的动物被合并时,就代表作为父节点的那一只动物吃作为子节点的那一只动物。照这样处理每一句真话即可。判断假话时,第2、3种假话是很容易判断的,若是第一种假话就这样判断:如果说的是x与y是同类的话,就判断x有没有和不在同一区间的y合并(这代表x吃y)以及y有没有和不在同一区间的x合并(这代表y吃x),如果有,这就是假话;如果说的是x吃y,就判断x有没有和在同一区间的y合并(这代表x和y是同类)以及y有没有和不在同一区间的x合并(这代表y吃x),如果有,这就是假话。最后输出答案即可。
#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int f[150005];//f[1~n]存动物A,f[n+1~2n]存动物B,f[2n+1~3n]存动物C
int find_(int x)//并查集找祖先函数
{
if(f[x]==x) return x;//找到了祖先就返回祖先是哪一个
return f[x]=find_(f[x]);//路径压缩+查找
}
void merge_(int x,int y)//并查集合并函数
{
int t1=find_(x),t2=find_(y);//找各自的祖先
if(t1!=t2) f[t2]=t1;//如果不在同一个集合内就合并
return;//结束
}
int main()
{
int n=0,k=0,ans=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=n*3;i++) f[i]=i;//并查集初始化
for(int i=1;i<=k;i++)
{
int s=0,x=0,y=0;
scanf("%d%d%d",&s,&x,&y);
if(x>n||y>n||s==2&&x==y) ans++;//判断属于第2、3种情况的假话
else
if(s==1)//如果此句话说的是x和y为同类
//如果前面的话中已经出现x吃y或y吃x的情况,就说明它们不是同类且这一句话是假话
if(find_(x)==find_(y+n)||find_(y)==find_(x+n)) ans++;
else//否则就说明这一句话是真的
{
//考虑3种情况
merge_(x,y);//若它们均为动物A,则合并x,y
merge_(x+n,y+n);//若它们均为动物B,则合并x+n,y+n
merge_(x+n*2,y+n*2);//若它们均为动物B,则合并x+n*2,y+n*2
}
else//如果此句话说的是x吃y
//如果前面的话中已经出现x与y是同类或y吃x的情况,就说明x不吃y且这一句话是假话
if(find_(x)==find_(y)||find_(y)==find_(x+n)) ans++;
else//否则就说明这一句话是真的
{
//考虑3种情况
merge_(x,y+n);//若x为A且y为B,将y+n合并到x下,表示x吃y+n
merge_(x+n,y+n*2);//若x为B且y为C,将y+n*2合并到x+n下,表示x+n吃y+n*2
merge_(x+n*2,y);//若x为C且y为A,将y合并到x+n*2下,表示x+n*2吃y
}
}
printf("%d",ans);//输出
return 0;
}
Luogu P2024 [NOI2001]食物链 | 并查集的更多相关文章
- P2024 [NOI2001]食物链 并查集
题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...
- Luogu P2024 [NOI2001]食物链
并查集 首先先要读懂题目,a是b的食物的话,b的天敌是a,b的食物是a的天敌 比如,人吃鸡,鸡吃草,那么草吃人..... 所以建3个并查集,+n时表示这是其食物,+2*n时表示这是其天敌 所以当x,y ...
- 【题解】P2024 [NOI2001]食物链 - 数据结构 - 并查集
P2024 [NOI2001]食物链 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 动物王国中有三类动物 \(A,B ...
- 洛谷 P2024 [NOI2001]食物链 解题报告
P2024 [NOI2001]食物链 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个 ...
- 编程算法 - 食物链 并查集 代码(C)
食物链 并查集 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有N仅仅动物, 分别编号为1,2,...,N. 全部动物都属于A,B,C中的一种 ...
- [BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增)
[BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增) 题面 有一个n位的十进制数a(无前导0),给出m条限制,每条限制\((l_1,r_1,l_2,r_2)(保证 ...
- P2024 [NOI2001]食物链(种类并查集)
题目链接: https://www.luogu.org/problemnew/show/P2024 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 ...
- 种族并查集模板题分析 -----P2024 [NOI2001]食物链
本文参考了:洛谷p2024题解 题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都 ...
- 洛谷 P2024 [NOI2001]食物链——带权值的并查集维护
先上一波题目 https://www.luogu.org/problem/P2024 通过这道题复习了一波并查集,学习了一波带权值操作 首先我们观察到 所有的环都是以A->B->C-> ...
随机推荐
- JetBrains 系列软件汉化包 2017.3-2018.1
JetBrains 系列软件汉化包 关键字: Android Studio 3.0-3.1.3 汉化包 CLion 2018.1-2018.2 汉化包 GoLand 2017.3.2-2018.2 汉 ...
- Java跨平台原理(字节码文件,虚拟机)
介绍 C/C++语言都直接编译成针对特定平台机器码.如果要跨平台,需要使用相应的编译器重新编译. Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机 ...
- 【PHP数据结构】栈和队列的应用
通过栈和队列的学习,我们似乎会感觉到其实数据结构还是非常简单的嘛.当然,这只是一个开始,我们从顺序表.链表开始,到现在的栈和队列,其实都是为了将来在铺路.在树和图的遍历算法中,都可以见到栈和队列的身影 ...
- centos7.6,nginx1.18,php-7.4.6,mysql-5.7.30 安装
#1.下载,来自各官网 nginx-1.18.0.tar.gz php-7.4.6.tar.gz mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz #下载到本地再传 ...
- 启动docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
启动docker提示: docker: Got permission denied while trying to connect to the Docker daemon socket at uni ...
- greedy algorithm, insertion sort, quick sort
always makes the choice that seems to be the best at that moment. Example #1: @function: scheduling ...
- nginx 配置文件(支持thnkphp3.2~5)
server { listen 8080 ; server_name localhost; set $root /var/www/myweb; #listen 443 ssl; #ssl_certif ...
- disruptor笔记之五:事件消费实战
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 请求既有multipartFile,也有实体的解决方案
上回书我们说到,我们在发文件上传请求的时候,携带数据 this.fileData.append('trainName', this.dataModel.trainName); // 添加培训名称 然后 ...
- 实时渲染基础(4)纹理(Texture)
目录 纹理映射(Texture Mapping) 球形贴图(Spherical Map) 立方体贴图(Cube Map) 纹理走样问题 Mipmap 各向异性过滤(Ripmap) 纹理应用技术(Tex ...