网络流是 OI 中一种非常重要的模型,在生活中也有广泛的运用。
有很多问题都可以抽象成网络流模型,而且这些题大多数看起来甚至跟 图 都没有关联。
所以,掌握好网络流是 至关重要 的。
0x01. 概念 1
下述概念较多,比较抽象。
网络
请注意 网络(Flow Network)和 网络流(Flow)的区别。
网络是一个有向带权图
G
(
V
,
E
)
G(V, E)
G(V,E),一条边
(
u
,
v
)
∈
E
(u, v) \in E
(u,v)∈E 的边权
c
(
u
,
v
)
c(u, v)
c(u,v) 称为这条边的 容量(Capacity)。
网络中有两个特殊点,源点(Source)
s
∈
V
s \in V
s∈V,汇点(Sink)
t
∈
V
t \in V
t∈V。
流
网络流即网络上的流。
对于函数
f
(
u
,
v
)
f(u, v)
f(u,v),
u
,
v
∈
V
u, v \in V
u,v∈V,若其满足
- 容量约束。任意一条边 ( u , v ) (u, v) (u,v) 的流量不能超过它的容量 c ( u , v ) c(u, v) c(u,v),即 f ( u , v ) ≤ c ( u , v ) f(u, v) \le c(u, v) f(u,v)≤c(u,v)。
- 反对称性。每条边的流量与其相反边的流量之和为 0 0 0,即 f ( u , v ) = − f ( v , u ) f(u, v) = -f(v, u) f(u,v)=−f(v,u)。
- 流量守恒。除 s s s 和 t t t,所有节点的流入量等于流出量,即 ∀ x ∈ V − { s , t } , ∑ ( u , x ) ∈ E f ( u , x ) = ∑ ( x , v ) ∈ E f ( x , v ) \forall x \in V - \{s, t\}, \sum\limits_{(u, x) \in E}f(u, x) = \sum\limits_{(x, v) \in E}f(x, v) ∀x∈V−{s,t},(u,x)∈E∑f(u,x)=(x,v)∈E∑f(x,v)。
则称
f
f
f 是
G
G
G 的 流函数。对于
(
u
,
v
)
∈
E
(u, v) \in E
(u,v)∈E,
f
(
u
,
v
)
f(u, v)
f(u,v) 称为边的 流量,
c
(
u
,
v
)
−
f
(
u
,
v
)
c(u, v) - f(u, v)
c(u,v)−f(u,v) 称为边
(
u
,
v
)
(u, v)
(u,v) 的 剩余流量,整个网络的流量为
∑
(
s
,
v
)
∈
E
f
(
s
,
v
)
\sum\limits_{(s, v) \in E} f(s, v)
(s,v)∈E∑f(s,v),即 从源点出发到所有点的流量之和。
一般而言也可以把网络流理解为整个图的流量。而这个流量必满足上述三个性质。
流函数的完整定义:
f
(
u
,
v
)
=
{
f
(
u
,
v
)
,
(
u
,
v
)
∈
E
−
f
(
v
,
u
)
,
(
v
,
u
)
∈
E
0
,
(
u
,
v
)
∉
E
f(u, v) = \begin{cases} f(u, v), & (u, v) \in E \\ -f(v, u), & (v, u) \in E \\ 0, & (u, v) \not\in E \end{cases}
f(u,v)=⎩
⎨
⎧f(u,v),−f(v,u),0,(u,v)∈E(v,u)∈E(u,v)∈E
0x02. 形式化网络
本节仅帮助理解上述概念,已理解可直接跳过。
好吧上面的概念太抽象了(但是基本定义还是要了解。
其实可以把网络想象成一个大型输水系统,有许多的点和许多水管连接着这些点。
源点
s
s
s 是水库,可以输出任意大小的水流,汇点
t
t
t 是汇聚所有水流的地方。
水流从
s
s
s 流到
t
t
t 需要经过中转点,中转点不产生流量,也不私吞流量。
水管有一定的容量,不能超额运输水流。
如果从
s
s
s 输出一定大小的水流,能满足上述的限制,最终流入
t
t
t,那么这条流就被称为整个网络的一条 可行流。
上图是一个为了帮助你理解的网络,源点是
1
1
1,汇点是
4
4
4,边上的数字代表该边的容量。
0x03. 最大流
网络最大流 指在满足容量约束和流量守恒的前提下,净输出最大的网络流。
最大流算法根据实现原理可以分为两类。
Ford-Fulkerson 增广路算法
这类方法通过寻找 增广路 来求解最大流。
Push-Relabel 预流推进算法
这类方法在求解过程中忽略流守恒性,并每次对一个结点更新信息,以求解最大流。
参考资料:网络流简介 - OI Wiki ↩︎