Sunteți pe pagina 1din 34

Calin Jebelean Algoritmul lui Dijkstra 1

Algoritmul lui Dijkstra


Este un algoritm care calculeaza drumurile
minime de la un nod al unui graf la toate
celelalte noduri din graf
Grafurile pe care poate lucra algoritmul lui
Dijkstra sunt, in general, ponderate si
orientate arcele sunt orientate de la un nod
la alt nod (nu se poate merge si invers) si au
un anumit cost de care se va tine seama in
aflarea drumului minim
Calin Jebelean Algoritmul lui Dijkstra 2
Algoritmul lui Dijkstra
Daca graful este neponderat (arcele nu au costuri asociate) atunci
drum minim intre doua noduri se considera drumul alcatuit din numar
minim de arce
Pentru a gasi drumul minim de la un nod X la un nod se poate aplica
o cautare prin cuprindere pornind de la nodul X prima aparitie a lui
in coada algoritmului de cautare prin cuprindere presupune e!istenta
unui drum cu numar minim de arce de la X la , care poate fi
reconstituit
Pe un astfel de graf se poate aplica si algoritmul lui Dijkstra, daca
transformam in preala"il graful intr#unul ponderat, asociind fiecarui arc
acelasi cost (de e!emplu, costul $)
Drumul de cost minim intre doua noduri o"tinut in urma aplicarii
algoritmului lui Dijkstra va avea si numar minim de arce din moment ce
toate arcele au acelasi cost
Calin Jebelean Algoritmul lui Dijkstra 3
Algoritmul lui Dijkstra
Algoritmul lui Dijkstra functioneaza atat pe grafuri cone!e cat si
pe grafuri necone!e
%n graf este cone! daca din orice nod al sau se poate ajunge in
orice alt nod
&n cazul grafurilor orientate, pentru ca intre doua noduri sa
e!iste un drum in graf, nu este suficient sa e!iste o succesiune
de arce intre cele doua noduri, ci arcele tre"uie sa fie si
orientate in sensul corespunzator
%n drum intr#un graf orientat tre"uie sa parcurga numai arce
orientate identic, de la nodul sursa pana la nodul destinatie
Daca nu e!ista nici un drum de la nodul de start la un alt nod al
grafului atunci algoritmul lui Dijkstra va raporta e!istenta unui
drum de lungime infinita intre ele acest rezultat indica, de
fapt, lipsa oricarui drum intre cele doua noduri
Calin Jebelean Algoritmul lui Dijkstra 4
Algoritmul lui Dijkstra
&ntrare'

Algoritmul porneste de la un graf orientat si ponderat cu ( noduri

De asemenea, e nevoie de un nod de start apartinand grafului


acesta este nodul de la care se doreste aflarea drumurilor minime
pana la celelalte noduri din graf
&esire'

)ezultatul algoritmului se prezinta su" forma unui ta"lou D cu (


intrari, continand distantele minime de la nodul de start la toate
celelalte noduri din graf

De asemenea, tot ca rezultat se poate o"tine si ar"orele drumurilor


minime (in cazul in care ne intereseaza nu numai lungimile minime
ale drumurilor, ci si drumurile propriu#zise) acesta este un ar"ore
generalizat care se va o"tine su" forma unui ta"lou * cu ( intrari
(implementarea cu indicatori spre parinte)
Calin Jebelean Algoritmul lui Dijkstra 5
Algoritmul lui Dijkstra
+ie X nodul de start acesta se marc,eaza ca vizitat
&deea gasirii drumului minim de la X la un un alt nod este cautarea
treptata' se presupune ca drumul minim este alcatuit dintr#un singur
arc (arcul direct intre X si nodul tinta, care poate sa nu e!iste, costul
sau fiind infinit in acest caz), apoi se cauta drumuri mai scurte alcatuite
din - arce, apoi din ., etc/ un drum minim nu poate avea mai
mult de N-1 arce, deci algoritmul are (#$ pasi (al (#lea este "anal)
Dupa pasul k ($ 0 k 0 (#$), ta"loul D va contine lungimile drumurilor
minime de la nodul X la celelalte noduri, toate aceste drumuri fiind
alcatuite din maxim k arce
Astfel, D12 3 4 dupa pasul k inseamna ca de la X la exista un
drum minim de lungime L alcatuit din maxim k arce
Deci, dupa pasul k, au fost gasite numai drumurile minime alcatuite din
ma!im k arce a"ia la finalul algoritmului (dupa pasul (#$) drumurile
minime o"tinute sunt definitive, ele fiind drumuri minime alcatuite din
ma!im (#$ arce
Calin Jebelean Algoritmul lui Dijkstra 6
Algoritmul lui Dijkstra
4a inceputul fiecarui pas k avem un set de k#$ noduri marcate (in cadrul pasilor
precedenti) nodurile marcate sunt cele pentru care se cunoaste drumul minim
(initial, doar nodul de start este marcat deoarece doar pentru el se cunoaste
drumul minim)
&n cadrul pasului k tre"uie e!ecutate . operatiuni'

5e gaseste acel nod nemarcat care are D[Y] minim (acesta este
singurul dintre nodurile nemarcate pentru care se poate spune sigur ca
drumul minim are lungimea D12) pentru celelalte noduri nemarcate
valoarea corespunzatoare din ta"loul D s#ar putea sa nu reprezinte
lungimea drumului minim ci un drum minim intermediar (alcatuit din ma!im
k#$ arce) care poate fi im"unatatit in cadrul pasilor viitori ai algoritmului

(odul se marc,eaza ca vizitat

Pentru fiecare nod 6 ramas nemarcat se e!ecuta urmatorul algoritm'


if D162 7 D12 8 Arc( , 6) t,en "egin
D162 '3 D12 8 Arc( , 6)9
*162 '3
end
Calin Jebelean Algoritmul lui Dijkstra 7
Algoritmul lui Dijkstra
4ogica este urmatoarea'
D12 contine lungimea drumului minim de la nodul de start la
nodul Y care trece numai prin noduri marcate ( fiind, la
inceputul pasului k, nodul nemarcat care avea D12 minim) acest
drum este alcatuit din ma!im k#$ arce D12 fiind minim, il marcam pe
deoarece nu poate e!ista un drum mai scurt de la X la
D162 contine lungimea celui mai scurt drum de la nodul de start la
nodul 6 alcatuit din maxim k-1 arce acest drum trece doar prin
noduri marcate, fara sa tina cont ca, intre timp, si a fost marcat
5#ar putea sa e!iste un drum mai scurt decat D162 de la nodul de start
la 6 alcatuit din maxim k arce care trece numai prin noduri
marcate, inclusiv nodul Y unicul drum cu aceasta proprietate care
poate fi mai scurt decat D162 este cel care include drumul minim pana
la si arcul direct intre si 6, deci lungimea sa este D12 8 Arc( , 6)
Calin Jebelean Algoritmul lui Dijkstra 8
Algoritmul lui Dijkstra
+ie graful din figura
:rem sa aflam drumurile minime de la nodul A la toate celelalte
noduri din graf
;
$
<
;
.
$
-
=
$
<
$
-
A
>
?
D
E
+
G
@
=
Calin Jebelean Algoritmul lui Dijkstra 9
Algoritmul lui Dijkstra
Algoritmul tre"uie sa returneze urmatorul rezultat'
D 3
* 3
*a"loul D are cate o intrare pentru fiecare nod al grafului,
corespunzand lungimii drumului minim de la nodul A pana la
respectivul nod
Astfel, drumul minim de la A la A nu intereseaza (#), drumul
minim de la A la + are lungimea <, drumul minim de la A la @ nu
e!ista (A), etc/
# B $ . . < = A
A E A A ? E + #
A > ? D E + G @
Calin Jebelean Algoritmul lui Dijkstra 10
Algoritmul lui Dijkstra
A este nodul de start il marcam ca vizitat
+iind primul pas, initializam ta"lourile D si * astfel'

D1!2 este lungimea arcului direct de la A la nodul ! pentru fiecare nod !

*1!2 este nodul de start (sau indicele nodului de start in * daca se doreste un
ta"lou de indicatori spre parinte clasic)
;
$
<
;
.
$
-
=
$
<
$
-
A
>
?
D
E
+
G
@
=
# ; $ . A A ; A
A > ? D E + G @
(odurile marcate
astfel sunt noduri
vizitate in graf de
algoritmul lui Dijkstra
A A A A A A A A
D'
*'
Calin Jebelean Algoritmul lui Dijkstra 11
Algoritmul lui Dijkstra
?u alte cuvinte, presupunem ca drumurile
minime de la nodul A la celelalte noduri din
graf sunt alcatuite dintr#un singur arc, adica
arcul direct de la A la fiecare din nodurile
respective (sim"olul A semnifica lipsa arcului)
Astfel, drumurile minime gasite dupa primul
pas sunt cele ingrosate pe figura anterioara
Calin Jebelean Algoritmul lui Dijkstra 12
Algoritmul lui Dijkstra
5e alege nodul ? si se marc,eaza, deoarece nodul ? este nodul
nemarcat care are intrarea in ta"loul D minima drumul minim
de la A la ? are lungimea $ (nu vom gasi altul mai scurt pana la
final)
;
$
<
;
.
$
-
=
$
<
$
-
A
>
?
D
E
+
G
@
=
# ; $ . A A ; A
A > C D E + G @
D'
Calin Jebelean Algoritmul lui Dijkstra 13
Algoritmul lui Dijkstra
*a"loul D este'
Pentru toate nodurile nemarcate tre"uie sa verificam daca nu
e!ista un drum mai scurt care trece prin nodul ?
E!emplu pentru nodul >'

D1>2 3 ; este drumul cel mai scurt de la A la > pe care#l aveam

D1?2 8 Arc(? , >) 3 $ 8 A 3 A este drumul alternativ care trece


prin nodul ? (nodul ales)

Acest al doilea drum este mai lung decat drumul pe care#l aveam
deci D1>2 nu se modifica la acest pas
# ; $ . A A ; A
A > C D E + G @
Calin Jebelean Algoritmul lui Dijkstra 14
Algoritmul lui Dijkstra
E!emplu pentru nodul E'

D1E2 3 A este drumul cel mai scurt de la A la E pe care#l aveam

D1?2 8 Arc(? , E) 3 $ 8 - 3 . este drumul alternativ care trece


prin nodul ? (nodul ales)

Deoarece noul drum este mai scurt decat drumul pe care#l aveam
rezulta ca D1E2 se modifica din A in . si *1E2 se modifica in ?
(nodul ales)

5e o"serva ca drumul alternativ trece prin nodul ? (nodul ales)

Drumul de la A la ? de lungime D1?2 fiind minim, daca adaugam


arcul ?#7E o"tinem o"ligatoriu drumul minim de la A la E care
trece prin ?
Calin Jebelean Algoritmul lui Dijkstra 15
Algoritmul lui Dijkstra
Procedand la fel pentru toate nodurile
nemarcate, o"tinem urmatorul rezultat'
;
$
<
;
.
$
-
=
$
<
$
-
A
>
?
D
E
+
G
@
=
# ; $ . . C ; A
A > C D E + G @
A A A A ? ? A A
D'
*'
Din nodul ? au fost
descoperite aceste -
drumuri noi (mai
scurte) catre E si +
Calin Jebelean Algoritmul lui Dijkstra 16
Algoritmul lui Dijkstra
5e alege nodul D si se marc,eaza, deoarece nodul D are
intrarea in ta"loul D minima (c,iar daca egala cu intrarea
nodului E, alegerea este ar"itrara) drumul minim de la A la D
are lungimea . (nu vom gasi altul mai scurt pana la final)
# ; $ . . C ; A
A > C D E + G @
D'
;
$
<
;
.
$
-
=
$
<
$
-
A
>
?
D
E
+
G
@
=
Calin Jebelean Algoritmul lui Dijkstra 17
Algoritmul lui Dijkstra
*a"loul D este'
Pentru toate nodurile nemarcate tre"uie sa verificam daca nu
e!ista un drum mai scurt care trece prin nodul D
E!emplu pentru nodul +'

D1+2 3 C este drumul cel mai scurt de la A la + pe care#l aveam

D1D2 8 Arc(D , +) 3 . 8 A 3 A este drumul alternativ care trece


prin nodul D (nodul ales)

Acest al doilea drum este mai lung decat drumul pe care#l aveam
deci D1+2 nu se modifica la acest pas
# ; $ . . C ; A
A > C D E + G @
Calin Jebelean Algoritmul lui Dijkstra 18
Algoritmul lui Dijkstra
E!emplu pentru nodul G'

D1G2 3 ; este drumul cel mai scurt de la A la G pe care#l aveam

D1D2 8 Arc(D , G) 3 . 8 = 3 D este drumul alternativ care trece


prin nodul D (nodul ales)

Deoarece noul drum este mai scurt decat drumul pe care#l aveam
rezulta ca D1G2 se modifica din ; in D si *1G2 se modifica in D
(nodul ales)

5e o"serva ca drumul alternativ trece prin nodul D (nodul ales)

Drumul de la A la D de lungime D1D2 fiind minim, daca adaugam


arcul D#7G o"tinem o"ligatoriu drumul minim de la A la G care
trece prin D
Calin Jebelean Algoritmul lui Dijkstra 19
Algoritmul lui Dijkstra
Procedand la fel pentru toate nodurile
nemarcate, o"tinem urmatorul rezultat'
;
$
<
;
.
$
-
=
$
<
$
-
A
>
?
D
E
+
G
@
=
# ; $ . . C D A
A > C D E + G @
A A A A ? ? D A
D'
*'
Din nodul D a fost
descoperit acest drum
nou (mai scurt) catre
G
Calin Jebelean Algoritmul lui Dijkstra 20
Algoritmul lui Dijkstra
5e alege nodul E si se marc,eaza, deoarece nodul E are intrarea
in ta"loul D minima drumul minim de la A la E are lungimea .
(nu vom gasi altul mai scurt pana la final)
# ; $ . . C D A
A > C D E + G @
D'
;
$
<
;
.
$
-
=
$
<
$
-
A
>
?
D
E
+
G
@
=
Calin Jebelean Algoritmul lui Dijkstra 21
Algoritmul lui Dijkstra
*a"loul D este'
Pentru toate nodurile nemarcate tre"uie sa verificam daca nu
e!ista un drum mai scurt care trece prin nodul E
E!emplu pentru nodul G'

D1G2 3 D este drumul cel mai scurt de la A la G pe care#l aveam

D1E2 8 Arc(E , G) 3 . 8 A 3 A este drumul alternativ care trece


prin nodul E (nodul ales)

Acest al doilea drum este mai lung decat drumul pe care#l aveam
deci D1G2 nu se modifica la acest pas
# ; $ . . C D A
A > C D E + G @
Calin Jebelean Algoritmul lui Dijkstra 22
Algoritmul lui Dijkstra
E!emplu pentru nodul >'

D1>2 3 ; este drumul cel mai scurt de la A la > pe care#l aveam

D1E2 8 Arc(E , >) 3 . 8 < 3 B este drumul alternativ care trece


prin nodul E (nodul ales)

Deoarece noul drum este mai scurt decat drumul pe care#l aveam
rezulta ca D1>2 se modifica din ; in B si *1>2 se modifica in E
(nodul ales)

5e o"serva ca drumul alternativ trece prin nodul E (nodul ales)

Drumul de la A la E de lungime D1E2 fiind minim, daca adaugam


arcul E#7> o"tinem o"ligatoriu drumul minim de la A la > care
trece prin E
Calin Jebelean Algoritmul lui Dijkstra 23
Algoritmul lui Dijkstra
Procedand la fel pentru toate nodurile
nemarcate, o"tinem urmatorul rezultat'
;
$
<
;
.
$
-
=
$
<
$
-
A
>
?
D
E
+
G
@
=
# B $ . . < D A
A > C D E + G @
A E A A ? E D A
D'
*'
Din nodul E au fost
descoperite aceste -
drumuri noi (mai
scurte) catre > si +
Calin Jebelean Algoritmul lui Dijkstra 24
Algoritmul lui Dijkstra
5e alege nodul + si se marc,eaza, deoarece nodul + are intrarea
in ta"loul D minima drumul minim de la A la + are lungimea <
(nu vom gasi altul mai scurt pana la final)
# B $ . . < D A
A > C D E G @
D'
;
$
<
;
.
$
-
=
$
<
$
-
A
>
?
D
E
+
G
@
=
Calin Jebelean Algoritmul lui Dijkstra 25
Algoritmul lui Dijkstra
*a"loul D este'
Pentru toate nodurile nemarcate tre"uie sa verificam daca nu
e!ista un drum mai scurt care trece prin nodul +
E!emplu pentru nodul >'

D1>2 3 B este drumul cel mai scurt de la A la > pe care#l aveam

D1+2 8 Arc(+ , >) 3 < 8 A 3 A este drumul alternativ care trece


prin nodul + (nodul ales)

Acest al doilea drum este mai lung decat drumul pe care#l aveam
deci D1>2 nu se modifica la acest pas
# B $ . . < D A
A > C D E G @
Calin Jebelean Algoritmul lui Dijkstra 26
Algoritmul lui Dijkstra
E!emplu pentru nodul G'

D1G2 3 D este drumul cel mai scurt de la A la G pe care#l aveam

D1+2 8 Arc(+ , G) 3 < 8 $ 3 = este drumul alternativ care trece


prin nodul + (nodul ales)

Deoarece noul drum este mai scurt decat drumul pe care#l aveam
rezulta ca D1G2 se modifica din D in = si *1G2 se modifica in +
(nodul ales)

5e o"serva ca drumul alternativ trece prin nodul + (nodul ales)

Drumul de la A la + de lungime D1+2 fiind minim, daca adaugam


arcul +#7G o"tinem o"ligatoriu drumul minim de la A la G care
trece prin +
Calin Jebelean Algoritmul lui Dijkstra 27
Algoritmul lui Dijkstra
Procedand la fel pentru toate nodurile
nemarcate, o"tinem urmatorul rezultat'
;
$
<
;
.
$
-
=
$
<
$
-
A
>
?
D
E
+
G
@
=
# B $ . . < = A
A > C D E G @
A E A A ? E + A
D'
*'
Din nodul + a fost
descoperit acest drum
nou (mai scurt) catre
G
Calin Jebelean Algoritmul lui Dijkstra 28
Algoritmul lui Dijkstra
5e alege nodul G si se marc,eaza, deoarece nodul G are
intrarea in ta"loul D minima drumul minim de la A la G are
lungimea = (nu vom gasi altul mai scurt pana la final)
;
$
<
;
.
$
-
=
$
<
$
-
A
>
?
D
E
+
G
@
=
# B $ . . < = A
A > C D E ! @
D'
(u e!ista drumuri mai
scurte spre > sau @
trecand prin G, deci
ta"lourile D si *
raman nemodificate
Calin Jebelean Algoritmul lui Dijkstra 29
Algoritmul lui Dijkstra
5e alege nodul > si se marc,eaza, deoarece nodul > are
intrarea in ta"loul D minima drumul minim de la A la > are
lungimea B (nu vom gasi altul mai scurt pana la final)
;
$
<
;
.
$
-
=
$
<
$
-
A
>
?
D
E
+
G
@
=
# B $ . . < = A
A " C D E ! @
D'
(u e!ista drum mai
scurt spre @ trecand
prin >, deci ta"lourile
D si * raman
nemodificate
Calin Jebelean Algoritmul lui Dijkstra 30
Algoritmul lui Dijkstra
5e alege nodul @ si se marc,eaza, deoarece nodul @ are
intrarea in ta"loul D minima drumul minim de la A la @ are
lungimea A (adica nu e!ista), caz in care punem *1@2 3 EF
;
$
<
;
.
$
-
=
$
<
$
-
A
>
?
D
E
+
G
@
=
# B $ . . < = A
A " C D E ! #
D'
(u mai e!ista noduri
nemarcate care sa fie
actualizate, deci
ta"lourile D si *
raman nemodificate
Calin Jebelean Algoritmul lui Dijkstra 31
Algoritmul lui Dijkstra
Algoritmul se inc,eie deoarece nu mai sunt noduri
nemarcate
)ezultatul este'
4ungimile drumurilor minime de la A la celelalte
noduri din graf sunt disponi"ile in ta"loul D
*a"loul * serveste la reconstituirea drumurilor
# B $ . . < = A
A " C D E ! #
A E A A ? E + #
D'
*'
Calin Jebelean Algoritmul lui Dijkstra 32
Algoritmul lui Dijkstra
Putem reconstitui drumurile in doua moduri'

intuitiv, urmarind arcele ingrosate de pe graf (de e!emplu, drumul


minim de la A la G este A #7 ? #7 E #7 + #7 G)

formal, utilizand ta"loul * rezultat in urma aplicarii algoritmului


;
$
<
;
.
$
-
=
$
<
$
-
A
>
?
D
E
+
G
@
=
Calin Jebelean Algoritmul lui Dijkstra 33
Algoritmul lui Dijkstra
*a"loul * este'
Daca consideram ca acest ta"lou reprezinta un ar"ore
generalizat in implementarea cu indicatori spre parinte, atunci
drumul minim de la A la G poate fi reconstituit pornind de la G'

*1G2 3 +

*1+2 3 E

*1E2 3 ?

*1?2 3 A
Gergand invers, o"tinem' A #7 ? #7 E #7 + #7 G
Ar"orele generalizat o"tinut in ta"loul * contine toate drumurile
minime cu originea in A
A E A A ? E + #
A > ? D E + G @
Calin Jebelean Algoritmul lui Dijkstra 34
Algoritmul lui Dijkstra
Algoritmul gaseste doar drumuri minime cu originea
intr#un anumit nod al grafului
Daca se doresc drumuri minime cu originea in alt
nod, tre"uie repornit algoritmul cu respectivul nod pe
post de nod de start
Drumurile minime o"tinute pot fi reprezentate ca un
ar"ore generalizat, deoarece ele se suprapun in mare
parte
Astfel, daca drumul minim de la X la trece prin 6, el
tre"uie o"ligatoriu sa cuprinda si drumul minim de la
X la 6

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