USACO5.4 TSP_背包_网络流拆点
tour 双调TSP&&传纸条模型
题意,给出一个图,从最东边到最西边再返回,求最多经过的城市,除了起始只能经过一次
- 一开始想二分从左到右最多的城市,T
- 而后从左边开始两条路同时搜索,T
DP,状态定义为同时走到
i,j
城市的最大距离[1,1] = 1,f[n,n] = 0(1<n<V),f[j,i] = f[i,j] = max(f[n,j] + 1)
其中j到i有路,最后扫一遍f[v,j]就可以过了.- 因为
f[n,n] = 0
所以不会经过相同的城市
最大费用流
把第i个城市拆分成两个顶点
charrec
题意: 给出a~z的图像,然后给出另外一条图像求出对应字符串
输入文件包含一个或多个可能损坏的字符图案。一个字符图案可能以这些方式被损坏。
- 最多有一行可能被复制了(就接在原来那一行的下面)
- 最多有一行可能丢失了
- 有些“0”可能被改成“1”
- 有些“1”可能被改成“0”
不会有任何一个字符图案既多余了一行并且又丢失了一行。在测试数据的任何一个字符图案中,“0”和“1”的被改变率不超过 30%。
被复制的那一行中,原来的行和多余的行可能都损坏了,而且损坏的部分可能并不相同。
分析:
- dp,先预处理记录第c个字符的第i行与字符串第j行的dis值,再背包就好
- 因为要输出,可以用结构体记录前一个的位置.
- 对于三种不同的扩展每次找三个前卫就好了.
总结:
- 代码打烂了就重打,不要一昧调试凑数据没准还能找到错误地方(没错这题就是这么过的)
- WA很多次的原因是,,对应位置不是从0位开始dp的..
- 算法比赛中可以通过短字母+注释的方法缩短代码长度,减少畏惧心理
网络流拆点
题意:
给出n割点,m条无向边
求分割点a到点b最少+最小割点集合
一开始IDDFS和二分都T在第八个数据
拆点:
- 把每个点拆为
i*2
和i*2+1
,连一条边,权值1 - 原始边添加从
a*2+1
到b*2
和从b*2+1
到a*2
的两条权值为inf
的边 - 然后最大流,,枚举删除点(两个)(因为这里有删除,所以dinic的bfs中条件加一个删除)
- 把每个点拆为
因为没有重新初始化错了(删点后的最大流需要初始化)
for (int i = 2; i <= nume ; i++) { if (i % 2 == 0) { e[i].f += e[i^1].f; }else e[i].f = 0; }
因为空间分配小了错了两次