最大流算法小结

最大流算法小结
   最近在看网络流,把几个常用的算法总结下,正确性的证明和一些理论的东西就不写了,参看算法导论和神牛们的论文,我只写算法的理解和实现模板。

Ford-Fulkerson方法
      每次找增广路,把这条路上的所有点的流量加上这条路上的残余容量,再找新的增广路,直到找不到为止,它有很多种实现方法,下面给出算法导论上的伪代码
ExpandedBlockStart.gif ContractedBlock.gif Ford_Fulkerson( G, s, t ) {
InBlock.gif    
for each edge( u, v )∈E[G]
InBlock.gif        
do    f[u,v]= 0
InBlock.gif            f[v,u]
= 0
InBlock.gif    
while there exists a path p from s to t in the residual network Gf
ExpandedSubBlockStart.gifContractedSubBlock.gif        
do    Cf(p)= min{ Cf(u,v) | (u,v) is in p }
InBlock.gif        
for each edge(u,v) in p
InBlock.gif            
do    f[u,v]+= Cf(p)
InBlock.gif                f[v,u]
= -f[u,v]

Edmonds-Karp算法
      就是用广度优先搜索来实现Ford-Fulkerson方法中对增广路径的计算,时间复杂度为O(VE 2)
      (代码参考NOCOW)
None.gif #define  VMAX 201
None.gif
int  n, m;         // 分别表示图的边数和顶点数
None.gif
int  c[VMAX][VMAX];
ExpandedBlockStart.gifContractedBlock.gif
int  Edmonds_Karp(  int  s,  int  t ) {    //输入源点和汇点
InBlock.gif
    int p, q, queue[VMAX], u, v, pre[VMAX], flow= 0, aug;
ExpandedSubBlockStart.gifContractedSubBlock.gif    
while(true){
InBlock.gif        memset(pre,
-1,sizeof(pre));        //记录父节点
ExpandedSubBlockStart.gifContractedSubBlock.gif
        for( queue[p=q=0]=s; p<=q; p++ ){    //广度优先搜索
InBlock.gif
            u= queue[p];
InBlock.gif            
for( v=0; v<m&&pre[t]<0; v++ )
InBlock.gif                
if( c[u][v]>0 && pre[v]<0 )
InBlock.gif                    pre[v]
=u, queue[++q]=v;
InBlock.gif            
if( pre[t]>=0 )    break;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
if( pre[t]<0 )    break;        //不存在增广路
InBlock.gif
        aug= 0x7fff;    //记录最小残留容量
InBlock.gif
        for( u=pre[v=t]; v!=s; v=u,u=pre[u] )
InBlock.gif            
if(c[u][v]<aug)    aug=c[u][v];
InBlock.gif        
for( u=pre[v=t]; v!=s; v=u,u=pre[u] )
InBlock.gif            c[u][v]
-=aug, c[v][u]+=aug;
InBlock.gif        flow
+= aug;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return flow;
ExpandedBlockEnd.gif}

转载于:https://www.cnblogs.com/ACAC/archive/2010/05/17/1737767.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值