(2) 网流问题分类:
最大流最小割定理构成网络流理论基础。该定理包含以下几个概念

a. 容量网络(capacity network)
有向图
G
(
V
,
E
)
G(V,E)
G(V,E)中, 指定了源点
V
s
V_s
Vs 汇点
V
t
V_t
Vt,每一条边上都有一个权值
c
(
u
,
v
)
>
0
c(u,v)> 0
c(u,v)>0即弧的容量。
b. 弧的容量
容量网络G中任意一条弧上的权值。表示最大可以通过的流量。
c. 弧的流量(Flow Rate)
通过网络G中每条弧
<
u
,
v
>
<u,v>上的实际流量(流量), 记为
f
(
u
,
v
)
f(u,v)
f(u,v)。
d. 网络流(Network Flow)
所有弧上流量的集合
f
=
{
f
(
u
,
v
)
}
f=\{f(u,v)\}
f={f(u,v)} , 称为容量网络G的一个网络流。 如图6.2 (b)所示,
u
u
u代表容量,
v
v
v代表弧上当前流量。
[!info]
- 弧上流量小于弧的容量
- 源 V s V_s Vs流出的流量等于流入汇点 V t V_t Vt 的流量
- 任意的中间顶点 V i V_i Vi , 流入与流出的流量相等
f. 零流(Zero Flow)
网络图中,每条弧上的流量为0,该网络流被称为零流
g. 伪流(Pseudoflow) 或容量可行流
一个网络流只满足弧的容量限制条件,不满足平衡条件,这种网络流被称为伪流。或称为容量可行流。在预流推进算法中用到。
h. 最大流(Maximum Flow)
在容量网络
G
(
V
,
E
)
G(V,E)
G(V,E)中,满足弧流量限制条件和平衡条件,且具有最大流量的可行流,称为网络最大流,简称最大流。
容量网络G根据弧上流量和容量的关系,可以将分为4中类型
链: 容量网络图
G
G
G中的,源
u
u
u到汇
v
v
v的顶点序列,如:
(
u
,
u
1
,
u
2
,
⋯
,
u
n
,
v
)
(u, u_1, u_2, \cdots, u_n, v)
(u,u1,u2,⋯,un,v) 。 要求相邻的两个顶点之间有一条弧,如
⟨
u
,
u
1
⟩
或
⟨
u
1
,
u
⟩
\braket {u,u1} 或 \braket{u1, u}
⟨u,u1⟩或⟨u1,u⟩为容量网络的一条弧。
各弧分类:

链
P
1
=
{
<
V
s
,
V
1
>
,
<
V
1
,
V
2
>
,
<
V
2
,
V
4
>
,
<
V
4
,
V
t
>
}
P1=\{
前向弧:
P
1
+
=
{
<
V
s
,
V
1
>
,
<
V
1
,
V
2
>
,
<
V
2
,
V
4
>
,
<
V
4
,
V
t
>
}
P1+=\{
后向弧:
P
1
−
=
{
<
V
2
,
V
1
>
}
P1-=\{
满足一下两个条件的链P,成为增广路(增广链,可改进路):
在残留网络中,从源点到汇点的任意一条简单路径都对应一条增广路。
路径上每条弧容量的最小值即为能够一次增广的最大流量。
求容量网路的最大流有两大类算法:增广路算法(Augmenting Path Algorithm)和预流推进算法(Preflow-push Algorithm)
思路:
根据增广路定理,从任何一个可行流开始,沿着增广路对网络进行增广,直到网络不存在增广路为止。
关键:寻找增广路和改进网络流
如何有效的找到增广路,并保证算法在有限次增广后一定终止。
基本流程
预留推进算法是从一个预流(Pre-flow)出发对活跃顶点沿着允许弧进行流量增广,每次增广称为一次推进(Push).
推进过程中满足条件:
满足流量限制条件
一般不满足流量平衡条件
是一个伪流
预流
从每个顶点(除了
V
s
和
V
t
V_s和V_t
Vs和Vt)流出的流量之和总是小于等于流入该顶点的流量之和,称这样的伪流为预流。
预留推进算法分类
Frod-Fulkerson算法寻找增广路和改进网络流的方法为标号法
标号法实例
(1) 标号法求最大流的实例1— 初始流为零流
(2) 标号法求最大流的实例2— 初始流为非零流
标号法运算过程
(1) 标号过程
标号分量:
<
v
i
,
α
>
v
i
v_i
vi: 该分量指明它的标号来源
α
\alpha
α: 可改进量
顶点分类:
未标号顶点
已标号,未检查邻接节点
已标号,且已检查邻接顶点(即已经检查过它的所有邻接顶点,看是否能够标号)
(2) 调整过程
a. 采用“倒向追踪”法,以
α
\alpha
α分量按照第一个分量向前推荐,改进每一条弧上的流量。如下:
f
(
u
,
v
)
=
{
f
(
u
,
v
)
+
α
,
<
u
,
v
>
∈
P
+
f
(
u
,
v
)
−
α
,
<
u
,
v
>
∈
P
−
f
(
u
,
v
)
,
<
u
,
v
>
∉
P
f(u,v) = {f(u,v)+α,<u,v>∈P+f(u,v)−α,<u,v>∈P−f(u,v),<u,v>∉P
f(u,v)=⎩
⎨
⎧f(u,v)+α,f(u,v)−α,f(u,v),<u,v>∈P+<u,v>∈P−<u,v>∈/P
b. 调整后去掉所有标号,并对新的可行流进行重新标号过程和调整过程。
标号法程序实现
(1) 图的定义格式:
输入:顶点个数n, 弧数m
每条弧的数据格式: u v c f (u: 起点 v:终点 c: 容量 f: 流量), 顶点序号0开始
存储格式:邻接矩阵
(2) 中间变量:
f
l
a
g
[
n
]
flag[n]
flag[n]: 顶点状态
-1: 未标记
0 : 已标记,未检查
1: 已标记,已检查
p
r
e
v
[
n
]
prev[n]
prev[n]: 标号的第一个分量,标号来源节点
a
l
p
h
a
[
n
]
alpha[n]
alpha[n]: 标号的第二个分量,改进量
q
u
e
u
e
[
n
]
queue[n]
queue[n]: 广度优先搜索使用的队列,qs和qe表示队头和队尾
(3) 标记策略: 广度优先搜索