10: Single-Source Shortest Paths 4 Cạnh có trọng số âm ª Giả thiết: Trọng số của cạnh có thể âm – Chu trình có thể có trọng số âm – Nếu tồn tại một chu trình có trọng số âm đến được reac
Trang 1Single-Source Shortest Paths
Trang 220.11.2004 2
Các đường đi ngắn nhất từ một đỉnh nguồn
ª Bài toán các đường đi ngắn nhất: một số thuật ngữ
Cho một đồ thị có trọng số, có hướng G = (V, E), với một hàm trọng số w : E → ℜ
– Trọng số của một đường đi p = 〈v0 , v1,…, v k 〉
• w(p) = ∑i = 1…k w(v i− 1 , v i )– Trọng số của đường đi ngắn nhất (shortest path weight) từ u đến
v
min{w(p) : u v } nếu có đường đi từ u đến v
– Đường đi ngắn nhất từ u đến v là bất kỳ đường đi p nào từ u đến
v sao cho w(p) = δ(u, v).
4 3 6
2 5
1
u
Trang 3Các đường đi ngắn nhất từ một đỉnh nguồn (tiếp)
ª Bài toán các đường đi ngắn nhất từ một nguồn duy nhất source shortest-paths problem):
(Single-– Cho đồ thị G = (V, E) và một đỉnh nguồn s ∈ V.
– Tìm đường đi ngắn nhất từ s đến mọi đỉnh v ∈ V.
3
6
7 2
4 3 6
2 5
1
s
Trang 420.11.2004 Ch 10: Single-Source
Shortest Paths
4
Cạnh có trọng số âm
ª Giả thiết: Trọng số của cạnh có thể âm
– Chu trình có thể có trọng số âm
– Nếu tồn tại một chu trình có trọng số âm đến được (reachable) từ
s thì trọng số của đường đi ngắn nhất không được định nghĩa:
không đường đi nào từ s đến một đỉnh nằm trên chu trình có thể
là đường đi ngắn nhất
3 5 2
j
số trong mỗi đỉnh là trọng số đường đi ngắn nhất
từ đỉnh nguồn s.
Trang 5Cạnh có trọng số âm (tiếp)
– Nếu tồn tại một chu trình có trọng số âm trên một đường đi từ s đến v, ta định nghĩa δ(s, v) = −∞
– Trong ví dụ sau, các đỉnh h, i, j không đến được từ s nên có trọng
số đường đi ngắn nhất là ∞ (chứ không là −∞ mặc dù chúng nằm trên một chu trình có trọng số âm)
3 5 2
j
Trang 6– Với mọi đỉnh v, đỉnh cha (predecessor) của v là một đỉnh khác
hay là NIL
Duy trì π[v], con trỏ đến đỉnh cha Dùng π để suy ra đường đi
ngắn nhất từ s đến v.
– Đồ thị con Gπ = (Vπ , Eπ ) (predecessor subgraph)
• Vπ = {v ∈ V : π[v] ≠ NIL} ∪ {s}
• Eπ = {(π[v], v) ∈ E : v ∈ Vπ − {s}}
Trang 7Biểu diễn các đường đi ngắn nhất (tiếp)
ª Cho G = (V, E) là một đồ thị có hướng, có trọng số;
G không chứa chu trình trọng số âm đến được từ đỉnh nguồn s ∈ V.
Cây các đường đi ngắn nhất với gốc tại s là đồ thị có hướng G’ = (V’,
E’), với V’ ⊆ V và E’ ⊆ E sao cho
1 V’ là tập các đỉnh đến được (reachable) từ s trong G
2 G’ là cây có gốc với gốc là s
3 Với mọi v ∈ V’, đường đi đơn duy nhất từ s đến v là đường đi
ngắn nhất từ s đến v trong G
Trang 83
6
7 2
4 3 6
0 3
6
7 2
4 3 6
2 5
0 3
6
7 2
4 3 6
2 5
Ví dụ: trong (b) và (c) là hai cây các đường đi ngắn nhất có gốc tại đỉnh
nguồn s của đồ thị trong (a)
Trang 9Cấu trúc của đường đi ngắn nhất
ª Lemma 25.1 (Đường đi con của đường đi ngắn nhất cũng là đường
đi ngắn nhất)
Cho
– Đồ thị có trọng số, có hướng G = (V, E) với hàm trọng số
w : E → ℜ
– p = 〈v1 , v2 ,…, v k〉 đường đi ngắn nhất từ v1 đến v k
– Với mọi i, j mà 1 ≤ i ≤ j ≤ k, gọi p ij = 〈v i , v i + 1 ,…, v j 〉 là đường đi con
(subpath) của p từ v i đếnv j
Trang 10p ij
p 1i
p jk
Trang 11Cấu trúc của đường đi ngắn nhất (tiếp)
p’
Trang 13Cấu trúc của đường đi ngắn nhất (tiếp)
Trang 1420.11.2004 Ch 10: Single-Source
Shortest Paths
14
Kỹ thuật nới lỏng
ª Kỹ thuật nới lỏng (relaxation)
– Duy trì cho mỗi đỉnh v một thuộc tính d [v] dùng làm chận trên cho trọng số của một đường đi ngắn nhất từ s đến v.
– biến d[v] được gọi là ước lượng đường đi ngắn nhất (shortest path
estimate)
– Khởi động các ước lượng đường đi ngắn nhất và các predecessors bằng thủ tục sau
2 do d[v] ← ∞
3 π[v] ← NIL
4 d[s] ← 0
Trang 15Kỹ thuật nới lỏng (tiếp)
ª Thực thi nới lỏng lên một cạnh (u, v): kiểm tra xem một đường đi đến v thông qua cạnh (u, v) có ngắn hơn một đường đi đến v đã tìm được hiện thời hay không Nếu ngắn hơn thì cập nhật d[v] và π[v].
Trang 16Trị của d[v] giảm sau khi
gọi RELAX(u, v, w) Trị của d[v] không thay đổi sau khigọi RELAX(u, v, w)
Trang 17Kỹ thuật nới lỏng (tiếp)
ª Các giải thuật trong chương này gọi INITIALIZE-SINGLE-SOURCE và sau đó gọi RELAX một số lần để nới lỏng các cạnh
– Nới lỏng là cách duy nhất được dùng để thay đổi các ước lượng đường đi ngắn nhất và các predecessors
– Các giải thuật khác nhau ở thứ tự và số lần gọi RELAX lên các cạnh
Trang 19Các tính chất của kỷ thuật nới lỏng (tiếp)
– Một khi d[v] đạt đến cận dưới δ(s, v) của nó thì nó sẽ không bao
giờ thay đỗi
Trang 20– đẳng thức này được duy trì thành bất biến đối với mọi dãy các
bước nới lỏng lên các cạnh của G.
Trang 21Các tính chất của kỷ thuật nới lỏng (tiếp)
ª Để chứng minh tính đúng đắn của các giải thuật tìm đường đi ngắn nhất (giải thuật Dijkstra và giải thuật Bellman-Ford) ta cần Lemma sau
ª Lemma 25.7
Cho
– Đồ thị có trọng số và có hướng G = (V, E), với hàm trọng số
w : E → ℜ
– Một đỉnh nguồn s, và s u → v là một đường đi ngắn nhất trong
G với các đỉnh nào đó u, v ∈ V.
– G được khởi động bỡi INITIALIZE-SINGLE-SOURCE(G, s) và sau đó
một chuỗi các bước nới lỏng trong đó có gọi RELAX(u, v, w) được thực thi lên các cạnh của G.
⇒
Nếu d[u] = δ(s, u) trước khi gọi RELAX(u, v, w), thì sau khi gọi luôn luôn có d[v] = δ(s, v).
Trang 22Sau khi khởi động G bởi INITIALIZE-SINGLE-SOURCE(G, s), ta có
– Đồ thị Gπ là cây có gốc s
– Mọi chuổi các bước nới lỏng lên các cạnh của G duy trì tính chất
trên thành một bất biến
Trang 23Cây các đường đi ngắn nhất (tiếp)
– G không chứa chu trình có trọng số âm đến được từ s.
Khởi động G bằng INITIALIZE-SINGLE-SOURCE(G, s) và thực thi chuổi bất kỳ các bước nới lỏng lên các cạnh của G sao cho d[v] = δ(s, v) với mọi đỉnh v ∈ V.
⇒
Đồ thị Gπ là một cây các đường đi ngắn nhất có gốc tại s.
Trang 2420.11.2004 Ch 10: Single-Source
Shortest Paths
24
Giải thuật của Dijkstra
ª Đồ thị G = (V, E) có hướng, có trọng số với
– Hàm trọng số w : E → ℜ mà w(u, v) ≥ 0 cho mọi cạnh (u, v) ∈ E
– Đỉnh nguồn s.
ª Giải thuật của Dijkstra:
– Dùng một priority queue Q với khóa là các trị d[ ]
Trang 25Phân tích giải thuật của Dijkstra
ª Thời gian chạy phụ thuộc vào hiện thực của priority queue Q:
– Linear array
° Mỗi EXTRACT-MIN tốn O(V) thời gian, vậy tất cả các
° Tất cả các lần gọi RELAX tốn O(E) thời gian
Thời gian chạy tổng cộng: O(V 2 + E) = O(V 2)
Trang 2620.11.2004 Ch 10: Single-Source
Shortest Paths
26
Phân tích giải thuật của Dijkstra (tiếp)
ª Thời gian chạy phụ thuộc vào hiện thực của priority queue Q:
– Binary heap
° Tạo heap tốn O(V) thời gian.
° Mỗi EXTRACT-MIN tốn O(lg V) thời gian, vậy tất cả các
° Tất cả các lần gọi RELAX tốn O(E lg V) thời gian, vì mỗi
Thời gian chạy tổng cộng: O((V + E) lg V).
Trang 27Phân tích giải thuật của Dijkstra
(tiếp)
– Fibonacci heap
° Tạo heap với V phần tử tốn O(V) thời gian.
° Mỗi EXTRACT-MIN tốn O(lg V) phí tổn bù trừ, vậy tất cả các
° Tất cả các lần gọi RELAX tốn O(E) thời gian, vì mỗi
Thời gian chạy tổng cộng: O(V lg V + E).
Trang 289 7 2
9 7 2
2 5
Đỉnh màu đen là đỉnh trong S
Đỉnh màu xám là đỉnh được đem vào S trong lần lặp tới
Ngay trước khi vào vòng lặp while: Vòng while: ngay sau lần lặp 1
Trang 29Thực thi giải thuật của Dijkstra (tiếp)
9 7 2
0
10
1
6 4
9 7 2
2 5
Trang 3010
1
6 4
9 7 2
0
10
1
6 4
9 7 2
2 5
Trang 31Tính đúng đắn của giải thuật của Dijkstra
ª Định lý 25.10 (Tính đúng đắn của giải thuật của Dijkstra)
Thực thi giải thuật của Dijkstra lên đồ thị G = (V, E) có trọng số và
có hướng với
– hàm trọng số w : E → ℜ không âm
– đỉnh nguồn s.
⇒
Khi giải thuật thực thi xong,
d[u] = δ(s, u) cho mọi đỉnh u ∈ V
Chứng minh
Sẽ chứng minh: ∀u ∈ V, d[u] = δ(s, u) khi u được đưa vào tập S và
sau đó đẳng thức luôn được duy trì
Trang 32Chứng minh bằng phản chứng.
(*) Gọi u là đỉnh đầu tiên sao cho d[u] ≠ δ(s, u) khi u được đưa vào
tập S.
– Phải có một đường đi từ s đến u Vì nếu không thì δ(s, u) = ∞, do
đó d[u] = ∞, do đó d[u] = δ(s, u) dùng Hệ luận 25.6, mâu thuẫn! – Do đó có đường đi ngắn nhất p từ s đến u, với s ∈ S và u ∈ V − S Gọi y là đỉnh đầu tiên trên p sao cho y ∈ V − S Đặt x = π[y].
Trang 33Tính đúng đắn của giải thuật của Dijkstra
Chứng minh (tiếp)
– Chứng tỏ d[y] = δ(s, y) khi u được đưa vào tập S: theo (*) ta phải có d[x] = δ(s, x) khi x được đưa vào S Khi đó cạnh (x, y) được nới lỏng nên d[y] = δ(s, y) dùng Lemma 25.7.
– Vì y trước u trên đường đi ngắn nhất từ s đến u và mọi trọng số
đều dương nên δ(s, y) ≤ δ(s, u).
Trang 34– Khi u được chọn bởi EXTRACT-MIN thì y cũng còn trong Q nên
d[u] ≤ d[y], do đó bất đẳng thức :
d[y] = δ(s, y) = δ(s, u) = d[u], từ đó d[u] = δ(s, u), mâu thuẫn với
(*)!
– Dùng Lemma 25.5 để chứng minh phần còn lại
Trang 35Tính đúng đắn của giải thuật của Dijkstra (tiếp)
ª Hệ luận 25.11
Thực thi giải thuật của Dijkstra lên đồ thị G = (V, E) có trọng số và
có hướng với
– hàm trọng số w : E → ℜ không âm
– đỉnh nguồn s.
⇒
Khi giải thuật thực thi xong thì đồ thị Gπ là cây các đường đi ngắn
nhất có gốc tại s.
Trang 3620.11.2004 Ch 10: Single-Source
Shortest Paths
36
Giải thuật của Bellman-Ford
ª Cho G = (V, E) là đồ thị có trọng số, có hướng
– Hàm trọng số w : E → ℜ
Trang 37Phân tích giải thuật của Bellman-Ford
ª Thời gian chạy:
– Khởi tạo: Θ(V) thời gian
– |V| − 1 lượt, mỗi lượt O(E) thời gian
– vòng lặp for dòng 5-7: O(E) thời gian
Thời gian chạy tổng cộng: O(V E)
Trang 388 7
5
7 9
8 7
Trong mỗi lượt, thứ tự relax các cạnh là:
(u, v) (u, x) (u, y) (v, u) (x, v) (x, y) (y, v) (y, z) (z, u) (z, x)
Ngay trước lượt đầu: Ngay sau lượt đầu:
Cạnh (u, v) được sơn xám nếu π[v] = u
Trang 39Thực thi giải thuật Bellman-Ford (tiếp)
2 7
0
6
5
7 9
8 7
5
7 9
8 7
0 6
5
7 9
8 7
Trang 41Tính đúng đắn của giải thuật Bellman-Ford (tiếp)
Chứng minh
Gọi v là một đỉnh đến được từ s Gọi p = <v0 , , v k > là một đường đi
ngắn nhất từ s đến v Vì p là đường đi đơn nên k ≤ | V | − 1
Sẽ chứng minh: d[v i ] = δ(s, v i ) sau lượt nới lỏng thứ i, với i = 0, ,k,
và đẳng thức được duy trì sau đó
Dùng quy nạp:
– Cơ bản: d[v0 ] = δ(s, v0) = 0 (vì v0 = s)
– Giả thiết quy nạp: d[v i − 1 ] = δ(s, v i − 1) sau lượt nới lỏng thứ i − 1.
– Bước quy nạp: Cạnh (v i − 1 , v i ) được nới lỏng trong lượt thứ i nên d[v i ] = δ(s, v i ) sau lượt i và tại mọi thời điểm sau đó, theo Lemma
25.7
Để ý là k ≤ | V | − 1 và có | V | − 1 lượt nới lỏng
Trang 42Với mọi đỉnh v ∈ V, tồn tại đường đi từ s đến v nếu và chỉ nếu
Trang 43Tính đúng đắn của giải thuật của Bellman-Ford (tiếp)
ª Định lý 25.14 (Tính đúng đắn của giải thuật của Bellman-Ford)
Thực thi BELLMAN-FORD lên đồ thị G = (V, E) có trọng số và có
hướng với
– hàm trọng số w : E → ℜ
– đỉnh nguồn s
⇒
(i) Nếu G không chứa chu trình có trọng số âm đến được từ s, thì
(1) giải thuật trả về TRUE
(2) d[v] = δ(s,v) cho mọi đỉnh v ∈ V
(3) đồ thị Gπ là cây các đường đi ngắn nhất có gốc tại s.
(ii) Nếu G chứa một chu trình có trọng số âm đến được từ s, thì giải
thuật trả về FALSE
Trang 44(i) Giả sử G không chứa chu trình có trọng số âm đến được từ s.
– Nếu v đến được từ s thì Lemma 25.12 chứng minh (2).
Nếu v không đến được từ s thì có (2) từ Hệ luận 25.6
– Lemma 25.9 cùng với (2) chứng minh (3)
– Khi giải thuật hoàn tất, ta có với mọi cạnh (u, v):
d[v] = δ(s,v) ≤ δ(s,u) + w(u, v) (từ Lemma 25.3)
= d[u] + w(u, v),
vậy các test dòng 6 khiến giải thuật trả về TRUE, chứng minh (1)
Trang 45Tính đúng đắn của giải thuật của Bellman-Ford
Chứng minh (tiếp)
(ii) Giả sử G chứa một chu trình có trọng số âm đến được từ s là
c = 〈v0 ,…,v k 〉 với v0 = v k
Vậy ∑ i = 1…k w(v i − 1, v i ) < 0 (*)
Chứng minh (ii) bằng phản chứng:
° Giả sử Bellman-Ford trả về TRUE, thì (dòng 5-8)