usaco4.4

4.4.1 shuttle

 看了样例,就觉得这里面肯定有啥规律,或者要用对称性优化,想了好久不知道怎么写,第一次尝试用bfs, 到中间就跑不动了,尝试利用对称性优化,改来改去越改越糟。看完nocow的题解,感觉快要吐血了,还真是找规律,看来以后还是要相信第一感觉......

 话说这个规律还不知道怎么证明正确性.....

 

4.4.2 pollution control

 求最小割,并输出边数最小(cutn),字典序最小的割集(和为sum)。

 这里用到一个很巧妙的办法,把原来给的边容量重新编码,500000(cup*1001+1)+i; 这样就可以求出边数最小,下标和最小的割集,解码后得到原图的最大流。

 为了得到字典序最小的割集,还要枚举满流边。在求完最大流后每天边上存在流量为exsit[],该边容量为

e[],若exsit[]=e[];则说明该边满流。

 我的办法是每次删掉一条边i(e[]=0),如果此时的最小割集边cutn与原来的差1,sum与原来差i,最大流与原来差e[i],那么这条边就是原最小割集中的边。然后,找到此时的满流边,并认为也是原图的满流边,这里错了! 要真正得到字典序最小的边,还要在原来基础上继续枚举直到把所有的边都找出来.....这里很容易犯错的。

 

4.4.3 frame up

 拓扑排序,只是读取图的信息比较繁琐。起初以为每条边至少会给出一个顶点

  • It is possible to see at least one part of each of the four sides of a frame. A corner is part of two sides.(这句话到底咋翻译啊- -)

用一个自作聪明的办法,从4个方向读取第一个遇到的顶点,最后再更新实际顶点坐标......(只要有一对对角线就可以了) 

被翻译坑了一爹usaco4.4,有一个测试点4个顶点都没有给出来......

 另外,拓扑排序也不懂是神马.....纠结了半天才发现,这货就是按入度大小排序,入度为0的先入序列,并减小以它为起点的边的末端点的入度(好拗口... 就是e[u][v],删除v的入度)。

 要得到特定序列的拓扑排序,可以改变入度为0的点入序列的顺序......

 

 4章完了...这章是最累的,每节的代码都敲了好几种版本- -,有的每种版本都敲了好几遍,囧坏了。

本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

你可能感兴趣的:(USACO)