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

Luồng cực đại và một số bài toán ứng dụng

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 (319.5 KB, 21 trang )

Trường THPT Chuyên Quảng Bình
PHẦN I: PHẦN MỞ ĐẦU
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ị 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à Ford và 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
phạm vi đề tài này tôi sẽ trình bày về “ luồng cực đại và một số bài toán ứng
dụng” và sử dụng thuật toán của Ford và Fulkerson để giải bài toán cụ thể.
GV: Trương Nữ Thùy Duyên
Trường THPT Chuyên Quảng Bình
PHẦN II: NỘI DUNG
I. PHÁT BIỂU BÀI TOÁN
1.1 Mạng, 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 đó - tập các đỉnh của mạng mà từ đó có cung đến v, - tập các đỉnh của
mạng mà từ v có cung đến nó:

{ } { }
.),(:)(,),(:)( EwvVwvEvwVwv
∈∈=Γ∈∈=Γ
+−
3.Giá trị của luồng f là số

.),(),()(
)()(
∑∑

Γ∈
+
Γ∈

==
twsw
twfwsffval

1.2 Bài toán luồng cực đại trong mạng
GV: Trương Nữ Thùy Duyên
Trường THPT Chuyên Quảng Bình
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.
1.3 Thuật toán Ford-Fulkerson
Việc chứng minh định lý luồng cực đại-lát cắt cực tiểu ngay lập tức cho
chúng ta một thuật toán Tìm luồng cực đại- thuật toán Ford-Fulkerson:
• Khởi tạo một luồng bằng 0.
• Trong khi đồ thị tăng luồng của f còn có đường đi cơ bản (đường tăng
luồng), thì tìm một đường đi như thế, nâng luồng dọc theo đường đi này.
• Khi không còn đường đi cơ bản nữa thì f là luồng cực đại.
Đoạn chương trình sau minh họa thuật toán Ford-Fulekerson bằng NNLT
Pascal, trong đó sử dụng tìm kiếm sâu DFS để tìm một đường tăng luồng trên
đồ thị tăng luồng.
Procedure Findpath(u:integer);{tìm đường tăng luồng trên G
f

}
Var
v:integer;
Front, rear: integer;
Begin
Trace [s]:= n+1; {Trace[v] = 0 nghĩa là v chưa được
thăm}
For v :=1 to n do
Begin
If (trace[v] = 0) and (c[u,v]>f[u,v]) then {xét v kề u chưa
thăm trên G
f
}
Begin
GV: Trương Nữ Thùy Duyên
Trường THPT Chuyên Quảng Bình
Trace[v]:=u;
if v=t then {đến được t thì dừng thuật toán }
Begin
path := True; exit;
End;
findpath(v);
End;
if path =true then exit;
End;
End;
Procedure IncFlow; {tăng luông dọc đường tăng luồng: f :=(f+f
f
)}
Var

Delta, u, v: Integer;
Begin
{Tính Delta = Δ
f
}
Delta:= Maxint;
V :=t;
Repeat
U := trace[v];
If c[u,v] - f[u,v] < Delta then Delta := c[u,v] – f[u,v] ;
V := u;
Until v = s;
{f := (f+f
f
)
V :=t;
Repeat
u := trace[v];
f[u,v] :=f[u,v] + Delta ;
f[u,v] :=f[u,v] - Delta ;
v :=u ;
until v = s;
End;
Trong đó:
• C[1 n,1 n]: ma trận biểu diễn khả năng thông qua các cung trên mạng.
GV: Trương Nữ Thùy Duyên
Trường THPT Chuyên Quảng Bình
• F[1 n,1 n]: ma trận biểu diễn luồng trên các cung.
• Trace[1 n]: dùng để lưu vết đường tăng luồng, thuật toán tìm đường tăng
luồng sẽ sử dụng là thuật toán tìm kiếm theo chiều sâu (DFS).

Ta có thể tìm kiếm (u,v) có phải là cung trên mạng thặng dư G
f
không bằng đẳng
thức: c[u,v]>f[u,v]. Nếu (u,v) là cung trên G
f
thì khả năng thông qua của nó là
c[u,v] –f[u,v]
Ví dụ 1:
Xét mạng vận tải G =(V,E) được cho ở hình sau với 1 là đỉnh phát, 6 là
đỉnh thu, luồng được đặt trong ngoặc, khả năng thông qua được ghi trên các
cung :
Sử dụng thuật toán Ford-Fulkerson để tìm luồng cực đại và lát cắt nhỏ nhất
1. Bước 1: Khởi tạo luồng f =0.
2. Bước 2:
• Đồ thị tăng luồng G
f
của G:
GV: Trương Nữ Thùy Duyên
Trường THPT Chuyên Quảng Bình
• Chọn đường tăng luồng P = (1,2,4,6), tăng luồng dọc theo đường này:
- Δ
P
= min( 5,6,6) = 6.
- Tăng luồng dọc theo P thu được luồng mới f = 5:
-Đồ thị tăng luồng:
• Chọn đường tăng luồng P = (1,3,5,6), tăng luồng dọc theo đường này:
- Δ
P
= min( 5,1,6) = 1.
- Tăng luồng dọc theo P thu được luồng mới f = 6:

GV: Trương Nữ Thùy Duyên
Trường THPT Chuyên Quảng Bình
- Đồ thị tăng luồng:
• Chọn đường tăng luồng P = (1,3,4,2,5,6), tăng luồng dọc theo đường
này:
- Δ
P
= min( 4,3,5,3,5) = 3.
- Tăng luồng dọc theo P thu được luồng mới f = 9:
- Đồ thị tăng luồng:
GV: Trương Nữ Thùy Duyên
Trường THPT Chuyên Quảng Bình
Đến đây không còn đường đi cơ bản nào trên đồ thị tăng luồng nên thuật
toán kết thúc.
Bước 3: Luồng cực đại
Luồng cực đại có giá trị là 9, lát cắt cực tiểu (X,Y) với X={1,3}, Y={2,4,5,6}
Định lý về tính nguyên: “Nếu tất cả các khả năng thông qua là số nguyên thì
thuật toán trên luôn tìm được luồng cực đại với luồng trên cung là các số
nguyên.
Goị e số cạnh của đồ thị, n là số đỉnh => e = E, n =V.
Thuật toán Ford Fulkerson có độ phức tạp là O(e) ở mỗi lần thực hiện, nhưng
số lần lặp không chính xác, xấp xỉ giá trị luồng cực đại f, tức là thuật toán này
có độ phức tạp là một hàm đa thức, vì vậy, chúng ta cần đến một thuật toán mà
thời gian thực hiện không phụ thuộc chút nào vào C. Xét cho cùng, các thuật
toán tìm đường đi ngắn nhất với khả năng thông qua của cung e là c
e
, nhưng thời
gian thực hiện của các thuật toán này chỉ phụ thuộc các tham số e và n. Một
thuật toán như thế gọi là “phụ thuộc đa thức mạnh” (strongly polynomial).
GV: Trương Nữ Thùy Duyên

Trường THPT Chuyên Quảng Bình
Ví dụ 2:
Xét mạng vận tải G được cho ở hình sau:
Trong đó: 1 là đỉnh phát, 6 là đỉnh thu, giá trị luồng được viết trong ngoặc và
khả năng thông qua được cho trên mỗi cạnh. Ta sẽ dùng thuật toán Ford-
Fulkersons để tìm luồng cực đại và lát cắt cực tiểu trên G.
a. Dùng thuật toán Ford-Fulkersons:
Bước 1: Khởi tạo luồng f=0:
Bước 2: Tăng luồng:
• Đồ thị tăng luồng:
GV: Trương Nữ Thùy Duyên
9
2
1 3
4
5
6
5(2)
7(4)
5(3)
7(2)
5(4)
7(3)
9(6)
8(0)
2
1 3
4
5
6

5(0)
7(0)
5(0)
7(0)
5(0)
7(0)
9(0)
8(0)
2
1 3
4
5
6
5
7
5
7
5
7
8
Trường THPT Chuyên Quảng Bình
• Chọn đường tăng luồng P = (1,2,5,6), tăng luồng dọc theo đường này:
- Δ
P
= min( 5,7,9) = 5.
• Tăng luồng dọc theo P thu được luồng mới f = 5:
• Đồ thị tăng luồng:
• Chọn đường tăng luồng P = (1,3,2,5,6), tăng luồng dọc theo đường
này:
- Δ

P
= min( 7,8,2,4) = 2.
- Tăng luồng dọc theo P thu được luồng mới f = 7:
• Đồ thị tăng luồng:
• Chọn đường tăng luồng P = (1,3,5,6), tăng luồng dọc theo đường này:
GV: Trương Nữ Thùy Duyên
2
3
4
5
6
5
7
5
2
5
7
8
5
1
54
2
1 3
4
5
6
5(5)
7(2)
5(0)
7(7)

5(0)
7(0)
9(7)
8(2)
2
1 3
4
5
6
5
5
5
2
5
7
2
6
7
7
2
2
Trường THPT Chuyên Quảng Bình
- Δ
P
= min( 5,5,2) = 2.
- Tăng luồng dọc theo P thu được luồng mới f = 9:
• Đồ thị tăng luồng:
• Chọn đường tăng luồng P = (1,4,6), tăng luồng dọc theo đường này:
- Δ
P

= min( 5,7) = 5.
- Tăng luồng dọc theo P thu được luồng mới f = 14:
GV: Trương Nữ Thùy Duyên
5
2
1 3
4
5
6
5(5)
7(4)
5(0)
7(7)
5(2)
7(0)
9(9)
8(2)
1
9
2
3
4
5
6
5
6
5
2
2
7

3
4
2
3
2
1 3
4
5
6
5(5)
7(4)
5(5)
7(7)
5(2)
7(5)
9(9)
8(2)
Trường THPT Chuyên Quảng Bình
• Đồ thị tăng luồng:
Đến đây không còn đường đi cơ bản nào trên đồ thị tăng luồng nên kết thúc
bước 2.
Bước 3: Luồng cực đại f
max
=14.
Lát cắt cực tiểu (X,Y) với X= {1,2,3,5}, Y={4,6}.
GV: Trương Nữ Thùy Duyên
1
9
2
3

4
5
6
5
6
5
2
2
2
3
4
2
3
5
2
1 3
4
5
6
5(5)
7(4)
5(5)
7(7)
5(2)
7(5)
9(9)
8(2)
Trường THPT Chuyên Quảng Bình
Sơ đồ thuật toán Ford-Fullkerson tổng quát
GV: Trương Nữ Thùy Duyên

False
True
False
True
Begin
Mạng với luồng zero
Stop:= False
not Stop
Find_Path
Path-Found
Tăng luồng
Stop:= False
Mạng với luồng
cực đại
End
Trường THPT Chuyên Quảng Bình
II. MỘT SỐ BÀI TOÁN TỐI ƯU TỔ HỢP ỨNG DỤNG TỪ BÀI TOÁN
LUỒNG
Bài toán luồng cực đại có rất nhiều ứng dụng trong việc giải nhiều bài
toán tổ hợp. Khó khăn chính ở đây là phải xây dựng tương ứng sao cho việc tìm
luồng cực đại trong nó sẽ tương đương với việc giải bài toán đặt ra. Mục này sẽ
giới thiệu một số bài toán như vậy.

2.1 Bài toán đám cưới vùng quê
Có m chàng trai ở một làng quê nọ. Đối với mỗi chàng trai ta biết các cô
gái mà anh ta vừa ý. Hỏi khi nào thì có thể tổ chức các đám cưới trong đó
chàng trai nào cũng sánh duyên với cô gái mà mình vừa ý.
Ta có thể xây dựng đồ thị với các đỉnh biểu thị các chàng trai và các cô
gái, còn các cung biểu thị sự vừa ý của các chàng trai đối với các cô gái. Khi đó
ta thu được một đồ thị hai phía.

Thí dụ. Có 4 chàng trai {T
1
,T
2
,T
3
,T
4
} và 5 cô gái {G
1
,G
2
,G
3
,G
4
,G
5
}. Sự
vừa ý cho trong bảng sau







Đồ thị tương ứng được cho trong hình sau.
GV: Trương Nữ Thùy Duyên
Chàng trai Các cô gái mà chàng trai ưng

ý
T
1
G
1
, G
4
, G
5
T
2
G
2
T
3
G
2
, G
3
, G
4
T
4
G
2
, G
4
G
1
s

t
G
4
G
3
G
2
T
4
T
3
T
2
T
1
Trường THPT Chuyên Quảng Bình
Mạng tương ứng với Bài toán đám cưới vùng quê
Đưa vào điểm phát s và điểm thu t. Nối s với tất cả các đỉnh biểu thị các
chàng trai, và nối t với tất cả các đỉnh biểu thị các cô gái. Tất cả các cung của đồ
thị đều có khả năng tông qua bằng 1. Bắt đầu từ luồng 0, ta tìm luồng cực đại
trong mạng xây dựng được theo thuật toán Ford- Fulkerson. Từ định lý về tính
nguyên, luồng trên các cung là các số 0 hoặc 1. Rõ ràng là nếu luồng cực đại
trong đồ thị có giá trị V
max
= m, thì bài toán có lời giải, và các cung với luồng
bằng 1 sẽ chỉ ra cách tổ chức đám cưới thoả mãn điều kiện đặt ra. Ngược lại,
nếu bài toán có lời giải thì V
max
=m. bài toán về các đám cưới vùng quê là một
trường hợp riêng của bài toán về cặp ghép trên đồ thị hai phía mà để giải nó có

thể xây dựng thuật toán hiệu quả hơn.
2.2. Bài toán về hệ thống đại diện chung
Cho tập m phần tử X = {z
1
,z
2
,…,z
m
} Giả sử <A
1
,A
2,…,
A
n
> và <B
1
,B
2
,…,B
n
>
là hai dãy tập con của X . Dãy gồm n phần tử khác nhau của X:< a
1
,a
2,
…,a
n
>
được gọi là hệ thống các đại diện chung của hai dãy đã cho nếu như tìm được
một hoán vị

σ
của tập {1,2,…,n} sao cho < a
1
,a
2,
…,a
n
> là hệ thống các đại
diện phân biệt của hai dãy <A
1
,A
2,…,
A
n
> và <B
σ
(1)
,B
σ
(2)
,…,B
σ
(n)
> tức là điều kiện
sau được thoả mãn:

a
i

A

i


B
σ
(i)
, i =1,2,…,n.
Xây dựng mạng G=(V,E) với tập đỉnh
{ } { } { }
{ } { }
,, ,,, ,,
, ,,, ,,,
2121
2121
nm
mn
yyyvvv
uuuxxxtsV
∪∪
∪∪=
Trong đó đỉnh x
i
tương ứng với tập A
i
đỉnh y
i
tương ứng với đỉnh B
i
,các phần tử
u

i
,v
i
tưong ứng với phần tử z
j
. Tập các cung mạng của G được xác định như sau
{ }
{
:),(1:,
jii
uxnixsE ∪≤≤=
với
}
∪≤≤≤≤∈ mjniAz
ij
1,1,
{ } {
:),(1:),(
ijji
yvmjvu
∪≤≤∪
với
} { }
.1:),(1,1, nitymjniBz
iij
≤≤∪≤≤≤≤∈
Khả năng thông qua của tất cả các cung được đặt bằng 1. Dễ dàng thấy
rằng hệ thống đại diện chung của hai dãy <A
1
,A

2
,…,A
n
> và <B
1
,B
2
,…,B
n
> tồn
tại khi và chỉ khi trong mạng G = (V,E) tìm được luồng với giá trị n. Để xét sự
tồn tại của luồng như vậy có thể sử dụng thuật toán tìm luồng cực đại từ s đến t
trong mạng G = (V,E).

2.3. Về một bài toán tối ưu rời rạc.
GV: Trương Nữ Thùy Duyên
Trường THPT Chuyên Quảng Bình
Trong mục này ta sẽ trình bày thuật toán được xây dựng dựa trên thuật
toán tìm luồng cực đại để giải một bài toán tối ưu rời rạc là mô hình toán học
cho một số bài toán tối ưu tổ hợp.
Xét bài toán tối ưu rời rạc

=
≤≤
→=
n
j
ij
mi
n

xxxxf
1
1
21
minmax), ,,(
(1)
với điều kiện

=
==
n
j
iijij
mipxa
1
,, ,2,1,
(2)
x
ij
= 0 hoặc 1, j=1,2,…,n (3)
trong đó a
ij


{0,1}, i= 1,2,…,m; j= 1,2,…,n, p
i
- nguyên dương, i=1,2,…,m.
Bài toán (1)-(3) là mô hình toán học cho nhiều bài toán tối ưu tổ hợp thực
tế. Dưới đây ta dẫn ra một vài ví dụ điển hình.
2.3.1 Bài toán phân nhóm sinh hoạt

Có m sinh viên và n nhóm sinh hoạt chuyên đề. Với mỗi sinh viên i, biết
a
ij
=1, nếu sinh viên có i nguyện vọng tham gia vào nhóm j,
a
ij
=0, nếu ngược lại,
và p
i
là số lượng nhóm chuyên đề mà họ có nguyện vọng tham gia và đảm bảo
mỗi sinh viên i phải tham gia đúng p
i
nhóm, hãy tìm cách phân phối với số
người trong nhóm có nhiều sinh viên tham gia nhất là nhỏ nhất có thể được.
Đưa vào biến số
x
ij
=1, nếu sinh viên i tham gia vào nhóm j,
x
ij
=0, nếu ngược lại,
i=1,2,…,m, j= 1,2,…,n, khi đó dễ thấy mô hình toán học cho bài toán đặt ra
chính là bài toán (1)-(3):
Xét bài toán tối ưu rời rạc

=
≤≤
→=
n
j

ij
mi
n
xxxxf
1
1
21
minmax), ,,(
(1)
với điều kiện

=
==
n
j
iijij
mipxa
1
,, ,2,1,
(2)
x
ij
= 0 hoặc 1, j=1,2,…,n (3)
trong đó a
ij


{0,1}, i= 1,2,…,m; j= 1,2,…,n, p
i
- nguyên dương, i=1,2,…,m.

2.3.2 Bài toán lập lịch cho hội nghị
Một hội nghị có m tiểu ban, mỗi tiểu ban cần sinh hoạt trong một ngày tại
phòng họp phù hợp với nó. Có n phòng họp dành cho việc sinh hoạt của các tiểu
ban. Biết
a
ij
=1, nếu phòng họp i là thích hợp với tiểu ban j,
a
ij
=0, nếu ngược lại,
GV: Trương Nữ Thùy Duyên
Trường THPT Chuyên Quảng Bình
i=1,2,…,m; j=1,2,…,n. Hãy bố trí các phòng họp sao cho hội nghị kết thúc sau
ít ngày làm việc nhất.
Đưa vào biến số
x
ij
= 1, nếu bố trí tiểu ban i làm việc ở phòng j,
x
ij
=0, nếu ngược lại,
i=1,2,…,m,j=1,2,…,n, khi đó dễ thấy mô hình toán học cho bài toán đặt ra chính
là bài toán (1)-(3):
Xét bài toán tối ưu rời rạc

=
≤≤
→=
n
j

ij
mi
n
xxxxf
1
1
21
minmax), ,,(
(1)
với điều kiện

=
==
n
j
iijij
mipxa
1
,, ,2,1,
(2)
x
ij
= 0 hoặc 1, j=1,2,…,n (3)
trong đó a
ij


{0,1}, i= 1,2,…,m; j= 1,2,…,n, p
i
- nguyên dương, i=1,2,…,m.

Bổ đề: Bài toán (1)-(3) có phương án tối ưu khi và chỉ khi

=
=≥
n
j
iij
mipa
1
., ,2,1,
(4)
Chương trình:
Uses Crt;
Const
InputFile='Input.Txt';
OutputFile='Output.Txt';
Var
a,x:Array[1 100,1 100]of Integer;
TraceX,TraceY:Array[1 100]of Integer;
p:Array[1 100]of Integer;
Start,Finish,n,m,s,t,Delta,No:Integer;
fi,fo:Text;
Procedure Input;
Var
i,j:Integer;
Begin
Assign(fi,InputFile);
Reset(fi);
Readln(fi,m,n);
Delta:=0;

For i:=1 to m do
begin
read(fi,p[i]);
Delta:=Delta+p[i];
End;
For i:=1 to m do
For j:=1 to n do read(fi,a[i,j]);
Close(fi);
s:=m+1;
t:=n+1;
For i:=1 to m do a[s,i]:=p[i];
End;
GV: Trương Nữ Thùy Duyên
Trường THPT Chuyên Quảng Bình
Function FindPath:Boolean;
Var
Queue:Array[1 100]of Integer;
i,j,First,Last,v:Integer;
Begin
Fillchar(TraceX,Sizeof(TraceX),0);
Fillchar(TraceY,Sizeof(TraceY),0);
First:=1;
Last:=0;
For i:=1 to m do
If x[s,i]<a[s,i] then
begin
inc(last);
Queue[last]:=i;
traceX[i]:=-1;
end;

While First<=Last do
Begin
i:=Queue[First];
Inc(first);
For j:=1 to n do
If (traceY[j]=0)and(x[i,j]<a[i,j])then
begin
traceY[j]:=i;
If x[j,t]<a[j,t] then
begin
Finish:=j;
FindPath:=True;
Exit;
end;
For v:=1 to m do
if (TraceX[v]=0)and(x[v,j]>0) then
begin
Inc(Last);
Queue[Last]:=v;
TraceX[v]:=j;
end;
end;
End;
FindPath:=False;
End;
Function Min(x,y:Integer):Integer;
Begin
If x<y then Min:="x"
else Min:="y;
"

End;
Procedure IncFlow;
Var
IncValue,i,j:Integer;
Begin
IncValue:=a[finish,t]-x[Finish,t];
j:=Finish;
While j>0 do
begin
i:=TraceY[j];
IncValue:=Min(IncValue,a[i,j]-x[i,j]);
j:=TraceX[i];
If j>0 then IncValue:=Min(IncValue,x[i,j]);
End;
Start:=i;
IncValue:=Min(IncValue,a[s,start]-x[s,start]);
GV: Trương Nữ Thùy Duyên
Trường THPT Chuyên Quảng Bình
j:=Finish;
While j>0 do
begin
i:=TraceY[j];
x[i,j]:=x[i,j]+IncValue;
j:=TraceX[i];
If j>0 then x[i,j]:=x[i,j]-IncValue;
End;
x[s,start]:=x[s,start]+IncValue;
x[finish,t]:=x[finish,t]+IncValue;
End;
Function MaxFlow(k:Integer):Integer;

Var
i,mf:Integer;
Begin
Fillchar(x,Sizeof(x),0);
For i:=1 to n do a[i,t]:=k;
Repeat
If not FindPath then break;
IncFlow;
Until False;
mf:=0;
For i:=1 to m do mf:=mf+x[s,i];
MaxFlow:=mf;
End;
Procedure Process;
var
l,r,k:Integer;
Begin
l:=0;
r:=m;
While l<r do
begin
k:=(l+r)div 2;
If MaxFlow(k)=Delta then r:=k
else l:=k+1;
End;
No:=r;
r:=MaxFlow(No);
End;
Procedure Output;
Var

i,j:Integer;
Begin
Assign(fo,OutputFile);
Rewrite(fo);
writeln(fo,No);
For i:=1 to m do
begin
For j:=1 to n do write(fo,x[i,j],' ');
writeln(fo);
end;
Close(fo);
End;
BEGIN
Input;
Process;
Output;
END.
GV: Trương Nữ Thùy Duyên
Trường THPT Chuyên Quảng Bình
GV: Trương Nữ Thùy Duyên
Trường THPT Chuyên Quảng Bình
PHẦN III: KẾT LUẬN
Trong phạm vi nghiên cứu của đề tài, tôi đã trình bày bài toán luồng cực
đại và thuật toán Ford – Fulkerson. Đề tài cũng đưa ra được một số bài toán ứng
dụng cụ thể của bài toán luồng cực đại. Hy vọng chúng ta có thể hiểu thêm thuật
toán tìm luồng cực đại và áp dụng để giải được các bài toán đã đặt ra.
Đề tài có một số hạn chế như sau:
- Chưa trình bày được một thuật toán tìm luồng cực đại khác
như Thuật toán Edmonds-Karp để so sánh và đối chiếu với thuật toán
Ford – Fulkerson

- Chưa cài đặt được hết các bài toán ứng dụng đưa ra
Hy vọng những hạn chế này như là phần bỏ ngỏ của đề tài để chúng ta tiếp
tục nghiên cứu và hoàn thiện đề tài này.
GV: Trương Nữ Thùy Duyên

×