最小费用最大流问题

博客介绍了最小费用最大流的定义,即求网络G的最大流f且使费用b(f)最小。算法思想是用Ford - Fulkerson算法思想,在残留网络中找以单位流量费用为权的最短路作为增广路操作,因费用有负值建议用SPFA算法,还给出了POJ 2516解题报告示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、定义与定理
      最小费用最大流:设G是以s为源t为汇的网络,c是G的容量,b是G的单位流量费用,且有b[i][j] = -b[i][j],f是G的流,则b(f)=∑(fij*bij),(i, j)∈E(G) 且fij>0。最小费用最大流问题,就是求网络G的最大流f且使费用b(f)最小。这样的流称为最小费用最大流。
二、算法思想
      用Ford-Fulkerson算法的思想,不断地在残留网络中寻找增广路,只不过这个增广路是当前网络中s到t的以单位流量费用为权的最短路,对这条增广路进行操作。由于费用有负值,建议用SPFA算法。

三、算法介绍
      描述:

      实现:

 

 

 1 None.gif mcmf()
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gif    while(true)
 4ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 5InBlock.gif        for(int i=1; i<=n+m+1; i++)
 6InBlock.gif            d[i] = MAX;
 7InBlock.gif        d[s] = 0;
 8InBlock.gif        spfa(); //p中存有该点的前继点
 9InBlock.gif        if(p[t] == -1//表示已无增广路
10InBlock.gif            break;
11InBlock.gif        int minf = INT_MAX;
12InBlock.gif        int it = t;
13InBlock.gif        while(p[it] != -1)
14ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
15InBlock.gif            minf = min(minf, c[p[it]][it] - f[p[it]][it]);
16InBlock.gif            it = p[it];
17ExpandedSubBlockEnd.gif        }

18InBlock.gif        it = t;
19InBlock.gif        while(p[it] != -1)
20ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
21InBlock.gif            f[p[it]][it] += minf;
22InBlock.gif            f[it][p[it]] = -f[p[it]][it];
23InBlock.gif            it = p[it];
24ExpandedSubBlockEnd.gif        }

25ExpandedSubBlockEnd.gif    }

26ExpandedBlockEnd.gif}


三、算法示例
      POJ 2516 解题报告

转载于:https://www.cnblogs.com/ACAC/archive/2010/05/21/1741175.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值