POJ-1182 食物链 并查集(互相关联的并查集写法)
题目链接:https://cn.vjudge.net/problem/POJ-1182
题意
中文题目,就不写了哈哈
动物王国中有三类动物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),输出假话的总数。
思路
思路有二
- 把某一动物转化为三个并查集
一个集合为同类,一个是食物,一个是天敌
这样来说更容易管理,也就更好写
插入数据:
按照同类食物和天敌的集合合并即可
注意a+n代表a元素的敌人;a+2×n代表a元素的食物
find(a)find(b+n)意思是b的敌人在a的集合里 -> a类是b的敌人
find(a+n)find(b+2*n)意思是b的食物在a敌人的集合里 -> a的敌人类是b的食物类
检查数据:
然而这样来说内存就是一个大问题了
现在来算一下吧,最大内存问题
\]
看来没什么问题,一开始忘了算了,直接去了思路二,痛苦不堪
2. 一个动物是一个并查集
把根节点做一个标志,标志比其他的大就算是捕食者,取模即可
然而不好写,半途改变思想了
代码
#include <cstdio>
const int MAX=int(5e4);
struct Node{
int parent, rank;
Node(int parent=0, int rank=1):
parent(parent),rank(rank) {}
}node[3*MAX+5];
int find(int x){
return (x==node[x].parent)?x:(node[x].parent=find(node[x].parent));
}
void join(int a, int b){
a=find(a); b=find(b);
if (a==b) return;
if (node[a].rank==node[b].rank) node[a].rank++;
if (node[a].rank>node[b].rank) node[b].parent=a;
else node[a].parent=b;
}
int main(void){
int ans=0, n, m, oper[3];
scanf("%d%d", &n, &m);
for (int i=1; i<=3*n; i++) node[i]=Node(i);
for (int snt=0; snt<m; snt++){
scanf("%d%d%d", &oper[0], &oper[1], &oper[2]);
if (oper[1]>n || oper[2]>n) {ans++; continue;}
if (oper[0]==2 && oper[1]==oper[2]) {ans++; continue;}
// self-0*n, eater-1*n, food-2*n
if (oper[0]==1){
// if (vis[oper[1]] && vis[oper[2]] && find(oper[1])!=find(oper[2])) {ans++; continue;}
if (find(oper[1])==find(oper[2]+n) || find(oper[1])==find(oper[2]+2*n)){ans++; continue;}
join(oper[1], oper[2]);
join(oper[1]+n, oper[2]+n);
join(oper[1]+2*n, oper[2]+2*n);
}else if (oper[0]==2){
if (find(oper[1])==find(oper[2]) || find(oper[1])==find(oper[2]+2*n)){ans++; continue;}
join(oper[1], oper[2]+n);
join(oper[1]+n, oper[2]+2*n);
join(oper[1]+2*n, oper[2]);
}
}printf("%d\n", ans);
return 0;
}
Time | Memory | Length | Lang | Submitted |
---|---|---|---|---|
282ms | 1528kB | 1489 | G++ | 2018-02-16 16:28:58 |
> 03-18 Update: 又写了一边题,发现并没有理解解法。重新思考,把要点详细说明一下
POJ-1182 食物链 并查集(互相关联的并查集写法)的更多相关文章
- poj 1182 食物链 && nyoj 207(种类并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 52414 Accepted: 15346 Description ...
- poj 1182 食物链 (带关系的并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44835 Accepted: 13069 Description 动 ...
- poj 1182:食物链(种类并查集,食物链问题)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44168 Accepted: 12878 Description ...
- POJ 1182 食物链(种类并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 63592 Accepted: 18670 Description ...
- POJ 1182 食物链 [并查集 带权并查集 开拓思路]
传送门 P - 食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit ...
- poj 1182 食物链 并查集 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=1182 题解 可以考虑使用并查集解决 但是并不是简单的记录是否同一组的这般使用 每个动物都有三个并查集 自己 天敌 捕食 并查集 那么在获得 ...
- POJ 1182 食物链(经典带权并查集 向量思维模式 很重要)
传送门: http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
- POJ 1182——食物链——————【种类并查集】
食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status P ...
- POJ 1182 食物链
G - 食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- poj 1182 食物链 (并查集)
http://poj.org/problem?id=1182 关于并查集 很好的一道题,开始也看了一直没懂.这次是因为<挑战程序设计竞赛>书上有讲解看了几遍终于懂了.是一种很好的思路,跟网 ...
随机推荐
- SSIS获取Oracle数据库数据
获取Oracle数据库步骤如下: 1.目标服务器获取连接Oracle数据库权限2.安装Oracle客户端,名称为win32_11gR2_client 安装管理员版本的.3.将配置文件tnsnames. ...
- springMVC下ajax获取后台参数直接走错误或者报406错误问题解决
直接走错误: 返回的结果是否json化,直接返回非字符串的结果会走ajax的error函数. 报406错误: 我在学习springmvc过程中(我的项目是配置的后缀是.html),从controlle ...
- 网页字体助手 WebFont Helper
网页字体助手 是 Windows 平台离线的网页字体生成辅助工具.核心功能,采用 python 编写. WebFont Helper 功能特色 生成字体子集(即提取用到的字符生成字体,或者大家所说的字 ...
- javascipt入门
一.javascript简介 javascript:(基于对象的编程语言:内部很多对象,我们只需要使用即可,几乎不需要自己创建对象) ECMAScript DOM BOM 存放位置: 建议代码放到ht ...
- 3ds Max修改桌面快捷方式为中文语言
通过上篇教程的学习,我们已经会切换3ds Max 2018的界面语言了,相关内容可参阅3ds Max如何设置中文界面.但是如果每次都要从开始菜单进行操作,岂不麻烦?简单一点,可以在桌面添加3ds Ma ...
- 小型ceph集群的搭建
了解ceph DFS(distributed file system)分布式存储系统,指文件系统管理的物理存储资源,不一定直接连接在本地节点上,而是通过计算机网络与节点相连,众多类别中,ceph是当下 ...
- Visual Studio中C++工程的环境配置方法
在Visual Studio的C++工程设置 1.添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录. 2.添加文件引用的lib静态库路径:工程---属性- ...
- TypeError: Cannot use 'in' operator to search for 'length' in....
前台页面读取商品属性是字符串形式,数据库中存储商品属性是集合形式,前台数据存入数据库中数据格式会自动转,后台数据回显到前台数据格式需要手动转换,否则会报异常 错误信息提示:
- 关于python return 和 print 的区别
概念上一个是 返回值 一个是打印输出 区别一:return是结束语一般放在函数的最后,当你在return 结束后面再写一些东西是不执行的如 下 def renshu(x,y): h=x+y pri ...
- Linux Kernel 5.1 RC5发布
我们距离正式的Linux 5.1内核发布还有不到一个月的时间,而今天Linus Torvalds宣布推出预期的Linux Kernel 5.1 RC5版本.Linus Torvalds专门评论了Lin ...