POJ1182 食物链【并查集】
食物链
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 72553 | Accepted: 21542 |
Description
现有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
以下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
问题链接: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 食物链【并查集】相关推荐
- Noi2001食物链-并查集
Noi2001食物链-并查集 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #incl ...
- poj 1182 食物链 并查集
转自一位大佬的最全题解 https://blog.csdn.net/c0de4fun/article/details/7318642 #include <cstdio> #include ...
- POJ 1182 食物链 [并查集 带权并查集 开拓思路]
传送门 P - 食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit ...
- poj 1182 食物链 (并查集)
http://poj.org/problem?id=1182 重点依旧是用rank记录相对于根节点的关系,并及时跟新rank的值. code: #include<cstdio> using ...
- 【poj 1182】食物链 并查集应用
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 59239 Accepted: 17332 Description 动物王 ...
- poj1182(并查集)
题目链接 分析:根据分析,关系的递推满足由[a,b]~[b,c]得:[a,c]=([a,b]+[b,c])%3;[a,d]=([a,b]+[b,c]+[c,d])%3.由rank数组表示关系 0 - ...
- POJ1182 食物链---(经典种类并查集)
题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
- 【常用数据结构——并查集(又在乱牵线了)】
并查集 简介 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中.这一类问题 ...
- 并查集/poj1182 noi2001食物链eat
题意 有三类动物A,B,C,题中给出两种关系: 1 x y :x y 同类 2 x y :x吃y 对于假话的定义: 1.当前的话与前面的某些真的话冲突,就是假话: 2.当前的话中X或Y比N大,就是假话 ...
- Bailian1182 POJ1182 食物链【并查集】
1182:食物链 描述 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...
最新文章
- 如何用SPY++工具查看窗体的句柄
- 由于应用universal link校验不通过_垃圾吊称重校验砝码2000kg市场行情分析
- js实现购物车数量的增加与减少,js实现购物车数量的自增与自减
- hibernate数据的三种存在状态(只与事务有关)
- centos 7安装配置vsftpd
- b树范围查找_使用段树查找最大查询范围
- 专访声智科技陈孝良:把自己嫁给公司,伟大都是熬出来的
- Android 程序中获取一个反向 Shell
- [翻译] ios-image-filters
- gameloft java 游戏_每一款JAVA游戏都是经典,但只有四款游戏,是90%玩家从小玩到大...
- NumPy学习笔记21. IO
- 腾讯、阿里、京东设计的股权激励
- MySQL中对索引的理解 特点 优势_深入理解MySQL索引和优化
- java软尾山地车评测_GT Sensor X Pro 软尾山地自行车测评
- 浪潮之巅--苹果的魔力
- 收集广州周边徒步线路
- 透视变换(perspective transformation)
- 终于修改了EXE的图标罗
- 51单片机三线串行驱动12864液晶
- c语言中compar的用法,compare的用法
热门文章
- Android BaseAdapter应用基础
- 人民币决定页游未来——8166网页游戏行业分析
- android顶部居中,如何将drawableLeft对齐到顶部,而不是在android TextView中居中?
- c++ 一维高斯拟合_χ2检验教案:拟合度检验与正态分布的关系
- 天津工业大学19年计算机考研大纲,天津工业大学2019考研《计算机原理及接口技术》复试大纲...
- android parcelable 对象,Android实现Parcelable对象序列化的实例
- c++ 一个线程执行结束后_告别 | 一个时代的结束:Williams家族将在蒙扎站后挥别Williams车队...
- C++小白课本练习1
- 力扣-图解算法数据结构-剑指 Offer 05. 替换空格
- MySQL 的DDL DML DQL DCL细节解析 知道这些就够了