T 蔚 NG QUAN H烏 H 渦 NG HÔNG IN QUANG
3.4.4.2. Thu壱t toán 8鵜nh tuy院n vect挨 kho違ng cách DVA
Là m瓜t thu壱t toán 8鵜nh tuy院n t逢挨ng thích nh茨m tính toán con 8逢運ng ng逸n nh医t gi英a các c員p node trong m衣ng, 8逢嬰c bi院t 8院n nh逢 là thu壱t toán Bellman-Ford. Các node m衣ng th詠c hi羽n quá trình trao8鰻i thông tin trên c挨 s荏 c栄a 8鵜a ch雨"8ích, node k院 ti院p, và con 8u運ng ng逸n nh医t t噂i 8ích. M厩i node trong m衣ng có b違ng 8鵜nh tuy院n cho th医y 8逢運ng t嘘t nh医t 8院n m丑i 8ích và m厩i node ch雨 g荏i b違ng 8鵜nh tuy院n c栄a nó 8院n các node láng gi隠ng.
V医n 8隠 t欝n t衣i c栄a thu壱t toán DV là nó th詠c hi羽n 8院m 8院n vô cùng khi có m瓜t k院t n嘘i b鵜 h臼ng. V医n 8隠 này có th吋 th医y rõ荏 ví d映 sau:
V噂i hình 3.8 cho th医y có duy nh医t m瓜t tuy院n gi英a node A 8院n nh英ng node khác. Gi違 s穎 tr丑ng s嘘 trên m厩i c衣nh 8隠u b茨ng 1, m厩i node (Router) 8隠u ch泳a b違ng 8鵜nh tuy院n. Bây gi運, n院u ta c逸t k院t n嘘i gi英a A và B thì node B s胤 hi羽u ch雨nh l衣i b違ng 8鵜nh tuy院n c栄a nó. Sau kho違ng th運i gian, các node trao 8鰻i thông tin b違ng 8鵜nh tuy院n và B nh壱n b違ng 8鵜nh tuy院n c栄a C. Khi C không bi院t gì x違y ra v噂i k院t n嘘i gi英a k院t n嘘i gi英a A và B, nó s胤 cho r茨ng có m瓜t tuy院n k院t n嘘i v噂i tr丑ng s嘘 là 2 (1 cho k院t n嘘i C-B và 1 cho k院t n嘘i B-A), nó không bi院t r茨ng k院t n嘘i A-B 8ã b鵜 c逸t. B nh壱n b違ng 8鵜nh tuy院n này và ngh r茨ng có m瓜t tuy院n khác gi英a C và A, vì th院 nó s穎a l衣i b違ng 8鵜nh tuy院n và thay 8鰻i giá tr鵜 tr丑ng s嘘 c栄a k院t n嘘i B-A v隠 3 (1 cho k院t n嘘i B-C, 2 cho k院t C-A). M瓜t
Ch逢挨ng 3: A鵜nh tuy院n và gán b逢噂c sóng
l亥n n英a các node thay 8鰻i b違ng 8鵜nh tuy院n c栄a nó. Khi C nh壱n b違ng 8鵜nh tuy院n c栄a B, nó th医y r茨ng b違ng B thay 8鰻i tr丑ng s嘘 c栄a tuy院n B-A t瑛 1 thành 3, vì th院 nó c壱p nh壱t b違ng 8鵜nh tuy院n và thay 8鰻i tr丑ng s嘘 c栄a tuy院n C-A thành 4 (1 cho k院t n嘘i C-B và 3 cho k院t n嘘i B-A). Quá trình này c泳 x違y ra mi院t cho 8院n khi t医t c違 các node tìm ra tr丑ng s嘘 c栄a tuy院n 8院n A là vô cùng.
Thu壱t toán Bellman-Ford là m瓜t thu壱t toán tính các 8逢運ng 8i ng逸n nh医t trong m瓜t 8欝 th鵜 có h逢噂ng có tr丑ng s嘘 (trong 8ó m瓜t s嘘 cung có th吋 có tr丑ng s嘘 âm).Thu壱t toán Dijksta 8òi h臼i tr丑ng s嘘 c栄a các cung ph違i có giá tr鵜 không âm. Do 8ó thu壱t toán Bellman-Ford th逢運ng dùng khi có các cung v噂i tr丑ng s嘘 âm.
3.4.4.2.1. Thu壱t toán
Gi違i thu壱t Bellman-Ford có th吋 phát bi吋u: Tìm các 8逢運ng d磯n ng逸n nh医t t瑛 node ngu欝n cho tr逢噂c v噂i ràng bu瓜c ch雨 ch泳a m瓜t tuy院n, sau 8ó tìm 8逢運ng d磯n ng逸n nh医t v噂i ràng bu瓜c ch雨 ch泳a t嘘i 8a hai tuy院n và c泳 th院 ti院p t映c. N院u 8逢運ng d磯n tr逢噂c 8ó là ng逸n nh医t thì8吋 l衣i còn không thì c壱p nh壱t 8逢運ng d磯n m噂i. Thu壱t toán"8逢嬰c ti院n hành qua các t亥ng 8逢嬰c bi吋u di宇n nh逢 sau:
function BellmanFord (danh_sách _8雨nh, danh_sách_cung, ngu欝n)
// hàm yêu c亥u 8欝 th鵜"8逢a vào d逢噂i d衣ng m瓜t danh sách 8雨nh, m瓜t danh cung // hàm tính các giá tr鵜 kho違ng_cách và 8雨nh_li隠n_tr逢噂c c栄a các 8雨nh, sao cho các //giá tr鵜"8雨nh_li隠n_ tr逢噂c s胤 l逢u l衣i các 8逢運ng 8i ng逸n nh医t.
// b逢噂c 1: kh荏i t衣o 8欝 th鵜
for each vin danh_sách_8雨nh:
if vis ngu欝nthenkho違ng_cách (v) := 0
elsekho違ng_cách (v) :=infinity
8雨nh_li隠n_tr逢噂c (v) :=null
// b逢噂c 2: k院t n衣p c衣nh
for ifrom 1to size (danh_sách_8雨nh) :
Ch逢挨ng 3: A鵜nh tuy院n và gán b逢噂c sóng
if kho違ng_cách (v) > kho違ng_cách (u) + tr丑ng_s嘘 (u, v) : kho違ng_cách (v) := kho違ng_cách (u) + tr丑ng_s嘘 (u, v)
8雨nh_li隠n_tr逢噂c (v) := u
// b逢噂c 3: ki吋m tra chu trình âm
for each (u, v) in danh_sách_cung :
if kho違ng_cách (v) > kho違ng_cách (u) + tr丑ng_s嘘 (u, v) :
errorÐA欝 th鵜 ch泳a chu trình có tr丑ng s嘘 âm”
3.4.4.2.2.Ch泳ng minh
Tính 8úng"8逸n c栄a thu壱t toán có th吋 ch泳ng minh b茨ng qui n衣p. Thu壱t toán có th吋 phát bi吋u chính xác theo ki吋u qui n衣p nh逢 sau:
A鵜nh lý: Sau i l亥n l員p vòng for:
1. N院u Kho違ng_cách(u) không có giá tr鵜 vô cùng l噂n, thì nó b茨ng 8瓜 dài c栄a m瓜t 8逢運ng 8i nào 8ó t瑛 s t噂i u;
2. N院u có m瓜t 8逢運ng 8i t瑛 s t噂i u qua nhi隠u nh医t i cung, thì Kho違ng_cách (u) có giá tr鵜 không v逢嬰t quá 8瓜 dài c栄a 8逢運ng 8i ng逸n nh医t t瑛 s t噂i u qua t嘘i 8a i cung.
Ch泳ng minh:
Tr逢運ng h嬰p c挨 b違n: Xét i =0 và th運i 8k吋m tr逢噂c khi vòng for 8逢嬰c ch衣y l亥n 8亥u tiên. Khi 8ó, v噂i 8雨nh ngu欝n kho違ng_cách (ngu欝n) := 0, 8k隠u này 8úng. A嘘i v噂i các 8雨nh u khác, kho違ng_cách (u) := infinity, 8k隠u này c ng 8úng vì không có 8逢運ng 8i nào t瑛 ngu欝n 8院n u qua 0 cung.
Tr逢運ng h嬰p quy n衣p:
Ch泳ng minh câu 1: Xét th運i 8k吋m khi kho違ng cách t噂i m瓜t 8雨nh 8逢嬰c c壱p nh壱t b荏i công th泳c kho違ng_cách (v) := kho違ng_cách (u) + tr丑ng_s嘘 (u,v). Theo gi違 thi院t quy n衣p, kho違ng_cách (u) là 8瓜 dài c栄a m瓜t 8逢運ng 8i nào 8ó t瑛 ngu欝n t噂i u. Do 8ó, kho違ng_cách (u) + tr丑ng_s嘘 (u, v) là 8瓜 dài c栄a 8逢運ng 8i t瑛 ngu欝n t噂i u r欝i t噂i v.
Ch泳ng minh câu 2: Xét 8逢運ng 8i ng逸n nh医t t瑛 ngu欝n t噂i u qua t嘘i 8a i cung. Gi違 s穎 v là 8雨nh li隠n ngay tr逢噂c u trên 8逢運ng 8i này. Khi 8ó, ph亥n 8逢運ng 8i t瑛 ngu欝n t噂i v là 8逢運ng 8i ng逸n nh医t t瑛 ngu欝n t噂i v qua t嘘i 8a i-1 cung. Theo gi違 thuy院t quy n衣p,
Ch逢挨ng 3: A鵜nh tuy院n và gán b逢噂c sóng
kho違ng_cách (v) sau i-1 vòng l員p không v逢嬰t quá 8瓜 dài 8逢運ng 8i này. Do 8ó, tr丑ng_s嘘 (v, u) + kho違ng_cách (v) có giá tr鵜 không v逢嬰t quá 8瓜 dài c栄a 8逢運ng 8i t瑛 s t噂i u. Trong l亥n l員p th泳 i, kho違ng_cách (u) 8逢嬰c l医y giá tr鵜 nh臼 nh医t c栄a kho違ng_cách (v) + tr丑ng_s嘘 (v, u) v噂i m丑i v có th吋. Do 8ó, sau i l亥n l員p, kho違ng_cách (u) có giá tr鵜 không v逢嬰t quá 8瓜 dài 8逢運ng 8i ng逸n nh医t t瑛 ngu欝n t噂i u qua t嘘i 8a i cung. Khi i b茨ng s嘘"8雨nh c栄a 8欝 th鵜, m厩i 8逢運ng 8i tìm8逢嬰c s胤 là 8逢運ng 8i ng逸n nh医t toàn c映c, tr瑛 khi 8欝 th鵜 có chu trình âm. N院u t欝n t衣i chu trình âm mà t瑛"8雨nh ngu欝n có th吋"8i 8院n 8逢嬰c thì s胤 không t欝n t衣i 8逢運ng 8i nh臼 nh医t (vì m厩i l亥n 8i quanh chu trình âm là m瓜t l亥n gi違m tr丑ng s嘘 c栄a 8逢運ng).