最大流问题涉及通过最大的单源、单汇流网络找到可行的流。
我们用一张图来解释一下上面的定义想表达的意思。
每条边都标有容量,即它可以携带的最大物品量。目标是弄清楚有多少东西可以从顶点 s(source) 推送到顶点 t(sink)。
.
可能的最大流量为: 23
以下是解决问题的不同方法:
1. Naive Greedy Algorithm Approach(可能不会产生最优或正确的结果)
最大流问题的贪婪方法是从全零流开始,贪婪地产生具有更高价值的流。从一个到下一个进行的自然方式是在从 s 到 t 的某个路径上发送更多流量
Greedy 方法如何找到最大流量:
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) 向后路由,撤消 2我们路由前一次迭代的 3 个单元,最后沿着边 (1,t) 我们需要一种正式指定允许的“撤消”操作的方法。这激发了残差网络的以下简单但重要的定义。这个想法是,给定一个图 G 和其中的流 f,我们形成一个新的流网络 G f ,它具有相同的 G 顶点集,并且对于 G 的每条边都有两条边。边 e = (1, 2) 承载流量 f(e) 并具有容量 C(e)(对于上图)的 G 产生了具有容量 C(e)-f(e)(剩余房间)的 G f 的“前边缘”和G f 的“后向边缘” (2,1),容量为 f(e)(可以撤消的先前路由流的量)。 source(s)- sink(t) 路径,其中 f(e) < C(e) 对于所有边,如由朴素贪心算法搜索的,对应于 G f 的仅包含前边的 st 路径的特殊情况。 使用残差图的思想福特-富克森和迪尼克的算法 来源 : 如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。
有一条从源 (s) 到汇 (t) [ s -> 1 -> 2 -> t] 的路径,最大流量为 3 个单位(路径显示为蓝色)
从图中删除所有无用的边后,它看起来像
对于上图,没有从源到汇的路径,因此最大流量:3 个单位但最大流量为 5 个单位。为了解决这个问题,我们使用残差图。
后向边缘:( f(e) )和向前边缘:( C(e) – f(e) )
http://theory.stanford.edu/~tim/w16/l/l1.pdf