http://ebook.here.vn Ti min phí ð thi, eBook, Tài liu hc tp

CHƯƠNG V
M(T S* BÀI TOÁN T*I ƯU TRÊN ð2 TH3
5.1. ð2 TH3 CÓ TR7NG S* VÀ BÀI TOÁN ðƯ8NG ðI NG9N NH:T.
5.1.1. M; ñ=u:
Trong ñi sng, chúng ta thưng gp nhng tình hung như sau: ñ ñi t ña
ñim A ñn ña ñim B trong thành ph, nhi"u ñưng ñi, nhi"u cách ñi; lúc ta
ch&n ñưng ñi ng'n nh(t (theo nghĩa c, ly), c l/i c0n ch&n ñưng ñi nhanh nh(t
(theo nghĩa thi gian) lúc ph2i cân nh'c ñ ch&n ñưng ñi r4 ti"n nh(t (theo nghĩa
chi phí), v.v...
th coi sơ ñ9 c:a ñưng ñi t A ñn B trong thành ph m;t ñ9 th, v<i ñ=nh
các giao l; (A B coi như giao l;), c/nh ño/n ñưng ni hai giao l;. Trên m?i
c/nh c:a ñ9 th y, ta gán m;t s dương, Ang v<i chi"u dài c:a ño/n ñưng, thi gian
ñi ño/n ñưng hoc cư<c phí vBn chuyn trên ño/n ñưng ñó, ...
ð9 th tr&ng s là ñ9 th G=(V,E) m?i c/nh (hoc cung) eE ñưHc gán bJi
m;t s th,c m(e), g&i là tr&ng s c:a c/nh (hoc cung) e.
Trong ph0n này, tr&ng s c:a m?i c/nh ñưHc xét m;t s ơng và còn g&i
chi"u dài c:a c/nh ñó. M?i ñưng ñi t ñ=nh u ñn ñ=nh v, chi"u dài m(u,v), bOng
tPng chi"u i các c/nh ñi qua. Kho2ng cách d(u,v) gia hai ñ=nh u v chi"u
dài ñưng ñi ng'n nh(t (theo nghĩa m(u,v) nhS nh(t) trong các ñưng ñi t u ñn v.
th xem m;t ñ9 th G b(t k m;t ñ9 th tr&ng s m&i c/nh ñ"u
chi"u dài 1. Khi ñó, kho2ng cách d(u,v) gia hai ñ=nh u và v là chi"u dài c:a ñưng ñi t
u ñn v ng'n nh(t, tAc là ñưng ñi qua ít c/nh nh(t.
5.1.2. Bài toán tìm ñưBng ñi ngDn nhEt:
Cho ñơn ñ9 thliên thông, tr&ng s G=(V,E). Tìm kho2ng cách d(u
0
,v) t m;t
ñ=nh u
0
cho trư<c ñn m;t ñ=nh v b(t kỳ c:a G và tìm ñưng ñi ng'n nh(t t u
0
ñn v.
m;t s thuBt toán tìm ñưng ñi ng'n nh(t; J ñây, ta thuBt toán do E.
Dijkstra, nhà toán h&c ngưi Hà Lan, ñ" xu(t năm 1959. Trong phiên b2n ta s` trình
bày, ngưi ta gi2 sa ñ9 th hư<ng, các tr&ng s dương. Ch= c0n thay ñPi ñôi chút
là có th gi2i ñưHc bài toán tìm ñưng ñi ng'n nh(t trong ñ9 th có hư<ng.
Phương pháp c:a thuBt toán Dijkstra là: xác ñnh tu0n t, ñ=nh kho2ng cách
ñn u
0
t nhS ñn l<n.
Trư<c tiên, ñ=nh kho2ng cách ñn a nhS nh(t chính a, v<i d(u
0
,u
0
)=0. Trong
các ñ=nh v u
0
, m ñ=nh kho2ng cách k
1
ñn u
0
nhS nh(t. ð=nh y ph2i m;t
trong các ñ=nh k" v<i u
0
. Gi2 sa ñó là u
1
. Ta có:
d(u
0,
u
1
) = k
1
.
http://ebook.here.vn Ti min phí ð thi, eBook, Tài liu hc tp

Trong các ñ=nh v u
0
v u
1
, tìm ñ=nh kho2ng cách k
2
ñn u
0
nhS nh(t. ð=nh
này ph2i là m;t trong các ñ=nh k" v<i u
0
hoc v<i u
1
. Gi2 sa ñó là u
2
. Ta có:
d(u
0
,u
2
) = k
2
.
Tip tdc ntrên, cho ñn bao gi tìm ñưHc kho2ng cách t u
0
ñn m&i ñ=nh v c:a G.
Nu V={u
0
, u
1
, ..., u
n
} thì:
0 = d(u
0
,u
0
) < d(u
0
,u
1
) < d(u
0
,u
2
) < ... < d(u
0
,u
n
).
5.1.3. Thut toán Dijkstra:
procedure Dijkstra (G=(V,E) là ñơn ñ9 th liên thông, có tr&ng s v<i tr&ng s dương)
{G có các ñ=nh a=u
0
, u
1
, ..., u
n
=z và tr&ng s m(u
i
,u
j
), v<i m(u
i
,u
j
) =
nu (u
i
,u
j
) không là m;t c/nh trong G}
for i := 1 to n
L(u
i
) :=
L(a) := 0
S := V \ {a}
u := a
while S
begin
for t(t c2 các ñ=nh v thu;c S
if L(u) +m(u,v) < L(v) then L(v) := L(u)+m(u,v)
u := ñ=nh thu;c S có nhãn L(u) nhS nh(t
{L(u): ñ; dài ñưng ñi ng'n nh(t t a ñn u}
S := S \ {u}
end
Thí dN 1: m kho2ng cách d(a,v) t a ñn m&i ñ=nh v m ñưng ñi ng'n nh(t t a
ñn v cho trong ñ9 th G sau.
a
n
b
e
d
g
m
c
h
k
1
3
3
2
1
4
2
4
2
6
2
3
5
5
6
3
1
2
3
http://ebook.here.vn Ti min phí ð thi, eBook, Tài liu hc tp

L(a) L(b) L(c) L(d) L(e) L(g) L(h) L(k) L(m) L(n)
5.1.4. ðPnh lý:
ThuBt toán Dijkstra tìm ñưHc ñưng ñi ng'n nh(t t m;t ñ=nh cho trư<c
ñn m;t ñ=nh tu ý trong ñơn ñ9 th vô hư<ng liên thông có tr&ng s.
ChRng minh: ðnh ñưHc chAng minh bOng quy n/p. T/i <c k ta gi2 thit quy
n/p là:
(i) Nhãn c:a ñ=nh v không thu;c S ñ; dài c:a ñưng ñi ng'n nh(t t ñ=nh a t<i ñ=nh
này;
(ii) Nhãn c:a ñ=nh v trong S ñ; dài c:a ñưng ñi ng'n nh(t t ñ=nh a t<i ñ=nh này
ñưng ñi này ch= chAa các ñ=nh (ngoài chính ñ=nh này) không thu;c S.
Khi k=0, tAc là khi chưa có bư<c lp nào ñưHc th,c hirn, S=V \ {a}, vì th ñ; dài
c:a ñưng ñi ng'n nh(t t a t<i các ñ=nh khác a là và ñ; dài c:a ñưng ñi ng'n nh(t t
a t<i chính bOng 0 (J ñây, chúng ta cho phép ñưng ñi không c/nh). Do ñó bư<c
cơ sJ là ñúng.
Gi2 sa gi2 thit quy n/p ñúng v<i bư<c k. G&i v ñ=nh l(y ra khSi S J bư<c
lp k+1, vBy v ñ=nh thu;c S J cui <c k nhãn nhS nh(t (nu nhi"u ñ=nh
nhãn nhS nh(t thì thch&n m;t ñ=nh nào ñó làm v). T gi2 thit quy n/p ta th(y rOng
0
3
3
2
1
5
2
2
3
3
2
5
4
6
3
6
6
4
10
6
6
9
6
8
7
8
8
http://ebook.here.vn Ti min phí ð thi, eBook, Tài liu hc tp

trư<c khi vào vòng lp thA k+1, các ñ=nh không thu;c S ñã ñưHc gán nhãn bOng ñ; dài
c:a ñưng ñi ng'n nh(t t a. ð=nh v cũng vBy ph2i ñưHc gán nhãn bOng ñ; dài c:a
ñưng ñi ng'n nh(t t a. Nu ñi"u này không x2y ra thì J cui bư<c lp thA k s`
ñưng ñi v<i ñ; dài nhS hơn L
k
(v) chAa c2 ñ=nh thu;c S (vì L
k
(v) ñ; dài c:a ñưng ñi
ng'n nh(t t a t<i v chAa ch= các ñ=nh không thu;c S sau bư<c lp thA k). G&i u ñ=nh
ñ0u tiên c:a ñưng ñi y thu;c S. ðó ñưng ñi v<i ñ; dài nhS hơn L
k
(v) t a t<i u
chAa ch= các ñ=nh không thu;c S. ði"u y trái v<i cách ch&n v. Do ñó (i) vvn còn ñúng
J cui bư<c lp k+1.
G&i u ñ=nh thu;c S sau bư<c k+1. ðưng ñi ng'n nh(t t a t<i u chAa ch= các
ñ=nh không thu;c S s` hoc chAa v hoc không. Nu không chAa v ttheo gi2
thit quy n/p ñ; dài c:a L
k
(v). Nu chAa v thì s` t/o thành ñưng ñi t a t<i
v v<i ñ; dài thng'n nh(t chAa ch= các ñ=nh không thu;c S khác v, kt thúc bOng
c/nh t v t<i u. Khi ñó ñ; dài c:a nó s` là L
k
(v)+m(v,u). ði"u ñó chAng tS (ii) là ñúng vì
L
k+1
(u)=min(L
k
(u), L
k
(v)+m(v,u)).
5.1.5. Mnh ñ:
ThuBt toán Dijkstra tìm ñưng ñi ng'n nh(t t m;t ñ=nh cho trư<c ñn
m;t ñ=nh tuỳ ý trong ñơn ñ9 th vô hư<ng liên thông có tr&ng s có ñ; phAc t/p là O(n
2
).
ChRng minh: ThuBt toán dùng không quá n1 bư<c lp. Trong m?i bư<c lp, dùng
không n 2(n1) phép c;ng phép so sánh ñ saa ñPi nhãn c:a c ñ=nh. Ngoài ra,
m;t ñ=nh thu;c S
k
nhãn nhS nh(t nh không quá n1 phép so sánh. Do ñó thuBt toán
có ñ; phAc t/p O(n
2
).
5.1.6. Thut toán Floyd:
Cho G=(V,E) là m;t ñ9 th hư<ng, tr&ng s. ð tìm ñưng ñi ng'n nh(t
gia m&i cp ñ=nh c:a G, ta th áp ddng thuBt toán Dijkstra nhi"u l0n hoc áp ddng
thuBt toán Floyd ñưHc trình bày dư<i ñây.
Gi2 sa V={v
1
, v
2
, ..., v
n
} và ma trBn tr&ng s là W W
0
. ThuBt toán Floyd xây
d,ng dãy các ma trBn vuông c(p n là W
k
(0 k n) như sau:
procedure Xác ñnh W
n
for i := 1 to n
for j := 1 to n
W[i,j] := m(v
i
,v
j
) {W[i,j] là ph0n ta dòng i c;t j c:a ma trBn W
0
}
for k := 1 to n
if W[i,k] +W[k,j] < W[i,j] then W[i,j] := W[i,k] +W[k,j]
{W[i,j] là ph0n ta dòng i c;t j c:a ma trBn W
k
}
5.1.7. ðPnh lý:
ThuBt toán Floyd cho ta ma trBn W*=W
n
ma trBn kho2ng cách nhS
nh(t c:a ñ9 th G.
http://ebook.here.vn Ti min phí ð thi, eBook, Tài liu hc tp

ChRng minh: Ta chAng minh bOng quy n/p theo k mrnh ñ" sau:
W
k
[i,j] là chi"u dài ñưng ñi ng'n nh(t trong nhng ñưng ñi ni ñ=nh v
i
v<i ñ=nh
v
j
ñi qua các ñ=nh trung gian trong {v
1
, v
2
, ..., v
k
}.
Trư<c ht mrnh ñ" hin nhiên ñúng v<i k=0.
Gi2 sa mrnh ñ" ñúng v<i k•1.
Xét W
k
[i,j]. Có hai trưng hHp:
1) Trong các ñưng ñi chi"u i ng'n nh(t ni v
i
v<i v
j
ñi qua các ñ=nh trung gian
trong {v
1
, v
2
, ..., v
k
}, m;t ñưng ñi γ sao cho v
k
γ. Khi ñó γ cũng ñưng ñi ng'n
nh(t ni v
i
v<i v
j
ñi qua các ñ=nh trung gian trong {v
1
, v
2
, ..., v
k•1
}, nên theo gi2 thit quy
n/p,
W
k•1
[i,j] = chi"u dài γ W
k•1
[i,k]+W
k•1
[k,j].
Do ñó theo ñnh nghĩa c:a W
k
thì W
k
[i,j]=W
k•1
[i,j].
2) M&i ñưng ñi chi"u dài ng'n nh(t ni v
i
v<i v
j
ñi qua các ñ=nh trung gian trong
{v
1
, v
2
, ..., v
k
}, ñ"u chAa v
k
. G&i γ = v
i
... v
k
... v
j
m;t ñưng ñi ng'n nh(t như th thì
v
1
... v
k
v
k
... v
j
cũng nhng ñưng ñi ng'n nh(t ñi qua các ñ=nh trung gian trong
{v
1
, v
2
, ..., v
k•1
} và
W
k•1
[i,k]+W
k•1
[k,j] = chi"u dài(v
1
... v
k
) + chi"u dài(v
k
... v
j
)
= chi"u dài γ < W
k•1
[i,j].
Do ñó theo ñnh nghĩa c:a W
k
thì ta có:
W
k
[i,j] = W
k•1
[i,k]+W
k•1
[k,j] .
Thí dN 2:t ñ9 th G sau:
Áp ddng thuBt toán Floyd, ta tìm ñưHc (các ô trng là )
W = W
0
=
1
22
4
3
14
27
v1
v2
v3
v4
v5
v6
4
7
2
2
4
1
1
2
3