Tải bản đầy đủ (.doc) (35 trang)

TIỂU LUẬN TOÁN ỨNG DỤNG BÀI TOÁN TÌM LUỒNG CỰC ĐẠI TRONG MẠNG THEO THUẬT TOÁN FORD-FULKERSON

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (421.01 KB, 35 trang )


ĐẠI HỌC ĐÀ NẴNG
BAN ĐÀO TẠO SAU ĐẠI HỌC



GVHD : PGS. TS. TRẦN QUỐC CHIẾN
NHÓM HV :
ĐẶNG QUÝ LINH
TRẦN THỊ ÁI QUỲNH
HUỲNH CÔNG TRƯỜNG
PHÙNG HỮU ĐOÀN
PHẠM VĂN TUẤN
LỚP : CAO HỌC KHMT K24

Đà Nẵng, tháng 05/2012
Đề tài:
BÀI TOÁN TÌM LUỒNG CỰC ĐẠI TRONG MẠNG THEO
THUẬT TOÁN FORD-FULKERSON
Tiểu luận
MỤC LỤC
LỜI MỞ ĐẦU
THÔNG TIN VỀ NHÓM
1
1
LỜI MỞ ĐẦU 3
THÔNG TIN VỀ NHÓM 4
CHƯƠNG I 1
MỘT SỐ KHÁI NIỆM CƠ BẢN CỦA LÝ THUYẾT ĐỒ THỊ 1
1.1 Định nghĩa đồ thị 1
Hình 1 2


Hình 4. Sơ đồ mạng máy tính với đa kênh thông báo 3
1.2. Các thuật ngữ cơ bản 4
1.3. Đường đi, chu trình. Đồ thị liên thông 5
CHƯƠNG II 7
BÀI TOÁN TÌM LUỒNG CỰC ĐẠI THEO 7
THUẬT TOÁN FORD-FULKERSON 7
2.1. Các khái niệm 7
2.1.1. Mạng và luồng trong mạng 7
2.1.2. Bài toán luồng cực đại trong mạng 8
2.1.3. Lát cắt, giá trị luồng 8
2.1.4. Định lý luồng cực đại lát cắt tối thiểu 10
2.2. Thuật toán Ford-Fulkerson tìm luồng cực đại trong mạng 12
CHƯƠNG III 18
THIẾT KẾ VÀ CÀI ĐẶT CHƯƠNG TRÌNH 18
3.1. Cấu trúc dữ liệu 18
3.2. Thiết kế 18
3.3. Cài đặt 22
3.4. Kiểm thử và giao diện chương trình 29
KẾT LUẬN 30
TÀI LIỆU THAM KHẢO 1
TÀI LIỆU THAM KHẢO

Tiểu luận
LỜI MỞ ĐẦU
Bài toán luồng cực đại trong mạng cũng là một trong số những bài toán tối ưu trên
đồ thị tìm được những ứng dụng rộng rãi trong thực tế cũng như những ứng dụng thú vị
trong lý thuyết tổ hợp. Bài toán được đề xuất vào đầu những năm 1950, và gắn liền với
tên tuổi của hai nhà bác học Mỹ là L.R.Ford và D.R.Fulkerson.
Bài toán luồng cực đại trong mạng có nhiều ứng dụng trong thực tế như: Bài toán
xác định cường độ dòng lớn nhất của dòng vận tải giữa hai nút của một bản đồ giao

thông, bài toán tìm luồng dầu lớn nhất có thể bơm từ tàu chở dầu vào bể chứa của một hệ
thống đường ống dẫn dầu…Ngoài ra, ứng dụng của bài toán còn để giải các bài toán như:
Bài toán đám cưới vùng quê, bài toán về hệ thống đại diện chung, bài toán phân nhóm
sinh hoạt, bài toán lập lịch cho hội nghị…
Trong bài tiểu luận này chúng em sẽ trình bày “Bài toán luồng cực đại trong
mạng” sử dụng thuật toán Ford - Fulkerson (1962) để giải bài toán đặt ra. Chương trình
minh họa thuật toán được viết bằng ngôn ngữ C và sử dụng các tập tin văn bản để lấy dữ
liệu ban đầu và xuất kết quả ra.
Nhóm chúng em đã cùng nhau thảo luận và trao đổi các vấn đề của đề tài, phân
chia nhiệm vụ cho mỗi thành viên, từ đó cố gắng đạt được kết quả tốt nhất cho bài báo
cáo. Tuy nhiên có thể không tránh khỏi những thiếu sót, nhóm chúng em rất mong nhận
được sự góp ý của thầy giáo và các bạn để báo cáo này được hoàn thiện hơn nữa.
Chân thành cảm ơn!

Tiểu luận
THÔNG TIN VỀ NHÓM
STT HỌ TÊN CÔNG VIỆC THỰC HIỆN CHỮ KÝ
NHẬN XÉT CỦA
GIÁO VIÊN
1. Đặng Quý Linh Tìm kiếm tài liệu
Chương 3 + Kết luận
Tổng hợp lần 3
2. Trần Thị Ái Quỳnh Tìm kiếm tài liệu
Chương 1 + Lời mở đầu
Tổng hợp lần 1
3. Huỳnh Công Trường Tìm kiếm tài liệu
Slide thuyết trình
4. Phùng Hữu Đoàn Tìm kiếm tài liệu
Chương 2
5. Phạm Văn Tuấn Tìm kiếm tài liệu

Tổng hợp lần 2

Tiểu luận
CHƯƠNG I
MỘT SỐ KHÁI NIỆM CƠ BẢN CỦA LÝ THUYẾT ĐỒ THỊ
1.1 Định nghĩa đồ thị
Đồ thị là một cấu trúc rời rạc bao gồm các đỉnh và các cạnh nối các đỉnh này, các
loại đồ thị khác nhau được phân biệt bởi kiểu và số lượng cạnh nối hai đỉnh nào đó của
đồ thị.
Giả sử V là tập hữu hạn, không rỗng các phần tử nào đó. Bộ G = (V,E) được gọi là
đồ thị hữu hạn. Mỗi phần tử của V gọi là một đỉnh và mỗi phần tử u = (x,y) của E được
gọi là một cạnh của đồ thị G = (V,E).
Xét một cạnh u của E khi đó tồn tại hai đỉnh x, y của V sao cho u = (x,y), ta nói rằng
x nối với y hoặc x và y phụ thuộc u.
- Nếu cạnh u = (x,y) mà x và y là hai đỉnh phân biệt thì ta nói x, y là hai đỉnh kề
nhau.
- Nếu u = (x,x) thì u là cạnh có hai đỉnh trùng nhau ta gọi đó là một khuyên.
- Nếu u = (x,y) mà x, y là cặp đỉnh có phân biệt thứ tự hay có hướng từ x đến y thì
u là một cung, khi đó x là gốc còn y là ngọn hoặc x là đỉnh ra, y là đỉnh vào.
- Khi giữa cặp đỉnh (x,y) có nhiều hơn một cạnh thì ta nói rằng những cạnh cùng
cặp đỉnh là những cạnh song song hay là cạnh bội.
Trong thực tế ta có thể gặp nhiều vấn đề mà có thể dùng mô hình đồ thị để biểu
diễn, như sơ đồ mạng máy tính, sơ đồ mạng lưới giao thông, sơ đồ thi công một công
trình.
Thí dụ 1. Xét một mạng máy tính, có thể biểu diễn mạng này bằng một mô hình đồ
thị, trong đó mỗi máy tính là một đỉnh, giữa các máy được nối với nhau bằng các dây
truyền, chúng tương ứng là các cạnh của đồ thị. Một mô hình mạng máy tính như hình 1
trong đó các máy tính a, b , c, d tương ứng là các đỉnh, giữa hai máy được nối trực tiếp
với nhau thì tương ứng với một cặp đỉnh kề nhau.
Trang 1

Tiểu luận
Hình 1
Định nghĩa 1. Đơn đồ thị vô hướng G = (V,E) bao gồm V là các tập đỉnh và E là các
tập các cặp không có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh.
Thí dụ 2.
Hình 2. Sơ đồ máy tính là đơn đồ thị vô hướng
Trong trường hợp giữa hai máy tính nào đó thường xuyên phải tải nhiều thông tin
người ta phải nối hai máy này bởi nhiều kênh thoại. Mạng với đa kênh thoại giữa các
máy được cho trong hình 3.
Hình 3. Sơ đồ mạng máy tính với đa kênh thoại
Định nghĩa 2. Đa đồ thị vô hướng G = (V,E) bao gồm V là tập các đỉnh, và E là họ
các cặp không có thứ tự gồm hai phần tử khác nhau của V gọi là các cạnh. Hai cạnh e
1
và e
2
được gọi là cạnh lặp nếu chúng cùng tương ứng với một cặp đỉnh.
Trang 2
c
d
b
a
l
k
i
h
ge
d
c
b
a

c
d
l
k
i
h
ge
b
a
Tiểu luận
Hình 4. Sơ đồ mạng máy tính với đa kênh thông báo
Rõ ràng mỗi đơn đồ thị là đa đồ thị, nhưng không phải đa đồ thị nào cũng là đơn đồ
thị, vì trong đa đồ thị có thể có hai (hoặc có nhiều hơn) cạnh nối một cặp đỉnh nào đó.
Trong mạng máy tính có thể có những kênh thoại nối một máy nào đó với chính nó
(chẳng hạn với mục đích thông báo). Mạng như vậy được cho trong hình 4. Khi đó đa đồ
thị không thể mô tả được mạng như vậy, bởi vì có những khuyên(cạnh nối một đỉnh với
chính nó). Trong trường hợp này chúng ta cần sử dụng đến khái niệm giả đồ thị vô
hướng, được định nghĩa như sau.
Định nghĩa 3. Giả đồ thị vô hướng G = (V,E) bao gồm V là các tập đỉnh, và E là
họ các cặp không có thứ tự (không nhất thiết phải khác nhau) của V gọi là các cạnh.
Cạnh e được gọi là khuyên nếu nó có dạng e = (u,u).
Các kênh thoại trong mạng máy tính có thể chỉ cho phép truyền tin theo một chiều.
Chẳng hạn trong hình 5 máy chủ ở a chỉ có thể nhận tin từ các máy ở máy khác, có một
số máy chỉ có thể gửi tin đi, còn các kênh thoại cho phép truyền tin theo cả hai chiều
được thay thế bởi hai cạnh có hướng ngược chiều nhau.
Hình 5. Mạng máy với các kênh thoại một chiều
Trang 3
l
b
a

g
c
d
k
i
h
e
c
d
l
k
i
h
ge
b
a
Tiểu luận
Ta đi đến định nghĩa sau.
Định nghĩa 4. Đơn đồ thị có hướng G = (V,E) bao gồm V là các tập đỉnh và E là các
cặp có thứ tự gồm hai phần tử khác nhau của V gọi là các cung.
Nếu trong mạng có thể có đa kênh thoại một chiều, ta sẽ phải sử dụng đến khái niệm
đa đồ thị có hướng:
Định nghĩa 5. Đa đồ thị có hướng G = (V,E) bao gồm V là các tập đỉnh và E là họ
các cặp có thứ tự gồm hai phần tử khác nhau của V gọi là các cung. Hai cung e
1
, e
2
tương ứng cùng với một cặp đỉnh được gọi là cung lặp.
Trong các phần tử tiếp theo chủ yếu chúng ta sẽ làm việc với đơn đồ thị vô hướng và
đơn đồ thị có hướng. Vì vậy, để ngắn gọn, ta bỏ qua tính từ đơn khi nhắc đến chúng.

1.2. Các thuật ngữ cơ bản
Trước tiên, ta xét các thuật ngữ mô tả các đỉnh và cạnh của đồ thị vô hướng.
Định nghĩa 1. Hai đỉnh u và v của đồ thị vô hướng G được gọi là kề nhau nếu (u,v)
là cạnh của đồ thị G. Nếu e = (u,v) là cạnh của đồ thị thì ta nói cạnh này là liên thuộc
với hai đỉnh u và v, hoặc cũng nói là cạnh e là nối đỉnh u và đỉnh v đồng thời các đỉnh u
và v sẽ được gọi là các đỉnh đầu của cạnh (u,v).
Để có thể biết có bao nhiêu cạnh liên thuộc với một cạnh, ta đưa vào định nghĩa sau.
Định nghĩa 2. Ta gọi bậc của đỉnh v trong đồ thị vô hướng là số cạnh liên thuộc với
nó và sẽ ký hiệu là deg(v).
Bậc của đỉnh có các tính chất sau:
Định lý 1. Giả sử G = (V,E) là đồ thị vô hướng với m cạnh. Khi đó
Hệ quả. Trong đồ thị vô hướng, số đỉnh bậc lẻ (nghĩa là đỉnh có bậc là số lẻ) là
một số chẵn.
Ta xét các thuật ngữ tương tự cho đồ thị có hướng.
Định nghĩa 3. Nếu e = (u,v) là cung của đồ thị có hướng G thì ta nói hai đỉnh u và v
là kề nhau, và nói cung (u,v) nối đỉnh u với đỉnh v hoặc cũng nói cung này là đi ra khỏi
đỉnh u và đi vào đỉnh v. Đỉnh u(v) sẽ được gọi là đỉnh đầu(cuối) của cung (u,v).
Trang 4


=
Vv
vm )deg(2
Tiểu luận
Định nghĩa 4. Ta gọi bán bậc ra (bán bậc vào) của đỉnh v trong đồ thị có hướng là
số cung của đồ thị đi ra khỏi nó (đi vào nó) và ký hiệu là deg
+
(v)(deg
-
(v)).

Định lý 2. Giả sử G = (V,E) là đồ thị có hướng. Khi đó
Rất nhiều tính chất của đồ thị có hướng không phụ thuộc vào hướng trên các
cung của nó. Vì vậy, trong rất nhiều trường hợp sẽ thuận tiện hơn nếu ta bỏ qua hướng
trên các cung của đồ thị. Đồ thị vô hướng thu được bằng cách bỏ qua hướng trên các
cung được gọi là đồ thị vô hướng tương ứng với đồ thị có hướng đã cho.
1.3. Đường đi, chu trình. Đồ thị liên thông.
Định nghĩa 1. Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó n là số nguyên
dương, trên đồ thị vô hướng G = (V,E) là dãy
x
0
, x
1
,…, x
n-1
, x
n
Trong đó u = x
0
, v = x
n
, v = (x
i
, x
i+1
)

E, i = 0,1,2,…, n-1.
Đường đi nói trên còn có thể biểu diễn dưới dạng dãy các cạnh:
(x
0

,x
1
), (x
1
,x
2
),…, (x
n-1
,x
n
).
Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi. Đường đi có đỉnh
đầu trùng với đỉnh cuối (tức là u = v) được gọi là chu trình. Đường đi hay chu trình được
gọi là đơn nếu như không có cạnh nào bị lặp lại.
Khái niệm đường đi và chu trình trên đồ thị có hướng được định nghĩa hoàn toàn
tương tự như trường hợp đồ thị vô hướng, chỉ khác là ta có chú ý đến hướng trên các
cung.
Định nghĩa 2. Đường đi độ dài n từ đỉnh u đến đỉnh v, trong đó n là số nguyên
dương, trên đồ thị có hướng G = (V,A) là dãy x
0
, x
1
,…, x
n-1
, x
n
; trong đó u = x
0
, v = x
n

, (x
i
,
x
i+1
)

A, i = 0, 1, 2,…, n-1.
Đường đi nói trên còn có thể biểu diễn dưới dạng dãy các cung: (x
0
, x
1
), (x
1
, x
2
), (x
n-1
,
x
n
).
Trang 5
∑∑


+

==
VvVv

Evv ||)(deg)(deg
Tiểu luận
Đỉnh u gọi là đỉnh đầu, còn đỉnh v gọi là đỉnh cuối của đường đi. Đường đi có đỉnh
đầu trùng với đỉnh cuối (tức là u = v) được gọi là chu trình. Đường đi hay chu trình được
gọi là đơn nếu như không có cạnh nào bị lặp lại.
Xét một mạng máy tính. Một câu hỏi đặt ra là hai máy tính bất kỳ trong mạng này
có thể trao đổi thông tin được với nhau hoặc là trực tiếp qua kênh nối chúng hoặc thông
qua một hoặc vài máy trung gian trong mạng ? Nếu sử dụng đồ thị để biểu diễn mạng
máy tính này (trong đó các đỉnh của đồ thị tương ứng với các máy tính, còn các cạnh
tương ứng của các kênh nối) câu hỏi đó được phát biểu trong ngôn ngữ đồ thị như sau:
Tồn tại hay chăng đường đi giữa mọi cặp đỉnh của đồ thị.
Định nghĩa 3. Đồ thị vô hướng G = (V,E) được gọi là liên thông nếu luôn tìm được
đường đi giữa hai đỉnh bất kỳ của nó.
Như vậy hai máy tính bất kỳ trong mạng có thể trao đổi thông tin được với nhau khi
và chỉ khi đồ thị tương ứng với mạng này là đồ thị liên thông.
Trang 6
Tiểu luận
CHƯƠNG II
BÀI TOÁN TÌM LUỒNG CỰC ĐẠI THEO
THUẬT TOÁN FORD-FULKERSON
Bài toán luồng cực đại trong mạng là một trong những bài toán tối ưu trên đồ thị
tìm được những ứng dụng rộng rãi trong thực tế cũng như những ứng dụng thú vị trong lý
thuyết tổ hợp. Bài toán được đề xuất vào đầu những năm 1950, và gắn liền vơi tên tuổi
của hai nhà toán học Mỹ là Ford và Fulkerson. Trong nội dung bài viết này chúng tôi
muốn trình bày thuật toán của hai ông và cài đặt nó cũng như đưa ra một số bài toán ứng
dụng của thuật toán.
2.1. Các khái niệm
2.1.1. Mạng và luồng trong mạng
Định nghĩa 1. Ta gọi mạng là đồ thị có hướng G = (V,E), trong đó có duy nhất
một đỉnh s không có cung đi vào gọi là điểm phát, duy nhất một đỉnh t không có cung đi

ra gọi là điểm thu và mỗi cung e = (v,w)

E được gán với một số không âm c(e) =
c(v,w) gọi là khả năng thông qua của cung e.
Để thuận tiện cho việc trình bày ta sẽ quy ước rằng nếu không có cung (v,w) thì
khả năng thông qua c(v,w) được gán bằng 0.
Định nghĩa 2. Giả sử cho mạng G = (V,E). Ta gọi luồng f trong mạng G = (V,E)
là ánh xạ f: E

R
+
gán cho mỗi cung e =(v,w)

E một số thực không âm f(e) = f(v,w),
gọi là luông trên cung e, thoả mãn các điều kiện sau:
1. Luồng trên mỗi cung e

E không vượt quá khả năng thông qua của nó: 0 ≤ f
(e) ≤ c(e),
2. Điều kiện cân bằng luồng trên mỗi đỉnh của mạng : Tổng luồng trên các cung
đi vào đỉnh v bằng tổng luồng trên các cung đi ra khỏi đỉnh v, nếu v

s,t:

0),()()(
)()(
=−=
∑∑
+
Γ∈


Γ∈
vwvw
f
wvfvfvDiv
Trong đó
)(v

Γ
- tập các đỉnh của mạng mà từ đó có cung đến v,
)(v
+
Γ
- tập các đỉnh
của mạng mà từ v có cung đến nó:
{ } { }
.),(:)(,),(:)( EwvVwvEvwVwv
∈∈=Γ∈∈=Γ
+−
Trang 7
Tiểu luận
3.Giá trị của luồng f là số
.),(),()(
)()(
∑∑

Γ∈
+
Γ∈
==

twsw
twfwsffval
2.1.2. Bài toán luồng cực đại trong mạng
Cho mạng G=(V,E). Hãy tìm luồng f
*
trong mạng với giá trị luồng val(f
*
) là lớn
nhất . Luồng như vậy ta sẽ gọi là luồng cực đại trong mạng.
Bài toán như vậy có thể xuất hiện trong rất nhiều ứng dụng thực tế . chẳng hạn khi
cần xác định cường độ lớn nhất của dòng vận tải giữa 2 nút của một bản đồ giao thông.
Trong ví dụ này của bài toán luồng cực đại xẽ chỉ cho ta các đoạn đường đông xe nhất và
chúng tạo thành “chỗ hẹp” tương ứng với dòng giao thỗng xét theo hai nút được chọn.
Một ví dụ khác là nếu xét đồ thị tương ứng với một hệ thống dẫn dầu. Trong đó các ống
tương ứng với các cung , điểm phát có thể có thể là tàu chở dầu, điểm thu là bể chứa, còn
những điểm nối giữa các ống là các nút của đồ thị. Khả năng thông qua của các cung
tường ứng với tiết diện các ống.Cần phải tìn luộng dầu lớn nhất có thể bơm từ dầu vào bể
chứa.
2.1.3. Lát cắt, giá trị luồng
Định nghĩa 3. Ta gọi lát cắt (X,X
*
) là một cách phân hoạch tập đỉnh V của mạng
ra thành hai tập X và X
*
=V \ X , trong đó s

X và t

X
*

. Khả năng thông qua của lát
cắt (X,X
*
) là số



=
*
).,(),(
*
Xw
Xv
wvcXXc
Lát cắt với khả năng thông qua nhỏ nhất được gọi là lát cắt hẹp nhất.
Bổ đề 1. giá trị của mọi luồng f trong mạng luôn nhỏ hơn bằng khả năng thông
qua lát cắt (X,X
*
) bất kỳ trong nó : val(f)

c(X,X
*
).
Chứng minh. Cộng các điều kiện cân bằng luồng Div
f
(v) = 0 với mọi v

X. Khi
đó ta có
∑ ∑ ∑



Γ∈
+
Γ∈
−=−
Xv
vw vw
fvalwvfvwf )()),(),((
)( )(
Trang 8
Tiểu luận
Tổng này sẽ gồm các số hạng dạng f(u,v) với dấu cộng hoặc dấu trừ mà trong đó
có ít nhất một trong hai đỉnh u, v phải thuộc tập X. Nếu cả hai đỉnh u, v đều trong tập X,
thì f(u,v) xuất hiện với dấu cộng trong Div
f
(v) và có dấu trừ trong Div
f
(u). Vì thế, chúng
triệt tiêu lẫn nhau. Do đó, sau khi giản ước các số hạng như vậy ở vế trái, ta thu được
,)(),(),(
*
*
∑ ∑




−=+−
Xw

Xv
Xw
Xv
fvalwvfwvf
hay là
∑ ∑




−=
*
*
).,(),()(
Xw
Xv
Xw
Xv
wvfwvffval
Mặt khác từ điều kiện 1 rõ ràng là
∑∑





**
).,(),(
Xw
Xv

Xw
Xv
wvcwvf
còn
0),(
*
≤−



Xw
Xv
wvf
suy ra val(f)

c(X,X
*
). Bổ đề được chứng minh.
Từ bổ đề 1 suy ra
Hệ quả 1. Giá trị luồng cực đại trong mạng không vượt quá khả năng thông qua
của lát cắt hẹp nhất trong mạng.
Ford và Fulkerson đã chứng minh rằng giá trị luồng cực đại trong mạng đúng bằng
khả năng thông qua của lát cắt hẹp nhất. Để có thể phát biểu và chứng minh kết quả này
chúng ta sẽ cần thêm một số khái niệm.
Giả sử f là một luồng trong mạng G = (V,E). Từ mạng G = (V,E) ta xây dựng đồ
thị có trọng số trên cung G
f
=(V,E
f
) , với tập cung E

f
và trọng số trên các cung được xác
định theo quy tắc sau:
1
0
Nếu e = (v,w)

E với f(v,w) = 0, thì (v,w)

E
f
với trọng số c(v,w);
2
0
Nếu e = (v,w)

E với f(v,w) = c(v,w), thì (w,v)

E
f
với trọng số f(v,w);
3
0
Nếu e = (v,w)

E với 0 <f(v,w) < c(v,w), thì (v,w)

E
f
với trọng số

c(v,w) - f(v,w) và (w,v)

E
f
với trọng số f(v,w).
Trang 9
Tiểu luận
Các cung của G
f
đồng thời cũng là cung của G được gọi là cung thuận, các cung
còn lại gọi là cung nghịch. Đồ thị G
f
được gọi là đồ thị tăng luồng.
2.1.4. Định lý luồng cực đại lát cắt tối thiểu
Giả sử G(V,E) là một đồ thị có hướng hữu hạn và mỗi cung (u,v) có một khả năng
thông qua c(u,v) (một giá trị thực không âm). Ngoài ra, giả sử có hai đỉnh, đỉnh phát s và
đỉnh thu t, đã được xác định.
Một lát cắt là một cách chia các nút mạng thành hai tập S và T, sao cho thuộc
tập S và thuộc T. Do đó, trong một đồ thị có lát cắt có thể.
Khả năng thông qua của một lát cắt (S,T) là
,
Đó là tổng của các khả năng thông qua của tất cả các cung đi qua lát cắt, từ vùng
tới vùng .
Ba điều kiện sau là tương đương:
1. f là một luồng cực đại trong đồ thị
2. Mạng còn dư G
f
không chứa đường tăng
3. |f| = c(S,T) với lát cắt (S,T) nào đó.
Phác thảo chứng minh: Nếu có một đường tăng, ta có thể gửi luồng theo đó và thu

được một luồng lớn hơn, do đó nó không thể là luồng cực đại, và ngược lại. Nếu
không có đường tăng nào, ta chia đồ thị thành gồm các nút tới được từ
trong mạng còn dư, và T gồm các nút không tới được. Khi đó c(S,T) phải bằng 0. Nếu
không, tồn tại một cung (u,v) với c(u,v) > 0, nhưng khi đó, từ s lại đến
được v nên v không thể nằm trong T.
Trang 10
Tiểu luận
Ví dụ
Hình là một mạng với các nút V= {s,o,p,q,r,t} và luồng cực đại là một luồng tổng
từ nút phát s tới nút thu t có giá trị bằng 5. (Đây thực ra là luồng cực đại duy nhất ta có
thể tìm thấy trong mạng này)
Có ba lát cắt cực tiểu trong mạng. Đối với lát cắt S = {s,p}, T = {o,q,r,t}, khả năng
thông qua lát cắt là c(s,o) + c(p,r) = 3 +2 = 5 Với S= {s,o,p}, T = {q,r,t} nó là c(o,q) +
c(p,r) = 3 + 2 = 5 . Và với S = {s,o,p,q,r}, T = {t} là c(q,t) + c(r,t) = 2 + 3 = 5
Lưu ý rằng S = {s,o,p,r}, T = {q,t} không phải là một lát cắt cực tiểu, tuy trong
luồng đã cho cả (o,q) và (r,t) đều đầy. Đó là do trong mạng còn dư G
f
có một cung (r,q)
với khả năng thông qua c
f
(r,q) = c(r,q) – f(r,q) = 0 – (-1) = 1.
Định nghĩa 4. Ta gọi đường tăng luồng f là mọi đường đi từ s đến t trên đồ thị
tăng luồng G(f).
Định lý 1. Các mệnh đề dưới đây là tương đương:
(i) f là luồng cực đại trong mạng:
(ii) Không tìm được đường tăng luồng f:
(iii) val(f) = c(X,X
*
) với mọi lát cắt (X,X
*

) nào đó.
Chứng minh.
(i) => (ii). Giả sử ngược lại, tìm được đường tăng luồng P. Khi đó ta có thể tăng
giá trị luồng bằng cách tăng luồng dọc theo đường P. Điều đó mâu thuẫn với tính luồng
cực đại của luồng f.
Trang 11
Hình 2.1: Một mạng với luồng cực đại và ba lát cắt cực tiểu
Tiểu luận
(ii) => (iii). Giả sử không tìm được đường tăng luồng. Ký hiệu X là tập tất cả các
đỉnh s trong đó đồ thị G
f
, và đặt X
*
= V\X. Khi đó (X,X
*
) là lát cắt, và f(v,w)=0 với mọi v

X
*
, w

X nên
∑ ∑ ∑






=−=

*
*
*
).,(),(),()(
Xw
Xv
Xw
Xv
Xw
Xv
wvfwvfwvffval
Với v

X, w

X
*
. do (v, w)

G
f
, nên f(v, w) = c(v, w). Vậy
∑ ∑




===
* *
*

).,(),(),()(
Xw
Xv
Xw
Xv
XXcwvcwvffval
(iii) =>(i). Theo bổ đề 1, val(f)

c(X,X
*
) với mọi luồng f và với mọi lát cắt (X,X
*
).
Vì vậy, từ đẳng thức val(f) = c(X,X
*
) suy ra luồng f là luồng cực đại trong mạng.
2.2. Thuật toán Ford-Fulkerson tìm luồng cực đại trong mạng
Định lý 1 là cơ sở xây dựng thuật toán lặp sau đây để tìm luồng cực đại trong mạng:
Bắt đầu từ luồng với luồng trên tất cả các cung bằng 0 ( ta sẽ gọi luồng như vậy là luồng
không ), và lặp lại bước lặp sau đây cho đến khi thu được luồng mà đối với nó không còn
luồng tăng:
Thuật toán Ford – Fulkerson
1
0
Xuất phát từ một luồng chấp nhận được f.
2
0
Tìm một đường đi tăng luồng P. Nếu không có thì thuật toán kết thúc. Nếu có,
tiếp bước 3 dưới đây.
3

0
Nếu
δ
(P) = +

thuật toán kết thúc.
Trong đó δ(P) - Lượng luồng tăng thêm, hay nói khác là làm sự tăng luồng (flow
augmentation) dọc theo đường đi tăng luồng P một lượng thích hợp mà các ràng buộc của
bài toán vẫn thoả.
Cách tìm đường đi tăng luồng. Ta sử dụng thuật toán gán nhãn có nội dung như
sau. Một đường đi P thoả mãn về đường đi tăng luồng, nhưng chỉ đi từ s đến k nào đó
(chưa tới t, nói chung) sẽ được gọi là đường đi chưa bão hoà (unsaturated path).
Trang 12
Tiểu luận
Ta nói đỉnh u là đã đánh dấu (u is labeled) nếu ta biết là có một đường đi chưa bão
hoà từ s tới u. Bây giờ ta sẽ xét tất cả các đỉnh v có nối trực tiếp đến đỉnh u (sẽ gọi là ở
cạnh đỉnh u) xem chúng có thể được gán nhãn hay không khi u đã gán nhãn. Việc này
được gọi là thăm (scanning) đỉnh u.
Nếu (u,v) có luồng trên cung F(u,v) < C(u,v) thì ta có thể nối thêm cung (u,v) và
đường đi chưa bão hoà P từ s đến u để được đường đi chưa bão hoà tới v. Vậy v có thể
gán nhãn.
Bước lặp tăng luồng ( Ford - Fulkerson): Tìm dường tăng P đối với luồng hiện
có. Tăng luồng dọc theo đường P
Khi đã có luồng cực đại, lát cắt hẹp nhất có thể tìm theo thủ tục mô tả trong chứng
minh định lý 1.
Để tìm đường tăng luồng trong G
f
có thể sử dụng thuật toán tìm kiếm theo chiều
rộng ( hay thuật toán tìm kiếm theo chiều sâu) bắt đầu từ đỉnh s, trong đó không cần xây
dựng tường minh đồ thị G

f
. Ford- Fulkerson đề nghị thuật toán gán nhãn chi tiết sau đây
để giải bài toán luồng trong mạng. Thuật toán bắt đầu từ luồng chấp nhận được nào đó
trong mạng ( có thể bắt đầu từ luồng không) sau đó ta sẽ tăng luồng bằng cách tìm các
đường tăng luồng. Để tìm đường tăng luồng ta sẽ áp dụng phương pháp gán nhãn cho các
đỉnh. Mỗi đỉnh trong quá trình thực hiện thuật toán sẽ ở một trong ba trạng thái: chưa có
nhãn, có nhãn chưa xét, có nhãn đã xét. Nhãn của một đỉnh v gồm 2 phần và có một
trong hai dạng sau: [+p(v),
ε
(v)] hoặc [-p(v),
ε
(v) ]. Phần thứ nhất +p(v) (-p(v)) chỉ ra là
cần tăng (giảm) luồng theo cung (p(v),v) cung (v,p(v)) còn phần thứ hai
ε
(v) chỉ ra lượng
lớn nhất có thể tăng hoặc giảm theo cung này. Đầu tiên chỉ có đỉnh s được khởi tạo nhãn
và nhãn của nó là chưa xét, còn tất cả các đỉnh còn lại đều chưa có nhãn . Từ s ta gán cho
tất cả các đỉnh kề với nó và nhãn của đỉnh s sẽ trở thành nhãn đã xét. Tiếp theo, từ mỗi
đỉnh v có nhãn chưa xét ta lại gán nhãn cho tất cả các nhãn chưa có nhãn kề với nó và
nhãn của đỉnh v trở thành nhãn đã xét. Quá trình sẽ được lặp lại cho đến khi hoặc là đỉnh
t trở thành có nhãn hoặc là nhãn của tất cả các đỉnh có nhãn đều là đã xét nhưng đỉnh t
vẫn chưa có nhãn. Trong trường hợp thứ nhất ta tìm được đường tăng luồng, còn trong
trường hợp thứ hai đối với luồng đang xét không tồn tại đường tăng luồng ( tức là luồng
Trang 13
Tiểu luận
đã là cực đại). Mỗi khi tìm được đường tăng luồng, ta lại tăng luồng theo đường tìm
được, sau đó xoá tất cả các nhãn và đối với luồng mới thu được lại sử dụng phép gán
nhãn các đỉnh để tìm đường tăng luồng. Thuật toán sẽ kết thúc khi nào đối với luồng
đang có trong mạng không tìm được đường tăng luồng.
Thuật toán gán nhãn (The labeling algorithm)

Gọi V
T
là tập mọi đỉnh đã gán nhãn nhưng chưa được thăm. Ta có thuật toán để
tìm đường đi tăng luồng.
Xuất phát với V
T
= {s} và s là nút đã đánh dấu duy nhất.
Một bước lặp sẽ có V
T
hiện hành và gồm ba bước như sau.
1
0
Nếu t

V
T
hoặc V
T
=

, thuật toán kết thúc. Ngược lại thì chọn một đỉnh u

V
T
để thăm và đưa nó ra khỏi V
T
. Xét tất cả các đỉnh cạnh u, tức là xét mọi cung có dạng
(u,v) và (v,u).
2
0

Nếu (u,v)

E, F(u,v) < C(u,v) và v chưa gán nhãn thì gán nhãn nó và đưa v
vào tập V
T
.
3
0
Nếu (v,u)

E, F(v,u) > 0 và v chưa gán nhãn thì gán nhãn nó và đưa vào tập
V
T
.
Bây giờ ta xét kết quả của thuật toán gán nhãn. Nó có kết thúc hữu hạn hay
không? Nhận xét rằng một đỉnh được vào tập V
T
chỉ khi chuyển từ chưa gán nhãn. Do đó
một đỉnh chỉ được vào V
T
nhiều nhất là một lần. Mà mỗi bước lặp bỏ một đỉnh ra khỏi V
T
.
Do đó, vì số đỉnh của mạng là hữu hạn, thuật toán phải kết thúc hữu hạn.
Ví dụ 1. Áp dụng thuật toán Ford-Fullkerson tìm luồng cực đại bằng cách gán
nhãn cho luồng zero sau:
Trang 14
7,0
4,0
12,0

3,0
4,0
5,0
9,0
5,0
7,0
4,0
6,0
c
d
e
t
b
s
a
Tiểu luận
+ Bước lặp 1: s → a → b → t,
δ
1
= 1
+ Bước lặp 2: s → a → b → c → e → t,
δ
2
= 2
Trang 15
c(s+,4)
7,0
4,0
12,0
3,0

4,0
5,0
9,0
5,0
7,0
4,0
6,0
d(s+,7)
e(d+,4)
t(e+,2)
b(a+,6)
s
(s,

)
a(s+,6)
7,4
4,4
12,0
3,0
4,0
5,0
9,0
5,0
7,0
4,0
6,4
c
d
e

t
b
s
a
c(b+,2)
7,4
4,4
12,0
3,0
4,0
5,0
9,0
5,0
7,0
4,0
6,4
d(s+,7)
e(c+,2)
t(e+,2)
b(a+,2)
s
(s,

)
a(s+,2)
c
7,6
4,4
12,2
3,2

4,2
5,0
9,0
5,0
7,0
4,0
6,6
d
e
t
b
s
a
c(s+,4)
7,6
4,4
12,2
3,2
4,2
5,0
9,0
5,0
7,0
4,0
6,6
d(s+,7)
e(c+,1)
t(e+,1)
b(a+,1)
s

(s,

)
a(s+,0)
Tiểu luận
+ Bước lặp 3: s → c → e → t,
δ
3
= 1
+ Bước lặp 4: s → d → e → t,
δ
4
= 7
+ Bước lặp 5: s → c → d → e → t,
δ
5
= 2
Trang 16
c
7,6
4,4
12,3
3,3
4,2
5,0
9,0
5,0
7,0
4,1
6,6

d
e
t
b
s
a
c(s+,3)
7,6
4,4
12,3
3,3
4,2
5,0
9,0
5,0
7,0
4,1
6,6
d(s+,7)
e(d+,7)
t(e+,7)
b(a+,1)
s
(s,

)
a(s+,0)
c
7,6
4,4

12,10
3,3
4,2
5,0
9,7
5,0
7,7
4,1
6,6
d
e
t
b
s
a
c(s+,3)
7,6
4,4
12,10
3,3
4,2
5,0
9,7
5,0
7,7
4,1
6,6
d(c+,3)
e(d+,2)
t(e+,2)

b(a+,1)
s
(s,

)
a(s+,0)
Tiểu luận
+ Bước lặp 6: Không còn đường tăng luồng nữa, Val(f
max
) = 6+3+7 = 16.
Trang 17
c
7,6
4,4
12,12
3,3
4,2
5,0
9,9
5,2
7,7
4,3
6,6
d
e
t
b
s
a
Tiểu luận

CHƯƠNG III
THIẾT KẾ VÀ CÀI ĐẶT CHƯƠNG TRÌNH
3.1. Cấu trúc dữ liệu
Chương trình cài đặt sử dụng:
+ Các mảng 2 chiều capacity[100][100] để biểu diễn khả năng thông qua của các cung
trên mạng, mảng 2 chiều flow[100][100] biểu diễn luồng trên các cung.
+ Mảng một chiều color[100] dùng để đánh dấu đỉnh trong quá trình tìm kiếm rộng
BFS; mảng một chiều pred[100] dùng để lưu giữ đường tăng luồng.
+ Hàng đợi q[102] được dùng trong quá trình tìm kiếm rộng BFS.
+ Sử dụng kiểu file text để lấy dữ liệu và lưu kết quả có được từ chương trình.
3.2. Thiết kế
 Thuật toán tìm đường tăng luồng:
- Khởi đầu cho các đỉnh là màu trắng (chưa thăm), đỉnh đầu và đỉnh cuối là đỉnh 1.
- Đưa đỉnh nguồn vào hàng đợi q.
- Chừng nào đỉnh đầu còn khác đỉnh cuối thì làm:
o Lấy từng đỉnh u ra khỏi hàng đợi và đánh dấu đỉnh u là màu đen.
o Tìm tất cả những đỉnh màu trắng kề v với đỉnh u vừa lấy ra, nếu có c[u,v]-
f[u,v]>0 thì đưa v vào hàng đợi.
o Lưu vết đường đi.
- Nếu màu của đỉnh đích là màu đen thì đã tìm được đường đi tăng luồng.
Thủ tục cài đặt như sau:
//tim duong tang luong theo thuat toan tim kiem rong
int bfs(int st, int tt)
{
Trang 18
Tiểu luận
int u,v;
for(u=1;u<=n;u++)
color[u]=WHITE; {khoi dau cho cac dinh la mau trang, nghia la chua danh dau
(chua tham)}

head=1;
tail=1;
enque(st);
pred[st]= -1;
while(head!=tail)
{
u=deque();
//tim tat ca nhung dinh mau trang ke voi v, neu tu u toi v ma co c[u,v]-f[u,v]>0 thi
goi ham enque(v)
for(v=1;v<=n;v++)
{
if(color[v]== WHITE && (capacity[u][v]-flow[u][v])>0)
{
enque(v);
pred[v]=u;
}
}
}
Trong đó hàm enque() và hàm deque() được cài đặt như sau:
//hang doi cho thuat toan tim kiem rong
Trang 19
Tiểu luận
int head, tail;
int q[102];
//dua dinh x vao hang doi va danh dau x la mau xam
void enque(int x)
{
q[tail]=x;
tail++;
color[x]= GREY;

}
//lay dinh x ra khoi hang doi va danh dau x la mau den
int deque()
{
int x= q[head];
head++;
color[x]= BLACK;
return x;
}
 Thuật toán Ford-Fukerson tìm ra luồng cực đại trong mạng:
- Khởi tạo luồng rỗng.
- Khởi tạo giá trị tăng luồng incvalue=oo
- Chừng nào tìm được đường đi trong luồng thì:
• Xác định giá trị tăng luồng incvalue=min (incvalue,c[u,v]-f[u,v])
• Tăng luồng f[u,v] một giá trị incvalue nếu cung (u,v) là cung thuận, giảm
luồng f[v,u] một giá trị incvalue nếu cung (u,v) là cung nghịch.
Trang 20
Tiểu luận
- Cho đến khi tìm được giá trị luồng cực đại của các cung trên đường tăng luồng thì
kết thúc.
Thủ tục được cài đặt như sau:
//thuat toan ford-furkeson
int max_flow(int so, int sk)
{
int i,j,u;
//khoi tao luong rong
int maxflow=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)

flow[i][j]=0;
}
//chung nao tim duoc duong tang luong thi tang luong doc theo duong nay
while(bfs(so,sk)== 0)
{
//xac dinh gia tri tang luong
int incr=10000;
for(u=n;pred[u]>=1;u=pred[u])
{
incr=min(incr,(capacity[pred[u]][u]-flow[pred[u]][u]));
}
//tang luong
Trang 21

×