昨天写bzoj2324的解题报告的时候突然隐隐约约发现了我程序的一点问题
睡了一觉之后找到了反例
如下:
4 4 2
0 1 2
1 2 1
2 3 2
2 4 2
对于这个测试数据,显然最短路径和为
1个人呆在0点,1个人从走0—1—2—3—2—4
最短路径和为0+9=9
但实际我跑出的结果为10
为什么呢?因为最小费用最大流是在最大流的前提下求最小费用
对于这个图,最大流为2,那么跑完第一个流1之后,下一个流还要再流
也就是说,对于多余人,会影响最后的结果。
怎么处理呢?朴素的方法是,穷举人数,然后找出最小的路径和
考虑到k<=10,应该是不会TLE的
但有没有跟简单的方法呢?
我曾经考虑了两种方法
1. 当每个点都被访问之后就直接退,但事实上(也许是水平不够实现的问题),这个连样例都过不了
打印一下过程
运行了两次5 -2
这突然让我想到了背模板时一直不理解的问题:费用流的反向弧负费用是干什么的?
2. 正确的方法应该是不断费用流,直到产生了正权费用,这时候说明所有极小边都走过了,于是就可以直接退出增广了