关于最小费用最大流的问题描述,这个ppt讲的很好 https://wenku.baidu.com/view/38c158d4c1c708a1284a44af.html
初始化费用矩阵和链路容量矩阵,费用矩阵中如果两个点之间不相连,则代价为inf,而链路容量矩阵中两个点不直连,则链路容量为0.
然后怎样在迭代中更新费用矩阵,有三条规则:
1、如果某条链路没有任何流量通过,则该条链路的费用不变。
2、如果某条链路上有流量但不饱和,则该条链路原本的前向链路的代价为a的话,则反向添加一条链路,其代价为-a。(例如原本图中是点i到j,费用为a,则现在代价矩阵中添加一条从j到i的链路,代价为-a),具体理解:称i到j为前向链路,j到i为后向链路,这样表明,如果后面继续会从前向链路上增加流量的话,费用会增加a*走过的流量,如果链路一开始走多了,那么要回退,即走后向链路,那么费用会以-a*退的流量而减少。
3、如果某条链路达到饱和,那么原来前向链路的费用为inf(即断开),后向链路的费用为-a,表示已经不能再从前向链路增加流量了,只能从后向退回原来多走的流量。
然后更新完代价矩阵之后,再根据实际走的流量情况更新走的流量矩阵。最终完成迭代,得到最小费用最大流。
附上matlab代码:
function [ f,MinCost,MaxFlow ] = MaxFlowMinCost( a,c,V,s,t )
%% 输入参数列表
% a 单