Sunteți pe pagina 1din 5

Drumuri minime n grafuri

Doru Popescu Anastasiu 1. Relaxare


Algoritmii care vor fi prezentai n continuare folosesc anumite tehnici. Tehnica principal utilizat este relaxarea, metod care revine la decrementarea repetat a unei margini superioare pentru determinarea costului corespunztor unui drum minim pentru fiecare vrf, pn cnd marginea superioar devine egal cu costul unui drum optimal. n continuare vom considera un graf orientat G=(X,U), X={1, 2, , n}, o matrice de costuri c=(cij)i,j=1,2,,n i un nod sX, numit surs. Algoritmi ce vor urma determin pentru fiecare nod iX, distana minim pe un drum de la s la i (notat cu d i). Pentru a putea construi un drum de cost minim de la s la i (adic de cost d i), vom utiliza un vector t=(t1, t2, , tn), cu semnificaia, ti reprezint tatl nodului i. Vectorii v i t vor fi iniializai prin subprogramul: Iniializare-surs-unic(G,s) pentru i=1,n execut di= ti=0 sfrit pentru ds=0 n procesul de relaxare a unui arc (i,j) se verific dac drumul minim la j, determinat pn la acel moment, poate fi nbuntit pe baza vrfului i i dac da, atunci se reactualizeaz d j i tj. Un pas de relaxare pe muchia (i,j) este realizat prin subprogramul: Relaxeaz(i,j,c) dac dj>di+cij atunci dj=di+cij tj=i sfrit dac

2. Algoritmul lui Dijkstra


Algoritmul lui Dijkstra determin pentru fiecare nod cte un drum de cost minim ce pornete de la o surs unic ntr-un graf orientat, pentru care costurile arcelor sunt pozitive. Dijkstra(G,c,s) Initializare-surs-unic(G,s) S= Q={1, 2, , n} ct timp Q execut i=minim(Q) S=S {i} pentru fiecare vrf j pentru care exist arcul (i,j) execut relaxeaz(i,j,c) sfrit pentru sfrit ct timp Deoarece algoritmul lui Dijkstra alege ntotdeauna cel mai uor sau apropiat vrf din U-S pentru a-l introduce n S, avem o strategie de tip greedy. Timpul total de execuie al algoritmului este O(n2).

3. Algoritmul Bellman-Ford
Algoritmul Bellman-Ford rezolv problema drumurilor minime de surs unic n cazul mai general, pentru un graf orientat n care costurile arcelor pot fi i negative. n cazul n care exist un ciclu de cost negativ accesibil din vrful surs, algoritmul returneaz ADEVRAT, iar n cellalt caz FALS. Ca i n algoritmul lui Dijkstra, algoritmul Bellman-Ford utilizeaz tehnica de relaxare, procednd la descreterea estimrii di a drumului minim de la sursa s la fiecare vrf iX pn cnd este obinut costul adevrat. Bellman-Ford(G,c,s) Iniializare-surs-unic(G,s) pentru i=1,n-1 execut pentru fiecare arc (i,j) din G execut relaxeaz(i,j,c) sfrit pentru sfrit pentru pentru fiecare muchie (i,j) din G execut dac dj>di+cij atunci returneaz FALS sfrit dac sfrit pentru returneaz ADEVRAT Algoritmul Bellman-Ford este de complexitate O(nm), unde m este numrul de arce.

3. Drumuri minime de surs unic n grafuri orienate aciclice.


O sortare topologic a unui graf orientat aciclic este o ordonare liniar a tuturor vrfurilor sale astfel nct, dac graful conine un arc (i,j) , atunci i apare naintea lui j. Prin relaxarea muchiilor unui graf orientat aciclic cu costuri, putem determina drumurile minime de surs unic n timp O(n+m). Drumurile minime sunt ntotdeauna bine definite ntr-un astfel de graf datorit faptului c acesta nu poate avea cicluri de cost negativ, chiar dac graful conine muchii de cost negativ. Algoritmul ncepe prin sortarea topologic a grafului pentru impunerea unei ordini liniare a vrfurilor. Dac exist un drum de la vrful i la vrful j, atunci i precede j n ordine topologic. n continuare, se efectueaz o singur trecere peste vrfurile sortate topologic i pe msur ce fiecare vrf este procesat, sunt relaxate toate muchiile divergente din acel graf. GOA-Drumuri-minime(G,c,s) Sorteaz n ordine topologic vrfurile din G Iniializare-surs-unic(G,s) pentru fiecare vrf i n ordinea dat de sortarea topologic execut pentru fiecare vrf j adiacent cu i execut Relaxeaz(i,j,c) sfrit pentru sfrit pentru Observaie Pentru toi algoritmii prezentai anterior este util s dm grafurile prin liste de adiacen.

4. Drumuri minime ntre toate perechile de vrfuri.Algoritmul lui Floyd-Warshall


n continuare vom considera un graf orientat G=(X,U), X={1, 2, , n}, card(U)=m, dat prin matricea costurilor c=(cij)i,j=1,2,n.

cij = cos tul

dac i = j arcului (i, j ), dac i j i (i, j ) U , dac i j i (i, j ) U 0,

Sunt permise arce de costuri negative, dar, pentru moment, presupunem c graful de intrare nu conine cicluri de cost negativ. Ieirea sub form de tabel a algoritmilor de gsire a drumurilor minime ntre toate perechile de vrfuri este o matrice d=(dij)i,j=1,2,,n, ale crei elemente reprezint costul drumului minim de la i la j. Pentru a rezolva problema gsirii drumurilor de cost minim ntre toate perechile de vrfuri, trebuie s calculm, pe lng costurile drumurilor minime, i matricea predecesorilor t=(t ij)i,j=1,2,,n, unde tij este 0 n cazul n care i=j sau nu exist drum de la i la j. n celelalte cazuri, elementul t ij este predecesorul lui j ntr-un drum minim de la i. Afiarea unui drum minim de la vrful i la vrful j se va realiza prin subprogramul: Tiprete-Drumurile-Minime-Dintre-Toate-Perechile(t,i,j) dac i=j atunci Tiprete i altfel dac tij=0 atunci Tiprete Nu exist drum de la i la j altfel Tiprete-Drumurile-Minime-Dintre-Toate-Perechile(t,i,tij) Tiprete j sfrit dac sfrit dac Algoritmul Floyd-Warshall folosete metoda programrii dinamice pentru determinarea drumului minim ntre toate perechile de vrfuri ale unui graf orientat. Algoritmul ia n considerare vrfurile intermediare ale unui drum minim, unde un vrf intermediar al unui drum elementar p=(p1, p2, , ph) este oricare vrf din p diferit de p1 i ph. Algoritmul are timpul de execuie O(n3) i se bazeaz pe urmtoarea observaie. Considerm mulimea {1, 2, , k} pentru un anumit k. Pentru oricare pereche de vrfuri i,jX, considerm toate drumurile de la i la j ale cror vrfuri fac parte din mulimea {1, 2, , k}. Fie p drumul de cost minim dintre aceste drumuri (drumul p este elementar deoarece presupunem c G nu conine cicluri de cost negativ). Algoritmul Floyd-Warshall exploateaz o relaie ntre drumul p i drumul minim de la i la j cu toate vrfurile intermediare n mulimea {1, 2, , k-1}. Relaia depinde de statutul lui k: acesta poate fi sau nu un vrf intermediar al lui p. Dac k nu este un vrf intermediar al drumului p, atunci toate vrfurile intermediare ale drumului p fac parte din mulimea {1, 2, , k-1}. Ca urmare, un drum minim de la vrful i la vrful j cu toate vrfurile intermediare n mulimea {1, 2, , k-1} este, de asemenea, un drum minim de la i la j cu taoate vrfurile intermediare n mulimea {1, 2, , k}. Dac k este un vrf intermediar al drumului p, atunci vom mpri p n p1=(i,, k) i p2=(k, , j).Rezult c p1 este drumul minim de la i la k cu toate vrfurile intermediare n mulimea {1, 2, , k}. De fapt, vrful k nu este un vrf intermediar al drumului p1, deci p1 este un drum minim de la i la k cu toate vrfurile intermediare n mulimea {1, 2, , k-1}. n mod similar se arat c p2 este un drum minim de la vrful kla vrful j cu toate vrfurile intermediare n mulimea {1, 2, , k-1}. Floyd-Warshall(c) d=c pentru k=1,n execut pentru i=1,n execut pentru j=1,n execut dij=min(dij, dik+dkj) tij=k

sfrit pentru sfrit pentru sfrit pentru

5. Algoritmul lui Johnson pentru grafuri rare


Algoritmul lui Johnson gsete drumurile minime ntre toate perechile de vrfuri, de timp O(n2lgn+nm); deci este asimptotic, mai bun dect algoritmul lui Floyd-Warshall pentru grafuri rare. Algoritmul returneaz o matrice a costurilor drumurilor minime pentru toate perechile de vrfuri sau un mesaj care indic faptul c exist cicluri de costuri negative. Algoritmul lui Johnson folosete ca subprograme att algoritmul lui Dijkstra ct i algoritmul Bellman-Ford. Algoritmul lui Johnson folosete o tehnic de schimbare a costurilor care funcioneaz dup cum urmeaz. Dac toate arcele grafului au costuri pozitive, putem gsi drumurile minime dintre toate perechile de vrfuri, executnd algoritmul lui Dijkstra pentru fiecare vrf. Dac G are arce cu costuri negative determinm o nou mulime de arce care au costuri pozitive, mulime care ne permite s folosim aceeai metod. Noua funcie de cost (dat prin matricea c1) trebuie s satisfac dou proprieti importante. 1. Pentru toate perechile de vrfuri i,jX, un drum minim de la i la j, folosind matricea de cost c este, de asemenea, un drum minim de la i la j folosind funcia de cost c1. 2. Pentru toate arcele (i,j), noul cost c1ij este pozitiv. Dup cum vom vedea n continuare, preprocesarea lui G pentru a determina funcia de cost c1 poate fi efectuat ntr-un timp O(mn). Vom nota prin d=(dij)i,j=1,2,,n costurile drumurilor minime determinate pentru matricea costurilor c i prin d1=(d1ij)i,j=1,2,,n costurile minime determinate pentru matricea costurilor c1. Lem (Schimbarea costurilor nu schimb drumurile minime) Dndu-se un graf orientat G=(X,U) cu matricea costurilor c=(c ij)i,j1,2,,n, fie h:XR o funcie care pune n coresponden vrfurile cu numere reale. Pentru fiecare arc (i,j)U, definim: c1ij=cij+h(i)-h(j). (*) Fie p=(p1, p2, , pk) un drum de la vrful p1 la vrful pk. Atunci costul drumului p folosind matricea c este d(p1,pk) dac i numai dac costul drumului p folosind matricea c1 este d1(p 1,pk). De asemenea, G are cicluri de cost negativ folosind matricea c dac i numai dac are cicluri de cost negativ, folosind matricea c1. Demonstaia poate fi gsit n [1]. Obinerea costurilor pozitive prin schimbarea costurilor Urmtorul scop este s ne asigurm c este respectat a doua proprietate: vrem ca c1ij, s fie pozitiv pentru toate arcele (i,j)U. Dndu-se un graf orientat G=(X,U) cu matricea costurilor c=(cij)i,j1,2,,n, construim un nou graf G1=(X1, U1), unde X1=X{s} pentru un vrf nou sX i U1=U{(s,i) astfel nct iX}. Extindem matricea de cost c, astfel nct csi=0 oricare ar fi iX. Se observ c , deoarece s nu are nici o muchie care intr n el, nu exist drumuri minime n G1 care l conin pe s n afar de cele care pornesc din s. Mai mult, G1 nu are cicluri de cost negativ dac i numai dac G nu are cicluri de cost negativ. S presupunem c G i G1 nu au cicluri de cost negativ. Definim h(i)=dsi pentru orice iX1. Pentru toate arcele avem h(j) h(i)+cij, pentru toate arcele (i,j)U1. n concluzie, dac definim costurile din c1 n concordan cu (*), avem c1ij=cij+h(i)-h(j) 0, i cea dea doua proprietate este satisfcut. Algoritmul lui Johnson presupune c muchiile sunt pstrate n liste de adiacen i returneaz obinuita matrice d=(dij)i,j=1,2,,n sau un mesaj corespunztor pentru cazul n care graful conine cicluri de cost negativ. Johnson(G)

determin G1, unde V(G1)=v(G){s} si U(G1)=U(G) {(s,i) astfel incat iX(G)} dac Bellman-Ford(G1,c,s)=FALS atunci Tiprete Graful de intrare conine cel puin un ciclu de cost negativ altfel pentru fiecare vrf i din X(G1) execut h(i) primete valoarea dsi determinat de algoritmul Bellman-Ford sfrit pentru pentru fiecare arc (i,j) din U(G1) execut c1ij=cij+h(i)-h(j) sfrit pentru pentru fiecare vrf i din X(G) execut execut Dijkstra(G,c1,i) pentru a determina c1ij pentru orice j din X(G) pentru fiecare vrf j din U(G) execut dij=d1ij+h(j)-h(i) sfrit pentru sfrit pentru sfrit dac returneaz d Se poate observa destul de uor c timpul de execuie al algoritmului lui Johnson este O(n 2lgn +mn), dac n algoritmul lui Dijkstra implementm coada de prioritate cu ajutorul unui Heap Fibonacci. Implementarea simpl folosind un heap duce la un timp de execuie O(n m lgn). Bibliografie 1. T. Cormen, C. Leiserson, R. Rivest, Introducere n algoritmi 2. I. Tomescu, Probleme de combinatoric i teoria grafurilor