网络流算法
很多实际问题可以建模为流网络
• 装配线上物件的流动
• 电网中电流的流动
• 通信网络中信息的流动
• 道路交通网络中的运输活动
• ……
• 一个源节点s、一个汇点t,由源节点流向汇点
• 流量守恒
• 流网络
是一个无自环的有向图G=(V, E),
(1) 图中的每条边(u, v)E有一个非负的容量值c(u, v)0。
if (u, v)E c(u, v)=0;
(2) 有两个特殊结点s, tV,s称为源结点(source),t称为汇点
(sink)
(3) For vV, 存在一个s到t经过v的路径svt.
• 流(Flow)
设G(V,E)是一个流网络,c是容量函数,s源结点,t是汇点。
G中的流是一个实值函数f:VVR,满足下列性质:
(1) 容量约束:
(2) 流量守恒:
这里的流,指的即使在该网络的限制中,能够从s出发并到达t的流量的和。
例如,该图的流为19.
最大流算法,即是求该图上面的能够从s出发并到达t的流的最大值。
由于在网络内部有限制,所以求解的是在该限制下的流的最大流。
想法•:循环递进
– 初始:网络上的流为0
– 找出一条从s到t的路径p和正数a,使得p上的每一条边(u,v)
的流量增加a之后仍能够满足容量约束:f(u,v)+ac(u,v)
//将p上的每条边的流量增加a,得到一个更大的流
– 重复执行第二步,直到找不到满足约束条件的路径.
关键在于:
- 如何找路径p,以便得到更大的流?
- 如何判断循环结束的条件?
最大流算法
Ford-Fulkerson方法
招路径:
在一个关联的剩余网络(余图)中寻找一条增广路径:
剩余网络:
增广路径
• 增广路径
– 剩余网络中的一条由源结点s到汇点t的一条路径p
图中红色标注的路径为一条增广路径,其剩余容量为4
• 增广路径p的剩余容量
– cf
§=min{cf(u, v) : (u, v)属于路径p}
–表示了该路径能够增加的流的最大值。
• FF算法的核心是:通过增广路径不断增加路径上的流
量,直到找到一个最大流为止
• 如何判断算法终止时,确实找到了一个最大流
最大流最小割定理:
设f为流网络G(V,E)一个流,该流网络的源结点为s,
汇点为t,则下面命题等价: - f是G的最大流.
- 剩余网络Gf不包含增强路径.
- 对于G的某个划分(S, T), | f |=c(S, T).
割的定义
算法
一些问题: