POJ1182-食物链
2016-04-27 12:52
316 查看
该题有三种动物,我们可以把一个并查集分成三份:x,x+n, x+2n分别表示A,B,C三种动物。
当x与y是同类时,x与y可能是三种动物中的任意一种,则将(x, y)、(x+n, y+n)、(x+2n, y+2n)合并。
当x吃y时,x与y可能是三种捕食关系中的一种,x,y为异类,则合并A吃B(x, y+n)、B吃C(x+n, y+2n)、C吃A(x+2n, y)。
于是,当x,y处于同一个n内表示x,y为同类。
x,y跨过不同的n即表示x吃y。
对逐个语句进行分析时,先判断语句类型。
当语句表示x, y同类时,检查x,y是否为捕食关系。
当语句表示x吃y时,检查x,y是否是同类和x是否能够吃y。
当x与y是同类时,x与y可能是三种动物中的任意一种,则将(x, y)、(x+n, y+n)、(x+2n, y+2n)合并。
当x吃y时,x与y可能是三种捕食关系中的一种,x,y为异类,则合并A吃B(x, y+n)、B吃C(x+n, y+2n)、C吃A(x+2n, y)。
于是,当x,y处于同一个n内表示x,y为同类。
x,y跨过不同的n即表示x吃y。
对逐个语句进行分析时,先判断语句类型。
当语句表示x, y同类时,检查x,y是否为捕食关系。
当语句表示x吃y时,检查x,y是否是同类和x是否能够吃y。
#include <cstdio> const int MAX_N = 5*10e3; const int MAX_K = 10e5; int par[3*MAX_N+5]; int rank[3*MAX_K+5]; int T[MAX_K]; int X[MAX_K]; int Y[MAX_K]; void init(int n) { for (int i = 0; i < n; i++) { par[i] = i; rank[i] = 0; } } int find(int x) { if (par[x] == x) { return x; } else { return par[x] = find(par[x]); } } void unite(int x, int y) { x = find(x); y = find(y); if (x == y) { return; } if (rank[x] < rank[y]) { par[x] = y; } else { par[y] = x; if (rank[x] == rank[y]) { rank[x]++; } } } bool same(int x, int y) { return find(x) == find(y); } int main() { int n, k; scanf("%d%d", &n, &k); for (int i = 0; i < k; i++) { scanf("%d%d%d", &T[i], &X[i], &Y[i]); } init(3 * n); int ans = 0; for (int i = 0; i < k; i++) { int t = T[i]; int x = X[i] - 1; int y = Y[i] - 1; if (x < 0 || n <= x || y < 0 || n <= y) { ans++; continue; } if (t == 1) { if (same(x, y + n) || same(x, y + 2 * n)) { ans++; } else { unite(x, y); unite(x + n, y + n); unite(x + 2 * n, y + 2 * n); } } else { if (same(x, y) || same(x, y + 2 * n)) { ans++; } else { unite(x, y + n); unite(x + n, y + 2 * n); unite(x + 2 * n, y); } } } printf("%d\n", ans); return 0; }
相关文章推荐
- 谷歌chrome浏览器的源码分析(七)
- OC 单例设计
- ajax的原理及实现方式
- c语言学习之数组指针
- 科技公司钟爱的50款开源工具
- Redis+Spring缓存实例(windows环境,附实例源码及详解)
- Java源码解析-BlockingQueue
- light oj 1031(区间dp入门)
- Makefile中使用$$的使用
- POJ 2407 Relatives
- 谷歌chrome浏览器的源码分析(六)
- 转行程序员2 机器学习 线性回归 Linear Regression II 纯属敦促自己学习
- [JZOJ4467][JSOI2016?]无界单词
- PAT:二分查找
- ListView控件的应用
- 多音效播放本地调试OK!打包到android播放不正常
- jQuery上传插件uploadify 3.2.1 参数
- 选择排序
- listView的应用
- zabbix 定义了item 但是差可能这个主机的 Latest data 却始终没有数据