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)入手?