Tải bản đầy đủ (.pdf) (70 trang)

Một số khải niệm cơ bản của lý thuyết đồ thị và phát biểu bài toán luồng trên mạ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 (670.6 KB, 70 trang )


1
Chương 1

MỘT SỐ KHÁI NIỆM CƠ BẢN CỦA LÝ THUYẾT
ĐỒ THỊ


I. MỘT SỐ KHÁI NIỆM CƠ BẢN CỦA LÝ THUYẾT ĐỒ THỊ
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.




a) b) c)


Hình 1.1

Thí dụ ở hình 1.1 (a) tại đỉnh y có một khuyên b. (b) là cung (x,y) có hướng. (c) cặp
đỉnh (x,y) tạo thành 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.2 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.


x

y

x

y

b

y

THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN

2








Hình 1.2

Đị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.


c
d
b
a
l
k
i
h
g e
d
c

b
a
c
d
l
k
i
h
g e
b
a
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN

3









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

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.
l

b
a
g
c
d
k
i
h
e
c
d
l
k
i
h
g e
b
a
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN

4
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.

2. Các thuật ngữ cơ bản

Trong phần này chúng ta sẽ trình bày một số thuật ngữ cơ bản của lý thuyết đồ
thị. 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).








Hình 1. Đồ thị vô hướng G


Thí dụ 1. Xét đồ thị trong hình 1 ta có.
deg(a) = 1, deg(b) = 4, deg(c) = 4, deg(f) = 3,
deg(d) = 1, deg(e) = 3, deg(g) = 0.

Đỉnh bậc 0 gọi là đỉnh cô lập. Đỉnh bậc 1 gọi là đỉnh treo. Trong ví dụ trên
đỉnh g là đỉnh cô lập, a và d là các đỉnh treo. 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 đó
f e
g
d
c b
a


=
Vv
vm )deg(2
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN

5
Chứng minh. Rõ ràng mỗi cạnh e = (u,v) được tính một lần trong deg(u) và
một lần trong deg(v). Từ đó suy ra tổng tất cả các bậc của các đỉnh bằng hai lần số
cạnh.

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.

Chứng minh. Thực vậy gọi V
1

và V
2
tương ứng là tập chứa các đỉnh bậc lẻ và
tập chứa các đỉnh bậc chẵn của đồ thị. Ta có
Do deg(v) chẵn với v là đỉnh trong U nên tổng thứ hai trong vế phải ở trên là
số chẵn. Từ đó suy ra tổng thứ nhất (chính là tổng bậc của các đỉnh lẻ) cũng phải là
số chẵn, do tất cả các số hạng của nó sẽ là số lẻ nên tổng này phải gồm một số chẵn
các số hạng. Vì vậy số đỉnh bậc lẻ phải là 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).

Đị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)).










Hình 2. Đồ Thị có hướng G

Thí dụ 3. Xét đồ thị cho trong hình 2. Ta có
deg
-
(a) = 1, deg
-
(b) = 2, deg
-
(c) = 2, deg
-
(d) = 2, deg
-
(e) = 2.
deg
+
(a) = 3, deg
+
(b) = 1, deg
+
(c) = 1, deg
+
(d) = 2, deg
+
(e) = 2.

Do mỗi cung (u,v) sẽ được tính một lần trong bán bậc vào của đỉnh v và một
lần trong bán bậc ra của đỉnh u nên ta có:

Định lý 2. Giả sử G = (V,E) là đồ thị có hướng. Khi đó

d
e
c b
a
∑∑∑
∈∈∈
+==
21
)deg()deg()deg(2
VvVvVv
vvvm
∑∑


+

==
VvVv
Evv ||)(deg)(deg
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN

6
Rt nhiu tớnh cht ca th cú hng khụng ph thuc vo hng trờn cỏc
cung ca nú. Vỡ vy, trong rt nhiu trng hp s thun tin hn nu ta b qua
hng trờn cỏc cung ca th. th vụ hng thu c bng cỏch b qua hng
trờn cỏc cung c gi l th vụ hng tng ng vi th cú hng ó cho.

3. ng i, chu trỡnh. th liờn thụng.

nh ngha 1. ng i di n t nh u n nh v, trong ú n l s

nguyờn dng, trờn th vụ hng 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 biu din di dng dóy cỏc cnh:
(x
0
,x
1
), (x
1
,x
2

),, (x
n-1
,x
n
).
nh u gi l nh u, cũn nh v gi l nh cui ca ng i. ng i cú nh
u trựng vi nh cui (tc l u = v) c gi l chu trỡnh. ng i hay chu trỡnh
c gi l n nu nh khụng cú cnh no b lp li.

Thớ d 1. Trờn th vụ hng cho hỡnh 1: a, d, c, f, e l ng i n di
4. Cũn d, e, c, a khụng l ng i, do (e,c) khụng phi l cnh ca th. Dóy b, c,
f, e, b l chu trỡnh di 4. ng i a, b, e, d, a, b cú di l 5 khụng phi l
ng i n, do cnh (a,b) cú mt trong nú hai ln.









Hỡnh 3. ng i trờn th

Khỏi nim ng i v chu trỡnh trờn th cú hng c nh ngha hon
ton tng t nh trng hp th vụ hng, ch khỏc l ta cú chỳ ý n hng trờn
cỏc cung.

nh ngha 2. ng i di n t nh u n nh v, trong ú n l s
nguyờn dng, trờn th cú hng 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 biu din di dng dóy cỏc cung:
(x
0
, x
1
), (x
1
, x
2
), (x

n-1
, x
n
).
nh u gi l nh u, cũn nh v gi l nh cui ca ng i. ng i cú nh
u trựng vi nh cui (tc l u = v) c gi l chu trỡnh. ng i hay chu trỡnh
c gi l n nu nh khụng cú cnh no b lp li.
f e d
c b a b
e
a
d f
c
THệ VIEN ẹIEN Tệ TRệẽC TUYEN

7
Thí dụ 2. Trên đồ thị có hướng cho ở hình 3: a

d

c

f

e là đường đi
đơn độ dài 4. Còn d

e

c


a khơng là đường đi, do (e,c) khơng phải là cạnh
của đồ thị. Dãy b, c, f, e, b là chu trình độ dài 4. Đường đi a

b

e

d

a

b có
độ dài là 5 khơng phải là đường đi đơn, do cạnh (a,b) có mặt trong nó hai lần.
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 ln 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.

Thí dụ 3. Trong hình 2: Đồ thị G là liên thơng, còn đồ thị H là khơng liên
thơng.













Hình 2. Đồ thị liên thơng G và đồ thị H gồm 3
thành phần liên thơng H
1
, H
2
, H
3
.

II. MỘT SỐ THUẬT TỐN TRÊN ĐỒ THỊ

1 Thuật tốn tìm kiếm trên đồ thị
1.1 Tìm kiếm theo chiều sâu trên đồ thị

Ý tưởng chính của thuật tốn có thể trình bày như sau. Ta sẽ bắt đầu tìm kiếm
từ một đỉnh v
0
nào đó của đồ thị. Sau đó chọn u là một đỉnh tuỳ ý kề với v
0

và lặp lại
q trình đối với u. Ở bước tổng qt, giả sử ta đang xét đỉnh v, Nếu nhử tổng số các
đỉnh kề với v tìm được đỉnh w là chưa được xét thì ta sẽ xét đỉnh này( nó sẽ trở thành
đã xét) và bắt đầu từ nó ta sẽ tiếp tục q trình tìm kiếm. Còn nếu như khơng còn
đỉnh nào kề với v là chưa xét thì ta sẽ nói rằng đỉnh này là đã duyệt xong và quay trở
e
g
d
e
c
b
a
G
H
2
H
3
H
1
H

THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN

8
lại tiếp tục tìm kiếm từ đỉnh mà trước đó ta đến được đỉnh v (nếu v = v
0
, thì kết thúc
tìm kiếm). Có thể nói nơm na là tìm kiếm theo chiều sâu bắt đầu từ đỉnh v được thực
hiện trên cơ sở tìm kiếm theo chiều sâu từ tất cả các đỉnh chưa xét kề với v. Q trình
này có thể mơ tả bởi thủ tục đệ qui sau đây.


Procedure DFS(v);
(* Tìm kiếm theo chiều sâu bắt đầu từ đỉnh v;
Các biến Chuaxet, Ke, là tồn cục *)
Begin
Thăm_đỉnh(v);
Chuaxet[v] := false;
for u

Ke(v) do
if Chuaxet[u] then DFS(u);
end; (* đỉnh v là đã duyệt xong *)

Khi đó, tìm kiếm theo chiều sâu trên đồ thị được thực hiện nhờ thuật tốn sau:

BEGIN
(* Initialiation *)
for v

V do Chuaxet[u] := true;
for v

V do
if Chuaxet[v] then DFS(v);
END.

Rõ ràng lệnh gọi DFS(v) sẽ cho phép đến thăm tất cả các đỉnh thuộc cùng
thành phần liên thơng với đỉnh v, bởi vì sau khi thăm đỉnh là lệnh gọi đến thủ tục
DFS đối với tất cả các đỉnh kề với nó. Mặt khác, do mỗi khi thăm đỉnh v xong, biến
Chuaxet[v] được đặt lại giá trị false nên mỗi đỉnh sẽ được thăm đúng một lần. Thuật

tốn lần lượt sẽ tiến hành tìm kiếm từ các đỉnh chưa được thăm, vì vậy, nó sẽ xét qua
tất cả các đỉnh của đồ thị (khơng nhất thiết phải là liên thơng).
Để đánh giá độ phức tạp tính tốn của thủ tục, trước hết nhận thấy rằng số
phép tốn cần thực hiện trong hai chu trình của thuật tốn( hai vòng for của chương
trình chính) là cỡ n. Thủ tục DFS phải thực hiện khơng q n lần. Tổng số phép tốn
cần phải thực hiện trong các thủ tục này là O(n+m), do trong các thủ tục này ta phải
xét qua tất cả các cạnh và các đỉnh của đồ thị. Vậy độ phức tạp tính tốn của thuật
tốn là O(n+m).

Thí dụ 1. Xét đồ thị cho trong Hình 1. Các đỉnh của nó được đánh số lại theo
thứ tự chúng được thăm theo thủ tục tìm kiếm theo chiều sâu mơ tả ở trên. Giả thiết
rằng các đỉnh trong danh sách kề của đỉnh v (Ke(v)) được sắp xếp theo thứ tự tăng
dần của chỉ số.




THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN

9















Hình 1. Chỉ số mới (trong ngoặc) của các đỉnh được đánh lại theo thứ tự
chúng được thăm trong thuật tốn tìm kiếm theo chiều sâu

Thuật tốn tìm kiếm theo chiều sâu trên đồ thị vơ hướng trình bày ở trên dễ
dàng có thể mơ tả lại cho đồ thị có hướng. Trong trường hợp đồ thị có hướng, thủ tục
DFS(v) sẽ cho phép thăm tất cả các đỉnh u nào mà từ v có đường đi đến u. Độ phức
tạp tính tốn là O(n+m).

1.2 Tìm kiếm theo chiều rộng trên đồ thị

Để ý rằng trong thuật tốn tìm kiếm theo chiều sâu đỉnh được thăm càng muộn
sẽ càng sớm trở thành đã duyệt xong. Điều đó là hệ quả tất yếu của việc các đỉnh
được thăm sẽ được kết nạp vào trong ngăn xếp (STACK). Tìm kiếm theo chiều rộng
trên đồ thị, nếu nói một cách ngắn gọn, được xây dựng dựa trên cơ sở thay thế ngăn
xếp (STACK) bởi hang đợi (QUEUE). Với sự cải biên như vậy, đỉnh được thăm càng
sớm sẽ trở thành đã duyệt song (tức là càng sớm dời khỏi hang đợi). Một đỉnh trở
thành đã duyệt xong ngay sau khi ta xét xong tất cả các đỉnh kề (chưa được thăm) với
nó. Thủ tục có thể mơ tả như sau:

Procedure BFS(v);
(* Tìm kiếm theo chiều rộng bắt đầu từ đỉnh v;
Các biến Chuaxet, Ke là biến tồn cục *)
begin
QUEUE:=

;

QUEUE:<= v; (* Kết nạp v vào QUEUE *)
Chuaxet[v]:= false;
While QUEUE



do
begin
p <= QUEUE; (* Lấy p từ QUEUE *)
Thăm_đỉnh(p);
12(11
)
4(3
)
13(10
)
9(7
)
8(6
)
6(4
)
5(5
)
7(8
)
3(9
)
2(2
)

1(1
)
11(13
)
10(12
)
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN

10
for u

Ke(v) do
if Chuaxet[u] then
begin
QUEUE <= u; Chuaxet[u]:= false;
end;
end;
end;

Khi ú, tỡm kim theo chiu rng trờn th c thc hin nh thut toỏn
sau:

BEGIN
(* Initialization *)
for v

V do Chuaxet[v]:= true;
for v

V do

if Chuaxet[v] then BFS(v);
END.

Lp lun tng t nh trong th tc tỡm kim theo chiu sõu, cú th ch ra
c rng lnh gi BFS(v) s cho phộp n thm tt c cỏc nh thuc cựng thnh
phn liờn thụng vi nh v, v mi nh ca th s c thm ỳng mt ln.
phc tp tớnh toỏn ca thut toỏn l O(n+m).

Thớ d 2. Xột th trong Hỡnh 2. Th t thm nh ca th ny theo thut
toỏn tỡm kim theo chiu rng c ghi trong ngoc.












Hỡnh 2. Ch s mi (trong ngoc) ca cỏc nh c ỏnh li theo th t
chỳng c thm trong thut toỏn tỡm kim theo chiu rng

1.3 Tỡm ng i v kim tra tớnh liờn thụng

12(4
)
4(3

)
13(11
)
9(10
)
8(13
)
6(5
)
5(9
)
7(6
)
3(12
)
2(2
)
1(1
)
11(8
)
10(7
)
THệ VIEN ẹIEN Tệ TRệẽC TUYEN

11
Trong mc ny ta xột ng dng cỏc thut toỏn tỡm kim mụ t trong cỏc mc
trc vo vic gii bi toỏn c bn trờn th: Bi toỏn tỡm ng i v bi toỏn v
xỏc nh cỏc thnh phn liờn thụng ca th.


Bi toỏn tỡm ng i gia hai nh
Gi s s v t l hai nh no ú ca th. Hóy tỡm ng i t s n t.

Nh trờn ó phõn tớch, th tc DFS(s) (BFS(s)) s cho phộp thm tt c cỏc
nh thuc cựng mt thnh phn liờn thụng vi s. Vỡ vy, sau khi thc hin xong th
tc, nu Chuaxet[t] = true, thỡ iu ú cú ngha l khụng cú ng i t s n t, cũn
nu Chuaxet[t] = false thỡ t thuc cựng thnh phn liờn thụng vi s, hay núi mt cỏch
khỏc: Tn ti ng i t s n t. Trong trng hp tn ti ng i, ta dựng thờm
bin Truoc[v] ghi nhn nh i trc nh v trong ng i tỡm kim t s n v.
Khi ú, i vi th tc DFS(v) cn sa i cõu lnh if trong nú nh sau:

if Chuaxet[u] then
begin
Truoc[u]:=v;
DFS(u);
end;

Cũn i vi th tc BFS(v) cn sa i cõu lnh cõu lnh if trong nú nh sau:

if Chuaxet[u] then
begin
QUEUE

u; Chuaxet[u]:= false;
Truoc[u]:= p;
end;

ng i cn tỡm s c khụi phc theo quy tc sau:
T


p1:= Truoc[t]

p2:= Truoc[p1]



s.

Chỳ ý: ng i tỡm c theo thut toỏn tỡm kim theo chiu rng l ng
i ngn nht (theo s cnh) t nh s n nh t. iu ny suy trc tip t th t thm
nh theo thut toỏn tỡm kim theo chiu rng.

2 Tỡm ng i ngn nht
2.1. Cỏc khỏi nim

Trong phn ny chỳng ta ch xột th cú hng G = (V,E), |V| = n, |E| = m
vi cỏc cung c gỏn trng s, ngha l, mi cung (u,v)

E ca nú c t tng
ng vi mt s thc a(u,v) gi l trng s ca nú. Chỳng ta s t a(u,v) = , nu
(u,v)

E. Nu dóy
v
0
, v
1
,, v
p


THệ VIEN ẹIEN Tệ TRệẽC TUYEN

12
l mt ng i trờn G, thỡ di ca nú c nh ngha l tng sau

=

p
i
ii
vva
1
1
),(

Tc l, di ca ng i chớnh l tng cỏc trng s trờn cỏc cung ca nú.
(Chỳ ý rng nu chỳng ta gỏn trng s cho tt c cỏc cung u bng 1, thỡ ta thu c
nh ngha di ca ng i nh l s cung ca ng i ging nh trong cỏc
phn trc ó xột).
Bi toỏn tỡm ng i ngn nht trờn th di dng tng quỏt cú th phỏt
biu nh sau: Tỡm ng i cú di nh nht t mt nh xut phỏt s

V n nh
cui (ớch) t

V. ng i nh vy ta s gi l ng i ngn nht t s n t cũn
di ca nú ta s ký hiu l d(s,t) v cũn gi l khong cỏch t s n t (khong cỏch
nh ngha nh vy cú th l s õm). Nu nh khụng tn ti ng i t s n t thỡ ta
s t d(s,t) = . Rừ rng, nu nh mi chu trỡnh trong th u cú di dng,
thỡ trong ng i ngn nht khụng cú nh no b lp li (ng i khụng cú nh

lp li s c gi l ng i c bn). Mt khỏc, nu trong th cú chu trỡnh vi
di õm (chu trỡnh nh vy, ngn gn, ta s gi l chu trỡnh õm) thỡ khong cỏch
gia mt s cp nh no ú ca th cú th l khụng xỏc nh, bi vỡ, bng cỏch i
vũng theo chu trỡnh ny mt s ln ln, ta cú th ch ra ng i gia cỏc nh ny
cú di nh hn bt c mt s thc cho trc no. Trong nhng trng hp nh
vy, cú th t vn tỡm ng i c bn ngn nht, tuy nhiờn bi toỏn t ra s tr
nờn phc tp hn rt nhiu.
Trc ht cn chỳ ý rng nu bit khong cỏch t s n t, thỡ ng i ngn
nht t s n t, trong trng hp trng s khụng õm, cú th tỡm c mt cỏch d
dng. tỡm ng i, ch cn ý l i vi cp nh s,t

V tu ý (s

t) luụn tỡm
c nh v sao cho
d(s,t) = d(s,v) + a(v,t).
Thc vy, nh v nh vy chớnh l nh i trc nh t trong ng i ngn
nht t s n t. Tip theo ta li cú th tỡm c nh u sao cho d(s,v) = d(s,u) +
a(u,v), T gi thit v tớnh khụng õm ca cỏc trng s d dng suy ra rng dóy t, v,
u khụng cha nh lp li v kt thỳc nh s. Rừ rng dóy thu c xỏc nh
(nu lt ngc th t cỏc nh trong nú) ng i ngn nht t s n t. T ú ta cú
thut toỏn sau õy tỡm ng i ngn nht t s n t khi bit di ca nú.

Procedure Find_Path;
(*
u vo:
d[v] - khong cỏch t nh s n tt c cỏc nh cũn li v V;
t - nh ớch;
a[u,v], u, v V ma trn trng s trờn cỏc cung.
u ra:

Mng STACK cha dóy nh xỏc nh ng i nhn nht t s n t
*)
begin
STACK:=; STACK t; v:= t;
THệ VIEN ẹIEN Tệ TRệẽC TUYEN

13
While v ≠ s do
begin
u:= đỉnh thoả mãn d[v] = d[u] + a[u,v];
STACK ⇐ u;
v:= u;
end;
end;

Chú ý rằng độ phức tạp tính tốn của thuật tốn là O(n
2
), do để tìm đỉnh u ta
phải xét qua tất cả các đỉnh của đồ thị. Tất nhiên, ta cũng có thể sử dụng kỹ thuật ghi
nhận đường đi trong phần trên: Dùng biến biến mảng Truoc[v], v

V, để ghi nhớ
đỉnh đi trước v trong đường đi tìm kiếm.
Cần lưu ý thêm là trong trường hợp trọng số trên các cạnh là khơng âm, bài
tốn tìm đường đi ngắn nhất trên đồ thị vơ hướng có thể dẫn về bài tốn trên đồ thị có
hướng, bằng cách thay mỗi cạnh của nó bởi hai cung có hướng ngược chiều nhau với
cùng trọng số của các cạnh tương ứng. Tuy nhiên, trong trường hợp có trọng số âm
việc thay như vậy có thể dẫn đến chu trình âm.

2.2 Thuật tốn Ford – Bellman


Phần lớn các thuật tốn tìm khoảng cách giữa hai đỉnh s và t được xây dựng
nhờ kỹ thuật tính tốn mà ta có thể mơ tả đại thể như sau: Từ ma trận trọng số a[u,v],
u,v

V, ta tính cận trên d[v] của khoảng cách từ s đến tất cả các đỉnh v

V. Mỗi khi
phát hiện
d[u] + a[u,v] < d[v] (1)
cận trên d[v] sẽ được là tốt lên: d[v]:= d[u] + a[v].
Q trình đó sẽ kết thúc khi nào chúng ta khơng làm tốt thêm bất cứ cận trên
nào. Khi đó, rõ ràng giá trị của mỗi d[v] sẽ cho ta khoảng cách từ đỉnh s đến đỉnh v.
Khi thể hiện kỹ thuật tính tốn này trên máy tính, cận trên d[v] sẽ được gọi là nhãn
của đỉnh v, còn việc tính lại các cận trên này sẽ gọi là phép gán nhãn cho đồ thị và
tồn bộ thủ tục gọi là thủ tục gán nhãn. Nhận thấy rằng để tính khoảng cách từ s đến
t, ở đây, ta phải tính khoảng cách từ s đến tất cả các đỉnh còn lại của đồ thị. Hiện nay
vẫn chưa biết thuật tốn nào cho phép tìm đường đi ngắn nhất giữa hai đỉnh làm việc
thực sự hiệu quả hơn những thuật tốn tìm đường đi ngắn nhất từ một đỉnh đến tất cả
các đỉnh còn lại.
Sơ đồ tính tốn mà ta vừa mơ tả còn chưa xác định được, bởi vì còn phải chỉ
ra thứ tự chọn các đỉnh u và v để kiểm tra điều kiện (1). Thứ tự chọn này có ảnh
hưởng rất lớn đến hiệu quả của thuật tốn.
Bây giờ ta sẽ mơ tả thuật tốn Ford- Bellman tìm đường đi ngắn nhất từ đỉnh s
đến tất cả các đỉnh còn lại của đồ thị. Thuật tốn làm việc trong trường hợp trọng số
của các cung là tuỳ ý, nhưng giả thiết rằng trong đồ thị khơng có chu trình âm.

Procedure Ford_Bellman;
(*
Đầu vào: Đồ thị có hướng G = (V,E) với n đỉnh,

THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN

14
s

V l nh xut phỏt,
a[u,v], u, v

V, ma trn trng s;
Gi thit: th khụng cú chu trỡnh õm.
u ra: Khong cỏch t nh s n tt c cỏc nh cũn li d[v], v

V.
Truoc[v], v

V, ghi nhn nh i trc v trong ng i ngn nht t s
n v
*)
begin
(* Khi to *)
for v V do
begin
d[v]:= a[s,v];
Truoc[v]:= s;
end;
d[s]:= 0;
for k:= 1 to n-2 do
for v V \ {s} do
for u V do
if d[v] > d[u] + a[u,v] then

begin
d[v]:= d[u] + a[u,v];
Truoc[v]:= u;
end;
end;

Tớnh ỳng n ca thut toỏn cú th chng minh trờn c s nguyờn lý ti u
ca quy hoch ng. Rừ rng l phc tp tớnh toỏn ca thut toỏn l O(n
3
). Lu ý
rng chỳng ta cú th chm dt vũng lp theo k thỡ phỏt hin trong quỏ trỡnh thc hin
hai vũng lp trong khụng cú bin d[v] no b i giỏ tr. Vic ny cú th xy ra i
vi k < n-2, v iu ú lm tng hiu qu ca thut toỏn trong vic gii cỏc bi toỏn
thc t. Tuy nhiờn, ci tin ú khụng thc s ci thin c nh giỏ phc tp ca
bn thõn thut toỏn. i vi th tha tt hn l s dng danh sỏch k Ke(v), v

V,
biu din th, khi ú vũng lp theo u cn vit li di dng

for u Ke(v) do
if d[v] > d[u] + a[u,v] then
begin
d[v]:= d[u] + a[u,v];
Truoc[v]:= u;
end;

Trong trng hp ny ta thu c thut toỏn vi phc tp O(n.m)

THệ VIEN ẹIEN Tệ TRệẽC TUYEN


15
Thớ d 1. Xột th cho trong hỡnh 1. Cỏc kt qu tớnh toỏn theo thut toỏn
c mụ t trong bng di õy.










Hỡnh 1. Minh ho cho thut toỏn Ford-Bellman


k d[1],
Truoc[1]
d[2],
Truoc[2]
d[3],
Truoc[3]
d[4],
Truoc[4]
d[5],
Truoc[5]
0,1 1,1
,1 ,1
3,1
1 0,1 1,1 4,2 4,2 -1,3

2 0,1 1,1 4,2 3,5 -1,3
3 0,1 1,1 4,2 3,5 -1,3

Bng kt qu tớnh toỏn theo thut toỏn Ford-Bellman

2.3 Thut toỏn Dijkstra

Trong trng hp trng s trờn cỏc cung l khụng õm thut toỏn do Dijkstra
ngh gii bi toỏn tỡm ng i ngn nht t ng s n cỏc nh cũn li ca th
lm vic hu hiu hn rt nhiu so vi thut toỏn trỡnh by trong mc trc . thut
toỏn c xõy dng da trờn c s gỏn cho cỏc nh nhón tm thi . Nhón ca mi
nh cho bit cn trờn ca di ng i ngn nht t s n nú. Cỏc nhón ny s
c bin i theo th tc lp, m ú mi bc lp cú mt nhón tm thi tr thnh
nhón c nh. Nu nhón ca mt nh no ú tr thnh c nh thỡ nú s cho ta khụng
phi l cn trờn m l di ca ng i ngn nht t nh s n nú. Thut toỏn
c mụ t c th nh sau.

procedure Dijkstra;
(* u vo: th cú hng G=(V,E) vi n nh.
s

V l nh xut phỏt, a[u,v],u.v

V, ma trn trng s;
Gi thit : a[u,v]

0, u,v

V .
u ra: Khong cỏch t nh s n tt c cỏc nh cũn li d[v] , v


V.Truoc[v],
v

V
ghi nhn nh i trc v trong ng i ngn nht t s n v*)
Begin
A =
(1)

4
(4)

5
(8)

(3)

(-5)

(2)

3
(3)

(3)

(1)

5

s=1
1 3
3 3 8
1 -5
2
4
1 3
3 3 8
1 -5
2
4
THệ VIEN ẹIEN Tệ TRệẽC TUYEN

16
(*khởi tạo*)
for v∈V do
begin
d[v]:= a[s,v];
truoc[v]= s;
end;
d[s]:= 0; T:= V\{s}; (* T là tập đỉnh có nhãn tạm thời *)

(*bước lặp*)
while T ≠ ∅ do
begin
Tìm đỉnh u

T thoả mãn d[u] = min{d[z]:z

T};

T:= T\{u}; (* Cố định nhãn của đỉnh u *)
for v

T do (* Gán lại nhãn cho các đỉnh trong T *)
if d[v] > d[u] + a[u,v] then
begin
d[v]:= d[u] + a[u,v];
Truoc[v]:= u;
end;
end;
end;

Định lý 1. Thoật tốn Dijkstra tìm được đường đi ngắn nhất trên đồ thị sau
thời gian cỡ O(n
2
)

Chứng minh : Trước hết ta chứng minh là thuật tốn tìm được đường đi ngắn
nhấttừ đỉnh s đến các đỉnh còn lại của đồ thị, Giả sử rằng ở một bước lặp nào đó các
nhãn cố định cho ta độ dài đường đi ngắn nhất từ s đến các đỉnh có nhãn cố định, ta
sẽ chứng minh ở lần lặp tiếp theo nếu đỉnh u* thu được nhãn cố định thì d(u
*
) chính
là độ dài đường đi ngắn nhất từ s đến u
*
.
Ký hiệu S
l
là tập các đỉnh có nhãn cố định còn S
2

là tập các đỉnh có nhãn tạm
thời ở bước lặp đang xét. Kết thúc mỗi bước lập tạm thời d[v] cho ta độ dài của
đường đi ngắn nhất từ s đến v qua những đỉnh nằm hồn tồn trong S
1
. Giả sử rằng
đường đi ngắn nhất từ s đến u
*
khơng nằm trong tập S
1
. tức là nó đi qua ít nhất một
đỉnh của S
2
. Gọi z

S
2
là đỉnh đầu tiên như vậy trong đường đi này. Do đó trọng số
trên các khung là khơng âm, nên đoạn đường từ z đến u
*
có độ dài L > 0 và
D(z) <d(u
*
)-L< d(u
*
)
Bất đẳng thức này là mâu thuẫn với cách xác định đỉnh u
*
là đỉnh có nhãn tạm thời
nhỏ nhất. vậy đường đi ngắn nhất từ s đến u
*

phải nằm trọn trong S
1
và thế d[u
*
] là
độ dài của nó. Do ở lần lặp đậu tiên S
1
= {s} và sau mỗi lần lặp tạo thêm vào S
1
một
đỉnh u
*
nên giả thiết d(v) cho độ dài đường đi ngắn nhất s đến v với mọi v

S
1

đúng với bước lặp đậu tiên. Theo qui nạp suy ra thuật tốn cho ta đường đi ngắn nhất
từ s đến đỉnh của đồ thị .
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN

17
Bõy gi s ỏnh gớa s phộp toỏn cn thc hin theo thut toỏn . mi bc
lp li tỡm ra nh u cn phi thc hin O(n) phộp toỏn. V gỏn nhón li cng
cn phi thc hin mt s lng phộp toỏn cng l O(n). Thut toỏn phi thc hin n
-1 bc lp, vp thi gian tớnh toỏn ca phộp toỏn l c O(n
2
).
nh lý c chng minh.
Khi ó tỡm c di ca ng i ngn nht d[v] thỡ ng i ny cú th

tỡm da vo nhón Truoc[v], v

V, theo quy tc ging nh chỳng ta ó xột trc.

Thớ d 2. Tỡm ng i ngn nht t nh 1 n cỏc nh cũn li ca th
Hỡnh 2.











Hỡnh 2. Minh ho thut toỏn Dijkstra

Kt qu tớn toỏn theo thut toỏn c trỡnh by trong thut toỏn di õy. Qui
c vit hai thnh phn ca nhón theo th t: d[v], Truoc[v]. nh c ỏnh du *
l nh c chn c nh nhón bc lp ang xột, nhón ca nú khụng bin i
cỏc bc tip theo, vỡ th ta ỏnh du -.


Bng kt qu tớnh toỏn theo thut toỏn Dijkstra

Thớ d 3. Tỡm ng i ngn nht t nh 1 n tt c cỏc nh cũn li trong
th vụ hng sau.





Bc lp nh 1 nh 2 nh 3 nh 4 nh 5 nh 6
Khi to 0,1 1,1*
,1 ,1 ,1 ,1
1 - - 6,2 3,2*
,1
8,2
2 - - 4,4* - 7,4 8,2
3 - - - - 7,4 5,3*
4 - - - - 6,6* -
5 - - - - - -
(1)

(7)

(1)

(3)

(4)

(2)

(5)

(2)

(2)


2
2
2 1
3
2
THệ VIEN ẹIEN Tệ TRệẽC TUYEN

18











Hỡnh 3. Minh ho thut toỏn Dijkstra
cho th vụ hng

Bc lp nh 1 nh 2 nh 3 nh 4 nh 5 nh 6
Khi to 0.1 11.1
*
.1
12.1
.1 .1
1 - - 24.2 12.1

*
.1 .1
2 - - 24.2
*
- 31.4
.1
3 - - - - 31.4
*
41.3
4 - - - - - 41.3
*
5 - - - - - -

Bng kt qu tớnh toỏn theo thut toỏn Dijkstra
Chỳ ý:
1) Nu ch cn tỡm ng i ngn nht t s n mt nh t no ú thỡ cú th
kt thỳc thut toỏn khi cú nh t tr thnh nhón c nh.
2) Tng t nh mc 2, d dng mụ t li thut toỏn cho trng hp th
cho bi danh sỏch k. cú th gim bt khi lng tớnh toỏn trong vic xỏc nh
nh u mi bc lp. Khi ú cú th thu c thut toỏn vi phc tp tớnh toỏn l
O(m logn).
















(19)

(18)

(14)

(20)

(16)

(12)

(15)

(11)

6
5
4
3 2
1
THệ VIEN ẹIEN Tệ TRệẽC TUYEN

19

Chương 2


PHÁT BIỂU BÀI TỐN LUỒNG TRÊN MẠNG


Nhiều bài tốn quy hoạch tuyến tính có thể quy về bài tốn làm cực tiểu phí
tổn vận chuyển hàng trong một mạng (gồm các nút và các cung đường) sao cho đảm
bảo được các nhu cầu ở một số nút khi đã biết nguồng cung cấp tại một số nút khác.
Các bài tốn như vậy được gọi là các bài tốn luồng trên mạng (network flow
problem) hoặc bài tốn chuyển vận (transshipment problem). Đây là lớp bài tốn
quan trọng nhất và hay gặp nhất trong quy hoạch tuyến tính. Lớp này bao gồm các
bài tốn quen thuộc trong thực tế như: bài tốn vận tải, các bài tốn mạng điện và
mạng giao thơng, các bài tốn quản lý và phân bổ vật tư, bài tốn bổ nhiệm, bài tốn
kế hoạch tài chính, bài tốn đường ngắn nhất, bài tốn luồng cực đại …
Bài tốn luồng cực đại trong mạng là một trong số những bài tố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 tố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. Trong chương này chúng
ta sẽ trình bày thuật tốn của Ford và Fulkerson để giải bài tốn đặt ra và nêu một số
ứng dụng của bài tốn.

I. PHÁT BIỂU BÀI TỐN

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à lng 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 q 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ó:
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN

20
{ } { }
.),(:)(,),(:)( EwvVwvEvwVwv ==
+

3.Giỏ tr ca lung f l s
.),(),()(
)()(



+


==
twsw
twfwsffval


2. Bi toỏn lung cc i trong mng

Cho mng G=(V,E). Hóy tỡm lung f
*
trong mng vi giỏ tr lung val(f
*
) l
ln nht . Lung nh vy ta s gi l lung cc i trong mng.

Bi toỏn nh vy cú th xut hin trong rt nhiu ng dng thc t . chng hn
khi cn xỏc nh cng ln nht ca dũng vn ti gia 2 nỳt ca mt bn giao
thụng. Trong vớ d ny ca bi toỏn lung cc i x ch cho ta cỏc on ng ụng
xe nht v chỳng to thnh ch hp tng ng vi dũng giao thng xột theo hai nỳt
c chn. Mtvớ d khỏc l nu xột th tng ng vi mt h thng dn du.
Trong ú cỏc ng tng ng vi cỏc cung , im phỏt cú th cú th l tu ch du,
im thu l b cha, cũn nhng im ni gia cỏc ng l cỏc nỳt ca th. Kh
nng thụng qua ca cỏc cung tng ng vi tit din cỏc ng.Cn phi tỡn lung du
ln nht cú th bm t du vo b cha.

3. Lỏt ct. ng tng lung . nh lý Ford- Fulkerson

nh ngha 3. Ta gi lỏt ct (X,X
*
) l mt cỏch phõn hoch tp nh V ca

mng ra thnh hai tp X v X
*
=V \ X , trong ú s

X v t

X
*
. Kh nng thụng
qua ca lỏt ct (X,X
*
) l s



=
*
).,(),(
*
Xw
Xv
wvcXXc

Lỏt ct vi kh nng thụng qua nh nht c gi l lỏt ct hp nht.

B 1. giỏ tr ca mi lung f trong mng luụn nh hn bng kh nng
thụng qua lỏt ct (X,X
*
) bt k trong nú : val(f)


c(X,X
*
).

Chng minh. Cng cỏc iu kin cõn bng lung Div
f
(v) = 0 vi mi v

X.
Khi ú ta cú




+

=
Xv
vw vw
fvalwvfvwf )()),(),((
)( )(

Tng ny s gm cỏc s hng dng f(u,v) vi du cng hoc du tr m trong
ú cú ớt nht mt trong hai nh u, v phi thuc tp X. Nu c hai nh u, v u trong
tp X, thỡ f(u,v) xut hin vi du cng trong Div
f
(v) v cú du tr trong Div
f
(u). Vỡ
th, chỳng trit tiờu ln nhau. Do ú, sau khi gin c cỏc s hng nh vy v trỏi,

ta thu c
,)(),(),(
*
*





=+
Xw
Xv
Xw
Xv
fvalwvfwvf

THệ VIEN ẹIEN Tệ TRệẽC TUYEN

21
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).

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.

Thí dụ: Các số viết cạnh các cung của G ở hình 1 theo thứ tự là khả năng
thông qua và luồng trên cung.









THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN

22














Hình 1. Mạng G và luồng f. Đồ thị có trọng số G
f
tương ứng.

Giả sử P = (s = v
0
,v
1
,v
2
,… ,v
k
= t) là một đường đi từ s đến t trên đồ thị tăng
luồng G
f
. Gọi
δ
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) +
δ
, nếu (u,v)

P là cung thuận
f ‘(u,v) = f(u,v) -
δ
, nếu (u,v)


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

P

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) +
δ
. Ta sẽ gọi thủ tục biến đổi luồng vừa nêu là tăng luồng dọc theo
đường P.

Đị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.
(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

c

s

s

1

1

2

t

3

3

b

1

d

2

2


1

2

e

3

1

3,3

b

3,2

d

4,2

t

3,2

e

3,0

c


4,1

2,2

THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN

23

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.

4. Thuật tố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 tố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 tố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 tốn kết thúc. Nếu
có, tiếp bước 3 dưới đây.
3
0
Nếu
δ
(P) = +

thuật tố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 tốn vẫn thoả.

Cách tìm đường đi tăng luồng. Ta sử dụng thuật tố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 hồ (unsaturated
path).

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 hồ 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 hồ P từ s đến u để được đường đi chưa bão hồ 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. Sơ đồ của thuật tốn Ford – Fulkerson có thể mơ tả trong thủ
tục sau đây:
THƯ VIỆN ĐIỆN TỬ TRỰC TUYẾN

24

Procedure Max_Flow;
(* Thut toỏn Ford Fulkerson *)
begin
(* Khi to: Bt u t lung vi 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 tng lung P> then <Tng lung dc theo P>
else Stop:= true;
end;

tỡm ng tng lung trong G
f
cú th s dng thut toỏn tỡm kim theo
chiu rng ( hay thut toỏn tỡm kim theo chiu sõu) bt u t nh s, trong ú
khụng cn xõy dng tng minh th G
f
. Ford- Fulkerson ngh thut toỏn gỏn
nhón chi tit sau õy gii bi toỏn lung trong mng. Thut toỏn bt u t lung
chp nhn c no ú trong mng ( cú th bt u t lung khụng) sau ú ta s tng
lung bng cỏch tỡm cỏc ng tng lung. tỡm ng tng lung ta s ỏp dng
phng phỏp gỏn nhón cho cỏc nh. Mi nh trong quỏ trỡnh thc hin thut toỏn s

mt trong ba trng thỏi: cha cú nhón, cú nhón cha xột, cú nhón ó xột. Nhón ca
mt nh v gm 2 phn v cú mt trong hai dng sau: [+p(v),

(v)] hoc [-p(v),

(v)
]. Phn th nht +p(v) (-p(v)) ch ra l cn tng (gim) lung theo cung (p(v),v) cung
(v,p(v)) cũn phn th hai

(v) ch ra lng ln nht cú th tng hoc gim theo cung
ny. u tiờn ch cú nh s c khi to nhón v nhón ca nú l cha xột, cũn tt c
cỏc nh cũn li u cha cú nhón . T s ta gỏn cho tt c cỏc nh k vi nú v nhón
ca nh s s tr thnh nhón ó xột. Tip theo, t mi nh v cú nhón cha xột ta li
gỏn nhón cho tt c cỏc nhón cha cú nhón k vi nú v nhón ca nh v tr thnh
nhón ó xột. Quỏ trỡnh s c lp li cho n khi hoc l nh t tr thnh cú nhón
hoc l nhón ca tt c cỏc nh cú nhón u l ó xột nhng nh t vn cha cú nhón.
Trong trng hp th nht ta tỡm c ng tng lung, cũn trong trng hp th
hai i vi lung ang xột khụng tn ti ng tng lung ( tc l lung ó l cc i
). Mi khi tỡm c ng tng lung, ta li tng lung theo ng tỡm c, sau ú
xoỏ tt c cỏc nhón v i vi lung mi thu c li s dng phộp gỏn nhón cỏc
nh tỡm ng tng lung. Thut toỏn s kt thỳc khi no i vi lung ang cú
trong mng khụng tỡm c ng tng lung.

Thut toỏn gỏn nhón (The labeling algorithm)

Gi V
T
l tp mi nh ó gỏn nhón nhng cha c thm. Ta cú thut toỏn
tỡm ng i tng lung.
Xut phỏt vi V

T
= {s} v s l nỳt ó ỏnh du duy nht.
Mt bc lp s cú V
T
hin hnh v gm ba bc nh sau.

THệ VIEN ẹIEN Tệ TRệẽC TUYEN

25
1
0
Nu t

V
T
hoc V
T
=

, thut toỏn kt thỳc. Ngc li thỡ chn mt nh u

V
T
thm v a nú ra khi V
T
. Xột tt c cỏc nh cnh u, tc l xột mi cung cú
dng (u,v) v (v,u).
2
0
Nu (u,v)


E, F(u,v) < C(u,v) v v cha gỏn nhón thỡ gỏn nhón nú v a
v vo tp V
T
.
3
0
Nu (v,u)

E, F(v,u) > 0 v v cha gỏn nhón thỡ gỏn nhón nú v a vo
tp V
T
.

Bõy gi ta xột kt qu ca thut toỏn gỏn nhón. Nú cú kt thỳc hu hn hay
khụng? Nhn xột rng mt nh c vo tp V
T
ch khi chuyn t cha gỏn nhón.
Do ú mt nh ch c vo V
T
nhiu nht l mt ln. M mi bc lp b mt nh
ra khi V
T
. Do ú, vỡ s nh ca mng l hu hn, thut toỏn phi kt thỳc hu hn.

Thớ d 1. p dng thut toỏn Ford-Fullkerson tỡm lung cc i bng cỏch
gỏn nhón cho nh ca mng G vi lung f c cho nh Hỡnh 1, hai s vit bờn cnh
mi cung l kh nng thụng qua v lung ca cỏc cung. Kt qu cỏc bc ca thut
toỏn mụ t bi cỏc th v bng di õy. Mng vi lung cc i thu c Hỡnh
2. Lỏt ct bộ nht l X = {s,c}, X

*
= {b,d,e,t} v giỏ tr lung cc i l 9.







Hỡnh 1

+ Bc lp 1: s b d t,

1
= 1

















3,0

3,1

c
e
t
d
b
5,2

1,1

6,1

6,5

6,4

5,4

s
3,0

3,1

c(s+,3)
e(b+,1)
t(d+,1)

d(b+,1)
b(s+,1)
5,2

1,1

6,1

6,5

6,4

5,4

s
(s,

)
d
b
3,0

3,1

c
e
t
5,2

1,1


6,1

6,6

6,5

5,5

s
THệ VIEN ẹIEN Tệ TRệẽC TUYEN

×