【坚持不能偷懒】
网络流这块有点懵逼,所以一起搞一下
最小费用最大流,下面介绍的是常规做法,比较裸
思路是:
记Flow为剩余流量,Cost为单位流量价格,S为源点,T为汇点
每次在【剩余图】中增广一条【最小单位流量费用】的增广路
怎么做到呢,凡是Flow不为0,表示一条路可以走
然后我们找一条S到T的(可以走的,最小Cost和的路)
那么从S到T的【单位流量消耗】是最小的
然后,看看这条路能提供多少流量
找这条路就很easy了,直接把Cost当作距离,Flow不为0作为是否存在路径
跑一发最短路,通常用的是SPFA跑
建图就是
正向边的流量为 flow 单价为 cost
反向边的流量为 0 单价为 - cost
PS:裸的SPFA遇到负环会懵逼,但网上套板子过了到题,好像没管
POJ 2135
N点M边,无向非完全图,边上有权重(代价)
问从N走到M再回来,一条边最多走一次的最小代价
解:
建一个S到1,flow = 2 cost = 1
建一个N到T,flow = 2 cost = 1
然后对于 from to cost 的无向边
建 from to flow = 1 cost
和 to from flow = 1 cost 的两条边
这样跑出来的最大流就是结果
http://blog.csdn.net/stillxjy/article/details/52047189
模板参考如上blog
注意的是,初始化的时候,点数因为要加上自己做的大源点和大汇点
初始化的n是n+2,不然跑不出来……(这是血泪的教训)
——————————待补全———————————
1、SPFA跑负环会炸毛么
2、路径怎么搞出来
3、算法复杂度和优化