最大流问题
为了求一点到另一点的最短距离,我们可以把公路地图模型化为有向图。同理,我们可以将公路模型化为一个“流网络”(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算法。
多源点多汇点最大