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

CÁC ĐƯỜNG ĐI NGẮN NHẤT MỌI CẶP (ALL-PAIRS SHORTEST PATHS)

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 (220.5 KB, 24 trang )

ĐẠI HỌC HUẾ
TRƯỜNG ĐẠI HỌC KHOA HỌC
KHOA CÔNG NGHỆ THÔNG TIN
  
TIỂU LUẬN
Môn học: Thiết kế và phân tích thuật toán
Đề tài: CÁC ĐƯỜNG ĐI NGẮN NHẤT MỌI CẶP
(ALL-PAIRS SHORTEST PATHS)
Giáo viên hướng dẫn: TS. Hoàng Quang
Học viên thực hiện (Nhóm 7):
Lê Thị Minh Hương
Lê Văn Thái Khương
Nguyễn Thanh Vinh
Lớp: Khoa học máy tính (2014)
Huế, 03 – 2014
MỤC LỤC
Lời nói đầu 2
Khái quát 3
1. Các đường đi ngắn nhất và phép nhân ma trận 4
1.1. Cấu trúc của một đường đi ngắn nhất 4
1.2. Một giải pháp đệ quy cho bài toán các đường đi ngắn nhất mọi cặp 5
1.3. Tính toán các trọng số đường đi ngắn nhất dưới lên 5
1.4. Cải thiện thời gian thực hiện 8
1.5. Bài tập 9
2. Thuật toán Floyd-Warshall 10
2.1. Cấu trúc của một đường đi ngắn nhất 10
2.2. Một giải pháp đệ quy cho bài toán các đường đi ngắn nhất mọi cặp 11
2.3. Tính toán các trọng số đường đi ngắn nhất dưới lên 12
2.4. Thiết lập một đường đi ngắn nhất 13
2.5. Bao đóng bắc cầu của một đồ thị có hướng 14
2.6. Bài Tập 16


3. Thuật toán Johnson cho đồ thị thưa 17
3.1. Duy trì các đường đi ngắn nhất bằng cách tái trọng số 18
3.2. Sinh các trọng số không âm bằng cách tái trọng số 19
3.3. Tính toán các đường đi ngắn nhất mọi cặp 20
3.4. Bài tập 21
4. Các bài toán 22
4.1 Bao đóng bắc cầu của một đồ thị động 22
4.2 Các đường đi ngắn nhất trong đồ thị trù mật ε 23
2
Lời nói đầu
Trong phần này, chúng ta xét bài toán tìm đường đi ngắn nhất giữa tất cả các cặp
đỉnh trong một đồ thị. Bài toán này phát sinh trong khi lập một bảng các khoảng
cách giữa tất cả các cặp thành phố cho một bản đồ đường. Chúng ta đưa ra một
đồ thị có hướng trọng số G=(V,E) với một hàm trọng số ω: E→R ánh xạ các
cung theo trọng số giá trị thực. Chúng ta muốn tìm, với mọi cặp đỉnh u,v∈V,
một đường đi ngắn nhất (trọng số ít nhất) từ u đến v, ở đó trọng số của đường đi
là tổng các trọng số của các cung cấu thành nó. Chúng ta muốn đưa ra một dạng
bảng biểu: tại hàng u và cột v sẽ là trọng số của một đường đi ngắn nhất từ u đến
v.
Chúng ta có thể giải quyết bài toán các đường đi ngắn nhất mọi cặp bằng cách
chạy một thuật toán các đường đi ngắn nhất nguồn đơn V lần, mỗi lần cho một
đỉnh làm nguồn. Nếu tất cả các trọng số là không âm, chúng ta có thể sử dụng
thuật toán Dijkstra. Nếu chúng ta dùng cách thực thi mảng tuyến tính của hàng
đợi ưu tiên, thời gian thực hiện là O(V
3
+VE)=O(V
3
). Cách thực thi đống nhị
phân của hàng đợi ưu tiên có thời gian thực hiện là O(VElgV), là một cải thiện
nếu đồ thị thưa. Một cách khác, chúng ta có thể thực thi hàng đợi ưu tiên với

đống Fibonacci, mang lại thời gian thực hiện là O(V
2
lgV+VE).
Nếu các trọng số cung âm được phép, thuật toán Dijkstra có thể không còn được
sử dụng. Thay vào đó, chúng ta phải chạy thuật toán Bellman-Ford chậm hơn
mỗi lần từ một đỉnh. Kết quả thời gian thực hiện là O(V
2
E), mà trên một đồ thị
trù mật là O(V
4
). Trong phần này, chúng ta sẽ giải thích cách thực hiện tốt hơn.
Chúng ta cũng nghiên cứu quan hệ của bài toán các đường đi ngắn nhất mọi cặp
với phép nhân ma trận và nghiên cứu cấu trúc đại số của nó.
Khác với các thuật toán nguồn đơn, giả sử một phép biểu diễn danh sách kề của
đồ thị, hầu hết các thuật toán trong phần này đều sử dụng phép biểu diễn ma trận
kề. (Thuật toán Johnson cho đồ thị thưa sử dụng các danh sách kề.) Để thuận
tiện, chúng ta giả sử rằng các đỉnh là các số 1, 2, …, V , vì vậy đầu vào là một
ma trận n x n W biểu thị các trọng số cạnh của một đồ thị có hướng n đỉnh
G=(V,E). Nghĩa là, W=(ω
ij
), trong đó
0 nếu i = j,
ω
ij
= trọng số của cạnh có hướng (i,j) nếu i ≠ j và (i,j) ∈ E, (1)
∞ nếu i ≠ j và (i,j) ∉ E.
Các trọng số cung âm được phép, nhưng chúng ta giả sử rằng đồ thị không chứa
các chu trình trọng số âm.
3
Bảng kết quả của thuật toán đường đi ngắn nhất mọi cặp được trình bày trong

phần này là một ma trận n x n D=(d
ij
), trong đó d
ij
chứa trọng số của đường đi
ngắn nhất từ đỉnh i đến đỉnh j. Nghĩa là, nếu ta cho δ(i,j) thể hiện trọng số đường
đi ngắn nhất từ đỉnh i đến đỉnh j thì d
ij
= δ(i,j) vào lúc kết thúc.
Để giải quyết bài toán các đường đi ngắn nhất mọi cặp đỉnh trên một ma trận kề
cho trước, chúng ta cần tính toán không chỉ các trọng số đường đi ngắn nhất mà
còn một ma trận đã được xét trước đây (predecessor matrix) Π=(π
ij
), trong đó π
ij
là NIL nếu i = j hoặc không có đường đi từ i đến j, và ngược lại bằng π
ij
là phần
tử trước (predecessor) nào đó của j trên một đường đi ngắn nhất từ i. Cũng như
đồ thị con đã được xét trước đây (predecessor subgraph) G
π
trong chương 24 là
một cây các đường đi ngắn nhất đối với một đỉnh nguồn đã cho, đồ thị con được
tạo bởi hàng thứ i của ma trận Π phải là một các cây đường đi ngắn nhất có gốc
i. Với mỗi đỉnh i ∈ V, chúng ta định nghĩa đồ thị con đã được xét trước đây
(predecessor subgraph) của G với i là G
π
,i
=(V
π

,i
,E
π
,i
), trong đó
V
π
,i
= { j ∈ V: π
ij
≠ NIL } ∪ { i } và E
π
,i
= { (π
ij
, j ): j ∈ V
π
,i
– { i }}
Nếu G
π
,i
là một cây các đường đi ngắn nhất, thì thủ tục dưới đây, là một phiên
bản đã thay đổi của thủ tục PRINT-PATH trong chương 22, in một đường đi
ngắn nhất từ đỉnh i đến đỉnh j.
PRINT-ALL-PAIRS-SHORTEST-PATH(Π, i, j)
1 if i=j
2 then print i
3 else if π
ij

= NiL
4 then print “không tồn tại đường đi từ đỉnh i đến đỉnh j”
5 else PRINT-ALL-PAIRS-SHORTEST-PATH(Π, i, π
ij
)
6 print j
Để nêu bật các tính năng chủ yếu của các thuật toán mọi cặp trong phần này,
chúng ta sẽ không đề cập cách tạo và các tính chất của các ma trận đã được xét
trước đây (predecessor matrix) nhiều như trường hợp các đồ thị con đã được xét
trước đây (predecessor subgraph) trong chương 24. Những điểm cơ bản được đề
cập bởi một số bài tập.
Khái quát
Đoạn 1 trình bày một thuật toán quy hoạch động dựa trên phép nhân ma trận để
giải quyết bài toán các đường đi ngắn nhất mọi cặp. Sử dụng kỹ thuật “bình
phương lặp lại”, thuật toán này có thể chạy trong Θ(V
3
lgV) thời gian. Một thuật
toán quy hoạch động khác, thuật toán Floyd-Warshall, được đưa ra trong đoạn 2.
Thuật toán Floyd-Warshall chạy trong thời gian Θ(V
3
). Đoạn 2 cũng đề cập bài
toán tìm bao đóng bắc cầu của một đồ thị có hướng, liên quan đến bài toán các
4
đường đi ngắn nhất mọi cặp. Cuối cùng, đoạn 3 trình bày thuật toán Jonhson.
Không như các thuật toán khác trong phần này, thuật toán Jonhson sử dụng biểu
diễn danh sách kề của một đồ thị. Nó giải quyết bài toán các đường đi ngắn nhất
mọi cặp trong O(V
2
lgV+VE) thời gian, khiến nó trở thành thuật toán tốt cho đồ
thị thưa, lớn.

Trước khi tiến hành, chúng ta cần thiết lập một số quy ước cho các phép biểu
diễn ma trận kề. Thứ nhất, chúng ta sẽ giả sử chung rằng cho trước đồ thị
G=(V,E) có n đỉnh, sao cho n = V . Thứ hai, chúng ta sẽ dùng quy ước biểu thị
các ma trận bằng các chữ cái hoa, như W, L hoặc D, và các phần tử riêng lẻ của
chúng bằng các chữ cái thường chỉ số dưới, như ω
ij
, l
ij
, hoặc d
ij
. Một số ma trận
sẽ có các chỉ số trên đóng ngoặc đơn, như L
(m)
= (l
ij
(m)
) hoặc D
(m)
= (d
ij
(m)
), để chỉ
các lần lặp lại. Cuối cùng, với một ma trận đã cho n x n A, chúng ta sẽ giả sử
rằng giá trị của n được lưu trữ trong thuộc tính rows[A].
1. Các đường đi ngắn nhất và phép nhân ma trận
(Shortest paths and matrix multiplication)
Đoạn này trình bày một thuật toán quy hoạch động cho bài toán các đường đi
ngắn nhất mọi cặp trên một đồ thị có hướng G=(V,E). Mỗi vòng lặp chính của
chương trình động sẽ thực hiện một phép toán tương tự như phép nhân ma trận,
vì vậy thuật toán trông giống như phép nhân ma trận lặp lại. Chúng ta sẽ bắt đầu

bằng việc phát triển một thuật toán Θ(V
4
) thời gian cho bài toán các đường đi
ngắn nhất mọi cặp và sau đó cải tiến thời gian thực hiện của nó đến Θ(V
3
lgV).
Trước khi tiến hành, chúng ta hãy tóm tắt ngắn gọn lại các bước đã nêu trong
chương 15 cho việc phát triển một thuật toán quy hoạch động.
1. Đặc điểm cấu trúc của một giải pháp tối ưu.
2. Định nghĩa đệ quy giá trị của một giải pháp tối ưu.
3. Tính toán giá trị của một giải pháp tối ưu theo dạng dưới lên.
(Bước thứ tư, kiến tạo một giải pháp tối ưu từ thông tin đã tính toán, sẽ dành cho
các bài tập.)
1.1. Cấu trúc của một đường đi ngắn nhất
(The structure of a shortest path)
Chúng ta bắt đầu bằng việc chỉ ra đặc điểm cấu trúc của một giải pháp tối ưu.
Với bài toán các đường đi ngắn nhất mọi cặp trên một đồ thị G=(V,E), chúng ta
đã chứng minh (Bổ đề 24.1) rằng tất cả các đường đi con của một đường đi ngắn
nhất là các đường đi ngắn nhất. Giả sử rằng đồ thị được biểu thị bởi một ma trận
kề W=(ω
ij
). Xét một đường đi ngắn nhất p từ đỉnh i đến đỉnh j, và giả sử rằng p
chứa tối đa m cạnh. Giả sử không có các chu trình trọng số âm, m hữu hạn. Nếu
5
i = j thì p có trọng số 0 và không có các cạnh. Nếu đỉnh i và đỉnh j phân biệt,
chúng ta phân tích đường đi p thành i
p’
k → j, ở đó đường đi p’ giờ đây chứa
tối đa m – 1 cạnh. Theo bổ đề 24.1, p’ là một đường đi ngắn nhất từ i đến k, và
vì vậy δ(i,j) = δ(i,k) + ω

kj
.
1.2. Một giải pháp đệ quy cho bài toán các đường đi ngắn nhất mọi cặp
(A recursive solution to the all-pairs shortest-paths problem)
Bây giờ, cho l
ij
(m)
là trọng số cực tiểu của đường đi nào đó từ đỉnh i đến đỉnh j
chứa tối đa m cạnh. Khi m=0, đó là một đường đi ngắn nhất từ i đến j mà không
có cạnh nào nếu và chỉ nếu i = j. Như vậy,
0 nếu i = j.

∞ nếu i ≠ j.
Với m ≥ 1, chúng ta tính toán l
ij
(m)
dưới dạng cực tiểu của l
ij
(m – 1)
(trọng số của
đường đi ngắn nhất từ i đến j bao gồm tối đa m–1 cạnh) và trọng số cực tiểu của
đường đi bất kỳ từ i đến j bao gồm tối đa m cạnh, có được bằng cách xem xét tất
cả các phần tử trước có thể (possible predecessor) k của j. Như vậy, chúng ta
định nghĩa theo đệ quy
l
ij
(m)
= min (l
ij
(m – 1)

, min{l
ik
(m – 1)
+ ω
kj
})
= min{l
ik
(m – 1)
+ ω
kj
} (2)
Đẳng thức sau là đúng do ω
jj
= 0 với mọi j.
Trọng số đường đi ngắn nhất thực tế δ(i,j) là gì?. Nếu đồ thị không chứa các chu
trình trọng số âm thì với mỗi cặp đỉnh i và j sao cho δ(i,j) < ∞, có một đường đi
ngắn nhất từ i đến j là đơn giản và như vậy chứa tối đa n–1 cạnh. Một đường đi
từ đỉnh i đến đỉnh j với hơn n–1 cạnh không thể có ít trọng số hơn một đường đi
ngắn nhất từ i đến j. Do đó, các trọng số đường đi ngắn nhất thực tế được đưa ra
bởi
δ(i,j) = l
ij
(n – 1)
= l
ij
(n )
= l
ij
(n + 1)

= … (3)
1.3. Tính toán các trọng số đường đi ngắn nhất dưới lên
(Computing the shortest-path weights bottom up)
Cho trước ma trận W=(ω
ij
), bây giờ chúng ta tính toán một chuỗi các ma trận
L
(1)
, L
(2)
, …, L
(n – 1)
, trong đó m = 1, 2, …, n – 1, chúng ta có L
(m)
=(l
ij
(m)
). Ma trận
cuối cùng L
(n – 1)
chứa các trọng số đường đi ngắn nhất thực tế. Nhận thấy rằng
như l
ij
(1)
= ω
ij
với mọi đỉnh i, j ∈ V, nên ta có L
(1)
= W.
Trọng tâm của thuật toán là thủ tục dưới đây, được đưa ra các ma trận L

(m – 1)

W, trả về ma trận L
(m)
. Nghĩa là, nó mở rộng tính toán đường đi ngắn nhất hơn
một cạnh.
ENTEND-SHORTEST-PATHS(L, W)
6
l
ij
(0)
=
1 ≤ k ≤ n
1 ≤ k ≤ n
1 n ← rows[L]
2 Cho L’ = (l’
ij
) là một ma trận n x n
3 for i ← 1 to n
4 do for j ← 1 to n
5 do l’
ij
← ∞
6 for k ← 1 to n
7 do l’
ij
← min(l’
ij
, l
ik

+ ω
kj
)
8 return L’
Thủ tục tính toán ma trận L’ = (l’
ij
), mà nó trả về vào cuối. Để thực hiện, nó tính
toán phương trình cho tất cả i và j, sử dụng L với L
(m – 1)
và L’ với L
(m)
(Nó được
viết mà không có các chỉ số trên để các ma trận đầu vào và đầu ra của nó độc lập
với m). Thời gian thực hiện là Θ(n
3
) do ba vòng lặp for lồng vào nhau.
Bây giờ, chúng ta có thể thấy quan hệ với phép nhân ma trận. Giả sử chúng ta
muốn tính tích ma trận C = A.B của hai ma trận n x n A và B. Như vậy, với
i,j=1, 2, …, n, chúng ta tính toán
c
ij
=

=
n
k 1
a
ik
.b
kj

(4)
Nhận thấy nếu chúng ta thực hiện phép thay thế
l
(m – 1)
→ a,
ω → b,
l
(m )
→ c,
min → +,
+ → .
trong phương trình (2), chúng ta được phương trình (4). Như vậy, nếu chúng ta
thực hiện các thay đổi này đối với ENTEND-SHORTEST-PATHS và cũng thay
∞ (đồng nhất thức của min) bằng 0 (đồng nhất thức của +), chúng ta có được thủ
tục không phức tạp Θ(n
3
) - thời gian cho phép nhân ma trận:
MATRIX-MULTIPLY(A, B)
1 n ← rows[A]
2 Cho C là một ma trận n x n
3 for i ← 1 to n
4 do for j ← 1 to n
5 do c
ij
← 0
6 for k ← 1 to n
7 do c
ij
← c
ij

+ a
ik
.b
kj

8 return C
Trở lại bài toán các đường đi ngắn nhất mọi cặp, chúng ta tính toán các trọng số
đường đi ngắn nhất bằng cách mở rộng các đường đi ngắn nhất theo từng cạnh.
Việc cho A.B thể hiện “tích” ma trận do ENTEND-SHORTEST-PATHS(A, B)
trả về, chúng ta tính toán dãy n–1 ma trận
7
L
(1)
= L
(0)
. W = W,
L
(2)
= L
(1)
. W = W
2
,
L
(3)
= L
(2)
. W = W
3
,

.
.
.
L
(n – 1)
= L
(n – 2)
. W = W
n – 1
.
Như chúng ta đã chứng tỏ ở trên, ma trận L
(n – 1)
= W
n – 1
chứa các trọng số đường
đi ngắn nhất. Thủ tục sau tính toán dãy này trong Θ(n
4
) thời gian.
SHOW-ALL-PAIRS-SHORTEST-PATHS(W)
1 n ← rows[W]
2 L
(1)
← W
3 for m ← 2 to n – 1
4 do L
(m)
← ENTEND-SHORTEST-PATHS(L
(m – 1)
, W)
5 return L

(n – 1 )

Hình 1 trình bày một đồ thị và ma trận L
(m)
được tính toán bởi thủ tục SHOW-
ALL-PAIRS-SHORTEST-PATHS.
L
(1)
=
06
052
04
710
4830
∞∞∞
∞−∞
∞∞∞
∞∞
−∞
L
(2)
=
0618
20512
11504
71403
42830

−−−




L
(3)
=
06158
20512
115047
11403
42330
−−−
−−
−−
L
(4)
=
06158
20512
35047
11403
42330
−−−
−−
−−
Hình 1 Một đồ thị có hướng và dãy các ma trận L
(m)
được tính toán bởi
SHOW–ALL–PAIRS–SHORTEST–PATHS.
Độc giả có thể kiểm tra rằng L
(5)

=L
(4)
.W bằng với L
(4)
và như vậy L
(m)
= L
(4)
với mọi m ≥ 4.
8
1
2
3
4
5
5
– 4
3
– 5
4
2
8
6
7
1
1.4. Cải thiện thời gian thực hiện
(Improving the running time)
Tuy nhiên, mục tiêu của chúng ta là không tính toán tất cả các ma trận L
(m)
:

chúng ta chỉ quan tâm đến ma trận L
(n – 1)
. Hãy nhớ lại rằng trong trường hợp
không có các chu trình trọng số âm, phương trình (3) hàm ý L
(m)
= L
(n – 1)
với tất
cả các số nguyên m ≥ n – 1. Với sự kết hợp của phép nhân ma trận truyền thống,
vì vậy phép nhân ma trận được xác định bởi thủ tục ENTEND-SHORTEST -
PATHS (xem bài tập 1-4). Do đó, chúng ta có thể tính toán L
(n–1)
với chỉ lg(n –
1) tích ma trận bằng cách tính toán dãy
L
(1)
= W,
L
(2)
= W
2
= W.W ,
L
(4)
= W
4
= W
2
.W
2

,
L
(8)
= W
8
= W
4
.W
4
,
.
.
.
L
(2 )
= W
2
= W
2
.W
2
Do 2 ≥ n – 1, nên tích cuối cùng L
(2 )
bằng L
(n – 1)
.
Thủ tục dưới đây tính toán dãy ma trận ở trên bằng cách dùng kỹ thuật bình
phương lặp lại.
FASTER-ALL-PAIRS-SHORTEST-PATHS(W)
1 n ← rows[W]

2 L
(1)
← W
3 m ← 1
4 while m < n – 1
5 do L
(2m)
← ENTEND-SHORTEST-PATHS(L
(m)
, L
(m)
)
6 m ← 2m
7 return L
(m)
Trong mỗi lần lặp lại của vòng lặp while của các dòng 4 – 6, chúng ta tính toán
L
(2m)
= (L
(m)
)
2
, bắt đầu với m=1. Vào cuối mỗi lần lặp lại, chúng ta nhân đôi giá
trị của m. Lần lặp cuối tính toán L
(n – 1)
bằng cách thực tế tính toán L
(2m)
cho mỗi
n – 1 ≤ 2m ≤ 2n – 2. Theo phương trình (3), L
(2m)

= L
(n – 1)
. Việc kiểm tra lần kế
tiếp ở dòng 4 được thực hiện, m đã được nhân đôi, vì vậy bây giờ m ≥ n – 1,
kiểm tra thất bại, và thủ tục trả về ma trận cuối mà nó đã tính toán.
Thời gian thực hiện của FASTER–ALL–PAIRS–SHORTEST–PATHS là
Θ(n
3
lgn) bởi mỗi số lg(n – 1) tích ma trận mất Θ(n
3
) thời gian. Nhận thấy rằng,
mã là chặt, không chứa các cấu trúc dữ liệu phức tạp, và do đó hằng ẩn trong ký
hiệu Θ là nhỏ.
9
lg(n – 1)
lg(n – 1) lg(n – 1) - 1
lg(n – 1) - 1
lg(n – 1)
lg(n – 1)
Hình 2 Một đồ thị có hướng, trọng số dùng trong các bài tập 1-1, 2-1, và 3-1.
1.5. Bài tập
1-1
Chạy SHOW-ALL-PAIRS-SHORTEST-PATHS trên đồ thị có hướng, trọng số
của Hình 2, trình bày các ma trận kết quả cho mỗi lần lặp lại của vòng lặp. Sau
đó, thực hiện tương tự với FASTER-ALL-PAIRS-SHORTEST-PATHS.
1-2
Tại sao chúng ta yêu cầu ω
ii
= 0 với mọi 1 ≤ i ≤ n ?
1-3

Ma trận
L
(0)
=
0
0
0
0
∞∞∞∞
∞∞∞
∞∞∞
∞∞∞




dùng trong các thuật toán đường đi ngắn nhất tương ứng với phép nhân ma trận
bình thường nào?
1-4
Trình bày phép nhân ma trận nào được kết hợp trong định nghĩa bởi ENTEND-
SHORTEST-PATHS.
1-5
Trình bày cách biểu diễn bài toán các đường đi ngắn nhất nguồn đơn dưới dạng
một tích các ma trận và một vectơ. Mô tả cách đánh giá tích này tương ứng với
một thuật toán Bellman-Ford (xem đoạn 24.1).
1-6
Giả sử chúng ta muốn tính toán các đỉnh trên đường đi ngắn nhất trong các thuật
toán của đoạn này. Trình bày cách tính toán ma trận đã được xét trước đây Π từ
ma trận hoàn thành L của các trọng số đường đi ngắn nhất trong O(n
3

) thời gian.
10
– 4
1
– 8
3
2
2
5
1 2 3
4
5
5 6
–1
7
10
1-7
Các đỉnh trên các đường đi ngắn nhất cũng có thể được tính toán cùng thời gian
như các trọng số đường đi ngắn nhất. Chúng ta hãy định nghĩa π
ij
(m)
là phần tử
trước của đỉnh j trên bất kỳ đường đi trọng số cực tiểu từ i đến j chứa tối đa m
cạnh. Thay đổi ENTEND-SHORTEST-PATHS và SHOW-ALL-PAIRS-
SHORTEST-PATHS để tính toán các ma trận Π
(1)
, Π
(2)
, …, Π
(n – 1)

khi các ma
trận L
(1)
, L
(2)
, …, L
(n – 1)
được tính toán.
1-8
Thủ tục FASTER-ALL-PAIRS-SHORTEST-PATHS, như được viết, yêu cầu
chúng ta lưu trữ lg(n – 1) ma trận, mỗi ma trận với n
2
phần tử, với yêu cấu
toàn bộ không gian là Θ(n
2
lgn). Thay đổi thủ tục để yêu cầu chỉ Θ(n
2
) không
gian bằng cách sử dụng chỉ hai ma trận n x n.
1-9
Thay đổi FASTER-ALL-PAIRS-SHORTEST-PATHS để có thể phát hiện sự
hiện diện của chu trình trọng số âm.
1-10
Nêu một thuật toán hiệu quả để tìm chiều dài (số cạnh) của một chu trình trọng
số âm có chiều dài cực tiểu trong một đồ thị.
2. Thuật toán Floyd-Warshall
(The Floy-Warshall algorithm)
Trong đoạn này, chúng ta sẽ dùng công thức quy hoạch động khác để giải quyết
bài toán đường đi ngắn nhất mọi cặp trên một đồ thị có hướng G=(V,E). Kết quả
thuật toán, thuật toán Floyd-Warshall, chạy trong Θ(V

3
) thời gian. Như trước đó,
các cạnh trọng số âm có thể hiển thị, nhưng chúng ta giả định rằng không có chu
trình trọng số âm. Trong đoạn 25.1, theo tiến trình xử lý quy hoạch động để giải
quyết thuật toán. Sau khi xem xét kết quả thuật toán, chúng ta đưa ra một
phương thức tương tự để tìm bao đóng bắc cầu của một đồ thị có hướng.
2.1. Cấu trúc của một đường đi ngắn nhất
(The structure of a shortest path)
Trong thuật toán Floyd-Warshall, chúng ta dùng một mô tả đặc điểm khác về
cấu trúc của một đường đi ngắn nhất hơn cách dùng thuật toán mọi cặp trong
nền tảng phép nhân ma trận. Thuật toán xét các đỉnh “trung gian” của một
đường đi ngắn nhất, trong đó một đỉnh trung gian của một đường đi đơn giản
p=<v
1
,v
2
,…,v
i
> là bất kỳ đỉnh của p khác v
1
hoặc v
i
, nghĩa là, các đỉnh trong tập
hợp {v
2
,v
3
,…,v
i-1
}.

11
Thuật toán Floyd-Warshall được dựa trên quan sát dưới đây. Dựa vào các giả
định của chúng ta là các đỉnh của G là V={1,2,…,n}, xét một tập con {1,2,…,k}
các đỉnh với một số k. Với mọi cặp đỉnh i,j ∈ V, xét tất cả các đường đi từ i đến
j mà các đỉnh trung gian lấy từ {1,2,…,k}, và cho p là một đường đi trọng số cực
tiểu trong số chúng. (Đường đi p là đơn giản.) Thuật toán Floyd-Warshall xem
xét mối quan hệ giữa đường đi p và các đường đi ngắn nhất từ i đến j với tất cả
các đỉnh trung gian trong tập hợp {1,2,…, k-1}. Mối quan hệ tùy thuộc vào việc
k có là một đỉnh trung gian của đường đi p không.
• Nếu k không phải đỉnh trung gian của đường đi p, thì tất cả các đỉnh trung
gian của đường đi p nằm trong tập {1,2,…,k-1}. Như vậy, một đường đi ngắn
nhất từ đỉnh i đến đỉnh j với tất các đỉnh trung gian trong tập {1,2,…,k-1} cũng
là một đường đi ngắn nhất từ i đến j với tất cả các đỉnh trung gian trong tập {1,2,
…,k}.
• Nếu k là một đỉnh trung gian trong đường đi p, thì chúng ta phân tích p
thành i
p1
k
p2
j, như hình minh họa 3. Theo Bổ đề 24.1, p
1
là một đường đi
ngắn nhất từ i đến k với tất cả các đỉnh trung gian trong tập {1,2,…,k}. Bởi vì
đỉnh k không phải là đỉnh trung gian trong đường đi p
1
, chúng ta thấy rằng p
1

một đường đi ngắn nhất từ i đến k với các đỉnh trung gian trong tập {1,2, ,k-1}.
Tương tự, p

2
là một đường đi ngắn nhất từ đỉnh k đến đỉnh j với các đỉnh trung
gian trong tập {1,2,…,k-1}.
tất cả các đỉnh trung gian trong {1,2,…,k-1} tất cả các đỉnh trung gian trong {1,2,…,k-1}
k
p
1
p
2
i j

p: tất cả các đỉnh trung gian trong tập {1,2,…,k}
Hình 3 Đường đi p là một đường đi ngắn nhất từ đỉnh i đến đỉnh j và k là đỉnh trung gian được
đánh số cao nhất của p. Đường đi p
1
, một phần của đường đi p từ đỉnh i đến đỉnh k, có tất cả các đỉnh
trung gian trong tập hợp {1,2,…,k-1}. Tương tự đường đi p
2
từ đỉnh k đến đỉnh j.
2.2. Một giải pháp đệ quy cho bài toán các đường đi ngắn nhất mọi cặp
(A recursive solution to the all-pairs shortest-path problem)
Dựa vào các nhận xét ở trên, chúng ta định nghĩa một một công thức đệ quy ước
lượng đường đi ngắn nhất mà khác với đoạn 1. Cho
( )
d
k
ij
trọng số của một đường
đi ngắn nhất từ đỉnh i đến đỉnh j mà tất cả các đỉnh trung gian trong tập {1,2,
…,k}. Khi k=0, một đường đi từ đỉnh i đến đỉnh j mà không có đỉnh trung gian

nào được đánh số lớn hơn 0 thì không tồn tại đỉnh trung gian. Như vậy đường đi
có một cạnh duy nhất, và do đó
( )
d
ij
0
= ω
ij
. Một định nghĩa đệ quy được cho bởi
12
( )
1
0
,
min
)1()1()1(
)(

=
+



=
−−−
k
k
if
if
ddd

w
d
k
kj
k
ik
k
ij
ij
k
ij
(5)
Với mọi đường đi, tất cả các đỉnh trung gian là trong tập {1,2,…,n}, ma trận
D
(n)
=(
( )
d
n
ij
) đưa ra câu trả lời cuối cùng:
( )
d
n
ij
= δ(i,j) với mọi i,j ∈V.
2.3. Tính toán các trọng số đường đi ngắn nhất dưới lên
(Computing the shortest-path weights bottom up)
Dựa vào phép truy toán (5), có thể dùng thủ tục dưới lên sau để tính các giá trị
( )

d
k
ij
theo thứ tự tăng của k. Cho trước ma trận n x n W được định nghĩa như
trong phương trình (1). Thủ tục trả về ma trận D
(n)
chứa các trọng số đường đi
ngắn nhất.
FLOYD-WARSHALL (W)
1 n ← rows[W]
2 D
(0)
← W
3 for k ← 1 to n
4 do for i ← 1 to n
5 do for j ← 1 to n
6 do
( )
dddd
k
kj
k
ik
k
ij
k
ij
)1()1()1()(
,min
−−−

+←
7 return D
(n)
















∞∞∞
∞−∞
∞∞∞
∞∞
−∞
=
06
052
04
710
4830

)0(
D
Π
(0)
















=
nilnilnilnil
nilnilnil
nilnilnilnil
nilnilnil
nilnil
5
44
3
22

111
















∞∞∞
−−
∞∞∞
∞∞
−∞
=
06
20552
04
710
4830
)1(
D

Π
(1)
















=
nilnilnilnil
nil
nilnilnilnil
nilnilnil
nilnil
5
1414
3
22
111

















∞∞∞
−−

∞∞

=
06
20552
11504
710
44830
)2(
D
Π
(2)

















=
nilnilnilnil
nil
nilnil
nilnilnil
nil
5
1414
223
22
1211
13

















∞∞∞
−−−

∞∞

=
06
20512
11504
710
44830
)3(
D
Π
(3)

















=
nilnilnilnil
nil
nilnil
nilnilnil
nil
5
1434
223
22
1211

















−−−
−−
−−
=
06158
20512
35047
11403
44130
)4(
D
Π
(4)

















=
nil
nil
nil
nil
nil
5434
1434
1234
1244
1241

















−−−
−−
−−
=
06158
20512
35047
11403
42310
)5(
D
Π
(5)

















=
nil
nil
nil
nil
nil
5434
1434
1234
1244
1543
Hình 4. Dãy các ma trận D
(k)
và Π
(k)
được tính bởi thuật toán Floyd-Warshall
với đồ thị trong hình 1.
Hình 4 trình bày ma trận D
(k)
được tính bởi thuật toán Floyd-Warshall với đồ thị
trong hình 1.
Thời gian thực hiện của thuật toán Floyd-Warshall được xác định bởi các vòng
for lồng nhau của các dòng 3-6. Do mỗi phép tính của dòng 6 có Ο(1) thời gian,

nên thuật toán thực hiện trong thời gian Ο(n
3
). Như thuật toán cuối cùng trong
đoạn 1, đoạn mã là chặt, các cấu trúc dữ liệu không phức tạp và do đó hằng số
ẩn trong ký hiệu Θ là nhỏ. Như vậy, thuật toán Floyd-Warshall là thực thi hầu
hết ngay cả các đồ thị đầu vào có kích cỡ vừa.
2.4. Thiết lập một đường đi ngắn nhất
(Constructing a shortest path)
Có một số phương pháp khác nhau để thiết lập các đường đi ngắn nhất trong
thuật toán Floyd-Warshall. Có một cách là tính ma trận D của các trọng số
đường đi ngắn nhất và sau đó thiết lập ma trận đã được xét trước đây Π từ ma
trận D. Phương pháp này có thể được thi hành để chạy trong Ο(n
3
) thời gian (bài
tập 25.1-6). Cho ma trận đã được xét trước đây Π, thủ tục PRINT-ALL-PAIRS-
SHORTEST-PATH có thể dùng để in các đỉnh trên một đường đi ngắn nhất đã
cho.
Chúng ta có thể tính ma trận đã được xét trước đây Π “trực tuyến” như thuật
toán Floyd-Warshall tính ma trận D
(k)
. Cụ thể, chúng ta tính một dãy các ma trận
14
Π
(0)
, Π
(1)
,…, Π
(n)
, trong đó Π=Π
(n)


π
)(k
ij
được định nghĩa là phần tử trước của
đỉnh j trên đường đi ngắn nhất từ đỉnh i với tất cả các đỉnh trung gian trong tập
{1, 2,…, k}.
Chúng ta có thể có một công thức đệ quy của
π
)(k
ij
. Khi k=0, một đường đi ngắn
nhất từ đỉnh i đến j không có các đỉnh trung gian. Do đó


<
=



=
=
w
w
ij
ij
ij
and
or
j

j
i
i
if
if
i
nil
#
)0(
π
(6)
Với k≥1, nếu chúng ta lấy đường đi i→k→j, trong đó k≠j thì phần tử trước của j
mà chúng ta chọn là trùng với phần tử trước của j mà chúng ta chọn trên một
đường đi ngắn nhất từ k với tất cả các đỉnh trung gian trong tập {1,2,…,k-1}.
Mặt khác, chúng ta chọn cùng phần tử trước của j mà chúng ta chọn trong đường
đi ngắn nhất từ i với tất cả các đỉnh trung gian trong tập {1,2,…,k-1}. Chính
thức, để k≥1,
d
d
d
d
d
d
k
kj
k
kj
k
ik
k

ik
k
ij
k
ij
k
kj
k
ij
k
ij
if
if
)1(
)1(
)1(
)1(
)1(
)1(
)1(
)1(
)(









+
+
>






=
π
π
π
(7)
Chúng ta để lại việc tính toán ma trận Π
(k)
trong thủ tục Floyd-Warshall như bài
tập 2-3. Hình 4 trình bày dãy ma trận Π
(k)
mà thuật toán kết quả tính toán cho đồ
thị của hình 1. Phần bài tập cũng yêu cầu khó hơn để chứng minh đồ thị con đã
được xét trước đây G
π
,i
là một cây các đường đi ngắn nhất với gốc i. Có một
cách khác để thiết lập các đường đi ngắn nhất được cho trong bài tập 2-7.
2.5. Bao đóng bắc cầu của một đồ thị có hướng
(Transitive closure of a directed graph)
Cho một đồ thị có hướng G=(V,E) với tập đỉnh V={1,2,…,n}, chúng ta có thể
mong ước tìm ra một đường đi trong G từ đỉnh i đến đỉnh j cho tất cả các cặp

đỉnh i,j∈V.
Bao đóng bắc cầu của G được định nghĩa như trong đồ thị G
*
=(V,E
*
) với
E
*
={(i,j): có một đường đi từ đỉnh i đến đỉnh j trong G}
Có một cách để tính bao đóng bắc cầu của một đồ thị trong Θ(n
3
) thời gian là
gán trọng số 1 cho mỗi cạnh của E và chạy thuật toán Floyd-Warshall. Nếu có
một đường đi từ đỉnh i đến đỉnh j, ta có được d
ij
< n. Mặt khác, ta có d
ij
= ∞.
Có một cách khác, tương tự cách tính bao đóng bắc cầu của G trong Θ(n
3
) thời
gian mà có thể tiết kiệm thời gian và không gian trong thực hành. Phương pháp
này bao hàm thay thế các toán tử logic V (OR) and Λ (AND) cho các toán tử số
học min và + trong thuật toán Floyd-Warshall. Với i,j,k=1,2,…,n ta định nghĩa
15
t
k
ij
là 1 nếu tồn tại một đường đi trong G từ đỉnh i đến j với các đỉnh trung gian
trong tập {1,2,…,k} và bằng 0 nếu ngược lại. Chúng ta thiết lập bao đóng bắc

cầu G
*
=(V,E
*
) bằng cách đặt cạnh (i,j) vào E
*
nếu và chỉ nếu
t
n
ij
=1. Một định
nghĩa đệ quy của
t
k
ij
, tương tự phép truy toán (5), là
E
E
ji
ji
or
and
j
j
i
i
if
if
t
ij



=




=
),(
),(
1
0
0
và với k ≥ 1,
( )
tttt
k
kj
k
ik
k
ij
k
ij
)1()1()1( −−−
∧∨=
(8)
Như trong thuật toán Floyd-Warshall, chúng ta tính các ma trận T
(k)
=(

t
k
ij
) theo
thứ tự tăng dần của k.
TRANSITIVE-CLOSURE (G)
1 n ←│V[G]│
2 for I ← 1 to n
3 do for j ← 1 to n
4 do if i=j or (i,j)

E[G]
5 Then
1
0

t
ij
6 Else
0
0

t
ij
7 for k ← 1 to n
8 do for i ← 1 to n
9 do for j ← 1 to n
10 do
( )
tttt

k
kj
k
ik
k
ij
k
ij
)1()1()1( −−−
∧∨←
11 return T
(n)
Hình 5 chỉ ra các ma trận T
(k)
được tính bởi thủ tục TRANSITIVE-CLOSURE
trên một đồ thị ví dụ. Thủ tục TRANSITIVE-CLOSURE, giống thuật toán
Floyd-Warshall, chạy trong Θ(n
3
) thời gian. Với một số máy tính, mặc dù các
giá trị toán tử logic một bit đơn xử lý nhanh hơn các toán tử số học trong dữ liệu
số nguyên. Hơn nữa, do thuật toán bao đóng bắc cầu trực tiếp chỉ dùng các giá
trị boolean đúng hơn là các giá trị số nguyên, sự đòi hỏi không gian nhớ là ít hơn
thuật toán Floyd-Warshall bởi hệ số tương ứng kích thước của một từ lưu trữ
máy tính.
1 2
4 3
16















=
1101
0110
1110
0001
)0(
T
















=
1101
0110
1110
0001
)1(
T















=
1101
1110
1110
0001

)2(
T














=
1111
1110
1110
0001
)3(
T
















=
1111
1111
1111
0001
)4(
T
Hình 5 Một đồ thị có hướng và các ma trận T
(k)
được tính toán bởi thuật toán bao đóng bắc cầu.
2.6. Bài Tập
2-1
Thực hiện thuật toán Floyd-Warshall trên đồ thị trọng số có hướng của hình 2.
Trình bày các ma trận D
(k)
là kết quả cho mỗi lần lặp lại của đầu ra vòng lặp.
2-2
Hãy trình bày, làm thế nào để tính bao đóng bắc cầu sử dụng kỹ thuật ở đoạn 1.
2-3
Sửa đổi thủ tục Floyd-Warshall để bao gồm tính toán các ma trận
Π
)(k

theo các
phương trình [6] và [7]. Chứng minh rằng với tất cả
Vi ∈
, thì đồ thị con đã được
xét trước đây
G
i,Π
là một cây đường đi ngắn nhất với gốc là i. (Chỉ dẫn: trình
bày
G
i,Π
là không chu trình, trước tiên chỉ ra rằng
l
k
ji
=
π
)(
,
hàm ý
wdd
lj
k
il
k
ij
+≥
)()(

theo cách định nghĩa của

π
)(k
ij
. Sau đó, dựa theo chứng minh của Bổ đề 24.16).
2-4
Theo những điều được trình bày ở trên, thuật toán Floyd-Warshall yêu cầu
không gian
Θ
(n
3
), bởi chúng ta tính
d
k
ij
)(
for i,j,k=1.2,…,n. Hãy chỉ ra thủ tục
dưới đây, mà đơn giản là bỏ tất cả các chỉ số trên, là đúng, và như vậy chỉ cần
không gian
Θ
(n
2
) là được yêu cầu.
FLOYD-WARSHALL’ (W)
1
][wrowsn ←
2
WD ←
3 for
1←k
to n

4 do for
1←i
to n
5 do for
1←j
to n
6 do
( )
dddd
kjikijij
+← ,min
7 return
D
17
2-5
Giả sử chúng ta đổi đẳng thức trong phương trình (7), như sau:
d
d
d
d
d
d
k
kj
k
kj
k
ik
k
ik

k
ij
k
ij
k
kj
k
ij
k
ij
if
if
)1(
)1(
)1(
)1(
)1(
)1(
)1(
)1(
)(








+

+

<





=
π
π
π
Có phải cách lựa chọn định nghĩa này của ma trận đã được xét trước đây
Π

đúng không?
2-6
Đầu ra của thuật toán Floyd-Warshall dùng để tìm sự có mặt của một chu trình
trọng số âm như thế nào?
2-7
Có cách khác để xây dựng lại các đường đi ngắn nhất trong thuật toán Floyd-
Warshall dùng các giá trị
Φ
)(k
ij
với i,j,k=1,2,…,n, trong đó
Φ
)(k
ij
là đỉnh trung

gian được đánh số cao nhất của đường đi ngắn nhất từ i đến j trong tất cả các
đỉnh trung gian của tập {1,2,…,k}. Đưa ra một trình bày đệ quy cho
Φ
)(k
ij
, thay
đổi thủ tục Floyd-Warshall để tính các giá trị
Φ
)(k
ij
, và viết lại thủ tục “PRINT-
ALL-PAIRS-SHORTEST-PATH” để ma trận
( )
Φ

)(n
ij
như một đầu vào. Ma
trận
Φ
như bảng s trong bài toán phép nhân xích ma trận của đoạn 15.2 như thế
nào?.
2-8
Đưa ra một thuật toán O(VE) - thời gian để tính bao đóng bắc cầu của một đồ thị
có hướng G=(V,E).
2-9
Giả sử bao đóng bắc cầu của một đồ thị có hướng, không có chu trình có thể
được tính trong
( )
EVf ,

thời gian, trong đó
f
là một hàm tăng đơn điệu của
V


E
. Chỉ ra rằng thời gian để tính bao đóng bắc cầu G
*
=(V,E
*
) của một đồ thị
có hướng tổng quát G(V,E) là
( )
EVf .
+ O(V+E
*
).
3. Thuật toán Johnson cho đồ thị thưa
(Johnson’s algorithm for sparse graphs)
Thuật toán Johnson tìm đường đi ngắn nhất giữa tất cả các cặp trong
O(V
2
lgV+VE) thời gian. Cho đồ thị thưa, đó là tiệm cận tốt hơn mỗi ma trận
bình phương lập lại hoặc thuật toán Floyd – Warshall. Mỗi thuật toán trả về một
ma trận trọng số đường đi ngắn nhất cho tất cả cặp đỉnh hoặc báo cáo đồ thị đầu
vào chứa một chu trình trọng số âm. Thuật toán Johnson sử dụng cả hai thuật
toán Dijkstra và Bellman- Ford như những thủ tục con, được mô tả ở chương 24.
18
Thuật toán Johnson sử dụng công nghệ reweighting (tái trọng số), nó làm việc

như sau. Nếu tất cả các trọng số cạnh w trong đồ thị G=(V,E) không âm, chúng
ta có thể tìm ra đường đi ngắn nhất giữa tất cả các cặp đỉnh bằng cách chạy mỗi
lần thuật toán Dijkstra từ mỗi đỉnh; với hàng đợi ưu tiên đống Fibonacci, thời
gian thực hiện của thuật toán mọi cặp là O(V
2
lgV+VE). Nếu G có các cạnh
trọng số âm nhưng không có chu trình trọng số âm, chúng ta tính toán đơn giản
một tập mới các trọng số cạnh không âm mà nó cho phép chúng ta sử dụng cùng
phương pháp. Tập hợp mới các trọng số cạnh
ω
ˆ
phải thỏa mãn hai tính chất
quan trọng.
1. Với mọi cặp đỉnh u,v ∈V, một đường đi p là đường đi ngắn nhất từ u đến
v sử dụng hàm trọng số w khi và chỉ khi p là đường đi ngắn nhất từ u đến v sử
dùng hàm có trọng số
ω
ˆ
.
2. Với tất cả các cạnh (u,v), trọng số mới
ω
ˆ
(u,v) là không âm.
Như chúng ta sẽ thấy, việc xử lý lại của G để xác định hàm trọng số mới
ω
ˆ

thể được thực hiện trong O(VE) thời gian.
3.1. Duy trì các đường đi ngắn nhất bằng cách tái trọng số
(Preserving shortest paths by reweighting)

Như các bổ đề sau trình bày, nó thật dễ dàng để đi đến một tái trọng số của các
cạnh thỏa mãn tính chất đầu tiên ở trên. Chúng ta dùng δ để biểu thị các trọng số
đường đi ngắn nhất xuất phát từ hàm có trọng số w và
δ
ˆ
để biểu thị các trọng số
đường đi ngắn nhất xuất phát từ hàm có trọng số
ω
ˆ
.
Bổ đề 1 (Tái trọng số không làm thay đổi các đường đi ngắn nhất)
Cho một đồ thị có hướng trọng số G=(V,E) với hàm trọng số w : E→R, cho
h:V→R là hàm bấy kỳ ánh xạ các đỉnh đến các số thực. Với mỗi cạnh (u,v)∈E,
ta định nghĩa:

ω
ˆ
(u,v) = w(u,v) + h(u) – h(v) (9)
Cho p=(v
o
, v
1
, …, v
k
) là đường đi bất kỳ từ đỉnh v
o
đến đỉnh v
k
. Thì p là đường
đi ngắn nhất từ v

o
đến v
k
với hàm trọng số w khi và chỉ khi nó là một đường đi
ngắn nhất với hàm trọng số
ω
ˆ
. Nghĩa là, w(p) =δ(v
o
, v
k
) khi và chỉ khi
ω
ˆ
(p)=
δ
ˆ
(v
o
, v
k
). Ngoài ra, G có một chu kỳ trọng số âm sử dụng hàm trọng số
ω
ˆ
.
Chứng minh: Chúng ta bắt đầu bằng cách chứng minh:
ω
ˆ
(p) = w(p) + h(v
o

) – h(v
k
) (10)
Chúng ta có:
ω
ˆ
(p) =

=
k
i 1
ω
ˆ
(v
i-1
,v
i
)
19
=

=
k
i 1
(w(v
i-1
,v
i
) + h(v
i-1

) – h(v
i
))
=

=
k
i 1
w(v
i-1
,v
i
) + h(v
o
) – h(v
k
)
= w(p) + h(v
o
) – h(v
k
).
Do đó, bất kỳ đường đi p từ v
o
đến v
k

ω
ˆ
(p) = w(p) + h(v

o
) – h(v
k
). Nếu một
đường đi từ v
o
đến v
k
là ngắn hơn đường khác sử dụng hàm trọng số w, thì nó
cũng ngắn hơn khi sử dụng
ω
ˆ
. Vì vậy, w(p) =δ(v
o
, v
k
) khi và chỉ khi
ω
ˆ
(p)=
δ
ˆ
(v
o
, v
k
).
Cuối cùng, chúng ta biểu diễn G có chu trình trọng số âm sử dụng hàm trọng số
w khi và chỉ khi G có chu trình trọng số âm sử dụng hàm trọng số
ω

ˆ
.
Xét chu kỳ bất kỳ c = <v
o
, v
1
, …, v
k
>, trong đó v
o
= v
k
. Thep phương trình
(25.10):
ω
ˆ
(c) = w(c) + h(v
o
) – h(v
k
) = w(c)
và vì vậy c có trọng số âm sử dụng w khi và chỉ khi nó có trọng số âm sử dụng
ω
ˆ
.
3.2. Sinh các trọng số không âm bằng cách tái trọng số
(Producing nonegative weights by reweighting)
Mục tiêu tiếp theo của chúng ta là chắc chắn tính chất thứ hai đúng: chúng ta
muốn
ω

ˆ
(u,v) là không âm cho tất cả các cạnh (u,v)∈E. Cho một đồ thị trọng số,
có hướng G=(V,E) với hàm trọng số w:E→R, chúng ta tạo ra một đồ thị mới
G’=(V’,E’) trong đó V’=V∪{s} cho một số đỉnh mới s∉V và
E’=E∪{s,v):v∈V}. Chúng ta mở rộng hàm trọng số w sao cho w(s,v)=0 với mọi
v∈V. Chú ý rằng s không có cạnh mà ghi nó, không có đường đi ngắn nhất
trong G’, khác với những cạnh có nguồn s, chứa s. Hơn nữa, G’ không có chu
trình trọng số âm khi và chỉ khi G không có chu trình trọng số âm. Hình 6(a)
biểu diễn đồ thị G’ tương ứng với đồ thị G ở hình 1.
Bây giờ giả sử rằng G và G’ không có chu trình trọng số âm. Chúng ta hãy định
nghĩa h(v)=δ(s,v) với mọi v∈V’. Bằng bất đẳng thức tam giác (Bổ đề 24.10)
Chúng ta có h(v) ≤ h(u) + w(u,v) với tất cả các cạnh (u,v)∈E’. Vì vậy, nếu
chúng ta định nghĩa trọng số mới
ω
ˆ
theo phương trình (9), chúng ta có
ω
ˆ
(u,v)
= w(u,v) + h(u) – h(v) ≥ 0 và tính chất thứ hai được thỏa. Hình 6(b) biểu diễn đồ
thị G’ từ hình 6(a) với cạnh được tái trọng số.
20
(f)
(g)
(c) (d)
(e)
0
0
0
0

0
0
0
-1
-5
0
5
-4
– 4
3
– 5
4
2
8
6
7
1
3
4
2
5
1
0
5
1
0
4
0
0
-1

-5
0
5
-4
0
4
0
0
2
13
2
10
0
3
4
2
5
1
4
0/0
2/1
2/-3
2/2
0/-4
0
0
0
2
13
2

10
0
2
3
4
5
1
4
2/3
0/0
0/-4
0/1
2/-1
0
0
0
2
13
2
10
0
2
3
4
5
1
4
2/7
0/4
0/0

0/5
2/3
0
0
0
2
13
2
10
0
2
3
4
5
1
4
2/2
0/-
1
0/-5
0/0
2/-2
0
0
0
2
13
2
10
0

2
3
4
5
1
4
4/8
2/5
2/1
2/6
0/0
0
0
0
2
13
2
10
0
2
3
4
5
1
(a)
(b)
Hình 6. Thuật toán các đường đi ngắn nhất mọi cặp của Johnson chạy trên đồ thị của hình 1
(a) Đồ thị G’ với hàm trọng số gốc w. Đỉnh s mới là màu đen. Trong mỗi đỉnh v là h(v) =
δ(s,v).
(b) Mỗi cạnh (u,v) được reweight với hàm trọng số

ω
ˆ
(u,v) = w(u,v) + h(u) – h(v).
(c) – (g) Kết quả khi chạy thuật toán Dijkstra trên mỗi đỉnh của G sử dụng hàm trọng số
ω
ˆ
.
Trong mỗi phần, đỉnh nguồn u là màu đen, và những cạnh được tô bóng là cây đường đi
ngắn nhất được tính toán bởi thuật toán. Trong mỗi đỉnh v là giá trị
δ
ˆ
(u,v) và δ(u,v) được
tách ra bằng một vạch xiên. Giá trị d
uv
= δ(u,v) bằng với
δ
ˆ
(u,v) + h(v) – h(u).
3.3. Tính toán các đường đi ngắn nhất mọi cặp
(Computing all-pairs shortest paths)
Thuật toán Johnson để tính các đường đi ngắn nhất mọi cặp sử dụng thuật toán
Bellman-Ford (đoạn 24.1) và thuật toán Dijkstra (đoạn 24.3) như thủ tục con.
Nó giả định rằng các cạnh được lưu trữ trong các danh sách kề. Thuật toán trả về
ma trận D = d
ij
thông thường |V| x |V| , trong đó d
ij
=δ(i,j), hoặc nó báo cáo đồ
21
thị cho trước chứa một chu trình trọng số âm. Như là kiểu thuật toán đường đi

ngắn nhất mọi cặp, chúng ta giả định rằng các đỉnh được đánh số từ 1 đến |V|.
JOHNSON(G)
1 Tính G’, trong đó V[G’] = V[G] ∪ {s}
E[G’] = E[G] ∪ {(s,v): v ∈V[G]}, và
w(s,v) = 0 với mọi v ∈V[G]
2. if BELL-FORD (G’,w,s) = FALSE
3 then In “Đồ thị cho trước chứa chu trình trọng số âm”
4 else for mỗi đỉnh v ∈ V[G’]
5 do đặt h(v) là giá trị của δ(s,v) được tính bởi
thuật toán Bellman-Ford
6 for mỗi cạnh (u,v) ∈ E[G’]
7 do
ω
ˆ
(u,v) ← w(u,v) + h(u) – h(v)
8 for mỗi đỉnh u ∈V[G]
9 do chạy DIJKSTRA(G,
ω
ˆ
,u)
để tính
δ
ˆ
(u,v) cho tất cả v∈V[G]
10 for mỗi đỉnh v∈V[G]
11 do d
uv

δ
ˆ

(u,v) + h(v) – h(u)
12 return D
Mã này đơn giản thực hiện các hoạt động mà chúng ta đề cập sớm hơn. Dòng 1
sinh ra G’. Dòng 2 chạy thuật toán Bellman-Ford trên G’ với hàm trọng số w và
đỉnh nguồn s. Nếu G’ và do đó G, chứa một chu trình trọng số âm, dòng 3 báo
cáo bài toán. Dòng 4-11 giả định rằng G’ không chứa chu trình trọng số âm.
Dòng 4-5 đặt h(v) là trọng số lộ trình ngắn nhất δ(s,v) được tính bởi thuật toán
Bellman-Ford cho tất cả v∈V’. Dòng 6-7 tính trọng số mới
ω
ˆ
. Với mỗi cặp đỉnh
u,v∈V, cho vòng lặp for của các dòng 8-11 tính toán trọng số đường đi ngắn
nhất
δ
ˆ
(u,v) bằng cách gọi thuật toán Dijkstra một lần từ mỗi đỉnh trong V.
Dòng 11 chứa ma trận d
uv
đúng trọng số đường đi ngắn nhất δ(u,v), được tính
toán sử dụng phương trình (25.10). Cuối cùng, dòng 12 trả về ma trận D hoàn
thành. Hình 6 biểu diễn cách thực hiện thuật toán Johnson.
Nếu hàng đợi ưu tiên trong thuật toán Dijkstra là được thực thi bởi một đống
Fibonacci, thời gian chạy của thuật toán Johnson là O(V
2
lgV + VE). Đơn giản
hoá việc thực thi đống nhị phân mang lại một thời gian chạy là O(V E lgV), mà
vẫn tiệm cận nhanh hơn thuật toán Floyd-Warshall nếu đồ thị là thưa.
3.4. Bài tập
3-1
Sử dụng thuật toán Johnson để tìm đường đi ngắn nhất giữa tất cả các cặp đỉnh

trong đồ thị hình 2. Trình bày các giá trị của h và
ω
ˆ
được tính bởi thuật toán.
3-2
Mục đích của việc bổ sung thêm đỉnh mới s vào V, cho ra V’ là gì?
22
3-3
Giả sử rằng w(u,v) ≥ 0 với mọi cạnh (u,v) ∈ E. Mối quan hệ giữa hàm trọng số
w và
ω
ˆ
là gì?
3-4
Giáo sư Greenstreet cho rằng có một cách đơn giản để tái trọng số các cạnh hơn
phương pháp sử dụng thuật toán Johnson. Cho w* = min
(u,v)

E
{w(u,v)}, định
nghĩa
ω
ˆ
(u,v) = w(u,v)-w* cho tất cả các cạnh (u,v) ∈ E. Điểm sai của phương
pháp tái trọng số của giáo sư là gì?
3-5
Giả sử chúng ta chạy thuật toán Johnson trên đồ thị có hướng G với hàm trọng
số w. Trình bày nếu G chứa một chu trình 0 trọng số c thì
ω
ˆ

(u,v) = 0 cho mọi
cạnh (u,v) trên c.
3-6
Giáo sư Michener cho rằng không cần tạo một đỉnh nguồn mới ở dòng 1 của
JOHNSON. Ông cho rằng thay vì chúng ta có thể vừa sử dụng G’=G và đặt s là
đỉnh bất kỳ trong V[G]. Cho một ví dụ của một đồ thị có hướng, trọng số G mà
hợp nhất ý kiến của giáo sư vào JOHNSON là nguyên nhân các câu trả lời sai.
Sau đó trình bày nếu G được kết nối mạnh (mọi đỉnh có thể nối từ mọi đỉnh
khác), kết quả được chạy bởi JOHNSON với sự thay đổi của giáo sư là đúng.
4. Các bài toán
4.1 Bao đóng bắc cầu của một đồ thị động
Giả sử rằng ta muốn duy trì bao đóng bắc cầu của một đồ thị có hướng G=(V,E)
khi ta chèn các cạnh vào E. Nghĩa là, sau khi mỗi cạnh đã được chèn, chúng ta
muốn cập nhật bao đóng bắc cầu của các cạnh được chèn cho đến lúc đó. Giả sử
rằng khởi tạo đồ thị G không có các cạnh và bao đóng bắc cầu được biểu diễn
như ma trận boolean.
a. Nêu cách cập nhật bao đóng bắc cầu G*=(V,E*) của đồ thị G=(V,E) trong
0(V
2
) thời gian khi một cạnh mới được thêm vào G.
b. Nêu một ví dụ về một đồ thị G và một cạnh e sao cho chỉ cần Ω(V
2
) thời
gian để cập nhật bao đóng bắc cầu sau phép chèn của e vào G.
c. Mô tả một thuật toán hiệu quả để cập nhật bao đóng bắc cầu khi các cạnh
được chèn vào đồ thị. Với một dãy n phép chèn, thuật toán của bạn sẽ
chạy trong tổng thời gian

=
n

i 1
t
i
= 0(V
3
), trong đó t
i
là thời gian để cập nhật
bao đóng bắc cầu khi cạnh thứ i được chèn. Chứng minh thuật toán của
bạn đạt cận thời gian này.
23
4.2 Các đường đi ngắn nhất trong đồ thị trù mật ε
Một đồ thị G=(V,E) là trù mật ε nếu E = Θ(V
1+
ε
) với một hằng ε trong miền
giá trị 0<ε≤1. Bằng cách dùng các đống nhị phân d (xem bài tập 6-2) trong các
thuật toán các đường đi ngắn nhất trên các đồ thị trù mật ε, chúng ta có thể so
khớp thời gian thực hiện của các thuật toán cơ bản đống Fibonacci mà không
dùng một cấu trúc dữ liệu phức tạp.
a. Nêu các thời gian thực hiện tiệm cận của INSERT, EXTRACT-MIN, và
DECREASE-KEY, dưới dạng một hàm của d và số n thành phần trong
một đống thuộc d? Nêu các thời gian thực hiện này với các mức hao phí
khấu trừ của các phép toán này đối với một đống Fibonacci.
b. Nêu cách tính các đường đi ngắn nhất từ một nguồn đơn trên một đồ thị
trù mật ε có hướng G=(V,E) không có các trọng số cạnh âm trong O(E)
thời gian.
c. Nêu cách giải quyết bài toán các đường đi ngắn nhất mọi cặp trên một đồ
thị trù mật ε có hướng G=(V,E) không có các trọng số cạnh âm trong
O(V,E) thời gian.

d. Nêu cách giải quyết bài toán các đường đi ngắn nhất mọi cặp trong O(VE)
thời gian trên một đồ thị trù mật ε có hướng G=(V,E) có thể có các trọng
số cạnh âm nhưng không có các chu trình trọng số âm.

24

×