📜  最大流量问题介绍

📅  最后修改于: 2021-10-26 06:26:48             🧑  作者: Mango

最大流问题涉及通过最大的单源、单汇流网络找到可行的流。
我们用一张图来解释一下上面的定义想表达的意思。
福特富克森1

每条边都标有容量,即它可以携带的最大物品量。目标是弄清楚有多少东西可以从顶点 s(source) 推送到顶点 t(sink)。

. 福特富克森2
可能的最大流量为: 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)

图像14
有一条从源 (s) 到汇 (t) [ s -> 1 -> 2 -> t] 的路径,最大流量为 3 个单位(路径显示为蓝色)
图片
图片
从图中删除所有无用的边后,它看起来像
最大值
对于上图,没有从源到汇的路径,因此最大流量:3 个单位但最大流量为 5 个单位。为了解决这个问题,我们使用残差图。

2. 残差图

这个想法是通过允许“撤消”操作来扩展朴素贪婪算法。例如,从该算法卡在上图中的那一点开始,我们想沿着边 (s, 2) 再路由两个单元的流,然后沿着边 (1, 2) 向后路由,撤消 2我们路由前一次迭代的 3 个单元,最后沿着边 (1,t)
最大值
后向边缘:( f(e) )和向前边缘:( C(e) – f(e) )

我们需要一种正式指定允许的“撤消”操作的方法。这激发了残差网络的以下简单但重要的定义。这个想法是,给定一个图 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 路径的特殊情况。

使用残差图的思想福特-富克森和迪尼克的算法

来源 :
http://theory.stanford.edu/~tim/w16/l/l1.pdf

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。