Professional Documents
Culture Documents
Graph04 Max Flow
Graph04 Max Flow
BM Khoa học Máy tính • TOÁN RỜI RẠC • Fall 2005 • Nguyễn Đức Nghĩa
Bài toán luồng cực đại
Maximum Flow Problem
v 3/3
4/6
1/1 t
4/7
s 3/3
w
1/1 1/9 3/5
3/5
u z
2/2
BM Khoa học Máy tính • TOÁN RỜI RẠC • Fall 2005 • Nguyễn Đức Nghĩa
NỘI DUNG
Bài toán luồng cực đại trong mạng.
Lát cắt, Đường tăng luồng.
Định lý về luồng cực đại và lát cắt hẹp nhất.
Thuật toán Ford-Fulkerson
Thuật toán Edmond-Karp.
Các ứng dụng
11
42
21
1
s 2 t
32
31
864 pages!
11
Toán rời rạc – Fall 2005 NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 2008/5/2
Mạng và luồng trong mạng
f (e ) f (e)
eE ( v ) eE ( v )
trong đó E(v) và E(v) tương ứng là tập các cung đi vào và đi ra khỏi
đỉnh v.
Định nghĩa. Giá trị của luồng f là
(*)
val ( f ) f (e) f ( e)
eE ( s ) eE ( t )
(Đẳng thức (*) thu được bằng cách cộng tất cả các điều kiện cân bằng luồng.)
Toán rời rạc – Fall 2005 NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 10
LUỒNG TRONG MẠNG – Ví dụ
Ví dụ:
v 1/3
2/6
1/1 t
3/7
s 3/3
w
1/1 2/9 4/5
3/5
u z
2/2
Trong 2 số viết bên mỗi cạnh: giá trị luồng trên cạnh là số màu
đỏ, số còn lại là khả năng thông qua.
Các điều kiện 1) và 2) được thoả mãn => f là luồng trên mạng.
Giá trị luồng là:
8 = f(s,v) + f(s,u) + f(s,w) = f(v,t) + f(w,t) + f(z,t)
Mạng: G = (V, E, s, t, c) .
(V, E) = đồ thị có hướng, không có cung lặp.
Có hai đỉnh đặc biệt: s = phát/nguồn (source), t = thu/đích (sink).
c(e) = khả năng thông qua (capacity) của cung e.
2 9 5
10 15 15 10
4
s 5 3 8 6 10 t
4 6 15 10
Capacity 15
-
f (e) :
w : ( w, v ) E
f ( w, v)
f (e) :
w : ( v ,w) E
f (v, w)
eE ( v ) eE ( v )
0
2 9 5
4 0
0
10 15 15 0 10
4 4
0 4 4
s 5 3 8 6 10 t
0 0
kntq 4 0 6 15 0 10
15
Capacity
0
Luồng 4 30 7
Toán rời rạc – Fall 2005 NGUYỄN ĐỨC NGHĨA
Flow 0 Bộ môn KHMT 14
Luồng
Bài toán luồng cực đại: Tìm luồng có tổng luồng trên các cạnh đi ra
khỏi đỉnh phát là lớn nhất:
val ( f ) f ( e) f (e )
eE ( s ) eE (t )
0
2 9 5
4 0
0
10 15 15 0 10
4 4
0 4 4
s 5 3 8 6 10 t
0 0
kntq 4 0 6 15 0 10
15
Luồng 0 Giá trị = 4
6
2 9 5
10 6
0
10 15 15 0 10
4 4
3 8 8
s 5 3 8 6 10 t
1 10
4 0 6 15 0 10
kntq 15
11 Giá trị = 24
Luồng 4 30 7
11
9
2 9 5
10 9
1
10 15 15 0 10
4 0
4 8 9
s 5 3 8 6 10 t
4 10
4 0 6 15 0 10
kntq 15
14 Giá trị = 28
Luồng 4 30 7
14
Network connectivity.
Network reliability.
Bipartite matching.
Security of statistical data.
Data mining.
Distributed computing.
Open-pit mining.
Egalitarian stable matching.
Airline scheduling.
Distributed computing.
Image processing.
Many many more . . .
Project selection.
Baseball elimination.
Lát cắt là cách phân hoạch tập đỉnh (S, T) sao cho s S, t T.
Khả năng thông qua cap(S,T) của lát cắt (S, T) là số:
cap( S , T )
eS T
c(e),
trong ®ã S T : {(v, w) E : v S , w T }
Lát cắt nhỏ nhất (hẹp nhất) là lát cắt với kntq nhỏ nhất.
2 9 5
10 15 15 10
4
s 5 3 8 6 10 t
4 6 15 10
15
kntq = 30
Toán rời rạc – Fall 2005
4 30 7
NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 22
Lát cắt
Lát cắt (S1, T1), S1={s,2,3,4}, T={5,6,7,t) có khả năng thông qua 62:
2 9 5
10 15 15 10
4
s 5 3 8 6 10 t
4 6 15 10
15
cap(S1,T1)= 62
4 30 7
Toán rời rạc – Fall 2005 NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 23
Lát cắt
Lát cắt (S2, T2), S2={s,3,4,7}, T2={2,5,6,t) có khả năng thông qua 28:
2 9 5
10 15 15 10
4
s 5 3 8 6 10 t
4 6 15 10
15
cap(S2,T2) = 28
Toán rời rạc – Fall 2005
4 30 7
NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 24
Luồng và lát cắt
10 6
Giá trị = 24 0
10 15 15 0 10
4 4
4 8 8
s 5 3 8 6 10 t
0 10
4 0 6 15 0 10
15
10
6
2 9 5
10 6
Giá trị = 24 0
10 15 15 0 10
4 4
4 8 8
s 5 3 8 6 10 t
0 10
4 0 6 15 0 10
15
10
4 30 7
10
6
2 9 5
10 6
0
Giá trị = 24 10 15 15 0 10
4 4
4 8 8
s 5 3 8 6 10 t
0 10
4 0 6 15 0 10
15
10
4 30 7
10
CM. Cộng tất cả các ràng buộc cân bằng luồng theo mọi vS, đơn
giản biểu thức ta thu được:
w
0 ( f ( e) f (e))
vS eE ( v ) eE ( v )
u v t
f ( e ) f ( e ) f (e )
eS T
eE ( s ) eT S
Bổ đề 2. Giả sử f là luồng, còn (S, T) là lát cắt. Khi đó, val(f) cap(S, T).
CM.
val ( f )
eS T
f (e)
eT S
f ( e)
eS T
f ( e) S 4
8
T
t
eS T
c (e)
cap(S , T ) s
7
6
Hệ quả. Giả sử f là luồng, còn (S, T) là lát cắt. Nếu val(f) = cap(S, T), thì
f là luồng cực đại còn (S, T) là lát cắt hẹp nhất.
CM. Xét f’ là luồng bất kỳ và (S’,T’) là lát cắt bất kỳ. Theo bổ đề ta có
val(f’) cap(S,T) = val(f) cap(S’,T’).
9
2 9 5
10 9
1
10 15 15 0 10
4 0
4 8 9
s 5 3 8 6 10 t
4 10
4 0 6 15 0 10
15
14
4 30 7
14 Giá trị luồng = 28
kntq của lát cắt = 28
Toán rời rạc – Fall 2005 NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 30
Định lý về luồng cực đại và lát cắt nhỏ nhất
Max-Flow Min-Cut Theorem
Đinh lý (Ford-Fulkerson, 1956): Trong mạng bất kỳ, giá trị của luồng
cực đại luôn bằng khả năng thông qua của lát cắt nhỏ nhất.
Proof (muộn hơn).
9
2 9 5
10 9
1
10 15 15 0 10
4 0
4 8 9
s 5 3 8 6 10 t
4 10
4 0 6 15 0 10
15
15
4 30 7
15 Flow value = 28
Cut capacity = 28
4 5
0
0 4 0
4
0 4
0 4
0 0
s 10 2 13 3 10 t
4 5
0
0 4 0
4
0 4
X
0 10 4 X
X
0 10 0 10
s 10 2 13 3 10 t
4 5
0
0 4 0
4
0 4
10 4
10 10
s 10 2 13 3 10 t
Thuật toán tham lam cho luồng với giá trị 10.
Thuật toán tham lam không cho lời giải tối ưu.
TT tham lam:
Giá trị luồng = 10
4 5
0
0 4 0
4
0 4
10 4
10 10
s 10 2 13 3 10 t
Tối ưu:
4 5
Giá trị luồng = 14
4
4 4 4
4
4 4
10 4
6 10
s 10 2 13 3 10 t
e = (u,v) eR = (v,u)
4 5
4
Gf 4
4
4
s 10 2 10 3 10 t
4 5
4 X
0
4 0
X 4 0 4
X
G 4
4 X
0 4
10 4
10
X 6 10
s 10 2 13 3 10 t
4 5 cf (P) = 4
4
Gf 4
4
4
s 10 2 10 3 10 t
Toán rời rạc – Fall 2005 NGUYỄN ĐỨC NGHĨA
3 Bộ môn KHMT 39
Đường tăng luồng
4 5
4
4 4 4
G 4
4 4
10 4
6 10
s 10 2 13 3 10 t
4 5
Giá trị luồng = 14
4
Gf 4
4
4
s 10 2 6 3 10 t
7
Toán rời rạc – Fall 2005 NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 40
Định lý về luồng cực đại và lát cắt nhỏ nhất
Định lý đường tăng luồng (Ford-Fulkerson, 1956): Luồng là cực đại khi
và chỉ khi không tìm được đường tăng luồng.
Định lý về luồng cực đại và lát cắt nhỏ nhất (Ford-Fulkerson, 1956): Giá
trị của luồng cực đại bằng khả năng thông qua của lát cắt nhỏ nhất.
Định lý. Giả sử f là luồng trong mạng. Ba mệnh đề sau là tương đương
(i) Tìm được lát cắt (S, T) sao cho val(f) = cap(S, T).
(ii) f là luồng cực đại.
(iii) Không tìm được đường tăng luồng f.
Chứng minh.
(i) (ii)
Suy từ hệ quả của Bổ đề 2.
(ii) (iii)
Chứng minh bằng lập luận phản đề (contrapositive): Nếu tìm được
đường tăng thì f không là luồng cực đại.
Thực vậy, nếu tìm được đường tăng P, thì tăng luồng dọc theo P
ta thu được luồng f’ với giá trị lớn hơn.
Từ đó suy ra
val ( f )
eS T
f (e )
eT S
f (e) s
eS T
c (e ) Mạng đã cho G
cap(S , T )
Augment(f,P)
b cf(P)
FOR e P DO
IF (e E) THEN // cạnh thuận
Ví dụ
f(e) f(e) + b
ELSE // cạnh nghịch
f(eR) f(e) – b
RETURN f Thuật toán Ford-Fulkerson
Ford_Fulkerson(G,c,s,t);
FOR e E DO // Khởi tạo luồng 0
f(e) 0
Gf đồ thị tăng luồng f
Giả thiết: tất cả các khả năng thông qua là các số nguyên trong
khoảng từ 0 đến C.
Bất biến: mỗi giá trị luồng f(e) và mỗi khả năng thông qua c f (e) luôn
luôn là số nguyên trong quá trình thực hiện thuật toán.
Định lý: Thụât toán dừng sau không quá val( f *) nC lần lặp.
CM. Sau mỗi lần tăng luồng, giá trị của luồng tăng thêm ít nhất 1.
Hệ quả: Nếu C = 1, thì thuật toán đòi hỏi thời gian O(mn).
Giả thiết: tất cả các khả năng thông qua là các số nguyên trong
khoảng từ 0 đến C.
Bất biến: mỗi giá trị luồng f(e) và mỗi khả năng thông qua c f (e) luôn
luôn là số nguyên trong quá trình thực hiện thuật toán.
Định lý: Thụât toán dừng sau không quá val( f *) nC lần lặp.
CM. Sau mỗi lần tăng luồng, giá trị của luồng tăng thêm ít nhất 1.
Hệ quả: Nếu C = 1, thì thuật toán đòi hỏi thời gian O(mn).
Định lý về tính nguyên: Nếu kntq là các số nguyên, thì luôn tồn tại
luồng cực đại với giá trị luồng trên các cung là các số nguyên.
Chú ý: Thuật toán có thể không dừng nếu kntq là không nguyên. Hơn
thế nữa thuật toán còn không hội tụ đến lời giải tối ưu.
Answer: Không phải. Nếu kntq lớn nhất là C thì thuật toán có thể phải
thực hiện cỡ C bước lặp.
Ví dụ:
4
0 0
109 109
s 1 0 t
109 109
0 0
2
1 4
0
X 0
109 109
1
s 1 X
0 t
109 109
0 X
0 1
2
4
1 0
109 109
s 1 1 t
109 109
0 1
2
4
1 X0 1
109 109
0
s 1 X
1 t
109 109
1 X
0 1
2
4
1 1
109 109
s 1 0 t
109 109
1 1
2
Zwick xây dựng ví dụ sau đây cho thấy thuật toán F-F có
thể không dừng, nếu như khả năng thông qua là số vô tỷ
s
X X
X
1 1
X
X X
t
s
X X
X
1 1
X
X X
t
1 0
Trên đồ thị tăng luồng:
Các cung nằm ngang theo
thứ tự từ trái sang có khả t
năng rút gọn là 1, 0,
Toán rời rạc – Fall 2005 NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 55
Thực hiện thuật toán FF
s s
t t
B C
s s
X X
X
1 1
X X
X
t t
A
Toán rời rạc – Fall 2005 NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 56
Thực hiện thuật toán FF
Giả sử ở đầu lần lặp k các cung đó có khả năng thông qua là k-1, 0, k. Khi đó
1) Tăng luồng dọc theo B thêm k, kntq của chúng trở thành k+1, k, 0
2) Tăng luồng dọc theo C thêm k, kntq của chúng trở thành k+1, 0, k,
3) Tăng luồng dọc theo B thêm k+1, kntq của chúng trở thành 0, k+1, k+2,
4) Tăng luồng dọc theo A thêm k+1, kntq của chúng trở thành k+1, 0, k+2,
Sau 4 lần tăng, giá trị của luồng tăng thêm là 2(k+k+1)=2k+2
Sau 4n+1 lần tăng luồng, khả năng thông qua sẽ là 2n-2, 0, 2n-1, Khi số lần tăng
luồng ra vô cùng, giá trị của luồng sẽ là
Mặc dù dễ thấy là giátrị của luồng cực đại trong mạng này là 2X+1.
2
1 2 1
i
4 5 7.
i 1 1
Cần hết sức cẩn thận khi lựa chọn đường tăng, bởi vì
Một số cách chọn dẫn đến thuật toán hàm mũ.
Cách chọn khôn khéo dẫn đến thuật toán đa thức.
Nếu kntq là các số vô tỷ, thuật toán có thể không dừng
Trực giác: chọn đường đi với kntq lớn nhất sẽ tăng giá trị luồng lên
nhiều nhất.
Không cần quan tâm đến tìm đường với kntq lớn nhất.
Chọn thông số thang độ .
Gọi Gf () là đồ thị con của đồ thị tăng luồng chỉ gồm các cung có
kntq ít nhất là .
4 4
s 1 t s t
2 2
Gf Gf (100)
Toán rời rạc – Fall 2005 NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 59
Thuật toán Capacity Scaling
ScalingMaxFlow(V, E, s, t, c)
FOR e E, f(e) 0
q = min { k Z : 2k C }; = 2q
WHILE ( 1)
Xây dựng đồ thị Gf()
WHILE (tìm được đường đi P từ s đến t trong Gf())
f augment(f, P)
Hiệu chỉnh Gf()
/ 2
RETURN f
Pha nấc
Giả thiết. Khả năng thông qua của các cung là các số nguyên trong
khoảng từ 1 đến C.
Tính bất biến. Mọi luồng và khả năng thông qua trong suốt quá trình
thực hiện thuật toán luôn là số nguyên.
Tính đúng đắn: Nếu thuật toán kết thúc thì f là luồng cực đại.
Chứng minh.
Theo tính bất biến, khi = 1 Gf() = Gf
Pha nấc = 1 kết thúc khi không tìm được đường tăng luồng
Vậy f là luồng cực đại.
Bổ đề 2. Giả sử f là luồng tại thời điểm kết thúc pha nấc . Thế thì giá trị
của luồng cực đại không vượt quá val( f ) + m .
CM. Xem Silde tiếp theo
Định lý. Thuật toán Scaling max-flow kết thúc sau không quá O(m log C)
lần tăng luồng và có thể cài đặt với thời gian O(m 2 log C ).
Bổ đề 2. Giả sử f là luồng tại thời điểm kết thúc pha nấc . Thế thì giá
trị của luồng cực đại không vượt quá val( f ) + m .
CM.
Ta sẽ chỉ ra là khi kết thúc pha nấc phải tìm được lát cắt (S, T)
sao cho cap(S, T) val( f ) + m .
Gọi S là tập các đỉnh đạt tới được từ s trong Gf().
– rõ ràng s S, và t S theo định nghĩa của S
val ( f )
eS T
f (e)
eT S
f (e )
S T
eS T
( c ( e) )
eT S
t
eS T
c (e )
eS T
eT S
s
cap( S , T ) - mΔ
Mạng đã cho
Toán rời rạc – Fall 2005 NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 63
Ví dụ
4
0 0
109 109
s 1 0 t
109 109
0 0
2
4 4
109 109
109 109 109 109
0
s t s 1 t
Gf(229) G
4 4
109 109
109 109 109 109
0
s t s 1 t
Gf(229) G
4 4
109 109
10 9
10 9
109 109
0
s t s 1 t
Gf(229) G
Gf(2k), k = 28, 27, ..., 2, 1 như nhau. Các pha nấc 2k kết thúc mà không
tăng được luồng
4 4
109 109
10 9
10 9
109 109
0
s t s 1 t
Trên Gf(1) không tìm được đường đi từ s đến t. Thuật toán kết thúc.
4 4
109 109
10 9
10 9
109 109
0
s 1 t s 1 t
Gf(1) G
Cần hết sức cẩn thận khi lựa chọn đường tăng, bởi vì
Một số cách chọn dẫn đến thuật toán hàm mũ.
Cách chọn khôn khéo dẫn đến thuật toán đa thức.
Nếu kntq là các số vô tỷ, thuật toán có thể không dừng
ShortestAugmentingPath(V, E, s, t)
FOREACH e E
f(e) 0
Gf đồ thị tăng luồng (residual graph)
Bổ đề 1. Trong suốt thuật toán, độ dài đường tăng ngắn nhất không
khi nào bị giảm.
CM sau.
Định lý. Thuật toán đường tăng luồng ngắn nhất đòi hỏi thời gian
tính O(m2n).
CM
O(m+n) thời gian để tìm đường ngắn nhất nhờ sử dụng BFS.
O(m) lần tăng đối với đường đi có đúng k cung.
Nếu có đường tăng thì luôn tìm được đường tăng là đơn.
1k<n
O(mn) lần tăng
Thời gian của thuật toán là O(mn(m+n)) = O(m2n).
Toán rời rạc – Fall 2005 NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 75
Phân tích thuật toán ĐTNN
G:
s 3 6 t
2 5
LG :
s 3 6 t
=0 =1 =2 =3
Toán rời rạc – Fall 2005 NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 76
Phân tích thuật toán ĐTNN
2 5
L:
s 3 6 t
= = = =
Toán rời rạc 0
– Fall 2005
1 2 3
NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 77
Phân tích thuật toán ĐTNN
Bổ đề 1. Trong suốt thuật toán, độ dài đường tăng ngắn nhất không
khi nào bị giảm.
CM. Giả sử f và f' là luồng trước và sau khi tăng luồng theo đường
ngắn nhất. Gọi L và L' là hai đồ thị mức của Gf và Gf '
Chỉ có cung nghịch được bổ sung vào Gf '
– đường đi với cung nghịch có độ dài lớn hơn độ dài trước ■
2 5
s 3 6 t
s 3 6 t
Toán rời rạc – Fall 2005 NGUYỄN ĐỨC NGHĨA
Bộ môn KHMT 78
Phân tích thuật toán ĐTNN
s 3 6 t
s 3 6 t
Bổ đề 1. Trong suốt thuật toán, độ dài đường tăng ngắn nhất không
khi nào bị giảm.
Định lý. Thuật toán đường tăng luồng ngắn nhất đòi hỏi thời gian
tính O(m2n).
O(m+n) thời gian để tìm đường ngắn nhất nhờ sử dụng BFS.
O(m) lần tăng đối với đường đi có đúng k cung.
O(mn) lần tăng.
Chú ý: (mn) lần tăng là cần thiết đối với một số mạng cụ thể.
Cố gắng tìm cách giảm số lần tăng.
Cây động
O(mn log n) Sleator-Tarjan, 1983
Ý tưởng khác O(mn2)
Dinitz, 1970
4 qui tắc đầu đòi hỏi khả năng thông qua nằm trong khoảng từ 0 đến C.