文章目录
- 1. 网络流问题基础
- 1.1 概述
- 1.2 常规算法
- 1.3 总结
- 2. Ford-Fulkerson Algorithm
链接:
B站学习视频
1. 网络流问题基础
1.1 概述
最大流问题主要是关于有向图问题。有向图中有m
个边, n
个节点,其中有一个节点为s
[source],还有一个终点 t
[sink],具体如下图所示:相当于从水源头s流向水槽
,边上的数字表示水管边的最大容量。最大流的问题是在给定的容量情况下,就像给定如下图,如何计算这个图中每秒钟有多少水从起点s流向终点t.
- 其实就是相当于在约束条件下求最大的值,也相当于
约束条件下的优化问题
1.2 常规算法
-
初始化:
定义原始图Original-Graph
-即容量图,也定义一个残差图,初始化残差图Residual-Graph
等于容量图。
-
·循环1· 在残差图中从起点s到终点t中找一个
无回路
的路径
– 1.找路径 : s → v 2 → v 4 → t s\to v_2\to v_4\to t s→v2→v4→t
– 2.算瓶颈: 算出路径瓶颈x=2
– 3.更参数:更新残差图参数residual=residual - x
– 4.删零边:删除此路径上权值为0 的边
-
·循环2· 在残差图中从起点s到终点t中找一个
无回路
的路径
– 1.找路径 : s → v 1 → v 3 → t s\to v_1\to v_3\to t s→v1→v3→t
– 2.算瓶颈: 算出路径瓶颈x=2
– 3.更参数:更新残差图参数residual=residual-x
– 4.删零边:删除此路径上权值为0 的边
-
·循环3· 在残差图中从起点s到终点t中找一个
无回路
的路径
– 1.找路径 : s → v 1 → v 4 → t s\to v_1\to v_4\to t s→v1→v4→t
– 2.算瓶颈: 算出路径瓶颈x=1
– 3.更参数:更新残差图参数residual=residual-x
– 4.删零边:删除此路径上权值为0 的边
- 最终生成的残差图后无任何路径能够满足从s到t,即循环结束
- 将原始容量图和残差结束图放在一起,更新为
Flow Graph
- 计算总流量
s = 3 + 2 = 5 ; t = 2 + 3 = 5 \begin{equation} s=3+2=5; t=2+3=5 \end{equation} s=3+2=5;t=2+3=5 - 缺点:不一定会找到最大流,找到最大流取决于路径的先后顺序,这种方法会失败的,最后
- 此时流量为4+0=4
- 求得的是
阻塞流
。
1.3 总结
- 最大流问题:
– 输入:是一个有权重的有向图,里面有初始节点s[source
], 最终节点t[sink
]
– 目标:在约定的管道承载能力下求从s到t最大的流速。
– 限制: 每个管道边有承载能力限制,流向此边的流量不能超过承载能力 - 常规算法:
– 1. 创建一个初始的残差图,并使得残差图和容量图一样
– 2. 循环:
– 2.1 在残差图中从起点s到终点t中找一个无回路
的路径
– 2.2 在残差图路径上根据瓶颈x更新权重值residual=residual-x
– 2.3 在路径上删除权重为0 的边
– 3. 不断循环直到残差图中无任何一个从s到t的路径
– 4. 将容量图减去最后的残差图得到最后的流量图。计算流量 - 缺点:
– 1. 只能找到阻塞流[blocking flow]
– 2. 输出的阻塞流
不一定就是最大流