食物链(并查集)
来源:互联网 发布:战列舰 知乎 编辑:程序博客网 时间:2024/06/16 14:41
题目描述
动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B
吃 C,C 吃 A。
现有 N 个动物,以 1 - N 编号。每个动物都是 A,B,C 中的一种,但是我们并不知道
它到底是哪一种。
有人用两种说法对这 N 个动物所构成的食物链关系进行描述:
第一种说法是“1 X Y”,表示 X 和 Y 是同类。
第二种说法是“2 X Y”,表示 X 吃 Y 。
此人对 N 个动物,用上述两种说法,一句接一
句地说出 K 句话,这 K 句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。
• 当前的话与前面的某些真的话冲突,就是假话
• 当前的话中 X 或 Y 比 N 大,就是假话
• 当前的话表示 X 吃 X,就是假话
你的任务是根据给定的 N 和 K 句话,输出假话的总数。
输入输出格式
输入格式:从 eat.in 中输入数据
第一行两个整数,N,K,表示有 N 个动物,K 句话。
第二行开始每行一句话(按照题目要求,见样例)
输出格式:输出到 eat.out 中
一行,一个整数,表示假话的总数。
#include<cstdio>using namespace std;int a[150001];int n,k,d,x,y,ans=0;int find(int x){ if(x!=a[x]) a[x]=find(a[x]); return a[x];}void go(int x,int y){ x=find(x); y=find(y); a[x]=y;}int main(){ scanf("%d %d",&n,&k); for(int i=1;i<=3*n;i++) a[i]=i; for(int i=1;i<=k;i++) { scanf("%d %d %d",&d,&x,&y); if(x>n||y>n) { ans++; continue; } if(d==1) { if(find(x+n)==find(y)||find(x+n*2)==find(y)) { ans++; continue; } go(x,y); go(x+n,y+n); go(x+2*n,y+2*n); } else { if(find(x)==find(y)||find(x+2*n)==find(y)) { ans++; continue; } go(x+n,y); go(y+2*n,x); go(y+n,x+2*n); } } printf("%d",ans);}
阅读全文
0 0
- 并查集(食物链)
- 食物链(并查集)
- 食物链(并查集)
- 食物链(并查集)
- 食物链(并查集)
- 食物链(并查集)
- 食物链(并查集)
- 食物链(并查集)
- 并查集--食物链
- 【并查集】食物链
- 【并查集】食物链
- 【并查集】食物链
- 【并查集】食物链
- 食物链-并查集
- 食物链 并查集
- 食物链 并查集
- 食物链 【并查集】
- 【并查集】食物链
- ubuntu 16.04 LTS
- poj1840——Eqs
- JQuery Validate配合Ajax完成校验
- 封装Retrofit
- git学习笔记
- 食物链(并查集)
- Microsoft Office Visio 2010
- 归并排序的实现
- Java中方法不能重载的三种情况
- 工具类总结(6)-订单生成工具类
- The step of installation of JDK and basic of JAVA(Day 01)
- 网关测试用例 功能测试
- 解析fork函数与vfork函数
- 进度圆