POJ1182食物链
来源:互联网 发布:npm 淘宝镜像安装教程 编辑:程序博客网 时间:2024/06/05 07:46
都是坑啊,谁说的一定要自己想怎么写,不要一上来就看答案的,我脑子抽筋写了一下午这个题,看书上解答有一种浪费了十年寿命的快感。
这是后来分析解答时的笔记:
同一行代表同一种生物,上一行吃下一行的
1 2
3
xy(xa_ya xb_yb xc_yc), x-z(xa-zb, xb-zc, xc-za),
=[xa_ya_zb, xb_yb_zc, xc_yc_za]//卧槽厉害,这样就已经把12,1-3这种该合并的都合并了
不连贯的呢?
x m
y n
z
x-y-z(xa_yb_zc xb_yc_za xc_ya_zb), m-n(ma_nb mb_nc mc_na),
之后比如n-z()无论怎么搞,一开始连在一起的就相当于一个点,合并时候根本不用考虑其他复杂的吃和同类的操作了。所以接下来只要讨论最简单的跨行数的问题了
1
2
3
4
显然,多一行并没有多了什么幺蛾子,还是搜easy
代码有心情再写。
为了纪念我愚蠢的思考经历,我将看解答之前的思路贴上来了,如果你只是为了看笑话的话可以继续,以下和题基本无关了23333:
map中需要有吃和被吃两项记录吗?
如果只记录吃的关系,除了第三个例子要看,其他的不用看,那是个人思考走的弯路
1.例如1和3是同类,1吃2,则 map[1]=2, {
更新2吃3这个错误信息的时候,
find(2)=2, find(3)=1, map.find(f3)=2 == find(2), false
更新3吃2这个正确信息的时候,
find(3)=1, find(2)=2, map.find(f2)=2 != find(3), true
}
2.例如1吃2,map[1]=2, 2和3是同类,{
更新3吃1这个错误信息的时候,
find(3)=2, find(1)=1, map.find(f1)=2 == find(3), false
更新1吃3这个正确信息的时候,
find(1)=1, find(3)=2, map.find(f3)=E != find(1), true
}
3.1吃2,map[1]=2,2吃3,map[2]=3,{//所以3吃1
更新1和3是同类 错误信息:
find(1)=1, find(3)=3, map.find(f1)=2 != find(3), map.find(f3)=E != find(1), true ERROR!!!!!!!!!!!!!!!!!!!!!!!
}
4.1吃3,2吃3,//更新复杂度太高,需要全部遍历一遍?
5.1吃2,1吃3,//是否更新2和3为同类?需要先判断冲突,但 //1和2同类,1吃3,不用更新2吃3,只要find判断就好了
出现了ERROR,所以必须记录吃和被吃关系,map<int, pair<int, int>>是不是可取的?拿同类更新来说,
当前类型为2的时候,需要初始化两个map数据(因为两个值在后面都有可能用来查找):保证另一个值为-1。
有几类冲突?
只有一类物种:只有同类的关系
1等于2:1吃2
两类物种:必然有吃的关系,就看吃的群体多还是被吃的群体多
1-2: 12,2-1
1-2,1-3: 2-3,3-2
1-3,2-3: 1-2,2-1
三类物种:
上面这种方法太烦了,改从解决问题的方面分类:
(键是一定要更新的(12,2-3=1?3),值呢:更新(1-3,23=1?3 23的时候(假设已经判断完冲突要开始unite了)unite完之后要进行map中map[2]和map[3]的合并,
更新23,若2-4,3-5,有必要4和5合并吗,这个递归直到pair<-1,-1>才会停?如果不进行合并呢?
1
2 3
4
5
if (map<int, pair<eat, eaten>>){//
if (2 == f2) map[2]=map[3]; else map[3]=map[2];
}else if (eat<int, int>, eaten<int, int>){
}
find(2)map[f2]=3)?1-3,2-3=1?2)
[不论更新操作是同类还是吃的关系,都会先find(x)的,毕竟同类更新操作只比吃更新 有可能少判断一个 是否是同类的判断:find(x)==find(y)?,
但是,后面要进行捕食关系判断,就必须有find(x)操作,所以上面说的那种少一个 是否是同类的判断 是完全没有必要甚至会增加时间消耗的。]
1.更新操作是同类,冲突就看他们之间是否有捕食关系。x和y为例,因为一旦存在捕食关系必有x-y或者y-x,所以应该不用再map.find(y)了吧?
首先从直接map.find(x)入手,(2-3代表2吃3,12代表1和2是同类)
如果x之前是因为和某个捕食者的同类关系引入的话,12 34 2-3 = 1?4
1 2 (同行代表都是一类物种)
3 4
若引入的时候更新map,
若引入的时候不更新map,
如果x之前是因为捕食关系引入的话,
1-2 23 = 1?3
1
2 3
1-2 1-3 = 2?3
或者从map.find(y)入手?
- POJ1182 食物链
- POJ1182食物链
- poj1182 食物链
- POJ1182--食物链
- poj1182-食物链
- poj1182 食物链
- poj1182 食物链
- POJ1182食物链
- poj1182 食物链
- POJ1182食物链
- POJ1182食物链
- POJ1182 食物链
- POJ1182:食物链
- poj1182食物链
- POJ1182 食物链
- poj1182 食物链
- POJ1182--食物链
- POJ1182 食物链
- C++Regex库安装小结
- PAT乙级1012. 数字分类 (20)
- C语言基础-itoa和atoi函数的使用和自己实现
- 硬币问题(经典dp)
- C++Lambda表达式详解
- POJ1182食物链
- 安装mysql
- 【hpu oj 1019 985的买饮料难题 [数学、DP]】
- POJ2502 subway(spfa)
- <8>——String to Integer (atoi)
- CodeForces 118 A.String Task(水~)
- codeforces815aKarenAndGames解题报告
- C++的Lambda表达式
- 详解C++11的Lambda表达式