Tải bản đầy đủ (.docx) (20 trang)

Tiểu luận môn phân tích và đánh giá thuật toán bài toán luồng cực đại 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 (300.72 KB, 20 trang )

KHOA CÔNG NGHỆ THÔNG TIN
_______________

& _______________

BÀI TẬP LỚN
MÔN HỌC: PHÂN TÍCH VÀ ĐÁNH GIÁ THUẬT TOÁN
ĐỀ SỐ 2:
BÀI TOÁN LUỒNG CỰC ĐẠI
THUẬT TOÁN FORD – FULKERSON
KIỂM TRA TÍNH ĐÚNG ĐẮN VÀ ĐÁNH GIÁ HIỆU QUẢ

Giảng viên hướng dẫn : TS. Tống Minh Đức
Học viên : Nguyễn Tiến Thụy
Lớp : Cao học HTTT- K27B

Hà Nội, 2016

MỤC LỤC


2
2


CHƯƠNG I: LUỒNG CỰC ĐẠI
Bài toán luồng cực đại trong mạng là một trong số những bài toán tối ưu
trên đồ thị tìm được ứng dụng rộng rãi trong thực tế cũng như những ứng dụng
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à Ford và Fulkerson.
I.



Mạng
Định nghĩa: 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à đỉnh phát

-

Có duy nhất một đỉnh t không có cung đi ra gọi là đỉnh thu
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.

Quy ước nếu mạng không có cung (v,w) thì ta thêm vào cung (v,w) với khả
năng thông qua c[v,w] được gán bằng 0.
Với một mạng G = (V, E, c), ta ký hiệu:
W-(x) = {(v,w) ∈ E | v ∈ V}: tập các cung đi vào đỉnh v.
W+(x) = {(w,v) ∈ E | v ∈ V}: tập các cung đi ra khỏi đỉnh v.
II. Luồng trên mạng
Định nghĩa: 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:
Điều kiện 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)
Điều kiện 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:

t(W-(x)) = t(W+(x)), ∀x ≠ s, t


III. Tính chất của luồng
Với tập B ⊆ V, ký hiệu:
W-(B) = { (a, b)∈ E | a∉B, b∈B } - tập cung đi vào B.
3
3


W+(B) = { (a, b)∈ E | a∈B, b∉B } - tập cung đi ra từ B.
Khi đó nếu tập con các đỉnh B không chứa s và t thì: t (W-(B)) = t (W+(B)).
Theo tính chất b) của luồng: ∑ t (W-(x)) =∑ t (W+(x)).
Cạnh kề với đỉnh x nếu có đỉnh đầu và đỉnh cuối đều nằm trong tập B thì nó
sẽ có mặt ở cả hai vế của đẳng thức đúng một lần, do đó có thể giản ước
IV. Giá trị của luồng
Giá trị của một luồng được tính bằng tổng giá trị trên các cung đi ra từ đỉnh
nguồn s (đỉnh 1 Hình 1), hoặc tổng giá trị trên các cung đi vào đỉnh thứ t (đỉnh 6
Hình 1).

Hình 1: Luồng cực đại với giá trị luồng và khả năng thông qua của từng cặp cạnh.

V.

Ứng dụng thực tế
-

Xét đồ thị tương ứng hệ thống ống dẫn dầu. Trong đó các ống tương ứng
với các cung, điểm phát là tàu chở dầu, điểm thu là bể chứa, các điểm nối
của ống là các nút của đồ thị. Khả năng thông qua của các cung tương ứng
là tiết diện các ống. Cần phải 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.


-

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.

4
4


Bài toán cặp ghép: có m chàng trai và n cô gái. Mỗi chàng trai
ưa thích một số cô gái. Hãy tìm cách ghép cặp sao cho số
cặp ghép được là nhiều nhất.

-

Một số thuật toán về luồng cực đại

VI.

V.1. Bài toán luồng cực đại trên mạng
V.1.1. Lát cắt - Đường tăng luồng
a) Lát cắt

Định nghĩa. 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ố.
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
hoặc bằng khả năng thông qua lát cắt (X,X*) bất kỳ trong nó:
val(f) ≤ c(X,X*).
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.
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ố G f =(V,Ef), với tập cung Ef
và trọng số trên các cung được xác định theo quy tắc sau:


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



Nếu e = (v,w) ∈ E với f(v,w) = c(v,w), thì (w,v)∈ Ef với
trọng số f(v,w);



Nếu e = (v,w) ∈ E với 0 < f(v,w) < c(v,w), thì (v,w)∈ Ef
với trọng số c(v,w) - f(v,w) và (w,v) ∈ Ef với trọng số
f(v,w).

Các cung của Gf đồ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ị Gf
được gọi là đồ thị tăng luồng.
5
5



Ví dụ: Đồ thị tăng luồng được xây dựng từ đồ thị G ở hình
1.

Hình 2. Mạng G và luồng f. Đồ thị có trọng số Gf tương ứng
b) Đường tăng luồng

Giả sử P = (s = v0,v1,v2,…,vk= t) là một đường đi từ s đến t
trên đồ thị tăng luồng G f. Gọi d là giá trị nhỏ nhất của các
trọng số của các cung trên đường đi P. Xây dựng luồng f' trên
mạng G theo quy tắc sau:

f(u,v)
=

f(u,v) + d,

nếu (u,v) ∈ P là cung
thuận

f(u,v) – d,

nếu (u,v) ∈ P là cung
nghịch

f(u,v),

nếu (u,v) ∉ P

Hình 2: Đường tăng luồng

Dễ dàng kiểm tra được rằng f' được xây dựng như trên là luồng trong
mạng và val(f')= val(f) + d. Thủ tục biến đổi luồng vừa nêu là tăng luồng dọc
theo đường P.
6
6


Hình 3: Luồng trước và sau khi được tăng
Đường tăng luồng P = (1,3,4,2,5,6), có giá trị trong số nhỏ nhất trên đường d=2
[1,3] là cung thuận,

val(f) = 2 + 2 = 4, [3,4] là cung thuận, val(f) = 1 + 2 = 3

[4,2] là cung nghịch , val(f) = 5 – 2 = 3, [2,5] là cung thuận, val(f) = 0 + 2 = 2
[5,6] là cung thuận,

val(f) = 1 + 2 = 3

Sau biến đổi ta có luồng mới mang giá trị 9. val(f) = 4 + 3 - 3 + 2 + 3 = 9
V.1.2. Thuật toán Ford-Fulkerson
+ Xuất phát từ một luồng chấp nhận được f.
+ 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.
+ 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ả mãn.
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 u nào đó (chưa tới t) sẽ được gọi là đường đi chưa bão hoà.

Đỉnh u được gán nhãn, nếu ta biết có một đường đi chưa bão hoà từ s tới
u. Tiếp theo xét tất cả các đỉnh v liền kề với đỉnh u, kiểm tra xem chúng có thể
được gán nhãn hay không.
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 đường tăng luồng P đối với
luồng hiện có. Tăng luồng dọc theo đường P.
7
7


Khi đã có luồng cực đại, lát cắt hẹp nhất có thể xác định được.
Thuật toán Ford – Fulkerson được mô tả trong thủ tục sau:
Procedure Max_Flow;
* Thuật toán Ford – Fulkerson *
begin
(* Khởi tạo: Bắt đầu từ luồng với giá trị 0 *)
for u ∈ V do
for v ∈ V do f(u,v):=0;
Stop:=false;
While not Stop do
if< Tìm được đường tăng luồng P> then <Tăng luồng dọc theo P>
else Stop:= true;
end;
* Thuật toán gán nhãn (The labeling algorithm)
Gọi VT 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 VT = {s} và s là đỉnh bắt đầu ( đỉnh đánh dấu đầu tiên).
Một bước lặp sẽ có VT hiện hành và gồm ba bước như sau:

+ Nếu t ∈ VT hoặc VT = ∅, thuật toán kết thúc. Ngược lại thì chọn một
đỉnh u ∈ VT để thăm và đưa nó ra khỏi VT. 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).
+ 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 VT.
+ 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 VT.

8
8


Sơ đồ thuật toán Ford-Fulkerson tổng quát
Begin

Mạng với luồng zero

Stop:= False

Tăng luồng
True
not Stop

True

Find_Path

Path-Found
False


False

Stop:= False
Mạng với luồng cực đại

End

Định lý 2 (Định lý về luồng cực đại trong mạng và lát cắt hẹp nhất).
Luồng cực đại trong mạng bằng khả năng thông qua của lát cắt hẹp nhất.
Định lý 3. (Định lý về tính nguyên). Nếu tất cả các khả năng thông qua
là các số nguyên thì luôn tìm được luồng cực đại với luồng trên các cung là các
số nguyên.
9
9


V.2. Thuật toán song song tìm luồng cực đại
Hiện nay, mô hình xử lý song song đã và đang phát triển mạnh mẽ giải
quyết những vấn đề bế tắc mà mô hình xử lý tuần tự gặp phải như vấn đề thời
gian thực hiện chương trình, tốc độ xử lý, khả năng lưu trữ của bộ nhớ, xử lý dữ
liệu với quy mô lớn....
Client1
Server
Client1
Trong bối cảnh đó, thuật toán tìm luồng cực đại cần được phát triển theo
hướng song song nhằm phát huy sức mạnh của bài toán.
Connect

Connect


Connect

V.2.1. Bài toán tìm luồng cực đại trên mạng

Cho mạng G(V,E,C), nguồn a, đích z. Trong số các luồng trên mạng G,
hãy tìm luồng có giá trị lớn nhất.
getData

getNetworks

getData

V.2.2. Ý tưởng thuật toán

Dựa trên thuật toán truyền thống và thuật toán hoán chuyển nguồn đích,
Start
Waiting
xây dựng thuật toán song song
tìm luồng cực đại. Ý tưởng của
phương pháp này
Waiting
là thay vì trong thuật toán truyền thống dùng một bộ vi xử lý thực hiện công việc
tuần tự từ đỉnh nguồn đến đỉnh đích. Trong thuật toán song song sử dụng hai bộ
vi xử lý thực hiện cônggetData
việc song song, vi xử lý 1 xuất phát từ đỉnh nguồn, vi xử
Init()
Init()
lý 2 xuất phát từ đỉnh đích. Hai vi xử lý trong quá trình tìm đường tăng luồng sẽ
gặp nhau ở đỉnh trung gian t nào đó,
T công việc tiếp theo vi xử lý 1 xử lý công

Display
việc từ đỉnh t đến nút nguồn,
công việc từ
đỉnh t đến nút đích.
getData
getData
Stop vi xử lý 2 xử lý_Maxflow
F

V.2.3. Xây dựng thuật toán song song

T
G =CheckSteped
(V , E ) với nguồnEnda, đích z, khả năngT thông Exit
 Đầu vào:
qua:
ExitMạng

C = ( cij ) , ( i, j ) ∈ G

Stop
F

Stop

.

T

F


Các đỉnh trong G được
sắp xếpthentheo
thứ
If(c1ed=1&c2ed=1)
Step=2;
Danhtự
thucnào
C1, C2đó.
sinh nhan

getStep
F

Steped=1 =2
Đầu ra: Luồng cực đại F = ( f ij ), ( i, j ) ∈ G .

 Các bước

T

F

getStep

T

T

Bước1: Khởi tạo


If(c1ed1=2|c2ed=2) then c1ed=2, c2ed=2, Step=3, Danh thuc C1, C2 tang luong, xoa nhan

Assign
_label

Step=2

F

T

F

Bước 3: Hiệu chỉnh Ttăng luồng, xóa nhãn.

F
T

if(c1ed1=3&c2ed=3)
then c1ed=1,
C2 sinh nhan
Đây
là thuật toán
song
song
tổngc2ed=1,
quát,Step=2,
có Danh
thểthuc

ápC1,dụng
hiệu quả
cho các
Inc_flow
Inc_flow
Steped =3
l
Step=3
Del_label
Del_label
loại mạng. Nếu thuật toán được cài đặt trong môi trường xử lý song song tối ưu,
F
F
dự kiến thời gian tính toán sẽ giảm đi một nửa so với thuật toán truyền thống.

T

Step=4

Assign
_label

Step=2

Bước 2: Sinh nhãn

F

Step=3


Steped =2

T

Stop=True

F

If(c1ed=4|c2ed=4)then c1ed=4, c2ed=4, Step=4; Thong bao Step=4
dung C1, C2
Steped =4

F
Waiting

T

10
10

Stop=True

F
Waiting


CHƯƠNG 2: BÀI TOÁN ỨNG DỤNG
I Ứng dụng thuật toán Ford-Fulkerson giải bài toán luồng cực đại
Bài toán thực tế:
Dầu được bơm từ tàu chở dầu (đỉnh s) qua các trạm trung chuyển (các

đỉnh b, c, d, e) tới bể chứa (đỉnh t). Các cung có hướng của đồ thị biểu diễn các
đường ống dẫn và cho biết hướng của luồng dầu trong ống. Các số trên cung là
các khả năng thông qua (có thể hiểu là thiết diện) của các ống dẫn dầu tương
ứng. Cần xác định luồng dầu lớn nhất có thể bơm từ tàu chở dầu vào bể chứa
bằng cách nào (lượng dầu bơm qua từng trạm theo các đường ống đã cho)?
Áp dụng thuật toán Ford-Fulkerson tìm luồng cực đại bằng cách gán nhãn
cho đỉnh của mạng G với luồng f được cho như Hình 3, hai số viết bên cạnh mỗi
cung là khả năng thông qua và luồng của các cung. Kết quả các bước của thuật
toán mô tả bởi các đồ thị và bảng dưới đây. Mạng với luồng cực đại thu được ở
Hình 4. Lát cắt bé nhất là X = {s,c}, X* = {b,d,e,t} và giá trị luồng cực đại là 9.
b

d

6,4

6,5

5,4

t

3,1

s

3,0
5,2

c


Hình 1,1
3

6,1

e

+ Bước lặp 1: s → b → d → t, δ1 = 1
b(s+,1)

6,4

6,5

5,4

s
(s,)

d(b+,1)
t(d+,1)

3,1
3,0

5,2

c(s+,3)


b

6,1

e(b+,1)

1,1

d

6,5

6,6

5,5

t

3,1

s

3,0
5,2

c

11
11


1,1

6,1

e


+ Bước lặp 2: s → c → d → b → e → t, δ2 = 2
b(d-,2)

d(c+,2)

6,5

6,6

5,5

s
(-,)

t(e+,2)

3,1
3,0

5,2

c(s+,3)
b


6,1

e(b+,2)

1,1

d

6,3

6,6

5,5

t

3,3

s

3,2
5,4

c

6,3

e


1,1

+ Bước lặp 3: Không còn đường tăng luồng, Val(fmax) = 5+4 = 9
b

d

6,3

6,6
5,5

t

3,3

s

3,2
5,4

c

1,1

6,3

e

Hình 4. Mạng G với luồng cực đại và lát cắt hẹp nhất


Độ phức tạp của thuật toán:
Nếu các khả năng thông qua là các số rất lớn thì giá trị luồng cực đại cũng
có thể là rất lớn và khi đó thuật toán mô tả ở trên sẽ đòi hỏi rất nhiều bước tăng
luồng. Ví dụ trong hình 5 sẽ minh hoạ cho điều này. Hình 5(a) mô tả mạng cần
xét với khả năng thông qua trên các cung. Hình 5(b) mô tả luồng trên các cung
(số thứ hai bên cạnh cung) sau khi thực hiện tăng luồng dọc theo đường tăng
luồng (s,a,b,t). Hình 5(c) mô tả luồng trên các cung sau khi thực hiện tăng luồng
dọc theo đường tăng luồng (s,b,a,t). Rõ ràng, sau 2.10 6 lần tăng luồng theo
đường (s,b,a,t) và (s,b,a,t) một cách luân phiên ta thu được luồng cực đại.

12
12


(c)

a
b toán Ford- Fulkerson.
Hình 5: Ví dụ tồi tệ với thuật
1,0
Hơn thế nữa nếu các khả năng
thông qua là các số vô tỷ, người ta còn xây

dựng được ví dụ để cho thuật toán không dừng, và tệ hơn là dãy các giá trị luồng
xây dựng theo thuật toán hội tụ thì nó106,1
còn không hội tụ đến giá trị luồng cực đại.
Như vậy, muốn thuật toán làm việc hiệu quả, việc lựa chọn đường tăng luồng
cần được tiến hành hết sức106,1
cẩn thận.

Edmonds và Karp chỉ ra rằng nếu đường tăng luồng được chọn là đường
ngắn nhất từ s đến t trên đồ thị Gf . Điều đó có thể thực hiện, nếu trong thủ tục
tìm đường tăng Find_Path106,1
mô tảs ở 106,1
trên, danh sách VT được tổ chức dưới dạng
QUEUE (nghĩa là ta thực hiện tìm
t đường tăng bởi thủ tục tìm kiếm theo chiều
rộng) thì thuật toán sẽ kết thúc sau không quá mn/2 lần sử dụng đường tăng
luồng. Nếu để ý rằng, tìm kiếm theo chiều rộng trên đồ thị đòi hỏi thời gian
O(n+m), thì thuật toán thu được sẽ có độ phức tạp tính toán là O(nm2).
II Chương trình ứng dụng
(b) đầu vào
II.1. Dữ liệu

Input: file văn bản “mf1.in”, “mf2.in”, “mf3.in” tương ứng với kích thước
của mạng có kích thước:
- Mạng có 6 đỉnh , 8 cạnh
- Mạng có 7 đỉnh, 11 cạnh
- Mạng có 101 đỉnh, 200 cạnh

a
b
13
13

1,1

106,0



106,1

Cấu trúc file dữ liệu đầu vào:
- Dòng 1: Chứa 2 số nguyên tương ứng
với số đỉnh
106,1
106,0 (n) và số cạnh của mạng
s
(e)
- Đỉnh phát s mặc định là đỉnh đầu (đỉnh 0) vàt đỉnh thu t mặc định là đỉnh cuối
(n-1)
- Các dòng tiếp theo: Mỗi dòng chứa 3 số nguyên tương ứng với đỉnh đầu,
đỉnh cuối và khả năng thông qua cạnh đó.
Dữ liệu biểu diễn ma trận trọng số của đồ thị có hướng, minh hoạ cho mạng cần
tìm luồng cực đại.
II.2. Dữ liệu đầu ra

(a)

s

Output: Dữ liệu đầu ra thể hiện trên màn hình command với ma trận
đầu vào và giá trị luồng cực đại trong mạng.
106

II.3. Mô tả dữ liệu
Mô tả dữ liệu
mf1.in
68
015

025
136
143
233
241
356
456
mf2.in
7 11
016
024
037
157
215
235
253
359
424
464
5 6 12

106
1

a

b
106

106


1

3t

6

6
5

s
0

3

t
5

3

6

5
1

2

1

4


3

6

9
6

s
0

7

5

7

5
3

5

126
6

4

2

14

14

4

4

4

t
64


456

Ma trận vuông cũng có thể được xây dựng như sau
mf1.in
055000
000630
000310
000006
000006

mf2.in
06470000
00000700
05050300

00000900
00400640
0 0 0 0 0 0 12


Tương tự mạng đầu vào lấy từ file mf3.in có 101 đỉnh và 200 cạnh cũng biểu
được bằng lưu đồ và ma trận tương ứng..
II.4. Một số hàm chính của chương trình
II.4.1. Thuật toán Ford-Fulkerson – Tìm đường tăng luồng
int max_flow (int s, int t) {
int u,v;
int max_flow = 0;
for (u=0; ufor (v=0; vflow[u][v]= 0;
}
}
while (bfs(s,t)) {
int path_flow = MAX_FLOW;
for (u=n-1; pred[u]>=0; u=pred[u]) {
v=pred[u];
path_flow = min(path_flow,capacity[v][u]-flow[v][u]);
}
for (u=n-1; pred[u]>=0; u=pred[u]) {
v=pred[u];
flow[u][v] -= path_flow;
flow[v][u] += path_flow;
}
max_flow += path_flow;
}
return max_flow;
}

15

15


II.4.2. Hàm kiểm tra có tồn tại luồng cần tìm hay không
int bfs (int start, int target) {
int u,v;
for (u=0; ucolor[u] = WHITE;
}
head = tail = 0;
enqueue(start);
pred[start] = -1;
while (head!=tail) {
u = dequeue();
for (v=0; vif (color[v]==WHITE && capacity[u][v]-flow[u][v]>0) {
enqueue(v ;
pred[v] = u;
}
}
}
return color[target]==BLACK;
}

II.4.3. Hàm in ra ma trận:
void PrintMatrix(int matrix[][MAX_NODES]){
if (n > 10) { cout << " * Kich thuoc qua lon, khong the in ra ma tran dau vao *
\n"; return;}
for (int u=0; ufor (int v=0; v

printf("%3d",matrix[u][v]);
}
cout << "\n";
}
}

II.4.4. Hàm thêm một đỉnh vào hàng đợi:
void enqueue (int x) {
q[tail] = x;
tail++;
color[x] = GRAY;
16
16


}

II.4.5. Hàm xóa một đỉnh khỏi hàng đợi:
int dequeue () {
int x = q[head];
head++;
color[x] = BLACK;
return x;
}

II.4.6. Hàm kiểm tra giá trị lớn hơn:
int min (int x, int y) {
return x}


II.4.7. Giao diện debug chương trình:
Select the size of the matrix:
Press 1 => Small, Press 2 => Medium, Press 3 => Large
1
- Matrix input:
0
0
0
0
0
0

5
0
0
0
0
0

5
0
0
0
0
0

0
6
3
0

0
0

0
3
1
0
0
0

0
0
0
6
6
0

-1,0,0,1,1,3
capacity[3][5] =6 - f.0 = Path.6
capacity[1][3] =6 - f.0 = Path.6
capacity[0][1] =5 - f.0 = Path.5
flow[5][3]=-5, flow[3][5]=5
flow[3][1]=-5, flow[1][3]=5
flow[1][0]=-5, flow[0][1]=5
0 5 0 0 0 0
-5 0 0 5 0 0

17
17



0
0
0
0

0
-5
0
0

0 0
0 0
0 0
0 -5

0
0
0
0

0
5
0
0

-1,3,0,2,2,3
capacity[3][5] =6 - f.5 = Path.1
capacity[2][3] =3 - f.0 = Path.1
capacity[0][2] =5 - f.0 = Path.1

flow[5][3]=-6, flow[3][5]=6
flow[3][2]=-1, flow[2][3]=1
flow[2][0]=-1, flow[0][2]=1
0 5
-5 0
-1 0
0 -5
0 0
0 0

1 0
0 5
0 1
-1 0
0 0
0 -6

0
0
0
0
0
0

0
0
0
6
0
0


-1,3,0,2,2,4
capacity[4][5] =6 - f.0 = Path.6
capacity[2][4] =1 - f.0 = Path.1
capacity[0][2] =5 - f.1 = Path.1
flow[5][4]=-1, flow[4][5]=1
flow[4][2]=-1, flow[2][4]=1
flow[2][0]=-2, flow[0][2]=2
0 5 2 0 0
-5 0 0 5 0
-2 0 0 1 1
0 -5 -1 0 0
0 0 -1 0 0
0 0 0 -6 -1

0
0
0
6
1
0

-1,3,0,2,1,4
capacity[4][5]
capacity[1][4]
capacity[3][1]
capacity[2][3]
capacity[0][2]

=6

=3
=0
=3
=5

-

f.1 = Path.5
f.0 = Path.3
f.-5 = Path.3
f.1 = Path.2
f.2 = Path.2

flow[5][4]=-3, flow[4][5]=3
flow[4][1]=-2, flow[1][4]=2
flow[1][3]=3, flow[3][1]=-3
flow[3][2]=-3, flow[2][3]=3

18
18


flow[2][0]=-4, flow[0][2]=4
0 5
-5 0
-4 0
0 -3
0 -2
0 0


4 0 0
0 3 2
0 3 1
-3 0 0
-1 0 0
0 -6 -3

0
0
0
6
3
0

- Values flow maximal: 9
- Matrix Output:
0 5
-5 0
-4 0
0 -3
0 -2
0 0

4 0 0
0 3 2
0 3 1
-3 0 0
-1 0 0
0 -6 -3


0
0
0
6
3
0

You are continue? Press 1=Yes, Number others=No

19
19


Tài liệu tham khảo
[1]

Nguyễn Đức Nghĩa – Nguyễn Tô Thành Toán rời rạc

[2]

Lê Minh Hoàng Giải thuật và lập trình

[3]

Kenet H. Rosen Toán học rời rạc và ứng dụng trong tin học

[4]

Nguyễn Anh Cường Xử lý tự động trong tin học văn phòng


[5]

Nguyễn Anh Cường Hướng dẫn lập trình với C#

[6]

, Website của K23 CNTT, Học viện Kỹ thuật Quân

sự.
, Website của Khoa CNTT, Học viện Kỹ thuật Quân sự.

20
20



×