Sunteți pe pagina 1din 2

Grafuri...

Mircea Digulescu, Andrei Matei


Problema determinrii celui mai scurt drum de la un nod la altul ntr-un graf
este una fundamental n algoritmic. n continuare vom prezenta un algoritm
al crui timp de execuie depinde de costurile asociate muchiilor. Acesta este
aplicabil atunci cnd costurile sunt mici i sunt numere ntregi nenegative.

Notaii

Un algoritm de ordinul O(V+E+C*)

n continuare vom prezenta un algoritm care determin


costul drumului minim atunci cnd muchiile au costuri ntregi nenegative. El reprezint, de fapt, o modificare a algoritmului lui Dijsktra n care este folosit o coad de prioriti neobinuit.
Fie l[0], l[1], , l[C] i l[] liste dublu-nlnuite de
noduri din V.
n total avem C + 2 liste. Pe parcursul execuiei algoritmului, fiecare nod va aparine unei singure liste. Pentru

un nod v, d[v] va fi o estimare a costului drumului minim


la v. Cnd algoritmul se ncheie, vom avea d[v] = (s, v)
pentru toate nodurile v V. Algoritmul poate fi uor modificat pentru a determina i un drum de cost minim i lsm acest lucru pe seama cititorului.
n continuare vom prezenta varianta n pseudocod a
algoritmului:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:

l[i] , 0 i C*
l[]
l[0] s
pentru v V execut
l[] v
d[v]
sfrit pentru
d[s] 0
p0
ct timp p < C* execut
ct timp l[p] execut
v l[p]
pentru (v, u) cu d[u] > d[v] + w(v, u)
execut
l[d[u]] a v
d[u] d[v] + w(v, u)
l[d[u] u
sfrit pentru
sfrit ct timp
pp+1
sfrit ct timp

Algoritmul anterior este asemntor cu algoritmul lui


Dijsktra prin faptul c proceseaz nodurile n ordine cresctoare a costului cii minime la ele. Liniile 1-8 realizeaz
iniializarea valorilor l, S i d. Pe parcursul execuiei algoritmului lista l[i] va conine toate nodurile v pentru care
d[v] = i. Algoritmul parcurge n ordine l[0], l[1], l[2], i
la pasul p relaxeaz toate muchiile adiacente cu un nod din
l[p]. Liniile 14 i 16 vor muta un nod u pentru care estimarea costului drumului minim pn la el, d[u], s-a schimbat
(ca urmare a relaxrii unei muchii) n lista corespunztoare
noii estimri (mai nti este ters din lista veche i apoi
inserat n lista corespunztoare).

GInfo nr. 13/6 - octombrie 2003

Considerm un graf G = (V, E) i o funcie de cost w: E


N (astfel nct w(e) 0, e E) care asociaz un ntreg
nenegativ fiecrei muchii a grafului. Costul unui drum p n
G este suma costurilor tuturor muchiilor din p. Fie nodul
surs s.
p
Definim (u, v) = min(Cost (u v)) ca fiind costul
minim dintre toate cile p de la u la v, unde u, v V. De
asemenea, fie C = max(w(e)) costul celei mai "scumpe"
muchii din graf i fie C = max((s, u)) cel mai mare cost al
unui drum minim n G care pleac din s.
Pentru toi v V, d[v] reprezint o estimare a costului
unui drum minim (d[v] (s, v)) pe tot parcursul execuiei
algoritmilor prezentai aici).
Obiectivul este gsirea costurilor (s, v) pentru orice
v V. De asemenea, un drum p de cost minim de la s la v trebuie gsit, dar algoritmul folosit pentru determinarea (s, v)
este simplu de modificat pentru a gsi un astfel de drum p.
Algoritmul prezentat va folosi liste dublu-nlnuite.
Pentru o list dublu-nlnuit l operaia v l extrage
primul element. Dup extracie, v va avea valoarea primului element din list. Operaia l v introduce un element
v n lista l. Totodat, operaia l a v are ca efect tergerea
elementului v din lista l. Valoarea din v rmne neschimbat n urma aceastei operaii.

focus

Drumuri MINIME cnd


costurile sunt MICI

41

focus
GInfo nr. 13/6 - octombrie 2003

42

Corectitudinea algoritmului
Vom arata c atunci cnd algoritmul se ncheie, vom avea
d[v] = (s, v) pentru orice v V. Vom demonstra mai nti
cteva rezultate intermediare.
Lema 1: Dac un nod v este extras n linia 12, atunci
toate nodurile u care sunt legate de v (direct sau indirect)
prin muchii de cost 0 vor fi procesate la aceeai iteraie (a ciclului care ncepe la linia 10), ca i v, i vor avea d[u] = d[v].
Demonstraia se realizeaz prin inducie dup numrul de muchii de cost 0 dintre u i v. Toate nodurile adiacente cu v vor fi descoperite de codul din linia 13, vor avea
d[u] = d[v] datorit liniei 15 i vor fi adugate n lista curent la linia 16. Prin inducie, dac nodurile aflate la
distana k de v au fost procesate, atunci nodurile aflate la
distana k + 1 de v vor fi descoperite de codul din linia 13
i procesate. Deci, toate nodurile legate de v prin muchii
de cost 0 vor fi procesate i vor avea d[u] = d[v].
Lema 2: La sfritul fiecrei iteraii a ciclului care ncepe la linia 10 toate nodurile v pentru care (s, v) p au fost
procesate.
Demonstraia se realizeaz tot prin inducie. Primul
nod extras este s. Din moment ce costurile muchiilor sunt
nenegative, singurele noduri pentru care (s, v) 0 sunt cele
pentru care (s, v) = 0. Orice nod pentru care (s, v) = 0
trebuie s fie conectat de surs prin muchii de cost 0. Conform lemei 1, toate nodurile de acest tip vor fi procesate.
La pasul p, datorit ipotezei de inducie, toate nodurile
x pentru care (s, v) < p au fost procesate. Fie v un nod
astfel nct (s, v) = p. Fie u predecesorul direct al lui v pe
un drum de cost minim s:
(s, v) = (s, u) + w(u, v) p = (s, u) + w(u, v).
Dac w(u, v) > 0, atunci (s, u) < p, deci u a fost procesat la o iteraie precedent. Deoarece u a fost procesat
atunci cnd muchia (u, v) a fost relaxat, nodul v a fost
inserat n lista l[p] (dac nu era inserat deja n list). Deoarece toate nodurile din l[p] sunt procesate la pasul p, atunci
nodul v va fi procesat.
Cazul n care w(u, v) = 0 nu prezint interes, deoarece,
conform lemei 1, toate nodurile legate prin muchii de cost
0 de nodul u sunt procesate la aceeai iteraie ca i u. Deci,
dac am dovedit c toate nodurile pentru care (s, v) = p i
care sunt legate de predecesorii direci prin muchii de cost
pozitiv sunt procesai la pasul p, atunci toate nodurile pentru care (s, v) = p sunt procesate la pasul p.
Teorem: Atunci cnd un nod este extras n linia 12 el
va avea d[v] = (s, v).
Demonstraia se realizeaz tot prin inducie. Primul
nod extras este s i va avea d[s] = (s, s) = 0.
Fie v un nod arbitrar extras din l[p] cu operaia de la linia 12. Prin inducie avem calculate costurile drumurilor minime pentru toate nodurile care au fost extrase naintea lui.
Datorit lemei 2 toate nodurile pentru care costul drumului
minim este mai mic dect p au fost procesate. Astfel avem:
d[u] = (s, u), pentru toi u astfel nct (s, u) < p.
t
Fie un drum de cost minim de la s la v: s

uv.
Vom avea (s, v) = (s, u) + w(u, v).

Presupunem, fr a reduce generalitatea, c w(u, v) > 0


(deoarece, conform lemei 1, toate nodurile care sunt conectate prin muchii de cost 0 de un nod x vor avea n cele
din urm d[u] = d[x] care va fi (s, u) dac d[x] = (s, x)).
Prin urmare: (s, u) < (s, v) (s, u) < p.
Conform lemei 2, toate nodurile de acest tip au fost
procesate. Fie u primul asemenea nod procesat de algoritm.
Prin ipoteza de inducie avem d[u] = (s, u). Atunci cnd
muchia (u, v) este relaxat avem d[v] = (s, u) + w(u, v) i,
datorit alegerii fcute, pentru u (ca predecesor al lui v pe
un drum de cost minim), vom avea d[v] = (s, v).
n sfrit, deoarece fiecare nod aparine unei liste (prin
iniializare), i toate listele sunt procesate, toate nodurile
vor fi procesate. Astfel, conform teoremei 1, vom avea
d[v] = (s, v) pentru toi v V cnd algoritmul se ncheie.
Analiza complexitii
Linia 1 se execut ntr-un timp de ordinul O(C); ordinul de
complexitate al operaiilor efectuate n liniile 4-7 este O(V),
iar cel al operaiilor efectuate n liniile 2, 3, 8 i 9 este O(1).
Ciclul care ncepe la linia 10 necesit un timp O(C),
dac nu lum n considerare ciclul care ncepe la linia 11.
Se observ c dac un nod este extras n linia 12 (i procesat) el nu va mai fi procesat ulterior. Prin urmare, timpul
total consumat de execuiile liniei 12 este O(V), deoarece
fiecare nod este extras exact o dat. Aadar, timpul necesar
pentru toate execuiile ciclului care ncepe la linia 11 este
O(V), dac facem abstracie de timpul necesar execuiei
ciclului care ncepe la linia 13.
Se observ c fiecare muchie (v, u) a grafului este luat
n considerare exact o dat n cadrul ciclului care ncepe la
linia 13 (sau de dou ori dac graful este neorientat), mai
exact atunci cnd nodul v este procesat (dac graful este
neorientat este considerat i atunci cnd este procesat nodul u; condiia d[u] > d[v] + w(v, u) va fi adevrat cel mult
o dat: la prima procesare a unui nod adiacent acesteia).
Operaiile de inserare i eliminare pentru liste dublu-nlnuite pot fi executate n timp constant; aadar ordinul de
complexitate al tuturor execuiilor acestui ciclu este O(E).
n concluzie, ordinul de complexitate al algoritmului este O(C) + O(V)+ O(C)+ (O(V)+ O(E)) = O(V + E + C).
Datorit faptului c C < V C ordinul de complexitate este cu siguran mai mic dect O(V C + E).

Bibliografie

1. T. H. Cormen, C. E. Leiserson, R. R. Rivest, Introducere n algoritmi, Computer Libris Agora, 2000


2. Ahuja, Mehlhorn, Orlin, Tarjan, Faster algorithms for
the shortest path problem, Tehnical Report 193, MIT
Operations Research Center, 1998
3. Gabow, Tarjan, Faster scaling algorithms for network
problems, SIAM Journal on Computing, 1989
Mircea Digulescu i Andrei Matei sunt elevi n clasa a XI-a la Colegiul
Naional de Informatic Tudor Vianu din Bucureti i pot fi contactai
prin e-mail la mircea85@yahoo.com, respectiv andreimatei@home.ro.

S-ar putea să vă placă și