最小费用流的变形,这题边上的权值为a*f^2,a为已知系数,f为流值
一开始的想法是,用spfa进行最小权值增广时,判断条件为 dis[j]>dis[i]+a*(2*f+1),wa了(2*f+1=(f+1)^2-f^2)
后来注意到每条边上的容量c<=5,想到可以把一条边拆成c条容量为1的边,边权一次为a,3a,5a...(2*c-1)a
今天又想了想,终于发现昨天那个判断条件哪里错了,错在如果产生回流的情况,a为负值,f也为负值,dis值的增量应为 -a*(2*f+1),修改后AC了,速度还快了一倍
自己出的数据不够强,没有出现回流的情况
总结:设计网络流方面的算法时,一定要注意回流的情况!还有就是重边!
另外,最小费用流解决问题时,如果因为流值不同会导致单位流量的费用不同,可以将边进行拆分,将单位流量相同的流量拆成一条边
POJ3422也运用到了拆边的思想,可惜当时构图方法是看的别人的,没有从本质上理解
代码:(注释部分为拆边的代码)