打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【每日算法】基础算法——食物链(三十二)

题目内容

动物王国中有三类动物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句话有的是真的,有的是假的。

当一句话满足下列三条之一时,这句话就是假话,否则就是真话。

1) 当前的话与前面的某些真的话冲突,就是假话;

2) 当前的话中X或Y比N大,就是假话;

3) 当前的话表示X吃X,就是假话。

你的任务是根据给定的N和K句话,输出假话的总数。

输入格式

第一行是两个整数N和K,以一个空格分隔。

以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。

若D=1,则表示X和Y是同类。

若D=2,则表示X吃Y。

输出格式

只有一个整数,表示假话的数目。

数据范围

1≤N≤50000 ,

0≤K≤100000

输入样例

100 7

1 101 1

2 1 2

2 2 3

2 3 3

1 1 3

2 3 1

1 5 5

输出样例

3

题解

这里因为只有三种动物,且三种动物是一个环链式被吃的结构。因此,可以构造一个树形结构,来对三个种类的动物的被吃关系进行界定。假设根节点为某一个动物,可以通过与根节点之间的距离,或者用距离进行模运算的结果来作为被吃的判断依据。比如当与根节点距离模的余数为1的点是可以吃根节点的,那么余数为2的点是可以被根节点吃掉的,余数为0的点是与根节点是同类动物。

代码

#include<iostream>using namespace std;
const int N = 50010;
int n,m;int p[N],d[N];
int find(int x){ if(p[x]!=x){ int t = find(p[x]); d[x]+=d[p[x]]; p[x] = t; } return p[x];}
int main(){ scanf('%d%d',&n,&m); for(int i = 1;i<=n;i++) p[i] = i; int res = 0; while(m--){ int t,x,y; scanf('%d%d%d',&t,&x,&y); if(x > n || y > n){ res++; } else{ int px = find(x),py = find(y); if(t == 1 ){ if(px==py && (d[x]-d[y])%3) res++; else if(px != py){ p[px] = py; d[px] = d[y]-d[x]; } }else{ if(px == py && (d[x]-d[y]-1)%3)res++; else if(px!=py){ p[px]=py; d[px] = d[y] + 1 -d[x]; } } } } printf('%d\n',res); return 0;}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
A* 寻路算法
『算法原理』绘制&填充几何图形 – Easy Graphics Engine
flash动画制作实例:打造粒子烟花效果
Huffman算法相关
按键精灵平滑移动
判断直线是否相交
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服