ch06 - 图和网络优化 · 2015-12-23 · 4 最短s‐t 路问题 实例:给定一个无向图...
TRANSCRIPT
1
第 6章 图和网络优化
2
第 6章的主要内容
6.5 最短路问题
6.6 最大流问题
6.7 最小费用流问题
6.8 最大匹配问题
3
6.5 最短路问题
4
最短 s‐t路问题
实例:给定一个无向图 G = (V, E),边 e E 上定义
有费用(长度)ce 0。有两个特殊的顶点 s, t V,
其中 s 是源顶点,t 是目标顶点。
目标:找一条从 s 到 t 的总长度最短的路径。
最短路问题的 IP
定义指示变量 xe为是否使用了边 e。则最短路问题
5
的 IP 可写为:
ex
Sx
xc
e
See
Eeee
,1,0
,1s.t.
min
S
其中 S = {S V: s S, t S},(S)是所有一端在 S中、另
一端在 S 外的边的集合,即割 SS , 中的所有边。
6
最短路的 LP松弛和它的对偶
ex
Sx
xc
e
See
Eeee
,0
,1s.t.
min
S (LP)
S
S
S
Sy
ecy
y
S
eSeS
S
SS
,0
,s.t.
max
: (DP)
7
DP的一个几何解释
对于 S中的每一个 S(可称为“城池”),都有一个“护
城河”(moat)环绕着 S。对偶变量 yS即是这个护城
河的宽度。
DP的目标函数是挖环绕着每一个 S的护城河,使得
它们的总宽度最大,以保护每一个 S。
当然,护城河不能无限地宽。图中的边解释为跨过
护城河的“桥”。每条边 e之下都有若干护城河 S: e
8
(S)。
对任一条边 e,其跨过的护城河的总宽度不能超过 e
的长度 ce(参见对偶规划中的约束)。
多个连续的桥构成一条路。因此,一条路至少和它
所跨过的护城河的总宽度一样长。于是,s、t 之间
的最短路长度就等于它们之间的护城河的最大宽度。
9
10
最短路问题的原始‐对偶算法
1. S, yS 0;F 。
2. while s和 t 在(V, F)中没有连通时 do
3. 记 C为(V, F)中包含 s的连通分支。
4. 增加 yC,直到有一条边 e (C)成为紧的。
5. F F {e}。
6. endwhile 7. 记 P 为(V, F)中唯一的 s‐t 路。
11
8. return P。
边 e是紧的:S: e (S) yS = ce。
算法分析
引理 6.5.1:在算法的任一时刻,F都是包含 s 的一棵树。
证明:
由于加入 F 的每条边都是和 s 连通的,因此 F 仅包
含一个连通分支(即,C = V(F))。
当一条边 e要加入 F时,这条边来自于 (C),C是当
12
前 F 所包含的连通分支。
由于 e 恰好有一个端点在 C 中,另一个端点在 C 之
外,将 e加入 F不会形成圈。
因此 F总是一棵树。□
定理 6.5.2:算法找到了一条最短 s‐t路。
证明:
因为 P中的每一条边都是紧的,所以有
13
SS S
SPe SeS
SPe
e ySPyc : 。
断言:只要 yS > 0,就有|P (S)| = 1。
先假设这个断言是成立的,稍后给出证明。于是就有
OPT SS
SPe
e yc,
从而定理成立,证明就结束了。
反证断言。假设对某个 S S,有 yS > 0和|P (S)| > 1。
这表明 P 穿越了(S)至少 3 次。
14
因此 P上就有一条子路径 P’将 S中的两个顶点连接在
了一起。
由于 yS > 0,算法必定增加过 yS。在算法刚要增加 yS
15
的时刻,F是连接(span)S 中所有顶点的一棵树。
于是 F P’中就包含一个圈。这与引理 6.5.1矛盾。□
例子
蓝边:紧的边。
绿边:加入到 F中的边。
16
17
18
19
20
21
与 Dijkstra算法的比较
Dijkstra算法:每次加入距离 s最近的一个点。
22
23
24
25
26
结论:最短路的原始‐对偶算法与 Dijkstra算法本质上
是相同的。
27
6.6 最大流问题
28
问题定义
实例:给定有向网络 G = (V, E), 弧 e = (i, j) E 上
定义有容量 ce 0。有两个特殊的顶点 s, t V,其
中 s 是发点,t 是收点。
目标:计算从 s 到 t 的满足容量约束的最大流。
符号:
定义 xij为弧(i, j)上从顶点 i到顶点 j 的流量。
29
若流量{xij}在所有弧上均满足容量约束,在除 s 和 t
之外的所有顶点上都满足流守恒约束,则其为一个
流,记为 x。
流 x 的流值定义为 s 点发出的流量之和与 s 点接收
的流量之和的差,即 s 点发出的“净流”流量。
基本概念
可行流:满足容量约束和流守恒约束的从 s到 t的流,
简称为(s, t)‐流。
30
设 P 是 G 上从 s到 t 的一条“路”,路上弧的方向可以
任意。则:P上方向是从 s到 t的弧 (i, j) 称为前向弧。
P上方向是从 t到 s 的弧 (i, j) 称为后向弧。
流 x = (xij)的增广路 P:P 的每个前向弧 (i, j) 都有
ijij cx ,而 P的每个后向弧有 0ijx 。
(s, t)‐割:记为(S, T),是从 S 到 T 的所有弧(有向边)
的集合。其中 (S, T) 是顶点集 V的一个划分, Ss ,
Tt 。
31
割(S, T)的容量:
Si Tj
ijcTSc ,,即割中所有弧的容
量的和。
最大流的增广路算法(Ford‐Fulkerson)
基本思想:不断地找增广路来增加流,当流值不能再
增加时,就得到了最大流。
32
标号法找增广路
源顶点 s 具有永久标号 ),( 。
假设当前已标号点为 i,从 i经过弧 (i, j) 或 (j, i) 对未
标号点 j 进行标号。
若存在弧(i, j)且 ijij cx ,则给 j 标号 ))(,( ji ,其中
)}(,min{)( ixcj ijij 。
若存在弧(j, i)且 0jix ,则给 j 标号 ))(,( ji ,其中
)}(,min{)( ixj ji 。
33
标号的解释
一般地,顶点 j的标号为 ))(,( ji 。其中,
i 表示顶点 j 是从 i 获得的标号,即在从 s 到 j 的增广
路上,i是 j 的前驱顶点。
i之前的符号:正号“+”表示(i, j)是前向弧,在弧(i, j)
上可以增加流。
负号“”表示(j, i)是后向弧,在弧(j, i)上可以减少流。
(j)表示可以增加或减少的流量的大小。
34
最大流算法(标号法)(FF57)
1 Eji , , 0ijx ,得到一个零流。
2 给 s 一个永久标号 ),( ,LIST {s}。
(LIST是已标号但未检查的顶点的集合。)
35
3 while LIST
4 从 LIST中取出一个顶点 i,并将 i从 LIST中删除。
5 对每一个弧(i, j),如果 ijij cx 且 j 未标号,
则对 j 标号 ))(,( ji ,
其中 )}(,min{)( ixcj ijij 。
6 对每一个弧(j, i),如果 0jix 且 j 未标号,
则对 j 标号 ))(,( ji ,
其中 )}(,min{)( ixj ji 。
36
7 将新标号的点加入 LIST。
8 if t 被标号 then
9 由点 t 开始回溯到 s 找到一条 st‐增广路,
在这条路上增加流量(t)。(增广。)
10 清除除 s 外所有顶点的标号,LIST {s}。
11 endif
12 endwhile
13 return {xij}。(当前的流{xij}即为最大流,当前已标号
的顶点的集合形成一个最小割。)
例例 1
37
38
39
40
例例 2:增增广路通过过逆向弧
41
弧的例子子
42
例例 3
43
44
45
时
时间复杂
设弧数为
杂度
为 m,每每找一条
46
增广路最最多需要要进行 2m
m 次弧
47
检查。
不失一般性,假设所有弧容量都是整数。则最多需要
v次增广,其中 v 是最大流值。
所以,总的时间复杂度量为 O(mv)。
引理 1
引理 1:设 x 是一个 s, t‐可行流,(S, T)是一个 s, t‐割。则
x 的流值等于该割中前向弧的流量之和减去后向弧的流
量之和。
48
证明:
流 x 的值
sNj
jssNj
sj xxv
Si iNjji
iNjij xx
(由流守恒约束)
Si TiNjji
SiNjji
TiNjij
SiNjij xxxx
49
Si TiNjji
TiNjij
SiNjji
SiNjij xxxx
Si TiNjji
TiNjij xx
50
51
引理 2
引理 2:任意一个 s, t‐可行流的流值都不超过任意一个
s, t‐割的容量。
证明:
设 x 是一个 s, t‐流,流值为 v。(S, T)是一个 s, t‐割。
则
Si TiNjji
TiNjij xxv
(由引理 1)
52
Si TiNj
ijx
(由非负约束)
Si TiNj
ijc
(由容量约束)
TSc , 。
增广路定理
定理 6.6.1(增广路定理) 一个可行流 x是最大流 当且
仅当 不存在关于它的从 s到 t 的增广路。
53
证明:
()。若存在增广路,则 x 的流值可以严格增加,流
x就不是最大的。
()。已知可行流 x 不存在从 s到 t 的增广路。下面证
x是最大流。
定义 S 是从 s 出发经过任一条增广路可达的顶点的集
合。特别地,s S。定义 T = V – S。
由 S 和 T 的定义,可知对任意的弧(i, j) (S, T),有 xij =
cij;对任意的弧(j, i) (T, S),有 xji = 0。
54
首先,从 s经过增广路 P可达 i。
若 xij < cij,则由增广路的定义,P {(i, j)}是从 s到 j
的增广路,与 j T 矛盾。
类似地,若 xji > 0,P {(i, j)}也是从 s到 j 的增广路,
与 j T矛盾。
由引理 1,流值
Si Tjij
Si TiNjji
TiNjij cxxv
。
由引理 2,任意流的流值都小于等于任意割的容量。
现在 x的流值等于割(S, T)的容量,因此 x 是最大流。
55
最大流最小割定理
定理 6.6.3 一个流网络上最大流的流值等于该网络上最
小割的容量。
证明:
设 x*是一个最大流,v*是其流值。(S*, T*)是一个最小
割,c(S*, T*)是其容量。
由引理 2,v* c(S*, T*)。
56
由增广路定理的证明,存在割(S, T),使得 v* = c(S, T)。
因为(S*, T*)是最小割,有 c(S, T) c(S*, T*),即 v* c(S*,
T*)。
于是 v* = c(S*, T*)。
Max‐Flow Min‐Cut定理:
Lester R. Ford, Delbert R. Fulkerson. Maximal flow through a network.
Canadian Journal of Mathematics, vol. 8, 1956.
57
以及
P. Elias, A. Feinstein, C. E. Shannon. A note on the maximum flow through a network.
IRE Transaction on Information Theory IT2, 117‐119,
1956.
整数流定理
定理 6.6.2 如果网络中所有弧的容量都是整数,则最大
流的值也为整数。
58
证明:
从 0 流开始沿 s‐t 增广路增加流。由于弧上的容量都
是整数,每次在增广路上增加的流值都为整数。当最
后不能增加时,就得到了最大流,其值仍为整数。
最大流问题的 LP
定义 xij为弧(i, j)上从顶点 i到顶点 j 的流量。则最大
流问题的 LP可写为:
59
0,,0,,
,,0
,
,s.t.max
vEjixEjicx
tsixx
tivxx
sivxxv
ij
ijij
iNjji
iNjij
iNjji
iNjij
iNjji
iNjij
(LP)
x1
e1
价 0
s 1
v2 1
x2 x3e2 e3
0 0
1 0
0 1
x4 x
e4 e
0
0
1 1
60
x5 x6e5 e6
0 0
0 0
0 0
x7 x8e7 e8
0 0
0 0
0 0
x9 v
e9
0 1
0 1
0 0
右
0
0
61
v3 0 0 0 1 1 0 1 1 0 0 0
v4 0 1 1 0 1 1 0 0 0 0 0
v5 0 0 0 0 0 1 1 0 1 0 0
t 0 0 0 0 0 0 0 1 1 1 0
e1 1 0 3
e2 1 0 2
e3 1 0 1
e9 1 0 2
62
最大流 LP的对偶
线性规划(LP)的对偶为:
EjiVi
Eji
c
ij
i
st
ijij
Ejiijij
,,0,1
,,s.t.
min,
无限制 (DP1)
可以证明,(DP1)与(DP2)等价:
63
EjiVi
Eji
c
ij
i
st
ijij
Ejiijij
,,0,0
1,,s.t.
min,
(DP2)
最小割问题
最小 s‐t割问题
实例:有向图 G = (V, E),弧 e = (i, j)上定义有容量 ce
64
0。 源顶点 s 和目标顶点 t。 目标:求一个最小 s‐t割。
最小割问题的整数规划:
Eji
Vi
Eji
c
ij
i
st
ijij
Ejiijij
,,1,0,1,01
,,s.t.
min,
可以看出,对偶规划(DP2)正是最小割问题的线性规
65
划松弛。
66
6.7 最小费用流问题
67
问题定义
实例:给定有向图 G = (V, E),源顶点 s V和目的顶
点 t V,以及流值 v。弧(i, j) E上定义有容量 cij 0
和费用(长度)wij 0。
询问:求一个从 s 到 t,其流值为 v的流,使流的费用
最小。流 ijxx 的费用定义为jiijij xw
, 。
假设:所有的数(容量、费用、流值 v)均为整数。
说明:该
(不妨令
可以将该
该问题可
令其为原
该问题转
可能没有解
原图所有边
转换为必定
68
解。但通
边的费用
定有解的
通过加入一
用之和再
的问题。
一条费用
加 1)的边
用为M
边(s, t),
69
最小费用流问题的 LP及其对偶
)5(,,0
)4(, ,
)3(, , ,0)(
)2()(
)1()(.t.s
(LP)min),(
EjixEjicx
tsiVixx
vxx
vxx
xw
ij
ijij
jijji
jtjjt
jsjjs
Ejiijij
70
x12 x13 x23 x24 x34
(1, 2) (1, 3) (2, 3) (2, 4) (3, 4)
价 2 1 2 4 2 右
v1 1 1 0 0 0 v p1
v2 1 0 1 1 0 0 p2
v3 0 1 1 0 1 0 p3
v4 0 0 0 1 1 v p4
(1, 2) 1 0 0 0 0 1 r12
(1, 3) 0 1 0 0 0 3 r13
71
(2, 3) 0 0 1 0 0 1 r23
(2, 4) 0 0 0 1 0 3 r24
(3, 4) 0 0 0 0 1 1 r34
)8( ,)7(,,0)6(,,.t.s
(DP)max),(
VipEjirEjiwrpp
rcvpvp
i
ij
ijijij
Ejiijijst
无限制
72
互补松紧条件
原始和对偶最优解的互补松紧条件为:
0 ijijijij xwrpp , Eji , ,以及
0 ijijij cxr , Eji , 。
该条件等价于:
0 ijijijij xwrpp , Eji , ,以及
ijijij cxr 0 , Eji , 。
73
给定一组 pi,定义 ijijij wppr ,0max , (6.7.3)
则{pi, rij}是对偶的一组可行解。(由 rij的定义,rij pj –
pi – wij,满足约束(6)。)
由 rij的定义,可以证明:
ijijijijij wppwrpp ,以及
ijijij wppr 0 。
因此互补松紧条件又等价于:
0 ijijij xwpp , Eji , ,以及 (6.7.4)
74
ijijijij cxwpp , Eji , 。 (6.7.5)
因此,只要{xij}、{pi, rij}满足(6.7.3~5),则它们就分别
是原始规划 LP 和对偶规划 DP的最优解。
两个性质
性质: ijijijijij wppwrpp 。
证:
()。若 pj – pi < wij,由于 rij 0,显然有 pj – pi – rij < wij。
()。若 pj – pi – rij < wij,即 rij > pj – pi – wij,由于 rij =
75
max{0, pj – pi – wij},可知 rij = 0,因此 pj – pi < wij。
性质: ijij wipjpr 0 。
证:
由定义,rij = max{0, pj – pi – wij}。
若 rij > 0,则 pj – pi – wij > 0,即 pj – pi > wi。反之,若
pj – pi > wi,则 rij = pj – pi – wij > 0。
算法的基本思想
一个流可以分解成若干不可分流(unsplittable flow)
76
的叠加。
一个流是最小费用流,当且仅当它在满足容量约束
的条件下,它的每一个不可分流都是费用最小的,
即“路长”最短的。
因此,最小费用流算法的核心思想是:总是在费用
最小的增广路上增加流值,直到流值达到 v。
如何增加流?
从{pi = 0}(对偶可行)和{xij = 0}(原始不可行)开
77
始。
根据 (6.7.3) 计算出 {rij}。
当前的 {pi, rij} 是对偶规划的可行解。
当前的 {xij} 满足约束 (3)(4)(5),不满足 (1)(2)。
{pi} 和 {xij} 满足互补松弛条件 (6.7.4) 和 (6.7.5)。
设流 {xij} 的值为 v’。则当前的 {pi, rij} 和 {xij} 分
别是对偶规划和原始规划相对于流值 v’的最优解。
若 v’ < v,则需要找 s‐t增广路增加 x 的流值。
为了保证新的解仍是增加后的流值上的最小费用流
78
问题的最优解,找增广路时不能违反条件 (6.7.4) 和
(6.7.5)。
找一条增广路(1)
首先尝试在不改变当前{pi}值的情形下找增广路。
考察互补松紧条件(6.7.4)、(6.7.5)。若 pj – pi < wij,
则 xij = 0;若 pj – pi > wij,则 xij = cij。因此,若 pj – pi
wij,则 xij的值就是固定的,不能增加或减小。
所以,只能在 pj – pi = wij的弧上找增广路。由增广
79
路的定义,这样的弧又需要满足 xij < cij(前向弧)或
xij > 0(后向弧)的条件。于是,定义
I = {(i, j) | pj – pi = wij且 xij < cij},
R = {(i, j) | pj – pi = wij且 xij > 0}。
称 I R 为允许弧(admissible arc)的集合。
在不改变当前{pi}值的情形下找增广路,就是在 I R
中找增广路。
80
pi的解释
pi的直观含义是顶点 i的“势”,也可理解为“高度”。
初始时,所有的顶点的势都为 0。顶点 s 的势固定为
0,不会改变。
顶点 i所处的势是对从 s到 i在允许弧集合中的增广
路长度(前向弧的长度之和 – 后向弧的长度之和)
的估计。当估计不准确时,pi的值做加 1调整。
因此,若在允许弧集合中能够找到 s‐t 增广路 P,由
81
于 pi 每次都只增加 1,路 P 实际上是所有的增广路
中费用最小的。
找一条增广路(2)
若在允许弧集合中找不到 s‐t 增广路,表明当前网
络上没有费用为 l = pt的增广路。这时就需要对{pi}
的值做出调整:将从 s 出发通过增广路不能到达的
顶点的 pi 值加 1,尝试找费用为 l + 1 的增广路。
在找到的增广路上增加流量。重复上述过程,直到 x
82
的流值达到 v。
最小费用流的连续最短路算法
Successive Shortest Path Algorithm
([Jewell, 1958],[Iri, 1960],[Busacker, Gowen, 1961])
1 Eji , , 0ijx ; 0v ; Vi , 0ip 。
2 while 流 x 的值 v’ < v do
3 确定哪些弧可以改变流量。
83
ijijijij cxwppjiI 且|, ,
0|, ijijij xwppjiR 且 。
4 在 RI 上找一条从 s‐t 增广路 P。
5 if 能找到 then
6 vvP ,min 。
7 沿路 P 增加流量。
8 vv 。
9 else
10 记 T为第 4步找增广路时未获得标号的顶
84
点的集合。
11 T 中点的 pi值全部加 1。
12 endif
13 endwhile
14 return {xij}。
例例子
rij
(1, 2)
0
(1, 3)
0
85
(2, 3
0
) (2, 4
0
4) (3,
0
, 4)
0
86
I ‐ ‐ ‐ ‐ ‐
R ‐ ‐ ‐ ‐ ‐
I = ,R = 。在 I R 上找 s‐t 增广路,不能到达 t。
rij
I
(1, 2)
0
(1, 3)
0
‐
87
(2, 3)
0
‐
) (2, 4
0
‐
4) (3,
0
‐
4)
0
‐
88
R ‐ ‐ ‐ ‐ ‐
v2, v3, v4的 pi值加 1。绿边:I 中的边。
在 I R 上找 s‐t 增广路,不能到达 t。
rij
(1, 2)
0
(1, 3)
0
89
(2, 3
0
) (2, 4
0
4) (3,
0
, 4)
0
90
I ‐ ‐ ‐
R ‐ ‐ ‐ ‐ ‐
v3, v4的 pi值加 1。
在 I R 上找 s‐t 增广路,不能到达 t。
rij
(1, 2)
0
(1, 3)
0
91
(2, 3)
0
) (2, 4
0
4) (3,
0
4)
0
92
I ‐ ‐
R ‐ ‐ ‐ ‐ ‐
v4的 pi值加 1。
在 I R 上找 s‐t 增广路(绿边),可以到达 t , = 2。
第 1 条增广路
长度:
93
1 + 1 + 1
= 3
rij
I
R
(1, 2)
0
‐
(1, 3)
0
‐
‐
94
(2, 3)
0
‐
(2, 4)
0
‐
‐
(3, 4
0
‐
4)
95
红边:R 中的边。
在 I R 上找 s‐t 增广路,不能到达 t。
(1, 2) (1, 3)
96
(2, 3) (2, 4)
(3, 44)
97
rij 1 0 0 0 0
I ‐ ‐ ‐ ‐
R ‐ ‐ ‐
v2, v3, v4的 pi值加 1。
在 I R 上找 s‐t 增广路,不能到达 t。
(1, 2) (1, 3)
98
(2, 3) (2, 4)
(3, 44)
99
rij 1 0 0 0 1
I ‐ ‐ ‐
R ‐ ‐ ‐ ‐
v4的 pi值加 1。
在 I R 上找 s‐t 增广路,可以到达 t, = 1。
第 2 条增广路
长度:
100
3 – 1 + 3
= 5
rij
I
R
(1, 2)
1
(1, 3)
0
101
(2, 3)
0
(2, 4)
0
(3, 4
1
4)
102
橙边:既在 I 中,又在 R 中的边。
流值到达 v = 3,结束。
103
Ejix
Ejicxi xxxixxxixxixx
xw
ij
ijij
Ejiijij
,,0,,
3,02 ,04,31,3.t.s
(LP)min
342313
242312
3424
1312
),(
(1, 2) (1, 3) (2, 3) (2, 4) (3, 4)
xij 2 1 1 1 2
104
cij 2 1 2 4 2
r12 = 1 > 0 r34 = 1 > 0
VipEjir
rpprpprpprpprpp
rrrrrpp
i
ij
,,,04,314,233,213,132,11.t.s
(DP)242233max
3434
2424
2323
1313
1212
342423131214
无限制
105
1 2 3 4
pi 0 2 3 5
(1, 2) (1, 3) (2, 3) (2, 4) (3, 4)
rij 1 0 0 0 1
xij全部大于 0,(DP)中的 5 个约束全部取等式。
时间复杂度
设网络的点数为 n,弧数为 m,弧的最大费用为 w。
找一条 s‐t 增广路需要 O(m)时间。由于要找的增广路
106
的长度每次增加 1,而增广路最长为 mw,故花费在
找增广路上的时间为 O(m2w)。
一个顶点的 pi值修正的次数最多为 mw 次,总共有 n
个顶点,因此修改所有的 pi值的总花费为 O(nmw)。
流值为 v,则流增广最多进行 v 次,每次增广需要花
费 O(m)时间,所以修改 xij的总花费为 O(mv)。
所以,总的计算量为 )( 2 mvwmO 。
最最短路的的观点
流网网络
107
剩剩余网络络
108
109
110
6.7 最大匹配问题
111
本节主要内容
二分图的对集,基本概念,主要定理
二分图的最大匹配算法
二分图的带权重的最大匹配——分派问题及算法
基本概念
图 G = (V, E)的对集 M:M是 E的子集,且 M中任意
两条边均不相邻(都不共享顶点)。
112
M‐饱和点 i:V(M)中的顶点(i V(M),匹配的点)。
M‐非饱和点 i:V(M)之外的顶点(i V(M),没有匹配
的点)。
极大对集 M:不存在另外一个对集M ,使得 MM 。
最大对集 M:不存在另外一个对集M ,使得 MM 。
完美对集 M:对集 M,匹配了 G 上所有的点。
使用最大流算法求二分图上的最大匹配
给定二分图 G = (V, U, E),构造流网络。
113
增加一个源点 s,从 s 到 V 中每个顶点引一条有
向边。
增加一个目标顶点 t,从 U 中每个顶点向 t 引一
条有向边。
E中的边均从 V 指向 U。
记得到的流网络为 G’ = (V’, E’)。G’中的每条边均为
单位容量。
计算 G’上从 s 到 t 的最大流。
E 中的饱和边即构成 G 上的一个最大匹配。
114
115
定理
定理:记 G’上的最大流为 f*,流值为|f*|。G 上的最
大匹配为 M*。则|f*| = |M*|。
证明:
首先证|f*| |M*|。
给定最大匹配 M*,令 G’上 M*中的边的流值为 1,s
到 M*匹配的 V 一侧点的各条边上流值为 1,M*匹配
的 U 一侧点到 t的各条边上流值为 1,则构造了一个
116
流值为|M*|的流 f。
因此,显然有|f*| |M*|。
再证|f*| |M*|。
设 f*为 G’上的最大流。
由整流定理,G’上每条边上的流值为整数。由于每
条边的容量均为 1,因此 G’上每条边的流值不是 0
就是 1。
再由流守恒约束,V 中每个顶点最多有一条出去的
边流值为 1。同理,U中每个顶点最多有一条进来的
117
边流值为 1。
记 M = {e E | e上的流值 > 0},因此 M中的任何两
条边均不共享顶点,即,M是一个匹配,且|f*| = |M|。
因此,显然有|f*| |M|。
基本概念
M ‐交错路:边在对集 M 和 ME \ 中交错出现的路。
M ‐增广路:起点和终点都不在 V(M)中的 M ‐交错路。
顶点覆盖 K:K 是 V(G)的子集,且 G 的每条边都至少
118
有一个端点在 K中。
最小顶点覆盖 K:不存在另外一个覆盖 K’,使得
KK 。
119
顶点覆盖
120
定理 6.8.1
定理 6.8.1(Berge, 1957)图 G 中的一个匹配 M是最大
匹配当且仅当 G不包含 M‐增广路。
(说明:G是一般图,不要求是二分图。)
证:
()。G 上若有 M‐增广路,则可以使用这条路更新 M
得到基数更大(多 1)的一个匹配,与 M是最大匹配
矛盾。
121
()。假设 M 是一个匹配,图 G 上不含有 M‐增广路,
而 M 不是最大匹配。
于是,存在 G 上另外一个匹配 M’,有|M’| > |M|。
令 H是 G 上 M’M的导出子图。
由于H中的每个顶点最多只能和M中的一条边以及M’
中的一条边关联,因此 H 中每个顶点的度都不超过 2
(都是 1 或者 2)。
因此,H 的每个连通分支或者是边在 M 和 M’中交错
出现的路,或者是边在 M和 M’中交错出现的偶圈。
122
由于在 G中有|M’| > |M|,而 H是M’和M的对称差,
M’在 H中的边数必然也 > M 在 H中的边数。
这表明 H 中至少有一个连通分支,是一条起始于 M’
中的边又终止于 M’中的边的路。
由定义,这条路是一条 M‐增广路,与给定条件矛盾。
通过增广路求二分图上的最大匹配
从图 G = (S, T, E)的任意一个匹配 M 开始,比如空集。
123
由 S 的一个未被匹配的顶点出发,用一个系统方法搜
索一条 M‐增广路 P。
若 P 存在,则通过交换 P 在 M 和不在 M 中的边,便
得到一个其基数增加 1 的匹配。
然后从新的匹配开始,继续迭代,直到不存在 M‐增广
路,则当前的匹配就是 G的最大匹配。
二分图上最大匹配的标号算法
输入:二分图 G = (S, T, E)。
124
输出:G 的最大匹配 M。
1 M 。
2 对 S 中所有不在 M 中的顶点标号“”,然后
将这些顶点都加入 Q。
/* Q是已标号但未检查的顶点的集合 */
3 while Q do
4 从 Q中取出一个顶点 k,然后将 k从 Q中删除。
5 if k S then 6 对每条同 k关联的边(k, j) M,
125
若 j 尚未被标号,则给点 j 标号 k,
并将 j加入 Q。
7 else /* k T */ 8 if k在M中 then /* 此时有 k T V(M) */
9 设(i, k)是关联于 i、属于 M 的边
(此时 i S)。给点 i标号 k,
并将 i加入 Q。
10 else /* 此时有 k T \ V(M) */
11 终止在 k 的一条增广路被找到。从 k
126
开始,反向追踪标号找到这条增广
路 P,路的起始顶点有标号“”。
12 用增广路 P更新 M。
13 删除 G 上所有的标号。重新对 S中所
有不在 M 中的顶点标号“”,然
后将这些顶点都加入 Q。
14 endif
15 endif
16 endwhile
127
17 return M。(此时 S中没有标号的点的集合和 T中已
标号的点的集合构成对偶于 M 的最小顶点覆盖。)
例例子
128
找找到一条增广路(11, 7)。更
129
更新M。
找找到一条增广路(22, 8)。更
130
更新M。
找找到一条增广路(33, 10)。更
131
更新M。
找找到一条增广路(44, 10, 3, 9
132
9)。更新新 M。
找找不到增广路,结结束。
133
{红红边}为最最大匹配配,{蓝色
134
色顶点}为顶顶点覆盖
盖。
135
时间复杂度分析
令|S| = m,|T| = n,假设 m n。
找一条增广路(或判断不能找到)标号算法最多进行
O(mn)次检查(因为最多有这么多条边)。
初始匹配最多被增广 m次。
所以,总的计算量为 O(m2n)。
136
解释
从 S中未匹配的顶点开始,标号找M‐增广路的过程,
实际上是一个从 S 中未匹配的顶点开始进行类广度
优先搜索的过程。
该过程与标准的广度优先搜索不完全相同。
设搜索树的根位于第 1 层。区别仅在于,在搜索过
程中,奇数层顶点(在 S 一侧)按广度优先展开;
偶数层顶点(在 T 一侧)按 M 中的(唯一一条)边
137
顺延(而不是按广度优先展开)。
138
139
标号,找增广路。
140
找
虚
找增广路
虚线表示
过程中形
v5, u3相
形成的搜
邻,但在
141
搜索树
在对 v5进进行检查的
的过程中中,u3
142
已经标号,因此从 v5不能对 u3标号。
增广,找到一个更大的匹配
143
144
广度优先搜索的观点
145
146
中间:构造的辅助图。
顶点集 = V。
从 v1到 v2有一条有向边,当且仅当 u U,使得
(v1, u) M,(u, v2) M(即,从 v1开始经过一条细
的边和一条粗的边能够到达 v2 )。
右图:从辅助图上入度为 0的点 v2开始的广度优先搜索。
Hall定理
定理 6.8.2(Hall, 1935) 设 G = (S, T, E)是一个二分图。
147
则:G含有匹配 S 中的每个点的匹配 当且仅当
X S,有|(X)| |X|。 (*)
证:
()。假设 G有一个匹配 M,匹配了 S中所有的顶点。
任取 S的一个子集 X。则 X通过 M匹配到的点的集合
Y是 X 的一个子集。因此 XYX 。
()。反证。假设 G 满足(*)式,但 G 没有匹配 S 中所
有顶点的匹配。
令 M*是 G的一个最大匹配。则 M*没有匹配 S 中所有
148
的顶点。设 u 是一个未被 M*匹配的顶点。
令 Z 为从 u 出发经过 M*‐交错路可达的所有顶点的集
合。
由 M*‐交错路的定义,从 u 出发的这样一条路 P必终
止于 S,见下图所示。
149
u S
T
否则(终止于 T),P就成为一条 M*‐增广路,与 M*
是最大匹配矛盾。因此,Z 中除 u外所有的点都被 M*
匹配。
令 X = Z S,Y = Z T。则 u X。由于 X \ {u}中的点
150
与 Y 中的点在 M*下匹配,因此
|Y| = |X| 1。
Y
X u S
T
断言:(X) Y。
151
若断言成立,则|(X)| |Y| = |X| 1 < |X|,与(*)矛
盾,于是定理证毕。
下面证明断言。
任取 X中一个顶点 x,设 x 的邻居集合 (x) = {y1, y2,
y3, …}。因为 x 是从 u开始通过 M*‐交错路可达的,x
必关联一条匹配边,相应的邻居顶点设为 y1;其余顶
点为 y2, y3, …,它们是 x 经过非匹配边到达的顶点。
152
x
y1y2 y3 由于 x是通过某条M*‐交错路 P经过 y1到达的,因此,
由 Y 的定义,y1 Y。(实际上,仅有一条从 u出发的
M*‐交错路到达 x,这是因为 x只能关联一条匹配边。)
153
由于 u, …, y1, x是 M*‐交错路,u, …, y1, x, y2也是 M*‐
交错路。于是,y2在 Y 中。同理,y3等其他顶点都在
Y中。□
König定理
定理 6.8.3(König, 1931)在二分图中,最大基数对集的
边数等于最小顶点覆盖的点数。
证:
设 G = (S, T, E)是一个二分图,M*是 G 上的最大匹配。
154
通过构造一个大小和|M*|相等的最小顶点覆盖来证
明定理。
令 U 表示 S 中 M*未匹配的顶点的集合,Z 表示从 U
中的顶点出发经过 M*‐交错路能够到达的顶点的集合。
令 X = Z S,Y = Z T。
由 Y 的定义,可知 M*匹配了 Y中的所有的顶点。
定义 K = (S \ X) Y。
155
Y
X U
S \ X
我们声明,G 上不可能有跨在 X和 T \ Y之间的边。若
有这样的边,比如(x, t)(t 不在 Y中),则 t是经过从
U出发的 M*‐交错路可达的,于是,t 应该在 Y 中,矛
156
盾。因此,G 中的每一条边至少有一个端点在 K 中,
即,K是一个顶点覆盖。
由于 S中未被 M*匹配的点都在 U 中,S \ X中的点都
是被 M*匹配的,因此|M*| = |K|。
由于 M*中的所有边都是不相交的,任意的顶点覆盖
至少要覆盖 M*中的所有边。于是,K是最小顶点覆盖。
157
二分图上带权重的最大匹配问题
实例:二分图 G = (S, T, E),边上定义有非负权重{we}。
目标:找图G上的一个匹配M,使得总权重 e M we
最大。
该问题可通过过如下步
158
步骤转换
换为完全二二分图上上的最
159
小权重完美匹配问题。后者即是总所周知的指派问题1。
(1) 对二分图顶点数目少的一侧增加顶点,使得两
侧顶点数目相同。
(2) 添加边将图变成完全二分图,新添加的边上的
权重为 0。
(3) 找一个足够大的数 A,将每条边 e 上的权重修
1说明:教材[DLMS07]上将二分图上带权重的最大匹配问题称为指派问题。
[HL10] 及[KV12]上将完全二分图上的最小权重完美匹配问题称为指派问
题。实际上,这两个问题是等价的,可以相互转换。
160
改为 A – we。A的选择应使修改后的权重为非负的。
指派问题
事实上,指派问题可以很容易地归约到最小费用流
问题解决。
设 G = (S, T, E)为指派问题中的二分图,|S| = |T|= n。
增加一个源点 s,以及 s 到 S 中各个顶点之间的边。增
加一个目标顶点 t,以及 T 中各个顶点到 t 之间的边。
图中所有的边都改为有向边,其方向为从 s 到 t 的方
161
向。记如此得到的图为 G’。
将 s 到 S 之间的边以及 T 到 t 之间的边的费用设为 0。
将图中所有边的容量均设为 1。这就得到了最小费用
流的实例。
于是,G’上任意一个流值为 n的整数流,其在 S T 中
流值大于 0的边,构成 G上一个相同费用的完美匹配,
反之亦然。
下面,我们专专门介绍
162
绍求解指派派问题的的匈牙利算法。
163
匈牙利算法
1955年,Harold Kuhn(1925‐2014,美国)对指派
问题给出了一个组合算法。Kuhn将其称为“匈牙利算法”,
是因为该算法主要基于两位匈牙利数学家 Dénes Kőnig
和 Jenő Egerváry的工作。
[Kuh55] H. W. Kuhn. The Hungarian method for the
assignment problems. Naval Research Logistics
Quarterly, 2:83‐97, 1955.
164
The basic idea of the Hungarian method is to convert the
original cost table of the problem into a series of
equivalent cost tables containing many zeros. When there
are sufficiently many zeros, we will get an assignment with
zero cost. Since the total cost cannot be negative, this
assignment must be optimal.
The simplest transformation is to subtract the minimum of
a row (resp., column) from this row (resp., column).
165
Example
Solve the following assignment problem.
166
Solution.
After subtracting the corresponding minimum from each
row, we get
Now, each row has a zero and each column has a zero.
An optimal solution can be gotten by observation.
167
However, the condition that each row has a zero and each
column has a zero is only a necessary condition for an
optimal solution.
Consider the following example.
168
After subtracting the corresponding minimum from each
column, we get
169
Now, this table contains a zero in each row and in each
column. However, we cannot find a solution of zero cost
from it.
170
The key is that, if we use horizontal and vertical lines to
cross out the zeros in the table, the number of lines
needed is less than n ‐‐ the number of rows (or columns).
In general, the minimum number of lines needed to cross
171
out all zeros equals to the maximum number of
assignments that can be made to zero element positions.
So, we must create sufficiently many zeros in the table by
equivalent transformations.
We do this by (i) subtract the minimum number not
crossed out from the entire table, and (ii) add this number
to every crossed out rows and columns to eliminate
negative elements appeared.
172
173
Note that the number at row 3 and column 2 becomes 120,
since we add 30 two times to this position.
174
A shortcut for obtaining this cost table from the preceding
one is to subtract 30 from just the elements without a line
through them and then add 30 to every element that lies
at the intersection of two lines.
Now we need (at least) four lines to cross out all zeros, still
not five.
175
Now the minimum number of uncrossed out elements is
30. By subtracting 30 from all the uncrossed out elements
and add it to the elements lying at intersections of two
lines, we get
176
For this table, the minimum number of lines crossing out
all zeros is five. So, we can find a solution at zero cost,
which must be an optimal solution to the original problem.
177
The optimal solution is
1a‐‐2, 1b‐‐3, 2a‐‐1, 2b‐‐5, 3‐‐4.
The Hungarian Algorithm.
1 (Row reduction) Subtract the smallest number in
each row from every number in the row.
2 (Column reduction) Subtract the smallest number in
each column from every number in the column.
3 while the minimum number of lines to cross out
all zeros is not equal to n do
178
4 Subtract the smallest uncovered (i.e., not
crossed out) number from every uncovered
number in the table.
5 Add the smallest uncovered number to the
numbers at intersections of covering lines.
6 endwhile
7 repeat
8 Find a row or column that contains the least
number of zeros.
9 Make an assignment at the position that contains
179
a zero of this row (or column).
10 Cross out both the row and column involved at
this position.
11 until n assignments has been found.
12 return the complete set of assignments ever found.
P.S.
Given a n n matrix A, to find the minimum number of
lines crossing out all zeros is not a “quite” easy problem.
180
This problem can be converted into the Vertex Cover
problem in bipartite graph as follows.
We put n vertices u1, …, un in U, where each vertex denotes
a row of matrix A, and another n vertices v1, …, vn in V,
where each vertex denotes a column of matrix A. If there is
a zero at the position row i and column j in matrix A, then
we put an edge between ui and vj. Let the resulting graph
be G.
181
Then, the minimum number of lines crossing out all zeros
in A equals to the minimum number of vertices covering all
edges in G.
A minimum vertex cover on graph G can be found as
follows. First, find a maximum matching M in graph G.
Then, label the vertices along any M‐alternating path. The
unlabeled u‐vertices and the labeled v‐vertices constitute
a minimum vertex cover of G. (The details can be found in
several textbooks of operations research or combinatorial
o
ptimizatiion.)
182
183
二分图上带权重的最大匹配问题的原始对偶算法
说明:教材[DLSM07]中将“二分图上带权重的最大
匹配问题”亦称为指派问题。
问题的 LP 及其对偶 DP:
Ejix
Tjx
Six
LPxw
ij
jNiij
iNjij
Ejiijij
),( ,0
,1
,1.t.s
)(max
)(
)(
),(
TjvSiu
Ejiwvu
DPvu
j
i
ijji
Tjj
Sii
,0,0
),(,.t.s
)(min
184
互补松驰条件:
ijjiij wvux 0 (6.8.5)
10 j
iji xu (6.8.6)
10 i
ijj xv (6.8.7)
基本思想(原始‐对偶算法)
算法从可行对集M = 和可行对偶解{ui = maxj{wij}},
{vj = 0}开始。这时(6.8.5)和(6.8.7)全都满足,(6.8.6)
185
都不满足。
算法总是在仅由满足
ui + vj = wij
的边{(i, j)}构成的子网络上,找 S 中从 ui > 0 的顶点 i
出发的增广路。
若这样的增广路能够找到,则用它更新当前的M后,
(6.8.5)和(6.8.7)仍然是满足的,而(6.8.6)比以前多一
些被满足。
若这样的增广路找不到,则算法调整 ui和 vj的值。
186
当没有匹配的点的 ui调整到 0时,(6.8.6)全部满足,
算法求到最优解。
匈牙利算法
[Kuhn, 1955]
1 M ;i S, ui max{wij};
j T, vj 0, j + 。
2 给 S 中未匹配的顶点标“”。
3 while S中有未检查的标号点 或 (*)
187
T中有 j = 0的未检查的标号点 (**) do
4 找一个符合(*)或(**)的顶点 k。
5 if k S then
6 对于每条边(k, j) M,若 uk + vj – wij < j,
则对 j 标号“i”,并令 j uk + vj – wij。
7 else /* k T,j = 0 */
8 if k V(M) then
9 设(i, k) M。对 i标号“k”。
10 else /* k V(M) */
188
11 从顶点 k 反向追踪到标号为“”的点,
得到一条增广路 P。用 P更新 M。
12 j T, j +。
抹去所有点上的标号,回到第 2 步。
13 endif
14 endif
15 endwhile
16 1 min{ui | i S},2 min{j | j > 0, j S},
min{1, 2}。
189
17 对 S 中的每个有标号的顶点,ui ui ;
对 T 中每个 j = 0的顶点, vj vj + ;
对 T 中每个有标号且 j > 0的顶点, j j 。
18 若 < 1,则回到第 3步。
19 /* 否则,找到了最大权重匹配 */
return M。
190
例子
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
一般图上的最大匹配问题
最大基数匹配:
[Edm65a] Jack Edmonds. Paths, trees, and flowers. Canad.
J. Math. 17:449–467, 1965.
[MV80] Silvio Micali, Vijay V. Vazirani. An O(sqrt(|V|) |E|)
Algorithm for Finding Maximum Matching in General
Graphs. FOCS 1980:17‐27.
[Vaz14] A proof of the MV matching algorithm.
http://www.cc.gatech.edu/~vazirani/new‐proof.p
226
最大权重匹配:
[Edm65b] Jack Edmonds. Maximum matching and a
polyhedron with 0,1‐vertices. Journal of Research
National Bureau of Standards Section B, 69:125–130,
1965.
[DP14] Ran Duan, Seth Pettie. Linear‐time approximation
for maximum weight matching, JACM,
61(1)1:23,2014.