Gi¸o ¸n m«n: Lý ThuyÕt §å ThÞ
NguyÔn Minh §øc - §HQG Hµ Néi
60
v1
v2
v10
v5
v8 v9
v6 v7
v3 v4
Chương 6
MT S BÀI TOÁN NG DNG
(Bài toán tìm đường đi ngn nht và bài toán lung cc đại)
6.1 Bài toán tìm đường đi ngn nht
6.1.1 Tìm đường đi ngn nht trong đồ th không có trng s
Bài toán:
Cho đồ th không có trng s G = (V,E) và hai đỉnh u, v V. Tìm đường đi ngn nht t đỉnh u
đến đỉnh v, tc là đường đi t u đến v có s cnh (cung) là ít nht
Để gii quyết bài toán này ta có th thc hin theo thut toán sau đây:
Thut toán:
Bước 1:
Ti đỉnh u ta ghi s 0
Các đỉnh k vi u (có cnh đi t u đến) ta ghi s 1
Các đỉnh k vi các đỉnh đã được ghi s 1 ta ghi s 2
Gi s ta đã ghi ti i, tc là ta đã đánh s được các tp đỉnh là V(0) = {u}, V(1), V(2),..,V(i). Trong
đó V(i) là tp tt c các đỉnh được ghi bi s i. Ta xác định tp các đỉnh được đánh s bi s i+1 như
sau:
V(i+1) = {x| x V, xV(k) vi k=0,1,..,i và yV(i) sao cho t y có cnh (cung) đi tưới x}
Do tính hu hn ca đồ th, sau mt s hu hn bước, thut toán dng li và cho ta tp các đỉnh có
cha đỉnh v được đánh s bi m là V(m).
Bước 2:
Do bước 1 đỉnh v được đánh s là m, điu này chng t đường đi t u đến v có m cnh (cung) và
đường đi ngn nht t u ti v. Để tìm tt c các đường đi có độ dài m ngn nht t u ti v, ta xut
phát t v đi ngược v u theo nguyên tc sau đây:
- Tìm tt c các đỉnh có cnh (cung) ti b được ghi s m-1, gi s đó là xik (k=1,2...).
- Vi mi đỉnh xik tìm tt c các đỉnh có cnh (cung) ti xik được ghi s m-2.
Bng cách lùi dn tr li, đến mt lúc nào đó gp đỉnh ghi s 0, đó chính là đỉnh u. Tt c các đường
đi xác đinh theo các bước trên là đường đi t u ti v vi độ dài m ngn nht cn tìm
Ví d
Xét đồ th có hướng cho bi hình dưới đây (Hình 6.1)
Tìm đường đi ngn nht t đỉnh v1 đế
Gi¸o ¸n m«n: Lý ThuyÕt §å ThÞ
NguyÔn Minh §øc - §HQG Hµ Néi
61
Chu ý:
Thut toán tìm đường đi gia hai đỉnh u và v trong đồ th bng cách áp dng thut toán tìm kiếm
theo chiu rng chính là đường đi ngn nht t u ti v (theo s cnh).
6.1.2 Tìm đường đi ngn nht trong đồ thtrng s
Bài toán:
Cho đồ th có trng s G = (V,E) và hai đỉnh s, t V. Tìm đường đi ngn nht t đỉnh s đến đỉnh
t, tc là đường đi t s đến t có tng trng s ca các cnh (cung) là nh nht.
Phn ln các thut toán tìm đường đi ngn nht t s đến t được xây dn trên ý tưởng như sau:
T ma trn trng s c[u,v]; u,vV, ta tính cn trên d[v] ca khong cách t đỉnh s đến tt c các
đỉnh v V, mi khi phát hin d[u]+c[u,v]<d[v] thì cn trên d[v] s được làm tt lên:
d[v]:=d[u]+c[u,v]. Quá trình đó s kết thúc khi tt c các cn trên d[v] không th làm tt lên được
na. Khi thc hin cài đặt trên máy tính, cn trên d[v] được gi là nhãn ca đỉnh v (hay trng s ca
đỉnh v), còn vic làm tt các cn trên d[v] được gi là phép gán nhãn cho các đỉnh ca đồ th. Thut
toán có th được mô ta như sau:
Bước 1: Đánh trng s các đỉnh.
Trng s ca đỉnh xut phát s được đánh trng s (gán nhãn) d[s] = 0
Ti các đỉnh còn li ta ghi mt s dương đủ ln sao cho nó ln hơn trng s ca các đỉnh t a ti (có
th dùng )
Bước 2: Thc hin gim trng s các đỉnh
Gi s ti đỉnh v đang được ghi trng s d[v]. Nếu tn ti đỉnh u có trng s d[u], t u sang v mà
d[v]>d[u] +c[u,v] thì ta thay trng s d[v] bi d’[v]=d[u]+c[u,v]. Trường hp ngược li ta gi
nguyên là d[v]. Quá trình thc hin cho ti khi trng s ca tt c các đỉnh đã đạt cc tiu, tc là
vV không tn ti uV k vi v mà d[u]+c[u,v]<d[v] .
Bước 3: Xác định đường đi t s ti t có trng s nh nht
T bước 2 ta xác định được trng s ca đỉnh t, xut phát t t ta đi v đỉnh k vi t, chng hn đó là
đỉnh x có tính cht d[t] = d[x] + c[x,t], nếu không có đỉnh x như vy thì ta đi v đỉnh k vi t có
trng s nh nht, c tiếp tc như vy ta s đi v đến đỉnh y mà đỉnh k là s sao cho d[y]=d[s]+c[
s,y], vi d[s]=0.
Ví d
Tuy nhiên, trên thc tế vic tìm đường đi ngn nht gia hai đỉnh li có rt nhiu trường hp riêng
bit mà chưa có mt thut toán nào thc s ti ưu được tt c, chng hn đồ th có trng s ca cnh
là mt s âm, hay đồ th có cha chu trình có trng s âm...Sau đây ta s xét qua môt s trường hp
riêng.
6.1.2.1 Đường đi ngn nht xut phát t mt đỉnh (Thut toán Ford – Bellman)
Thut toán tìm đường đi ngn nht t mt đỉnh s đến tt c các đỉnh còn li ca đồ th được đưa ra
bi hai nhà bác hc Ford và Bellman, thut toán này làm vic trong trường hp trng s ca các
cnh (cung) là tu ý, nhưng gi thiết rng trong đồ th không có chu trình âm.
Gi¸o ¸n m«n: Lý ThuyÕt §å ThÞ
NguyÔn Minh §øc - §HQG Hµ Néi
62
Procedure Ford_Bellman;
(*
Đầu vào: Đồ th G = (V,E) vi n đỉnh,
s
V là đỉnh xut phát, c[u,v] là ma trn trng s;
Đầu ra: Khong cách ngn nht t s đến tt c các đỉnh còn li d[v],
Truoc[v] ghi nhn đỉnh đi trước v trong đường đi ngn nht t s đến v;
Gi thiết: Đồ th không có chu trình âm;
*)
Begin
(* Khi to *)
For vV do
Begin
d[v]:=c[s,v];
Truoc[v]:=s;
End;
d[s]:=0;
For k:=1 to n-2 do
For v
V\{s} do
For u
V do
If d[v]>d[u]+c[u,v] then
Begin
d[v]:=d[u]+c[u,v];
Truoc[v]:=u;
End;
End;
6.1.2.2Tìm đường đi ngn nht trong đồ th có trng s không âm (thut toán Dijkstra)
Dijkstra đề ngh mt thut toán tìm đường đi ngn nht t mt đỉnh ti tt c các đỉnh còn li ca đồ
th. Thut toán Dijkstra được xây dng da trên cơ s gán cho các đỉnh các nhãn tm thi. Nhãn ca
mi đỉnh cho biết cn trên ca độ dài đường đi ngn nht t đỉnh xut phát đến nó. Các nhãn này s
được biến đổi theo các bước lp, trong mi bước lp có mt nhãn tm thi tr thành nhãn c định.
Nếu nhãn ca mt đỉnh nào đó tr thành c định thì nó s cho ta độ dài ca đường đi ngn nht t
đỉnh xut phát đến nó. Thut toán được mô t c th như sau:
Procedure Dijkstra;
(*
Đầu vào: Đồ th G=(V,E) vi n đỉnh cho bi ma trn trng s c[i,j]
sV là đỉnh xut phát
Đầu ra: Khong cách t đỉnh s đến tt c các đỉnh v còn li là d[v]
Truoc[v] ghi nhn đỉnh đi trước v trong đường đi ngn nht t s đến v
Gi thiết: Trng s các cnh (cung) ca đồ th là không âm
*)
Begin
(* Khi tao *)
For vV do
Begin
d[v]:=c[s,v];
Truoc[v]:=s;
End;
Gi¸o ¸n m«n: Lý ThuyÕt §å ThÞ
NguyÔn Minh §øc - §HQG Hµ Néi
63
d[s]:=0; T:=V\{s}; (* T là tp các đỉnh có nhãn tm thi *)
(* Bước lp *)
While T
φ
do
Begin
Tìm đỉnh u thuc T tho mãn: d[u] = min{d[z]; z thuc T};
T:=T\{u}; (* C định nhãn ca đỉnh u *)
for v thuc T do (*Gán li nhãn cho các đỉnh *)
if d[v]>d[u] + c[u,v] then
Begin
d[v]:=d[u]+c[u,v];
Truoc[v]:=u;
End;
End;
End;
Ví d: