食物链

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 72553   Accepted: 21542

Description

动物王国中有三类动物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(1 <= N <= 50,000)和K句话(0 <= K <= 100,000),输出假话的总数。

Input

第一行是两个整数N和K,以一个空格分隔。 
以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。 
若D=1,则表示X和Y是同类。 
若D=2,则表示X吃Y。

Output

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

Sample Input

100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5

Sample Output

3

Source

Noi 01

问题链接:POJ1182 食物链。

题意简述:参见上文。

问题分析:(略)

程序说明

原先写的程序逻辑过于繁琐。

重新写了一个程序,每个角色分成三身,分别是自己、被自己吃的和吃自己的。每一种关系都放入这三种身份中,判断就容易了。

题记:(略)

AC的C++语言程序如下:

/* POJ1182 食物链 */#include <iostream>
#include <stdio.h>using namespace std;const int N = 50000;
int f[N * 3 + 1], cnt;void UFInit(int n)
{for(int i = 1; i <=n; i++)f[i] = i;cnt = n;
}int Find(int a) {return a == f[a] ? a : f[a] = Find(f[a]);
}void Union(int a, int b)
{a = Find(a);b = Find(b);if (a != b) {f[a] = b;cnt--;}
}int main()
{int n, k, d, x, y, ans;scanf("%d%d", &n, &k);UFInit(n * 3);ans = 0;for(int i=1; i<=k; i++) {scanf("%d%d%d", &d, &x, &y);if(x > n || y > n || (d == 2 && x == y)) {ans++;continue;}if(d == 1) {if(Find(n + x) == Find(y) || Find(n * 2 + x) == Find(y)) {ans++;continue;}Union(x, y);Union(n + x, n + y);Union(n * 2 + x, n * 2 + y);} else if(d == 2) {if(Find(x) == Find(y) || Find(n * 2 + x) == Find(y)) {ans++;continue;}Union(x, n * 2 + y);Union(n + x, y);Union(n * 2 + x, n + y);}}printf("%d\n", ans);return 0;
}

AC的C语言程序如下:

/* POJ1182 食物链 */#include <cstdio>
#include <iostream>using namespace std;const int N = 50000;int relation[N+1];  //根点节到点节的关系
int parent[N+1];
void init(int n)
{for(int i = 0; i <= n; ++i) {parent[i]= i;relation[i] = 0;}
}int find(int x)
{if(x != parent[x]) {int temp = parent[x];parent[x] = find(temp);relation[x] = (relation[x] + relation[temp]) % 3;}return parent[x];
}int main()
{int n, k, x, y, d, fx, fy, ans;scanf("%d%d", &n, &k);init(n);ans = 0;for(int i=0; i<k; i++) {scanf("%d%d%d", &d, &x, &y);if(x > n || y > n || (d == 2 && x == y)) {++ans;continue;}fx = find(x);fy = find(y);if(fx == fy) {if(d == 1 && relation[x] != relation[y])++ans;else if(d == 2 && relation[x] != (relation[y] + 2)%3)++ans;} else {parent[fy] = fx;relation[fy] = (relation[x] + (d - 1) + (3 - relation[y])) % 3;}}printf("%d\n", ans);return 0;
}

POJ1182 食物链【并查集】相关推荐

  1. Noi2001食物链-并查集

    Noi2001食物链-并查集 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #incl ...

  2. poj 1182 食物链 并查集

    转自一位大佬的最全题解 https://blog.csdn.net/c0de4fun/article/details/7318642 #include <cstdio> #include ...

  3. POJ 1182 食物链 [并查集 带权并查集 开拓思路]

    传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit  ...

  4. poj 1182 食物链 (并查集)

    http://poj.org/problem?id=1182 重点依旧是用rank记录相对于根节点的关系,并及时跟新rank的值. code: #include<cstdio> using ...

  5. 【poj 1182】食物链 并查集应用

    食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 59239 Accepted: 17332 Description 动物王 ...

  6. poj1182(并查集)

    题目链接 分析:根据分析,关系的递推满足由[a,b]~[b,c]得:[a,c]=([a,b]+[b,c])%3;[a,d]=([a,b]+[b,c]+[c,d])%3.由rank数组表示关系 0 -  ...

  7. POJ1182 食物链---(经典种类并查集)

    题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

  8. 【常用数据结构——并查集(又在乱牵线了)】

    并查集 简介 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中.这一类问题 ...

  9. 并查集/poj1182 noi2001食物链eat

    题意 有三类动物A,B,C,题中给出两种关系: 1 x y :x y 同类 2 x y :x吃y 对于假话的定义: 1.当前的话与前面的某些真的话冲突,就是假话: 2.当前的话中X或Y比N大,就是假话 ...

  10. Bailian1182 POJ1182 食物链【并查集】

    1182:食物链 描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

最新文章

  1. 如何用SPY++工具查看窗体的句柄
  2. 由于应用universal link校验不通过_垃圾吊称重校验砝码2000kg市场行情分析
  3. js实现购物车数量的增加与减少,js实现购物车数量的自增与自减
  4. hibernate数据的三种存在状态(只与事务有关)
  5. centos 7安装配置vsftpd
  6. b树范围查找_使用段树查找最大查询范围
  7. 专访声智科技陈孝良:把自己嫁给公司,伟大都是熬出来的
  8. Android 程序中获取一个反向 Shell
  9. [翻译] ios-image-filters
  10. gameloft java 游戏_每一款JAVA游戏都是经典,但只有四款游戏,是90%玩家从小玩到大...
  11. NumPy学习笔记21. IO
  12. 腾讯、阿里、京东设计的股权激励
  13. MySQL中对索引的理解 特点 优势_深入理解MySQL索引和优化
  14. java软尾山地车评测_GT Sensor X Pro 软尾山地自行车测评
  15. 浪潮之巅--苹果的魔力
  16. 收集广州周边徒步线路
  17. 透视变换(perspective transformation)
  18. 终于修改了EXE的图标罗
  19. 51单片机三线串行驱动12864液晶
  20. c语言中compar的用法,compare的用法

热门文章

  1. Android BaseAdapter应用基础
  2. 人民币决定页游未来——8166网页游戏行业分析
  3. android顶部居中,如何将drawableLeft对齐到顶部,而不是在android TextView中居中?
  4. c++ 一维高斯拟合_χ2检验教案:拟合度检验与正态分布的关系
  5. 天津工业大学19年计算机考研大纲,天津工业大学2019考研《计算机原理及接口技术》复试大纲...
  6. android parcelable 对象,Android实现Parcelable对象序列化的实例
  7. c++ 一个线程执行结束后_告别 | 一个时代的结束:Williams家族将在蒙扎站后挥别Williams车队...
  8. C++小白课本练习1
  9. 力扣-图解算法数据结构-剑指 Offer 05. 替换空格
  10. MySQL 的DDL DML DQL DCL细节解析 知道这些就够了