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-> ...
随机推荐
- Django学习day02随堂笔记
每日测验 """ 今日考题 1.谈谈你对web框架的认识,简述web框架请求流程 2.python三大主流web框架的区别 3.安装django需要注意的事项有哪些(最少 ...
- 学习PDO中的错误与错误处理模式
在 PDO 的学习过程中,我们经常会在使用事务的时候加上 try...catch 来进行事务的回滚操作,但是大家有没有注意到默认情况下 PDO 是如何处理错误语句导致的数据库操作失败问题呢?今天,我们 ...
- 小学生都能读懂的网络协议之:WebSocket
目录 简介 webSocket vs HTTP HTTP upgrade header websocket的优点 webScoket的应用 websocket的握手流程 WebSocket API 总 ...
- css 参考手册 部署到本地
* 到css参考手册网站 http://css.doyoe.com/ 下载chm手册 * 到github下载对应的html页面 cd /Applications/XAMPP/htdocs git cl ...
- jmeter加密解密(解密篇)
上一篇已经讲解了公钥加密,这篇讲解公钥解密.解密比较简单,直接操作吧. 需求是:接口中的请求体的部分参数需要先加密再请求,返回的结果中部分字段需解密. 1.在请求下新建beanshell后置处理程序, ...
- 软件开发的V模型
原文来自:http://www.51testing.com/html/67/n-3723567.html 软件开发的V模型大家都不陌生,其中测试阶段分为单元测试->功能测试->系统测试-& ...
- solidity 错误
solidity版本 0.7.5 Member "transfer" not found or not visible after argument-dependent looku ...
- 不关闭selinux下配置php+httpd访问KingbaseES
在不关闭selinux的情况下使httpd+php+KingbaseES正常使用1.正常设置php.apache 除了正常流程外还需要在/etc/sysconfig/httpd最后追加LD_LIBRA ...
- 51nod1600-Simple KMP【SAM,树链剖分】
正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1600 题目大意 给出一个字符串\(s\),每次在最后插入一个字符后求它的 ...
- P2150-[NOI2015]寿司晚宴【dp】
正题 题目链接:https://www.luogu.com.cn/problem/P2150 题目大意 将\(2\sim n\)选出一些分成两个集合,要求这两个集合中没有一对数不是互质的.求方案数对\ ...