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

Tiểu luận môn học THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT

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 (2.14 MB, 37 trang )

MỤC LỤC
Chương 24: Đường đi ngắn nhất nguồn đơn
Tổng quan
Một người lái xe ô tô muốn tìm thấy đường đi ngắn nhất từ Chicago đến Boston. Căn
cứ vào bản đồ đường lớn của Mỹ trên khoảng cách giữa mỗi cặp giao nhau liền kề được
đánh dấu, chúng ta có thể xác định đường đi ngắn nhất này như thế nào?
Một cách khả dĩ là đếm tất cả các đường đi từ Chicago đến Boston, lấy tổng những
khoảng cách trên mỗi tuyến đường, và lựa chọn đường đi ngắn nhất. Nó dễ dàng để nhìn
thấy, tuy nhiên, chúng ta không thực hiện được nếu đường đi chứa những chu trình, có
hàng triệu trong số những khả năng, nhưng hầu hết trong số đó hoàn toàn là không cần
phải xem xét. Chẳng hạn, một tuyến đường từ Chicago qua Houston đến Boston rõ ràng
là một sự lựa chọn không tốt bởi vì Houston cách con đường đó khoảng một nghìn dặm.
Trong chương này và Chương 25 sẽ trình bày cách để giải quyết hiệu quả những vấn đề
này. Trong vấn đề về đường đi ngắn nhất, chúng tôi đưa ra một đồ thị có hướng có trọng
số G = (V, E ), với hàm trọng số w: E → R ánh xạ đến giá trị thực. Độ dài của đường đi
p = v
0
, v
1
, , v
k
là tổng độ dài của những cạnh thành phần :
Ta xác định độ dài đường đi ngắn nhất từ u tới v bởi công thức:
Một đường đi ngắn nhất từ đỉnh u đến đỉnh v được định nghĩa như đường đi p với trọng
số w(p)= δ(u, v).
Trong ví dụ về đường đi từ Chicago tới Boston, chúng ta có thể mô hình đường đi như
một đồ thị: những điểm giao nhau được biểu diễn bằng các đỉnh, đoạn đường giữa
những điểm giao nhau được biểu diễn bằng các cạnh và khoảng cách giữa các con
đường được biểu diễn bằng trọng số ứng với cạnh đó. Mục đích của chúng tìm đường đi
ngắn nhất từ các giao lộ ở Chicago (đường Clart và đại lộ Addison) đến Boston (đại lộ
Brookline và đường Yawkey).


Có thể gán những trọng số khác nhau cho các cạnh để biểu diễn về thời gian, chi phí, tiền
phạt, tổn thất hay một đại lượng khác được tích lũy trong suốt đường đi có thể đạt đến
chi phí cực tiểu.
Giải thuật tìm kiếm chiều rộng ở Mục 22.2 là một giải thuật tìm đường đi ngắn nhất mà
làm việc trên những đồ thị không có trọng số nghĩa là những đồ thị mà trong đó mỗi
2
cạnh có thể được xem là một đơn vị. Bởi vì nhiều khái niệm từ sự tìm kiếm theo chiều
rộng xuất hiện trong việc tìm đường đi ngắn nhất của đồ thị có trọng số, người đọc nên
xem lại Mục 22.2 trước khi tiếp tục.
Bổ đề 24.1:
Cho một đồ thị có hướng có trọng số G = (V, E) với trọng số w : E → R, giả sử p=
(v1, v2, , vk) là một đường đi ngắn nhất từ đỉnh v
1
đến đỉnh v
k
. Cho i và j bất kì sao
cho 1 ≤ i ≤ j ≤ k , p
ij
= ( v
i
, v
i+1
, , v
j
) là đường đi của p từ đỉnh v
i
đến đỉnh v
j
. Lúc đó
p

ij
là một đường đi ngắn nhất từ v
i
đến v
j
.
Chứng minh:
Nếu chúng ta phân chia đường đi p ra thành v
1
ij
p
→
v
i
ij
p
→
v
j
ij
p
→
v
k
, thì có
w(p) = w(p
1i
) + w(p
ij
) + w(p

jk
). Bây giờ, giả thiết rằng có một đường đi
,
ij
p
từ vi đến
vj với trọng số
,
ij ij
( ) w( )w p p<
. Thì, v
1
ij
p
→
v
i
,
ij
p
→
v
j
ij
p
→
v
k
là một đường đi từ v1 đến vk với trọng số là w(p
1i

) + w(
,
ij
p
) + w(p
jk
) bé hơn w(p),
mâu thuẫn với giả thiết p là một đường đi ngắn nhất từ v1 đến vk.
Cạnh có trọng số âm
Trong một số trường hợp của đường đi ngắn nhất nguồn đơn, một số cạnh có thể có
trọng số âm. Nếu đồ thị G = (V, E) chứa những chu trình không âm mà từ đỉnh nguồn
có thể đi đến được thì mọi đỉnh v thuộc V độ dài đường đi ngắn nhất δ(s, v) xácđịnh
được dù nó có một giá trị âm. Tuy nhiên, nếu có một chu trình âm mà từ đỉnh nguồn
có thể đi đến được thì đường đi ngắn nhất không được xác định. Không có đường đi
nào từ s tới một đỉnh trên chu trình có thể là đường đi ngắn nhất- một đường đi có
trọng số nhỏ hơn có thể luôn luôn được tìm thấy như là đường dẫn " ngắn nhất " khi
đi qua chu trình trọng số âm. Nếu có một chu trình trọng số âm trên đường đi nào đó từ
s tới v, chúng ta xác định được δ(s,v) = -

.
Hình 24.1: Minh họa trọng số âm và chu trình âm của đường đi ngắn nhất. Bởi vì có chỉ
có một đường đi từ s tới a (đường đi (s, a)), δ(s,a) = w(s, a) = 3. Tương tự, có chỉ có một
đường đi từ s tới b, và vì vậy δ(s, b) = w(s,a) + w(a, b) = 3+ (- 4)= -1. Có rất nhiều đường
đi từ s tới c: (s,c), (s,c,d,c), (s,c,d,c,d,c), … Vì chu trình (c, d, c) có trọng số 6+ (- 3)=
3> 0, đường (dẫn) ngắn nhất từ s tới c là (s,c) với trọng số δ(s,c) =5. Tương tự, ngắn
nhất từ s tới d là (s,c,d) với trọng số δ(s, d) = w(s,c) + w(c,d) = 11. Tương tự, có rất
nhiều đường đi từ s tới e: (s,e), (s,e,f,e), (s,e,f,e,f,e) Từ chu trình (e,f,e) có trọng số
3+ (-6)=-3< 0, tuy nhiên đó không phải là đường đi ngắn nhất từ s tới e. Bằng việc đi qua
chu trình âm (e,f,e) tùy ý nhiều lần, chúng ta có thể tìm thấy những đường đi từ s tới e
với trọng số âm lớn và vì vậy δ(s,e)= -


. Tương tự δ(s,f)= -

.Vì từ g có đường đi từ
f , chúng ta có thể cũng tìm thấy những đường đi trọng số âm lớn từ s tới g và δ(s,g)= -

.
Đỉnh h, i và j lập thành một chu trình âm. Tuy nhiên, chúng không có đường đi từ s và
vì vậy δ(s,h)=δ(s,i)=δ(s,j)=

.
3
Hình 24.1: Minh họa các cạnh có trọng số âm của đồ thị có hướng. Xem mỗi đỉnh là độ dài
đường đi ngắn nhất từ nguồn s. Bởi vì đỉnh e và f lập thành một chu trình âm có đường đi từ
nguồn s, chúng có độ dài đường ngắn nhất là -

. Vì đỉnh g có đường đi được từ đỉnh a nên
cũng có độ dài đường đi nhắn nhất là -

. Các đỉnh như h, i và j không có đường đi từ s, và vì
thế độ dài đường đi ngắn nhất của là

mặc dù chúng nằm trên một chu trình âm.
Một số thuật toán đường đi ngắn nhất như thuật toán Dijkstra thực hiện trên đồ thị mà mọi
cạnh đều có trọng số dương, như trong ví dụ ở bảng đồ đường đi. Giải thuật Bellman-
Ford, cho phép những cạnh có trọng số âm trong đồ thị và kết quả trả về đúng với đồ thi
chu trình không âm có đường đi từ nguồn. Điển hình, nếu có một chu trình âm, giải thuật
có thể phát hiện và báo cáo sự tồn tại của nó.
Chu trình:
Một đường đi ngắn nhất có thể chứa một chu trình? Như chúng ta vừa mới nhìn thấy, nó

không thể chứa chu trình trọng số âm. Mà cũng không thể chứa một chu trình dương khi
loại bỏ chu trình từ đường đi kết quả là có một đường đi với cùng nguồn, đỉnh đến và
một trọng số thấp hơn.
Điều đó có nghĩa là nếu p = ( v
0
, v
1
, , v
k
) là một đường đi và c = (v
i
, v
i+1
, , v
j
) là
một chu trình dương tính trên đường đi này (v
i
= v
j
và w(c) >0) thì đường dẫn p’=(v0,
v1, ,vi, vj
+1
, vj
+2
, , vk) có trọng số w(p ')= w(p) - w(c) < w(p), và vì vậy p không thể
là một đường đi ngắn nhất từ v0 đến vk.
Những lá chỉ có chu trình trọng số 0. Chúng ta có thể loại bỏ chu trình có trọng số 0 từ
bất kì đường đi nào khác cùng trọng số. Như vậy, nếu có một đường đi ngắn nhất từ một
đỉnh nguồn s tới một đỉnh v mà chứa một chu kì trọng số 0, thì có đường đi ngắn nhất

khác từ s tới v không có chu trình này. Từ bất kỳ đường đi không có chu kỳ nào trong
một đồ thị G = (V, E) chứa nhiều nhất |V| đỉnh phân biệt, nó cũng chứa nhiều nhất |V| - 1
cạnh. Như vậy, chúng ta có thể hạn chế số đường đi ngắn nhất tối đa qua |V| - 1 cạnh.
Biểu diễn đường dẫn ngắn nhất
Chúng ta thường muốn tính toán không chỉ đường đi ngắn nhất mà còn các đỉnh trên
những đường ngắn nhất. Biểu diễn những đường đi ngắn nhất tương tự như sử dụng
duyệt cây theo chiều rộng Mục 22.2. Cho một đồ thị G = (V, E), gán mỗi đỉnh v thuộc
V một đỉnh liền trước π[v] là đỉnh khác hoặc bằng Nil. Những giải thuật đường đi ngắn
nhất trong chương này đặt những thuộc tính π sao cho dãy các đỉnh liền trước từ vector v
trở lui là đường đi ngắn nhất từ s tới u. Như vậy cho một vector v với π[v] ≠ Nil. Thủ tục
PRINT-PATH(G,s,v) ở mục 22.2 có thể in ra đường đi ngắn nhất từ s tới v.
Tuy nhiên, trong thời gian sự thực hiện giải thuật đường đi ngắn nhất, những giá trị π
không cần phải cho biết những đường đi ngắn nhất. Như trong duyệt theo chiều rộng, ta
sẽ quan tâm đến đỉnh trước đồ thị con Gπ = (Vπ, Eπ) bởi giá trị π. Tương tự, ta xác định
nghĩa tập hợp đỉnh

là tập hợp đỉnh của đồ thị G mà đỉnh liền trước khác Nil hợp với
đỉnh nguồn s.
Vπ = {v

V :π[v] ≠ NIL}
U {s} .
4
Tập hợp cạnh có hướng E là cạnh cho bởi có giá trị
π
ở đỉnh trong tập V.
Eπ = {(π[v], v)

E : v


Vπ - {s}} .
Chúng ta có thể chứng tỏ giá trị π được tạo ra bằng các giải thuật trong chương này có
thuộc tính ở đỉnh cuối G là một “cây đường đi ngắn nhất“. Một gốc của cây chứa một
đường đi ngắn nhất từ nguồn s tới mọi đỉnh có đường đi được từ s. Một cây đường đi
ngắn nhất giống như duyệt theo chiều rộng ở mục 22.2, nhưng nó chứa đường đi ngắn
nhất từ nguồn xác định trong giới hạn của những trọng số các cạnh thay thế cho số lượng
các cạnh. Dễ thấy, giả sử G=(V,E) là một đồ thị trọng số, có hướng với trọng số w : E →
R , cho G chứa chu trình không âm từ đỉnh nguồn s

V, vì thế đường đi ngắn nhất có
thể dễ dàng xác định. Một cây ngắn nhất ở s là một đồ thị con có hướng G=(V,E) , V’
chứa V sao cho:
1. V’ là tập hợp các đỉnh có đường đi từ s trong đồ thị G
2. G’ hình thành một cây có gốc là s và
3. Với mọi v

V ', đường đi duy nhất từ s tới v trong G ' là một đường đi ngắn nhất
từ s tới v trong G.
Những đường đi ngắn nhất không tất yếu duy nhất, và cũng không có duy nhất những
cây những đường đi ngắn nhất.Ví dụ, Hình 24.2 chỉ ra một đồ thị có trọng số, định hướng
và hai cây đường đi ngắn nhất với cùng gốc.

Hình 24.2: Một đồ thị có trọng số, có hướng với những độ dài đường đi ngắn nhất từ nguồn s.
(b)Những cạnh màu đậm thành lập một cây đường đi ngắn nhất mà có gốc tại nguồn s .
(c)Những cây đường đi ngắn nhất khác với cùng gốc.
Tính giảm bớt(Relaxation)
Gỉai thuật trong chương này dùng thuộc tính giảm bớt. Với mọi đỉnh v thuộc V,
chúng ta xây dựng d[v] là một cận dưới trên độ dài đường đi ngắn nhất từ nguồn s đến
v. Ta gọi d[v] là một ước lượng đường đi ngắn nhất. Ta khởi tạo một ước lượng
đường đi ngắn nhất và đỉnh trước bởi thủ tục với chi phí Θ(V)

INITIALIZE-SINGLE-SOURCE(G, s)
1 for each vertex v

V[G]
2 do d[v] ← ∞
3 π[v] ← NIL
4 d[s]

0
Sau khi khởi tạo
π[v] = NIL cho tất cả các đỉnh v

V, d[s] = 0, và d[v] = ∞ cho v

V - {s}.
Qúa trình giảm bớt 1 cạnh (u,v) bao gồm việc kiểm tra xem chúng ta có thể tận dụng
5
đường đi ngắn nhất đến v đã tìm thấy sau khi đi qua u và nếu cập nhật d[v] và π[v].
Một bước giảm bớt có thể giảm đi giá trị của đường đi ngắn nhất d[v] và cập nhật đỉnh
trước của v trong π[v]. Mã nguồn thực hiện một bước giảm bớt trên cạnh (u,v)
Hình 24.3: Giảm bớt cạnh (u,v) với trọng số w(u,v) =2. Ước lượng đường đi ngắn nhất
của mỗi đỉnh được xem trong đỉnh . (a)Vì d[v] > d[u] + w(u, v) ưu tiên để giảm bớt, giá
trị d[v] giảm.(b)Ở đây d[v] ≤ d[u] + w(u, v) trước bước giảm bớt và vì vậy d[v]
không thay đổi bởi sự giảm bớt.

RELAX(u, v, w)
1 if d[v] > d[u] + w(u, v)
2 then d[v] ← d[u] + w(u, v)
3 π[v] ← u
Hình 24.3: Cho thấy 2 ví dụ của việc giảm bớt, một ước lượng đường đi ngắn nhất

giảm và một ước lượng không thay đổi.
Mỗi giải thuật trong chương này gọi INITIALIZE-SINGLE-SOURCE và quá trình
giảm bớt cách cạnh lặp lại. Ngoài ra, quá trình giảm bớt chỉ có nghĩa khi có ước lượng
đường đi ngắn nhất và đỉnh trước thay đổi. Trong giải thuật Dijkstra và giải thuật đường
đi ngắn nhất cho đồ thị có hướng không có chu trình, mỗi cạnh giảm bớt chính xác một
lần. Trong giải thuật Bellman-Ford, mỗi cạnh bị giảm nhiều lần.
Thuộc tính của đường đi ngắn nhất và sự giảm bớt
Để chứng minh tính đúng của giải thuật trong chương này, chúng ta sẽ phân biệt thuộc
tính đường đi ngắn nhất và sự giảm bớt. Chúng ta phát biểu những thuộc tính này ở đây,
và Mục 24.5 chứng minh điều này. Các bạn tham khảo mỗi thuộc tính được phát biểu ở
đây bao gồm bổ đề thích hợp hay số hệ quả từ Mục 24.5. Sau các thuộc tính này với chỉ
dẫn ước lượng đến đường đi ngắn nhất hoặc đồ thị con đỉnh trước, thừa nhận rằng đồ thị
khởi tạo với một lời gọi INITIALIZE-SINGLE-SOURCE(G, s) và chỉ có trường hợp
ước lượng đường đi ngắn nhất và đồ thị con đỉnh trước thay đổi bởi chuỗi các bước giảm
bớt.
Tam giác không đều (Bổ đề 24.10)
• Cho cạnh bất kì (u,v) thuộc E, chúng ta có δ(s, v) ≤ δ(s, u) + w(u, v).
Thuộc tính cận trên (Bổ đề 24.11)
• Chúng ta luôn có d[v] ≥ δ(s, v) cho tất cả đinh v

V , và khi d[V] đạt được giá trị
δ(s, v), nó chưa bao giờ thay đổi.
Thuộc tính không đường (dẫn) (Hệ quả 24.12)
• Nếu không có đường (dẫn) từ s tới v, thì chúng ta luôn có d[v] = δ(s, v) = ∞.
Thuộc tính Quy tụ (Bổ đề 24.14)
6
• Nếu s ~ u > v là một đường đi ngắn nhất trong G cho các đỉnh u,v

V và nếu
d[u]=δ(s, u) trong lúc này ưu tiên giảm đỉnh (u,v) thì sau đó d[v] = δ(s, v)

Thuộc tính giảm bớt(Bổ đề 24.14)
• Nếu P = v
0
, v
1
, , v
k
là một đường đi ngắn nhất từ s = v
0
tới v
k
, và những cạnh của p
được giảm bớt theo thứ tự (v
0
, v
1
), (v
1
, v
2
), , (v
k-1
, v
k
), thì d[v
k
] = δ(s, v
k
). Thuộc tính
này giữ không quan tâm đến mọi bước giảm bớt, dù chúng được trộn lẫn với sự giảm bớt

của các cạnh của p.
Thuộc tính đồ thị con đỉnh trước (Bổ đề 24.17)
• Mỗi khi d[v] = δ(s, v), mọi đỉnh v

V, đồ thị con đỉnh trước là một cái cây đường đi
ngắn nhất có gốc tại s
7
Nội dung chính của chương:
Mục24.1 : Giới thiệu giải thuật Bellman-Ford để giải quyết đường đi ngắn nhất nguồn
đơn trong trường hợp tổng quát mà trong đó các cạnh có thể có trọng số
âm. Giải thuật Bellman-Ford chú ý trong tính đơn giản và có khả năng phát
hiện ra một chu trình trọng số âm có đường đi được từ nguồn.
Mục 24.2 : Cho một giải thuật tuyến tính cho việc tính toán đường đi ngăn nhất từ nguồn
đơn trong đồ thị có hướng không có chu trình.
Mục 24.3 : Tổng quan về giải thuật Dijkstra, giải thuật này có một thời gian hoạt động
thấp hơn so với Bellman-Ford nhưng yêu cầu những trọng số cạnh phải
không âm
Mục 24.4: Giải thuật Bellman-Ford có thể được dùng để giải quyết một trường hợp đặc
biệt của " Quy hoạch tuyến tính."
Mục 24.5: Chứng minh những thuộc tính đường đi và sự giảm bớt được phát biểu ở trên.
Yêu cầu một số quy ước để làm số học với những sự vô hạn. Chúng ta sẽ giả thiết điều
đó cho bất kỳ số thực nào a ≠ -∞, ta có a + ∞ = ∞ + a = ∞. Đồng thời, để chứng minh có
chu trình trọng số âm , chúng ta sẽ giả thiết điều đó cho bất kỳ số thực nào a ≠ ∞, ta có a
+ (-∞) = (-∞) + a = -∞.
Tất cả các giải thuật trong chương này giả thiết đồ hình có hướng G được lưu trong danh
sách kề liền. Đồng thời, lưu mỗi cạnh với trọng số của nó vì thế mà khi chúng ta xét danh
sách kề liền, chúng ta có thể xác định trọng số các cạnh với chi phí O(1)
24.1 Thuật toán Bellman-Ford
Giải quyết bài toán tìm đường đi ngắn nhất trong trường hợp tổng quát, trong đó các
cạnh có thể có trọng số âm. Cho đồ thị có hướng có trọng số G=(V,E) với đỉnh nguồn

s và hàm trọng số w : E → R , thuật toán trả về giá trị kiểu Boolean cho biết từ đỉnh
nguồn có thể đến được một trình âm hay không. Nếu có thì thuật toán sẽ kết thúc mà
không có lời giải. Còn nếu không sẽ kết xuất tất cả các con đường ngắn nhất cùng với
chiều dài của của chúng.
Thuật toán sử dụng kỹ thuật giảm bớt(Relaxation) bằng cách ngày càng giảm chiều
dài của con đường ngắn nhất từ đỉnh s đến các đỉnh v thuộc V cho đến khi đạt được
giá trị ngắn nhất δ(s, v). Thuật toán trả về giá trị TRUE khi và chỉ khi từ đỉnh gốc
không đi đến được chu trình âm.
BELLMAN-FORD(G, w, s)
1 INITIALIZE-SINGLE-SOURCE(G,s)
2 for i ← 1 to |V[G]| - 1
3 do for each edge (u, v)

E[G]
4 do RELAX(u, v, w)
5 for each edge (u, v)

E[G]
6 do if d[v] > d[u] + w(u, v)
7 then return FALSE
8 return TRUE
Hình 24.4 thể hiện thuật toán qua 5 đỉnh. Sau khi thực hiện phép khởi tạo thông
thường ở dòng 1, thuật toán thực hiên /V/-1 bước qua tất cả các cạnh trong đồ thị. Mỗi
bước là mỗi phép lặp của vòng lặp for từ dòng 2 đến dòng 4 và và gồm các cạnh bớt
đi trong đồ thị. Hình b đến e cho thấy trạng thái của thuật toán sau mỗi bước. Sau /V/
8
-1 bước, dòng 5-8 thuật toán sẽ tiến hành kiểm tra chu trình âm và trả vềgiá trị thích
hợp.
Thuật tóan Bellman có chi phí là O(VE) , khởi tạo tốn chi phí Θ (V), từng bước từ
dòng 2-4 tốn Θ (E), vòng lặp từ dong 5-7 tốn O(E).

Để chứng minh tính chính xác giải thuật Bellman- Ford, chúng ta bắt đầu bằng việc chỉ
ra rằng nếu không có những chu trình âm, giải thuật tính toán những đường đi ngắn
nhất đúng mọi đỉnh có đường đi được từ nguồn.
Bổ đề 24.1
Cho G = (V, E) là một đồ thị có trọng số có hướng với đỉnh nguồn s và hàm trọng số
w : E → R, và giả thiết G chứa những chu trình không âm mà có mà có đường đi được
từ S. Sau |V| - 1 bước lặp của vòng lặp for ở dòng 2-4 của hàm BELLMAN-FORD, ta
có d[v] = δ(s, v) cho tất cả đinh v mà có thể với tới được từ s.
Chứng minh: Chúng ta chứng tỏ bằng thuộc tính giảm bớt. Xem đỉnh v có đường đi được
từ s và giả sử p = v
0
, v
1
, , v
k
, nếu v
0
= s and v
k
= v , không tồn tại chu trình đường đi
ngắn nhất từ s tới v. Đường đi p có nhiều nhất là /V/-1 cạnh, nên k ≤ |V| - 1. Sau /V/ -1
bước lăp của vòng lặp for ở dòng 2-4 giảm bớt tất cả /E/ cạnh. Trong số các cạnh giảm đi
trong vòng lặp for i=1,2,… k là (v
i-1
, v
i
). Bằng thuộc tính giảm bớt d[v] = d[v
k
] = δ(s, v
k

)
= δ(s, v).
Hệ quả 24.3
Giả sử G = (V, E) là một đồ thị có trọng số có hướng với đỉnh nguồn s và hàm trọng số
w : E → R thì với mọi đỉnh v thuộc V có một đường đi từ s đến v khi và chỉ khi
d[v] < ∞ nếu nó liên tục trên G
Định lý 24.4 (Tính đúng đắn của thuật toán Bellman-Ford)
Bellman-Ford thực hiện trên đồ thị có trọng số có hướng G(V,E) với nguồn s và hàm
trọng số w : E → R. Nếu G chứa chu trình không âm có đường đi từ s thì giải thuật
trả về giá trị đúng, chúng ta có d[v] = δ(s, v) với mọi đỉnh v

V, đỉnh liền trước là
đồ thị con G
π
là một cây đường đi nhỏ nhất có gốc tại s. Nếu G chứa một chu trình âm
có đường đi từ s thì thuật toán trả về giá trị False.
Chứng minh: Gỉa thiết đồ thị G chứa những chu trình không âm mà có đường đi từ
nguồn s. Trước tiên d[v] = δ(s, v)với mọi đỉnh v

V .
9
Nếu đỉnh v có đường đi tới được từ s thì Bổ đề 24.2 chứng tỏ lập luận này. Nếu v
không có đường đi được từ s thì phát biểu sau từ thuộc tính không có đường đi. Vậy,
phát biểu được chứng minh. Thuộc tính đồ thị con cùng với phát biểu gợi ý rằng G
π
chính là cây đường đi ngắn nhất. Bây giờ ta dựa vào phát biểu đó để chứng tỏ rằng
BELLMAN-FORD trả về giá trị TRUE. Cuối cùng, chúng ta có tất cả các cạnh (u, v)

E
d[v] = δ(s, v)

≤ δ(s, u) + w(u, v) (bởi bất đẳng thức tam giác)
= d[u] + w(u, v),
và không có trường hợp nào trong số kiểm tra ở dòng 6 trả về giá trị FALSE, vì vậy nó
trả về giá trị TRUE.
Giả thiết là đồ thị G chứa một chu trình trọng số âm có đường đi được từ s, giả sử chu
trình này là c = v
0
, v
1
, , v
k
nếu v
0
= v
k
thì:
Giả thiết thuật toán Bellman trả về giá trị là True là mâu thuẩn. Vì vậy. d[v
i
] ≤ d[v
i-1
] +
w(v
i-1
, v
i
) for i = 1, 2, , k Tổng các trọng lượng khác nhau xung quanh chu trình c cho
ta
Khi v
0
= v

k
, mỗi đỉnh trong c xuất hiện chính xác một lần trong phép tính tổng

Vì vậy
Ngoài ra, trong hệ quả 24.3 d[v
i
] hữu hạn trong for i = 1, 2, , k. Vì vậy
Mâu thuẫn với sự (24.1). Chúng ta kết luận giải thuật Bellman trả về giá trị TRUE nếu đồ
thị G chứa chu trình không âm mà từ đỉnh nguồn có thể đi đến được và trả về giá trị
FALSE nếu ngược lại.
24.2 Đường đi ngắn nhất nguồn đơn trong đồ thị có hướng không có chu trình:
Bằng việc giảm bớt các cạnh của một đồ thị có hướng không có chu trình(directed acyclic
graph) G(V,E) gọi là dag mà các đỉnh sắp xếp tô pô, chúng ta có thể tính đường đi ngắn
10
nhất từ một nguồn đơn với chi phí Θ(V + E). Đường đi ngắn nhất luôn được xác định
trong đồ thị dag
Thuật toán bắt đầu bằng việc sắp xếp hình học tô pô(xem ở mục 22.4) để phân loại tuyến
tính trên các đỉnh. Nếu có một đường đi từ u đến v thì u đến trước v trong sắp xếp hình
học tôpô. Các đỉnh ta chỉ qua một lần trong sắp xếp hình học tôpô. Khi chúng ta xử lý mỗi
đỉnh, chúng tôi giảm bớt từng cạnh đi ra khỏi đỉnh đó
DAG-SHORTEST-PATHS(G, w, s)
1 topologically sort the vertices of G
2 INITIALIZE-SINGLE-SOURCE(G, s)
3 for each vertex u, taken in topologically sorted order
4 do for each vertex v

Adj[u]
5 do RELAX(u, v, w)
Chi phí hoạt động của giải thuật này dễ dàng để phân tích. Như trong Mục 22.4, sắp xếp
tôpô dòng 1 có thể được thực hiện trong Θ(V + E) phép toán. Gọi hàm ở dòng 2 tốn chi

phí Θ(V) Có một bước lặp các đỉnh trong vòng lặp for ở dòng 3-5. Duyệt từng đỉnh,
cạnh nào đi ra khỏi đỉnh đã được xác định 1 lần. Vì vậy tổng bước lặp /E/ trong vòng
lặp for tốn chi phí, (Ở đây chúng ta phân tích tổng hợp). Vì mỗi bước lặp trong vòng
lặp for tốn chi phí , tổng chi phí là Θ(V + E),. Đây là tuyến tính trong kích thức của một
danh sách kề của đồ thị.

Hình 24.5 Thể hiện giải thuật những đường đi ngắn nhất trong một đồ phi có hướng
không có chu trình. Đỉnh được sắp xếp hình học tôpô từ trái sang phải. Đỉnh nguồn là
S. Những giá trị d ở các đỉnh, các cạnh biểu diễn giá trị π . (a) Trường hợp trước vòng
lặp đầu tiên của dòng 3-5. (b)- Trường hợp sau khi lặp ở dòng 3-5. Các đỉnh được bôi
đen tiêp theo trong từng bước lặp đuợc dùng như u trong vòng lặp. Những giá trị thấy ở
phần ( G) Là những gía trị cuối cùng
Định lý sau đây cho thấy những thủ tục DAG-SHORTEST-PATHS tìm chính xác
đường đi ngắn nhất .
Định lý 24.5
Nếu một đồ thị có trọng số có hướng G=(V,E) có đỉnh nguồn s và không có chu trình thì
kết thúc của thủ tục DAG-SHORTEST-PATHS d[v] = δ(s, v) cho tất cả các đỉnh v

V
11
và đồ thị con G
π
đỉnh trược là cây đường đi ngắn nhất.
Chứng minh: Trước tiên, ta thấy d[v] = δ(s, v) với mọi đỉnh v

V. Nếu v không có
đường đi được từ s thì d[v] = δ(s, v) = ∞ bởi thuộc tính không có đường đi.
Bây giờ, giả sử rằng v có đường đi được từ s, đường đi ngắn nhất là p = v
0
, v

1
, , v
k
. khi
v
0
= s và v
k
= v Bởi vì chúng ta xử lý đỉnh theo cách sắp xếp tô pô, các cạnh trong p
được giảm bớt theo thứ tự (v
0
, v
1
), (v
1
, v
2
), , (v
k-1
, v
k
) Thuộc tính giảm bớt cho rằng
d[v
i
] = δ(s, v
i
) ở đỉnh cuối cùng for i = 0, 1, , k Kết luận, dựa vào thuộc tính đồ thị con ,
G
π
là cây đường đi ngắn nhất

Một ứng dụng hay của giải thuật mở rộng trong việc xác định đường đi trong phân tích
bảng đồ PERT chart
[2]
. Cạnh dùng để biểu diễn công việc cần thực hiện, trọng số của
cạnh biểu hiện thời gian đòi hỏi để thực hiện từng công việc. Nếu cạnh (u,v) nối với đỉnh
v và cạnh (v,x) là lá đỉnh v thì công việc (u,v) phải thực hiện trước công việc (v,x). Một
đường đi tới hạn là đường đi dài nhất của đồ thị dag tương ứng với thời gian lâu nhất để
thực hiện chuỗi công việc. Trọng số của đường đi tới hạn là thấp hơn trong tổng số để
thực hiện tất cả các công việc. Chúng ta có thể tìm một đường đi tới hạn bằng một cách
khác.
Đổi dấu tất cả các trọng số của cạnh và thực hiện DAG-SHORTEST-PATHS
Hoặc Thực hiện DAG-SHORTEST-PATHS bằng cách thay đổi "∞" bởi "-∞" trong
dòng 2 của DAG-SHORTEST-PATHS và ">" bởi "<" trong thủ tục RELAX.
24.3 Giải thuật Dijkstra
Giải thuật Dijkstra giải quyết những vấn đề về đường đi ngắn nhất nguồn đơn trên một
đồ thị có trọng số, có hướng G = (V, E) cho trường hợp mà các cạnh có trọng số không
âm. Vì vậy, trong phần này chúng ta giả thiết rằng w (u,v) >= 0 cho mỗi cạnh (u,v)


E. Chúng ta sẽ thấy với một sự thực thi tốt, thời gian hoạt động của giải thuật của giải
thuật Dijkstra thấp hơn giải thuật Bellman-Ford .
Giải thuật Dijkstra xây dựng một tập đỉnh S chứa độ dài đường đi nhắn nhất từ đỉnh
nguồn s đã được xác định. Giải thuật này dựa trên các bước lặp đỉnh u

V – S với ước
lượng đường đi ngắn nhất, thêm đỉnh u vào tập S, bỏ qua tất cả các cạnh không chứa u.
Trong giải thuật sau, chúng ta sử dụng một hàng đợi ưu tiên cực tiểu các đỉnh Q, được
gán bởi giá trị d.
DIJKSTRA(G, w, s)
1 INITIALIZE-SINGLE-SOURCE(G,w,s)

2 S ← Ø
3 Q ← V[G]
4 while Q ≠ Ø
5 do u ← EXTRACT-MIN(Q)
6 S ← S U {u}
7 for each vertex v

Adj[u]
8 do RELAX(u, v, w)
Giải thuật Dijkstra giảm bớt các cạnh như Hình 24.6. Dòng 1: thường thực hiện khởi tạo
giá trị của d và π , và dòng 2 khởi tạo S tới tập rỗng. Giải thuật xây dựng tập biến Q = V
– S bắt đầu ở mỗi bước lặp của vòng lặp while ở dòng 4-8. Dòng 3 Khởi tạo hàng đợi ưu
12
tiên cực tiểu Q để chứa mọi đỉnh trong V
Lúc này S= Ø, sau dòng 3 biến có giá trị True. Mỗi lần thực hiện vòng lặp while của dòng
4-8, một đỉnh u được lấy ra từ Q = V – S và thêm vào tập hợp S, do đó xây dựng biến.
(Lần đầu qua vòng lặp này u= s.) Vậy đỉnh u có ước lượng đường đi ngắn nhất nhỏ nhất
trong bất kỳ đỉnh nào trong V - S. Rồi ở dòng 7-8 giảm bớt mỗi cạnh đi ra khỏi u, cập
nhật ước lượng d[v] và đỉnh liền trước π[v] nếu đường đi ngắn nhất đến v có thể cải tiến
khi đi qua u. Dễ thấy các đỉnh đó không bao giờ được thêm vào Q sau dòng 3 và mỗi
đỉnh lấy ra từ Q và thêm vào S đúng 1 lần, vì vậy vòng lặp while ở dòng 4-8 lặp lại /V/
lần.
Hình 24.6: Thực hiện giải thuật Dijkstra. Nguồn S Là đỉnh cực trái, ước lượng giá trị
đường đi ngắn nhất xem trong các đỉnh, các cạnh bôi đen biểu diễn giá trị đỉnh trước.
Đỉnh bôi đen trong tập hợp S và đỉnh trắng trong hàng đợi ưu tiên cực tiểu Q=V-S,
(a)Trường hợp trước bước lặp đầu tiên của vòng lặp While ở dòng 4-8 Đỉnh bôi đen
có giá trị d cực tiểu và được lựa chọn như đỉnh u ở dòng 5. (b)- Trường hợp sau mỗi
bước lặp tiếp theo của vòng lặp while. Đỉnh bôi đen trong từng phần được chọn như
đỉnh u trong dòng 5 ở bước lặp sau. Gía trị d và π thấy ở phần f là giá trị cuối cùng
Bởi vì giải thuật Dijkstra luôn chọn đỉnh "nhẹ nhất" hay "gần nhất nhất" trong V –S để

thêm vào tập hợp S, nó sử dụng phương pháp tham lam
Phương pháp tham lam được mô tả chi tiết trong Chương 16, nhưng bạn không cần phải
đã đọc chương đó để hiểu giải thuật Dijkstra.
Phương pháp Tham lam không phải thường xuyên đưa ra những kết quả tối ưu nói
chung, trừ phi như định lý sau đây và kết quả của nó cho thấy thực ra giải thuật Dijkstra
tính toán những đường đi ngắn nhất. Kết quả là mỗi lần một đỉnh u thêm vào tập hợp S,
chúng ta có d[u] = δ(s, u).
Hình 24.7 Chứng minh Định lý 24.6. Tâp hợp S không rỗng khi thêm đỉnh u vào. Một
13
đường đi ngắn nhất p từ đỉnh nguồn s đến đỉnh u có thể phân chia thành s x y u
khi y là đỉnh đầu tiên trong đường đi không thuộc S và x thuộc S đến y trước. Đỉnh x và
y là hai đỉnh phân biệt nhưng chúng ta có thế cho s=x hoặc y=u. Đường đi p2 có thể
hoặc không thuộc tập hợp S
Định lý 24.6: (tính đúng đắn của giải thuật Dijkstra)
Giải thuật Dijkstra thực hiện trên một đồ thị có trọng số, có hướng G = (V, E) với hàm
trọng số không âm w và nguồn s, hoàn thành với d[u] = δ(s, v) với mọi đỉnh u thuộc V.
Chứng minh: Chúng ta dùng biến lặp sau
Bắt đầu từng bước của vòng lặp whileở dòng 4-8, d[v] = δ(s, v) cho mỗi đỉnh v

V
Trong mỗi đỉnh u

V, ta có d[u] = δ(s, u)khi u được thêm vào tập hợp S. Ta thấy d[u] =
δ(s, u), ta dựa vào thuộc tính cận trên để xem đẳng thức mỗi bước sau đó.
Khởi tao: khởi tạo S = Ø, giá trị biến thông thường
Xây dựng: Chúng ta xem trong mỗi bước lặp d[u] = δ(s, u) cho đỉnh đã thêm vào tập
hợp S. Kết quả của sự mâu thuẩn, cho u là đỉnh đầu tiên mà d[u] ≠ δ(s, u) khi nó đã
thêm vào tập hợp S. Chúng ta chú ý vào trường hợp bắt đầu của bước lặp ở vòng lặp
while khi u được thêm vào s và tìm ra sự mâu thuẫn là d[u] = δ(s, u) khi đó bằng cách
kiểm tra đường đi ngắn nhất từ s tới u. Chúng ta phải có u ≠s bởi vì s là đỉnh đầu tiên

thêm vào tập hợp S và d[s] = δ(s, s) = 0. Vì u ≠ s ta có S ≠ Ø khi u thêm vào S. Có một
số đường đi từ s tới u , mặt khác d[u] = δ(s, u) = ∞ bởi thuộc tính không có đường đi, trái
với giả thiết . Vì trong số đường đi, có đường đi ngắn nhất p từ s tới u. Ưu tiên thêm u
vào S, đường đi p nối một đỉnh trong S là s đến một đỉnh trong V-S là u. Ta coi đỉnh đầu
tiên y tiến về p như là y

V-S, và cho x

S là đỉnh trước của y. Vì vậy xem trong hình
24.7 đường đi p có thể phân thành(đương đi p1 hoặc p2 có thể không có các cạnh) .
Chúng ta phát biểu rằng d[y] = δ(s, y) khi u đã thêm vào S. Để chứng minh phát biểu
này, để ý rằng x

S . Nên vì u đã được chọn như là đỉnh đầu tiên mà d[u] ≠ δ(s, u) khi
nó đã được thêm vào S , ta có d[x] = δ(s, x) khi x đã được thêm vào S. Lúc này cạnh
(x,y) được bỏ đi, phát biểu sau dựa vào thuộc tính hội tụ.
Bây giờ chúng ta có thể dùng sự mâu thuẫn để chứng minh rằng d[u] = δ(s, u). Bởi vì y
xuất hiện trước u trong đường đi ngắn nhất từ s tới u và tất cả các trọng số của cạnh
không âm (đặc biệt là trong đường đi p2), chúng ta có δ(s, y) ≤ δ(s, u) và vì vậy
d[y] = δ(s, y)
≤ δ(s, u)
= d[u] (bởi thuộc tính cận trên)
Nhưng vì hai đỉnh u và y nằm trong V-S khi u được chon ở dòng 5, ta có d[u] ≤ d[y]. Vì
vậy có sự khác nhau của trong trong đảng thức:
d[y] = δ(s, y) = δ(s, u) = d[u].
Vì vậy d[u] = δ(s, u) mâu thuẩn với sự lựa chon u.Chúng ta kết luận rằng d[u] = δ(s, u)
khi u đã được thêm vào S và đẳng thức đúng.
Kết luận: Q = Ø với biến băt đầu với Q=V-S, gợi ý S=V. Vì vậy d[u] = δ(s, u) cho tất
cả các đỉnh u


V
Hệ quả 24.7
Nếu thực hiện giải thuật Dijkstra trên đồ thị trọng số có hướng G=(V,E) với hàm tọng
14
số không âm w và nguồn s thì cuối cùng đỉnh trước đồ thị con G
π
là cây đường đi
ngắn nhất có gốc tại đỉnh s.
Chứng minh:Trực tiếp từ Định lý 24.6 và thuộc tính đỉnh trước đồ thị con.
Phân tích:
Tốc độ thực hiện của giải thuật Dijkstra như thế nào? Nó xây dựng hàng đợi ưu tiên
Q bằng cách gọi 3 hoạt động: INSERT(dòng 3), EXTRACT-MIN (dòng 5)
DECREASE-KEY(trong RELAX được gọi ở dòng 8)INSERT gọi một đỉnh như là
EXTRACT-MIN. Vì mỗi đỉnh v

V được thêm vào S một lần, mỗi đỉnh trong danh
sách kề Adj[v] được kiểm tra trong vòng lặp for ở dòng 7-8 một lần suốt tiến trình của
giải thuật. Khi tổng số cạnh trong danh sách kề là /E/ , có một tổng bước lặp /E/ của
vòng lặp for và vì vậy tổng lớn nhất /E/ DECREASE-KEY(chúng ta đang dùng phân
tích tổng hợp) Chi phí của giải thuật Dijkstra phụ thuộc vào hàng đợi ưu tiên cực tiểu
chúng ta đã bổ sung như thế nào. Xem xét trường hợp đầu tiên chúng ta duy trì hàng đợi
ưu tiên bằng cách lấy dễ dàng các đỉnh từ 1 đến /V/ . Ta có thể lưu d[v] vào bảng ghi thứ
y của một mảng. Mỗi hàm INSERT và DECREASE-KEY tốn chi phí O(1), mỗi
EXTRACTMIN tốn chi phí O(V) (khi dúng ta duyệt bảng ghi mảng )tổng chi phí
O(V
2
+E) = O(V
2
).
Nếu đồ thị là đầy đủ E = o(V

2
/ lg V)-thực hiện đầy đủ hàng đợi ưu tiên cực tiểu với cấu
trúc đống cực tiểu nhị phân(mô tả ở mục 6.5 một sự bổ sung quan trọng là các đỉnh trong
đống phải với các đỉnh khác )Mỗi EXTRACT-MIN tốn chi phí O(lg V) Trước đó có
/V/ hoạt động. Lần này xây dựng một nhị phân cực tiểu là O(V) Mỗi DECREASE-KEY
tốn chi phí O(lg V) , có lớn nhất là /E/ hoạt động. Vì vậy tổng chi phí hoạt động là O((V
+ E) lg V) mà O(E lg V) nếu tất cả các đỉnh có đường đi được từ nguồn. Chi phí này
được cải thiện thành O(V
2
)- bổ sung nếu E = o(V
2
/ lg V).
Thự tế chúng ta có thể đặt được chi phí O(V lg V + E) bởi cải tiến hàng đợi ưu tiên với
dãy Fibonacci(chương 20) . Để lại cho mỗi hoạt động EXTRACT-MIN là O(lg V) và
mỗi lần gọi DECREASE-KEY, có lớn nhất /E/, chỉ lấy O(1). Lịch sử đã phát triển
Fibonacci làm sự thúc đẩy cho giải thuật Dijkstra là cổ điển gọi DECREASE-KEY hơn
là EXTRACT-MIN vì vậy một vài phương thức giảm chi phí hoạt động DECREASE-
KEY đến o(lg V) không tăng thời gian của EXTRACT-MIN sẽ đem lại sự thực hiện
nhanh hơn với cấu trúc đống
Giải thuật Dijkstra tương tự duyệt theo chiều rộng (xem Mục 22.2) và thuật toán Prim
tìm cây khung nhỏ nhất(xem Mục 23.2). Trong tập hợp S nó duyệt theo chiều rộng đến
tập hợp đỉnh màu đen như đỉnh trong tập hợp S có độ dài đường đi ngắn nhất chỉ vì thế
đỉnh màu đen trong duyệt theo chiều rộng có khoảng cách đúng. Giải thuật Dijkstra
giống như giải thuật Prim vì cả hai đều sử dụng hàng đợi ưu tiên để tìm đỉnh nhẹ nhất
bên ngoài tập hợp(tập hợp trong giải thuật Dijkstra và cây mở rộng trong giải thuật
Prim)thêm đỉnh này vào tập hợp và điều chỉnh lại trọng số của đỉnh bên ngoài tập hợp
cho phù hợp.
15
Bài tập 24.3
Bài tập 24.3-1

Chạy thuật toán Dijkstra trên đồ thị có hướng hình 24.2, đầu tiên lấy đỉnh s làm
nguồn và sau đó sử dụng đỉnh z như là nguồn. Trong kiểu của hình 24.6 biểu diễn
những giá trị d và và các đỉnh trong tập S sau mỗi bước lặp của vòng lặp While.
Bài tập 24.3-2
Đưa một ví dụ đơn giản của đồ thị có hướng với những cạnh trọng số âm cho thuật
toán Dijkstra nào đưa ra những câu trả lời sai. Tại sao phần chứng minh của định lý
24.6 không kiểm tra khi những cạnh trọng số âm được cho phép ?
Bài tập 24.3-3
Giả sử ta thay đổi dòng 4 của thuật toán Dijkstra như sau :
4 while |Q| > 1
Sự thay đổi này làm cho vòng lặp While thực |V | - 1 lần thay vì |V | lần .Có phải thuật
toán đã đề xuất là đúng ?
Bài tập 24.3-4
Cho một đồ thị có hướng G=(V,E) trên mỗi cạnh (u,v)

E có có thêm giá trị r(u,v), là
một số thực trong phạm vi 0 ≤ r(u, v) ≤ 1 biểu diễn độ tin cậy của của đường đi từ
đỉnh u tới đỉnh v . Chúng ta giải thích r(u,v) như là xác suất mà đường đi từ u đến v sẽ
hỏng. chúng ta giả sử rằng những xác suất này là độc lập. Đưa ra một thuật toán hiệu
quả để tìm một đường tin cậy nhất giữa 2 đỉnh đã cho.
Bài tập 24.3-5
Cho đồ thị G=(V,E) đồ thị có hướng có trọng số với hàm trọng số w:E →{ 1,2 W }
cho một vài số nguyên dương W, và giả sử rằng không có 2 đỉnh có cùng trọng số
đường đi ngắn nhất từ nguồn đỉnh s. Bây giờ giả sử chúng ta định nghĩa một đồ thị có
hướng không trọng số G’= ( V

V’ , E’) bởi thây thế mỗi cạnh (u,v)

E với những
cạnh trọng số riêng w(u,v) trong tập cạnh. G’ có bao nhiêu đỉnh? Bây giờ giả sử

chúng ta chạy một thuật toán tìm kiếm theo chiều rộng trên G’. Chỉ ra thứ tự những
đỉnh nào trong V được tô màu đen trong thuật toán tìm kiếm theo chiều rộng của G’
cùng thứ tự với những đỉnh của V đã được trích ra từ hàng đợi ưu tiên trong dòng 5
của thuật toán DIJKSTRA khi chạy trên G.
Bài tập 24.3-6
Cho G=(V,E) là độ thị có hướng có trọng số với hàm trọng số w: E →{ 1,2 W }
cho vài số tự nhiên W. Sửa thuật toán DIJKSTRA để tính những đường đi ngắn nhất
từ một đỉnh đã cho s trong O(W V + E) thời gian .
Bài tập 24.3-7
Sửa thuật toán bài Bài tập 24.3-6 chạy trong O((V + E) lg W ) thời gian
16
24.4 Những ràng buộc hiệu và những đường đi ngắn nhất (Difference constraints
and shortest paths)
Chương 29 học về bài toán quy hoạch tuyến tính tổng quát, trong đó chúng ta muốn
tối ưu hóa một đối tượng hàm tuyến tính thành một tập hợp những bất đẳng thức
tuyến tính. Trong phần này, chúng ta khảo sát một trường hợp đặc biệt của quy hoạch
tuyến tính mà có thể được quy về để tìm những đường đi ngắn nhất từ một nguồn
đơn. Vấn đề những đường đi ngắn nhất nguồn đơn là kết quả có thể được giải quyết
bằng sử dụng thuật toán Bellman-Ford, bằng cách ấy cũng giải quyết vấn đề quy
hoạch tuyến tính.
Quy hoạch tuyến tính
Trong bài toán quy hoạch tuyến tính tổng quát, cho một ma trận A ( mxn), một m-
vector b và một n-vector c. Chúng ta muốn tìm thấy một vector x của n những phần tử
mà làm cực đại hàm mục tiêu tới m ràng buộc đã cho bởi Ax ≤ b.
Mặc dù thuật toán đơn hình là trọng tâm của chương 29 , những đa thức không phải
thường xuyên chạy đúng lúc đó trong kích thước dữ liệu nhập vào. Có một vài lý do
đó là quan trọng hiểu việc thiết lập của những vấn đề quy hoạch tuyến tính. Đầu tiên,
việc nhận biết một bài toán đã cho có thể là một bài toán lập trình tuyến tính có kích
thước đa thức sẽ ngay lập tức có nghĩa rằng có một thuật toán thời gian đa thức cho
bài toán đó. Thứ hai, có nhiều trường hợp lập trình tuyến tính đặc biệt có thể được

giải quyết bằng các thuật toán nhanh hơn. Ví dụ, như đã trình bày trong phần này, bài
toán đường đi ngắn nhất nguồn đơn là một trường hợp đặc biệt của lập trình tuyến
tính. Các bài toán có tính chất như bài toán lập trình bao gồm bài toán đường đi ngắn
nhất đơn cặp (bài tập 24.4-4) và bài toán luồng cực đại (bài tập 26.1-8)
Thỉnh thoảng chúng ta không thật sự quan tâm về hàm mục tiêu, chúng ta chỉ muốn
tìm một vài giải pháp khả thi, đó là, bất kỳ vector x mà thỏa mãn Ax ≤ b, hoặc quyết
định không có giải pháp khả thi nào tồn tại. Chúng sẽ nhấn mạnh vào vấn đề khả thi.
Hệ thống những ràng buộc hiệu (Systems of difference constraints)
Trong một hệ thống những ràng buộc hiệu, mỗi dòng của ma trận quy hoạch tuyến
tính A chứa một số 1 và một số -1, và tất cả các trường khác của A là 0. Vì vậy
những ràng buộc đã đưa Ax ≤ b là một tập hợp của m ràng buộc hiệu liên quan đến
n ẩn. trong đó mỗi ràng buộc là một bất đẳng thức tuyến tính đơn giản của mẫu
X
j
– x
I
≤ b
k
,
với 1 ≤ i, j ≤ n và 1 ≤ k ≤ m.
Ví dụ, xét bài toán của việc tìm kiếm 5- vector x= ( x
i
) thỏa mãn
17
Bài toán này tương đương với tìm ẩn số dương đối với i=1,2,…,5, như là 8 ràng buộc
hiệu sau là thỏa mãn :
(24.3) x
1
–x
2

≤ 0
(24.4) x
1
–x
5
≤ -1,
(24.5) x
2
–x
5
≤ 1,
(24.6) x
3
–x
1
≤ 5 ,
(24.7) x
4
–x
1
≤ 4,
(24.8) x
4
–x
3
≤ -1,
(24.9) x
5
–x
3

≤ -3,
(24.10) x
5
–x
4
≤ -3,
Một nghiệm của bài toán này là x =( -5,-3,0,-1,-4), vì có thể được kiểm tra trực tiếp
bởi kiểm tra từng bất đẳng thức. Thật ra, có nhiều hơn một nghiệm cho bài toán này.
Một nghiệm khác là x

=(0,2,5,4,1). Hai nghiệm này là liên quan: mỗi thành phần của
x

lớn hơn thành phần tương ứng của x. sự thật điều này không chỉ là sự trùng hợp.
Bổ đề 24.8
Cho x=(x
1,
x
2, …,
x
n)
là một nghiệm của một hệ thống Ax ≤ b của những ràng buộc
hiệu, và cho d là một hằng số bất kỳ. Thì x+d = (x
1
+d
,
x
2
+d
, …,

x
n
+d
)
cũng là một
nghiệm của Ax ≤ b.
Bằng chứng đối mỗi x
i
và x
j
, chúng ta có (x
j
+d) – (x
i
+d) = x
j
-x
i.
Vì vậy, nếu x thỏa
mãn Ax ≤ b, thì x+d thỏa mãn.
Những hệ thống của nhữn ràng buộc hiệu xảy ra trong nhiều ứng dụng khác nhau. Ví
dụ, ẩn số x
i
có thể là số lần mà những sự kiện xảy ra. Mỗi ràng buộc có thể xem như
trạng thái mà phải có ít nhất một vài lần, hoặc nhiều nhất một, giữa 2 sự kiện. có lẽ
những sự kiện là những công việc được thực hiện trong suốt quá trình lắp ráp của
một sản phẩm. Nếu chúng ta gắn một chất dính mà mất 2 giờ để thiết lập tại thời gian
x
1
và chúng ta phải đợi đến khi nó thiết lập để cài đặt một phần tại thời gian x

2
, thì
chúng ta có ràng buộc x
2
≥x
1
+2 hoặc, tương đương là x
1
– x
2
≤ -2 . chúng ta có thể yêu
cầu rằng phần được cài đặt sau khi chất kết dính được gắn nhưng không chậm hơn
thời gian mà chất dính đã thiết lập nửa chừng. trong trường hợp này, chúng ta lấy cặp
ràng buộc x
2
≥x
1
và x
2
≤ x
1
+1, hoặc tương đương, x
1
– x
2
≤ 0 và x
2
-x
1
≤ 1.

Đồ thị ràng buộc
Biên dịch những hệ thống ràng buộc hiệu từ một điểm quan sát của lý thuyết đồ thị là
có lợi. Sáng kiến cho rằng trong một hệ thống Ax ≤ b của những ràng buộc hiệu, m x
n quy hoạch tuyến tính của ma trận A có thể thấy như là sự chuyển vị của một ma trận
liên thuộc ( xem bài 22.1-7) đối với một đồ thị với n đỉnh và m cạnh. Mỗi đỉnh v
i
18
trong đồ thị, cho i = 1,2,…,n, tương ứng với một trong n biến ẩn x
i
. Mỗi cạnh trực tiếp
tương ứng với một trong những m bất đẳng thức liên quan tới 2 ẩn.
Chính thức hơn, cho một hệ thống Ax ≤ b của những ràng buộc hiệu, tương đương đồ
thị ràng buộc là một đồ thị có hướng có trọng số G=(V,E), trong đó
V = {v
0
, v
1
, , v
n
}

E = {(v
i
, v
j
) : x
j
– x
i
≤ b

k
là một hằng số} {(v
0
, v
1
), (v
0
, v
2
), (v
0
, v
3
), , (v
0
, v
n
)} .
Thêm đỉnh v
0
vào, chúng ta sẽ thấy ngay , để đảm bảo rằng mọi đỉnh khác có thể đạt
đến từ đỉnh đó. Vì vậy, tập hợp đỉnh V của một đỉnh v
i
đối với một ẩn x
i
, cộng thêm
một đỉnh v
0
. Tập cạnh E chứa một cạnh cho một ràng buộc hiệu, cộng một cạnh
( v

0
,v
i
) đối với mỗi ẩn x
i
. nếu x
j
–x
i
≤ b
k
là một ràng buộc hiệu, thì trọng số của cạnh
(v
i
,v
j)
là w(v
i
,v
j
)=b
k
. Trọng số của mỗi cạnh rời khỏi v
0
là 0. Hình 24.8 chỉ đồ thị ràng
buộc cho hệ thống (24.3) –(24.10) của những ràng buộc hiệu.
Hình 24.8: đồ thị ràng buộc tương ứng của hệ thống (24.3)-(24.10) của những ràng
buộc hiệu. giá trị của
δ
(v

0
,v
i
) được chỉ ra trên mỗi đỉnh v
i
. Một nghiệm khả thi của
hệ thống là x=(-5,-3,0,-1,-4).
Định lý 24.9
Cho một hệ thống Ax ≤ b của những ràng buộc hiệu, cho G=(V,E) là đồ thị ràng buộc
tương ứng. Nếu G không chứa chu kỳ trọng số âm , thì
(24.11) x = (
δ
(v
0
,v
1
),
δ
(v
0
,v
2
),
δ
(v
0
,v
3
), ….,
δ

(v
0
,v
n
)) là một nghiệm khả thi cho hệ
thống. Nếu G chứa một chu kỳ trọng số âm, thi không có nghiệm khả thi cho hệ
thống.
Bằng chứng chúng ta chỉ ra đầu tiên là nếu đồ thị ràng buộc không chứa những vòng
trọng số âm, thì phương trình (24.11) cho một nghiệm khả thi. Xét bất kỳ cạnh j( v
i
,v
j
)

E. Bởi bất đẳng thức tam giác,
δ
(v
0
,v
j
) ≤
δ
(v
0
,v
i
) + w (v
i
,v
i

) hoặc, tương ứng
δ
(v
0
,v
j
) -
δ
(v
0
,v
i
) ≤ w (v
i
,v
i
). vì vậy, cho x
i
=
δ
(v
0
,v
i
) và x
j
=
δ
(v
0

,v
j
) thỏa mãn ràng
buộc hiệu x
j
– x
i
≤ w(v
i
,v
j
) tương ứng với cạnh ( v
i
,v
j
).
Bây giờ chúng ta chỉ ra rằng nếu đồ thị ràng buộc chứa một chu kỳ trọng số âm, thì hệ
thống của những ràng buộc hiệu không có nghiệm khả thi. Mà không mất tính tổng
quát, cho chu kỳ trọng số âm là c= ( v
1
, v
2
, …, v
k
), với v
1
=v
k
. ( đỉnh v
0

không trong
chu trình c, bởi vì nó không có những cạnh đi vào ). Chu trình c tương ứng với những
ràng buộc hiệu sau:
X
2
-x
1
≤ w(v
1
,v
2
),
X
3
-x
2

w(v
2
,v
3
),


19
X
k
-x
k-1
≤ w(v

k-1
,v
k
),
X
1
-x
k
≤ w(v
k
,v
1
).
Giả sử rằng có một nghiệm đối với x thỏa mãn mỗi bất đẳng thức của k bất đẳng thức.
Nghiệm này cũng phải thỏa mãn bất mà những kết quả khi chúng ta cộng k bất đẳng
thức với nhau. Nếu chúng ta cộng hết vế trái, mỗi ẩn x
i
được thêm vào một và được
trừ đi một, vì vậy vế trái của tổng là 0. Những tổng vế phải với w(c), và do vậy chúng
ta thu được 0 ≤ w(c). Nhưng vì c làm một chu kỳ trọng số âm, w(c) < 0, và chúng ta
thu được mâu thuẫn 0 ≤ w(0) <0.
Giải quyết những hệ thống của những ràng buộc hiệu
Định lý 24.9 nói rằng chúng ta có thể sử dụng thuật toán Bellman-Ford để giải quyết
một hệ thống của những ràng buộc hiệu. Bởi vì có những cạnh từ đỉnh nguồn v
0
tới
tất cả những đỉnh khác trong đồ thị ràng buộc, bất kỳ chu kỳ trọng số âm nào trong đồ
thị ràng buộc có thể đến được từ v
0
. Nếu thuật toán Bellman-Ford trả về TRUE,

thì những trọng số của đường đi ngắn cho một nghiệm khả thi đối với hệ thống.
Trong hình 24.8, ví dụ, những trọng số của đường đi ngắn nhất cung cấp một nghiệm
khả thi x =(-5,-3,0,-1,-4), và bởi bổ đề 24.8, x = (d-5,d-3,d,d-1,d-4) cũng là một
nghiệm khả thi cho bất kỳ hằng số d nào. Nếu thuật toán Bellman-Ford trả về FALSE,
không có nghiệm khả thi nào đối với hệ thống những ràng buộc hiệu.
Một hệ thống của những ràng buộc hiệu với m ràng buộc trên n ẩn tạo ra một đồ thị
với n+1 đỉnh và n+m cạnh. Do đó, sử dụng thuật toán Bellman-Ford, chúng ta có thể
giải quyết hệ thống trong O ( (n+1)(n+m)) = O(n
2
+nm) thời gian. Bài tập 24.4-5 đề
nghị bạn sửa đổi thuật toán để chạy trong O(nm) thời gian, thậm chí nếu m là nhỏ hơn
n.
20
Bài tập 24.4
Bài tập 24.4-1
Tìm một nghiệm khả thi hoặc quyết định không có nghiệm khả thi tồn tại đối với hệ
thống những ràng buộc hiệu sau:
X
1
-x
2
≤ 1,
X
1
-x
4
≤ -4,
X
2
-x

3
≤ 2,
X
2
-x
5
≤ 7,
X
2
-x
6
≤ 5,
X
3
-x
6
≤ 10,
,
X
4
-x
2
≤ 2,
X
5
-x
1
≤ -1,
X
5

-x
4
≤ 3,
X
6
-x
3
≤ -8,
Bài tập 24.4-2
Tìm một nghiệm khả thi hoặc quyết định không có nghiệm khả thi tồn tại đối với hệ
thống những ràng buộc hiệu sau:
X
1
-x
2
≤ 4,
X
1
-x
5
≤ 5,
X
2
-x
4
≤ -6,
X
3
-x
2

≤ 1,
X
4
-x
3
≤ 5,
X
4
-x
5
≤ 10,
,
X
5
-x
3
≤ -4,
X
5
-x
4
≤ -8,
Bài 24.4-3
Trọng số đường đi ngắn nhất từ đỉnh mới v
0
trong đồ thị ràng buộc có thể dương
không? Giải thích.
Bài 24.4-4
Biểu diễn bài toán đường đi ngắn nhất cặp đơn như một quy hoạch tuyến tính.
Bài toán 24 5

Chỉ ra cách làm sửa đổi nhỏ cho thuật toán Bellman-Ford để khi nó được sử dụng để
giải quyết một hệ thống ràng buộc hiệu với m bất đẳng thức trên n ẩn, thời gian chạy
là O(nm).
Bài tập 24.4-6
21
Giả sử rằng thêm vào một hệ thống những ràng buộc hiệu, chúng ta muốn giải quyết
những ràng buộc bất đẳng thức của x
i
= x
j
+ b
k
. Chỉ ra làm thế nào thuật toán
Bellman-Ford có thể được chấp nhận để giải loại bài toán hệ thống ràng buộc.
Bài tập 24.4-7
Chỉ cách làm thế nào một hệ thống những ràng buộc hiệu có thể được giải quyết bới
một thuật toán giống thuật toán Bellman-Ford mà chạy trên đồ thị ràng buộc mà
không có đỉnh ngoài v
0
Bài tập 24.4-8
Cho Ax ≤ b là một hệ thống của m ràng buộc hiệu trong n ẩn. chỉ ra rằng thuật toán
Bellman-Ford , khi chạy trên đồ thị ràng buộc tương ứng, tăng tối đa

=
n
i
xi
1
cho
Ax ≤ b và x

i
≤ cho tất cả x
i
.
Bài tập 24.4-9
Chỉ ra rằng thuật toán Bellman-Ford, khi chạy trên đồ thị ràng buộc cho một hệ thống
Ax ≤ b của những ràng buộc hiệu, cực tiểu hóa số lượng (max {x
i
} – min {x
i
})
subject tới Ax ≤ b. Giải thích làm thế nào để khai thác trong thực tế này nếu thuật
toán được sử dụng để sắp lịch công việc trong xây dựng.
Bài tập 24.4-10
Giả sử rằng mọi hàng trong ma trận A của một quy hoạch tuyến tính Ax

b tương
tứng một ràng buộc hiệu, một ràng buộc biến đơn của x
i

b
k
hoặc một ràng buộc biến
đơn của –x
i

b
k.
Chỉ cách làm thế nào để thích ghi thuật toán Bellman-Ford để giả
loại hệ thống ràng buộc này.

Bài tập 24.4-11
Đưa ra một thuật toán hiệu quả để giải một hệ thống Ax

b củaràng buộc hiệu khi tất
cả các yếu tố của b là giá trị thực và tất cả những ẩn x
i
phải là những số nguyên.
22
24.5 Những chứng minh của những đặc tính của đường đi ngắn nhất
Trong toàn bộ chương này, những tham số đúng của chúng ta đã dựa trên bất đẳng
thức tam giác, thuộc tính cận riêng, thuộc tính không đường đi ( no-path), thuộc tính
đồng quy, thuộc tính giảm bớt đường đi (path-relaxation) và thuộc tính đồ thị con của
các đỉnh cha (predecessor-subgraph). Chúng ta bắt đầu những thuộc tính này mà ko
cần dẫn chứng tại đoạn đầu của chương này. Trong phần này, chúng ta chứng minh lại
chúng.
Bất đẳng thức tam giác
Trong phần tìm kiếm theo chiều rộng ( phần 22.2), chúng ta đã chứng minh như bổ đề
22.1 một thuộc tính đơn giản của những khoảng cách ngắn nhất trong những đồ thị
không trọng số. Bất đẳng thức tam giác tổng quát hóa đặc tính đến những đồ thị trọng
số.
Bổ đề 24.10 ( bất đẳng thức tam giác)
Cho đồ thị G=(V,E) là một đồ thị có hướng có trọng số với hàm trọng số w: E→ R
và nguồn đỉnh s. sau đó, đối với tất cả các cạnh (u,v)

E, chúng ta có
δ
(s, v) ≤
δ
(s, u) + w(u, v).
Dẫn chứng giả sử rằng có một đường đi ngắn nhất p từ nguồn s tới đỉnh v. Thì p

không có nhiều trọng số hơn bất kỳ đường nào khác từ s tới v. Rõ ràng, đường p
không có nhiều trọng số hơn đường đặc biệt mà có đường đi ngắn nhất từ đỉnh s tới
đỉnh u và có cạnh (u,v).
Những ảnh hưởng của việc giảm bớt trên những ước tính đường đi ngắn nhất
Nhóm bổ đề tiếp theo mô tả làm cách nào để những ước tính đường đi ngắn nhất có
ảnh hưởng khi chúng ta thực thi một chuỗi các bước giảm bớt trên những cạnh của
một đồ thị có hướng có trọng số mà được khỏi tạo bởi INITIALIZE-SINGLE-
SOURCE.
Bổ đề 24.11 ( Thuộc tính cận trên )
cho đồ thị có hướng, có trọng số G=(V,E) với hàm trọng số w : E → R. cho V là đỉnh
nguồn, và cho đồ thị được khởi tạo bởi INITIALIZE-SINGLE-SOURCE(G, s). Thì
d[v]≥
δ
(s,v) đối với tất cả v

V, và bất biến này được duy trì trên mọi dãy các bước
giảm bớt trên các cạnh của G. Ngoài ra, đôi khi d[v] đạt được cận dưới
δ
(s,v), nó
không bao giờ thay đổi.
Chứng minh chúng ta chứng minh bất biến d[v]≥
δ
(s,v) đối với tất cả các đỉnh v

V
bằng phép quy nạp trên trên một số bước giảm bớt.
Về cơ bản, d[v] ≥
δ
(s,v) chắc chắn đúng sau khi khởi tạo, từ đó d[s] =0 ≥
δ

(s,s)
( chú ý rằng
δ
(s,s) là -∞ nếu s ở trên một chu kỳ trọng số âm) và d[v] = ∞ kéo theo
d[v] ≥
δ
(s,v) đối với tất cả v

V-{s}.
Đối với bước quy nạp, xét việc nới lỏng một cạnh (u, v). Bằng giả thiết quy nạp, d[x]

δ
(s,v) đối với tất cả x

V trước việc giảm bớt cạnh( relaxation ). Chỉ giá trị d có
thể thay đổi là d[v]. Nếu nó thay đổi, chúng ta có và vì vậy bất biến được duy trì.
d[v] = d[u] + w(u, v)
23
≥ (s, u) + w(u, v) ( bởi giả thiết quy nạp )

δ
(s,v) ( bởi bất đẳng thức tam giác )
Để thấy rằng giá trị của d[v] không bao giờ thay đổi đôi khi d[v]=
δ
(s,v), lưu ý rằng
khi đang đạt được cận dưới của nó, d[v] không thể giảm bởi vì chúng ta vừa chỉ ra
rằng d[v] ≥
δ
(s,v), và nó không thể tăng bởi vì các bước giảm bớt cạnh (relaxation
steps ) không tăng d giá trị.

Hệ quả 24.12 ( đặc tính No-path )
Giả sử rằng trong một đồ thị có hướng có trọng số G=(V,E) với hàm trọng số w:
E→R , không có đường nào kết nối một đỉnh nguồn s

V tới một đỉnh v

V
đã cho . Sau khi đồ thị được khởi tạo bởi INITIALIZE-SINGLE-SOURCE(G, s),
chúng ta có d[v] =
δ
(s,v) =∞ , và đẳng thức này được duy trì như một bất biến trên
bất kỳ chuỗi các bước giảm bớt trên những cạnh của G.
Chứng minh bởi đặc tính cận dưới, chúng ta luôn có ∞=
δ
(s,v) ≤ d[v], và vì thế d[v]
=∞=
δ
(s,v).
Bổ đề 24.13
Cho G=(V,E) là một đồ thị có hướng có trọng số với hàm trọng số w : E → R , và
cho (u,v)

E. Thì, ngay sau khi giảm bớt cạnh (u,v) bởi thực thi RELAX(u,v,w) ,
chúng ta có d[v] ≤ d[u] + w(u,v).
Chứng minh Nếu, chỉ trước khi giảm bớt cạnh (u,v), chúng ta có d[v] > d[u]
+w(u,v), thì sau đấy d[v] =d[u] + w(u,v). Nếu, thay vì, d[v] ≤ d[u] + w(u,v) chỉ trước
khi giảm bớt, thì không phải d[u] cũng không phải d[v] thay đổi, và vì vậy sau đó
d[v] ≤ d[u] + w (u,v).
Bổ đề 24.14: ( thuộc tính hội tụ )
Cho G=(V,E) là một đồ thị có hướng có trọng số với hàm trọng số w : E → R , cho s


V là một đỉnh nguồn, và cho s ~u → v là một đường đi ngắn nhất trong G đối với
một số đỉnh u,v

V. Giả sử rằng G được khởi tạo bởi INITIALIZE-SINGLE-
SOURCE(G, s) và thì một chuỗi các bước giảm bớt cạnh bao gồm việc gọi
RELAX(u,v,w) được thực thi trên những cạnh của G. Nếu d[u] =
δ
(s,u) tại bất kỳ
thời điểm nào trước khi gọi, thì d[v] =
δ
(s,v) tại tất cả thời gian sau khi gọi.
Chứng minh bằng thuộc tính cận trên, nếu d[u] =
δ
(s,u) tại một vài điểm trước khi
giảm bớt cạnh (u,v), thì đẳng thức giữ sau này. Đặc biệt, sau khi bớt cạnh (u,v), chúng
ta có
d[v] ≤d[u] + w(u, v) (bởi bổ đề 24.13)
=
δ
(s, u) + w(u, v)
=
δ
(s, v) (bởi bổ đề 24.1)
Bằng thuộc tính cận trên, d[v] ≥
δ
( s,v), từ đó chúng ta kết luận rằng d[v] =
δ
(s,v)
và đẳng thức này được duy trì sau đó.

Bổ đề 24.15 Thuộc tính giảm bớt đường đi (path-relaxation)
Cho G=(V,E) là một đồ thị có hướng có trọng số với hàm trọng số w : E → R , và
cho s

V là một đỉnh nguồn này. Xét bất kỳ đường đi ngắn nhất p= (v
0
, v
1,
… ,
v
v
k
)
24
từ s=v
0
tới v
k
. Nếu G được tạo bởi INITIALIZE-SINGLE-SOURCE(G, s) và sau đó
một chuỗi các bước giảm bớt xảy ra, theo thứ tự việc bớt các cạnh (v
0
,v
1
), (v
1
,v
2
), … ,
(v
k-1

,v
k
), thì d[v
k
] =
δ
( s,v
k
) sau khi giảm bớt những cạnh này và tại tất cả thời gian
sau đó. Thuộc tính này được thỏa mà không phụ thuộc vào việc các quá trình giảm
bớt cạnh nào xảy ra, bao gồm các quá trình giảm bớt cạnh có giao với các quá trình
giảm bớt cạnh của p
Chứng minh : chúng ta chỉ ra bằng quy nạp sau cạnh thứ i của đường đi p được giảm
bớt, chúng ta có d[v
i
] =
δ
( s,v
i
) . Ban đầu , i=0, và trước khi bắt kỳ cạnh nào của p
được bớt đi, chúng ta có có từ việc khởi tạo d[v
0
] =d[s] =0 =
δ
( s,s). Bằng thuộc tính
cận trên, giá trị của d[s] không bao giờ thay đổi sau khi khởi tạo.
Đối với bước quy nạp, chúng ta giả thiết rằng d[v
i-1
] =
δ

( s,v
i-1
) , và chúng ta kiểm
tra việc giảm bớt cạnh ( v
i-1
,v
i
). Bằng thuộc tính hội tụ, sau việc giảm bớt này, chúng
ta có d[v
i
] =
δ
( s,v
i
), và đắng thức này được duy trì tất cả thừoi gian sau đó.
Việc giảm bớt và những cây đường đi ngắn nhất
Chúng ta chỉ ra rằng một lần nữa một chuỗi các giảm bới là nguyên nhân của việc ước
lượng đường đi ngắn nhất để quy tụ về những trọng số đường đi ngắn nhất, , đồ thị
các đỉnh cha Gp bao gồm bởi kết quả p giá trị là một cây đường đi ngắn nhất cho G
Chúng ta bắt đầu với bổ đề sau, nó chỉ ra rằng đồ thị con trước đố luôn tạo một cây có
gốc mà gốc là nguồn.
Bổ đề 24.16
Cho G=(V,E) là một đồ thị có hướng có trọng số với hàm trọng số w : E → R, cho s

V là một đỉnh nguồn, và giả thiết rằng G không chứa những chu kỳ trọng số âm
mà có thể đạt đến từ s. Thì, sau đồ thị được khởi tạo bởi INITIALIZE-SINGLE-
SOURCE(G, s), đồ thị các đỉnh cha G
Π
tạo ra một cây có gốc với gốc s, và bất kỳ
chuỗi các bước giảm bớt trên những cạnh của G duy trì đặc tính này như là một bất

biến.
Chứng minh Khởi tạo, chỉ đỉnh trong G
Π
là đỉnh nguồn, và bổ đề là đúng .
Xét một đồ thị con của các đỉnh cha (predecessor subgraph) G
Π
nổi lên sau khi một
chuỗi các bước giảm bớt. Trước tiên chúng ta sẽ chứng minh G
Π
không phải là vòng.
Giả sử đối với lợi ích trái ngược nhau mà một vài bước giảm bớt tạo ra một chu kỳ
trong đồ thị G
Π
. cho chu kỳ C=v
0,
v
1,
… ,v
k
, nơi mà v
k
= v
0
. Thì, Π [v
i
] = v
i-1
đối với i
= 1,2,…,k và , không mất tính tổng quát, chúng ta có thể cho rằng nó là việc giảm bớt
cạnh ( v

k-1
,v
k
) mà đã tạo chu kỳ trong G
Π .
Chúng ta khẳng định tất cả các đỉnh trên chu trình c có thể đạt được từ nguồn s. Tạo
sao ? Mỗi đỉnh trên chu trình c có một cha non-NIL, và vì vậy mỗi đỉnh trên c đã
được gán một sự ước lượng đường đi ngắn nhất hạn chế khi nó được gán giá trị Π
không Nil. Bằng thuộc tính cận trên, mỗi đỉnh trên c có một trọng số đường đi ngắn
nhất hạn chế, đường đi đó hàm ý rằng nó có thể đạt đến từ s.
Chúng ta sẽ kiểm tra những ước tính đường đi ngắn nhất trên c chỉ trước khi gọi
RELAX( v
k-1,
v
k
,w) và chỉ ra c là một chu trình trọng số âm, do đó trái với giả thiết
rằng G không chứa những chu kỳ trọng số âm mà có thể đạt được từ nguồn. Chỉ trước
khi việc gọi hàm RELAX( v
k-1,
v
k
,w), chúng ta có Π [v
i
] = v
i-1
đối với i = 1,2,…,k-1.
Vì vậy, đối với i = 1,2,…,k-1 , việc cập nhật cuối cùng cho d[v
i
] là bởi việc gán d[vi]
d[vi-1] + w(vi-1, vi). Nếu d[v

i-1
] đã thay đổi từ đó, nó đã giảm. Bởi vậy chỉ trước khi
gọi hàm RELAX( v
k-1,
v
k
,w), chúng ta có
25

×