最大流量问题涉及通过最大单源,单汇流量网络找到可行流量。
让我们来一张图像来解释上面的定义要怎么说。
每个边缘都标有容量,即可以携带的最大物品数量。目的是弄清楚可以从顶点s(源)向顶点t(sink)推送多少填充物。
。
可能的最大流量是: 23
以下是解决问题的不同方法:
1.幼稚的贪婪算法方法(可能不会产生最佳或正确的结果)
解决最大流量问题的贪婪方法是从全零流量开始,然后贪婪地产生具有更高价值的流量。从一个到下一个的自然方法是在从s到t的某个路径上发送更多的流
贪婪方法如何找到最大流量:
E number of edge
f(e) flow of edge
C(e) capacity of edge
1) Initialize : max_flow = 0
f(e) = 0 for every edge 'e' in E
2) Repeat search for an s-t path P while it exists.
a) Find if there is a path from s to t using BFS
or DFS. A path exists if f(e) < C(e) for
every edge e on the path.
b) If no path found, return max_flow.
c) Else find minimum edge value for path P
// Our flow is limited by least remaining
// capacity edge on path P.
(i) flow = min(C(e)- f(e)) for path P ]
max_flow += flow
(ii) For all edge e of path increment flow
f(e) += flow
3) Return max_flow
注意,路径搜索仅需要确定在边e的子图中f(e) 2.残图 这个想法是通过允许“撤消”操作来扩展幼稚贪婪算法。例如,从该算法卡在上方图像的角度出发,我们想沿着边缘(s,2)路由两个更多的流单位,然后沿着边缘(1、2)向后路由,撤消两个我们路由了3个单元,进行了先前的迭代,最后沿边缘(1,t) 我们需要一种正式指定允许的“撤消”操作的方法。这激发了以下简单但重要的残差网络定义。这个想法是,给定一个图G和其中的流f,我们形成一个新的流网络G f ,该流网络G具有相同的顶点集G,并且每个G边缘都有两个边。边e =(1, 2)承载流量f(e)并具有容量C(e)的G(对于上图)产生具有容量C(e)-f(e)(剩余空间)的G f的“前缘”和a G f的“后边缘”(2,1),容量为f(e)(可以撤消的先前路由的流量)。通过纯朴素的贪婪算法搜索的所有边缘的f(e) 残余图的思想用于福特-富尔克森和狄尼克斯算法 来源 :
从源(s)到接收器(t)有一条路径[s-> 1-> 2-> t],最大流量为3单位(路径显示为蓝色)
从图形中删除所有无用的边缘后,它看起来像
对于上图,没有从源到接收器的路径,因此最大流量为3个单位,但最大流量为5个单位。为了解决这个问题,我们使用残差图。
后边缘:(f(e))和前边缘:(C(e)– f(e))
http://theory.stanford.edu/~tim/w16/l/l1.pdf