算法导论 26章 最大流(一)

最大流问题
为了求一点到另一点的最短距离,我们可以把公路地图模型化为有向图。同理,我们可以将公路模型化为一个“流网络”(flow network),并运用它来解决物流相关的问题。其中最大流问题是其中一种,即:在不违背每条路(即有向图的边)的容量的情况下,可以把物质从源点送到汇点的最大速率是多少。

最大流定义和性质
流网络是一个有向图G=(V,E),其中每条边(u,v)均有一个容量c(u,v) >= 0;如果边c(u,v)不属于E,则c(u,v) = 0.流网络一般只有两个顶点:源点s和汇点t。
对于流网络G = (V,E),容量函数为c,流函数为f。该网络满足下述三个性质:
1. 容量限制:对于所有的u,v属于E,f(u,v) <= c(u,v);
2. 反对称性: 对于所有的u,v属于E,f(u,v) = -f(v,u);
3. 流守恒性:对于所有的u属于V-{s,t},有:
这里写图片描述

从一个顶点u到另一个顶点v的流f的值为f(u,v),可正可负亦可为0。对于源点s来说,从它出发的流即为整个流网络的总流,它的值为:![这里写图片描述](https://img-blog.csdn.net/20150322153643828) 而对于最大流问题,就是希望找出从源点s到汇点t的最大值流。

最大流的例子
这里写图片描述
如上图,是一个流网络,其中对于边的数值,左边为该边上的流值,右边是改变允许通过的最大流值,即容量。可以看出最大流的值为23,可以通过累加源点的输出总流或者汇点的输入总流获得。

Ford-Fulkerson方法解决最大流问题
1、残留网络。
给定一个流网络G=(V,E)和流f,在输入流f后G的残留网络为Gf = (V,Ef),其中:
这里写图片描述,即由所有剩下的容量大于0的边所组成。如下图a是从源点s输入流11和8后得到的残留网络b。
这里写图片描述
其中,最初的原图G也是最初的残留网络。b中的粗线表示一条增广路径。
2、增广路径。
增广路径是用Ford-Fulkerson解决最大流问题的关键。增广路径p是残留网络Gf中,从源点s到汇点t的一条简单路径,该路径的每条边的容量都大于0,这意味我们可以通过这条路径继续输入流。
由此我们可以得到用Ford-Fulkerson方法求取最大流问题的算法了,如下:
1、在Gf中找到一条增广路径,求取该条路径的最小容量:这里写图片描述
2、更新该条路径上所有边(u,v)的容量c(u,v)和f(u,v),同时还需要更新c(v,u)和f(v,u);
3、循环1和2直到残留网络中不再有增广路径了;

用伪代码表示如下:

Ford - Fulkerson(G, s, t)
{
    for each edge(u, v) in E[G]
    {
        f[u, v] = 0;
        f[v, u] = 0;
    }
    while (there exists an augmenting path p)
    {
        cf(p) = min{ cf(u, v) :(u, v) is in p };
        for each edge(u, v) in p
        {
            f[u, v] = f[u, v] + cf(p);
            f[v, u] = -f[u, v];
            cf(u, v) = cf(u, v) - cf(p);
            cf(v, u) = -f[v, u];
        }
    }
}

根据以上算法,可以看出,唯一未解之处在于如何寻找该增广路径。根据寻找增广路径所使用的算法的不同,可以得到具体不同的算法。如果我们运用广度优先搜索来遍历整个Gf依次判断是否还存在增广路径,这种算法被称为Edmonds-Karp算法。

多源点多汇点最大

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值