poj 1182/codevs 1074 食物链
http://poj.org/problem?id=1182
http://codevs.cn/problem/1074/
动物王国中有三类动物 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),输出假话的总数。
第一行是两个整数N和K,以一个空格分隔。
以下K行每行是三个正整数D,X,Y,两数之间用一个空格隔开,其中 D 表示说法的种类。
若D=1,则表示X和Y是同类。
若D=2,则表示X吃Y。
只有一个整数,表示假话的数目。
100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
3
提示
输入文件
对7句话的分析 100 7
1 101 1 假话
2 1 2 真话
2 2 3 真话
2 3 3 假话
1 1 3 假话
2 3 1 真话
1 5 5 真话
NOI 2001 食物链(eat)
某位大神的详细到不能再详细题解:http://blog.csdn.net/c0de4fun/article/details/7318642
我就只简单说说吧
基本思路:加权并查集
第2、3种假话,特判。
第1种:
对于每一个节点,维护2个值,father:它的父节点;
relation:子节点相对于父节点的关系(这句一定要记清楚),0表示同类、1表示被父节点吃、2表示吃父节点
选定0,1,2及其代表含义的原因:
输入x,y,对于y来说
①,题目中给出的d,如果d=1,d-1=0表示同类;如果d=2,d-1=1表示y被x吃
②,子节点相对于父节点的relation=0,那么父节点相对于子节点的relation=(3-0)%3=0,同类;
子节点相对于父节点的relation=1,表示子节点被父节点吃,那么父节点相对于子节点的relation=3-1=2,表示父节点吃子节点;
子节点相对于父节点的relation=2,将上面反过来。
对于每个说法,如果给出的2个节点的父节点不在同一个集合中,就合并2棵子树,如果在同一个集合中,就判断是不是假话。
合并2棵子树:
我们这样定义:
struct node
{
int father,relation;
}r[50001];
第1部分:是y的父节点相对于y的关系。前文中relation的定义是子节点相对于父节点的关系,所以第1部分=(3-r[y].relation)%3
第2部分:是y相对于x的关系。如果d=1,那么第2部分=d-1=0,如果d=2,表示x吃y,d-1=1,y被x吃,那么第2部分=1
第3部分:x相对于x的父节点的关系,即r[x].relation
所以合并时relation更新表达式:r[y.father]].relation=(3-r[y].relation+d-1+r[x].relation)%3
判断是不是假话:
1、如果d=1,表示说法中的x,y是同类,那么如果r[x].relation!=r[y].relation,就是假话
2、如果d=2,表示x吃y,那么y相对于x的关系就是1
b:y相对于y的父节点的值,即r[y].relation
c: x的父节点相对于x的值,即3-r[x].relation
所以判断x吃y的说法是否正确:如果(r[y].relation+3-r[x],relation)%3!=1,就是假话。
最后再说说路径压缩时relation的维护
很明显,x相对于祖先的relation=x相对于x的父节点的relation+x的父节点相对于祖先的relation。
所以路径压缩时,relation的维护:r[x].relation=r[x].relation+r[r[x].father].relation
但这里要注意,直接在代码中写这一行是错误的,因为这一句代码是在查找祖先的递归回溯时完成的,执行这一句时,r[x].father已经被更新成祖先节点,所以要事先记录x在查找祖先节点之前的父节点,用这个值代替代码中的r[x].relation
- #include<cstdio>
- using namespace std;
- int n,k,ans;
- struct node
- {
- int relation,father;
- }e[];
- int d,x,y;
- int find(int i)
- {
- if(e[i].father!=i)
- {
- int tmp=e[i].father;
- e[i].father=find(tmp);
- e[i].relation=(e[i].relation+e[tmp].relation)%;
- }
- return e[i].father;
- }
- int main()
- {
- scanf("%d%d",&n,&k);
- for(int i=;i<=n;i++) e[i].father=i;
- for(int i=;i<=k;i++)
- {
- scanf("%d%d%d",&d,&x,&y);
- if(x>n||y>n) ans++;
- else if(d==&&x==y) ans++;
- else
- {
- int r1=find(x);
- int r2=find(y);
- if(r1!=r2)
- {
- e[r2].father=r1;
- e[r2].relation=(-e[y].relation+(d-)+e[x].relation)%;
- }
- else
- {
- if(d==)
- {
- if(e[x].relation!=e[y].relation) ans++;
- }
- else
- if((e[y].relation+-e[x].relation)%!=) ans++;
- }
- }
- }
- printf("%d",ans);
- }
这道题据说还可以用3个并查集来做
poj 1182/codevs 1074 食物链的更多相关文章
- Codevs 1074 食物链 2001年NOI全国竞赛
1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 动物王国中有三类动物 A,B ...
- COdevs 1074 食物链
1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 动物王国中有三类动物 A,B,C, ...
- POJ 1182 (经典食物链 /并查集扩展)
(參考他人资料) 向量偏移--由"食物链"引发的总结 http://poj.org/problem?id=1182这道食物链题目是并查集的变型.非常久曾经做的一次是水过的,这次 ...
- CODEVS 1074 食物链 2001年NOI全国竞赛(洛谷 P2024)
题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并 ...
- poj 1182:食物链(种类并查集,食物链问题)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44168 Accepted: 12878 Description ...
- POJ 1182 食物链
G - 食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- 食物链 poj 1182
C - 食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- POJ 1182 食物链(种类并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 63592 Accepted: 18670 Description ...
- poj 1182 食物链 (带关系的并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44835 Accepted: 13069 Description 动 ...
随机推荐
- Leetcode题库——8.字符串转为整数【##】
@author: ZZQ @software: PyCharm @file: myAtoi.py @time: 2018/9/20 20:54 要求:实现 atoi,将字符串转为整数. 1)根据需要丢 ...
- CS学习
作者:匿名用户链接:https://www.zhihu.com/question/27368268/answer/36464143来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- 1003 我要通过!| PAT (Basic Level) Practice
1003 我要通过! (20 分) "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的"答案正确"大派送 -- 只要读入的字符串满足下列条件 ...
- Week2-作业1 《构建之法》1、2、16章观后感
这几天阅读了<构建之法>中的几章,受益匪浅,刷新了很多我对软件工程的认知.这本书让我很惊喜,阅读起来不像其他书一样枯燥,有很多人物的设计,以及对话的形式,非常有趣. 第一章.概述 读完第一 ...
- nginx使用“sudo service nginx start”启动报错解决方案
下载nginx的启动脚本: # wget -O init-deb.sh http://library.linode.com/assets/660-init-deb.sh 将脚本添加到init.d目录和 ...
- EasyUi模糊匹配搜索框combobox
现在项目当中很多已经应用了Jquery-easyUi这个界面框架了,所以,学习一点easyUI的常用工具就显得很重要了,现在介绍的就是我在项目中用到的easyUi的模糊匹配组合框combobox. c ...
- 使用keep-alive 实现 页面回退不刷新内容
遇到问题,是从详情页面会到列表页,列表页会刷新.每个不同栏目的列表页面切换也会刷新 用keep-alive 可以缓存页面 <keep-alive><router-view>&l ...
- Python入门:字符串的分片与索引、字符串的方法
这是关于Python的第3篇文章,主要介绍下字符串的分片与索引.字符串的方法. 字符串的分片与索引: 字符串可以用过string[X]来分片与索引.分片,简言之,就是从字符串总拿出一部分,储存在另一个 ...
- 如何在Sql Server 2000中用一条语句实现树的查询
以公司的网站栏目表为例,表结构(表名:Subject)如下: 字段名称 字段类型 字段长度 id int 4 NAME varchar 200 PARENTID int 4 CODE varcha ...
- 解决将easyui里的combobox里的输入框下拉列表变为空值
jQuery easyui官网上有一个方法是 :clear方法,这个方法说是能清除数据,但我测试了,结果它确实清楚了(但他清除的只是输入框显示的数据,没有清除所有的数据),在这里巧妙的用 它加载数据的 ...