Documente Academic
Documente Profesional
Documente Cultură
Modalitatea de vizitare a tuturor vîrfurilor grafului în care fiecare vîrf al grafului este vizitat o
singură dată se numeşte parcurgere sau traversare. În acest material sînt prezentate metodele de
parcurgere BF (în lăţime) şi DF (în adîncime). Metodele de parcurgere sunt aplicate grafurilor
neorientate respectiv grafurilor direcţionate şi presupun selectarea unui vîrf iniţial v0 şi identificarea
acelor vîrfuri ale grafului v cu proprietatea că există cel puţin un drum de la vîrful iniţial către v.
Grafurile cu proprietatea că oricare două vârfuri sunt conectate printr-un drum se numesc
grafuri conexe şi sunt prezentate în § 1.4. Dacă graful este conex, atunci prin aplicarea
metodelor de parcurgere vor fi identificate toate vârfurile grafului. Cele două modalităţi de
parcurgere sunt prezentate în continuare în cazul grafurilor neorientate, extinderea la digrafuri
şi grafuri direcţionate fiind imediată.
Traversarea BF presupune parcurgerea în lăţime a grafului, în sensul că, vîrfurile grafului sînt
prelucrate în ordinea crescătoare a distanţelor la vîrful iniţial. Distanţa de la u la v, notată u , v ,
este numărul de muchii ale unui cel mai scurt u-v drum.
La momentul iniţial vîrf curent este v0. Deoarece vîrful curent la fiecare moment trebuie să fie
unul dintre vîrfurile aflate la distanţă minimă de v0 se poate proceda în modul următor: iniţial lui v0 i se
asociază valoarea 0, d v0 0 şi fiecărui vîrf v v0 i se asociază valoarea , d v . Dacă
valoarea asociată vîrfului curent este m, atunci fiecăruia dintre vecinii acestuia de valoare li se
asociază valoarea m+1. Se observă că, dacă după ce toate vîrfurile de valoare m au fost considerate şi
nici unui vîrf nu i-a fost recalculată valoarea, atunci toate vîrfurile conectate cu v0 au fost vizitate, deci
calculul se încheie.
Exemple
2 3
6
4
7
5
şi v0=1.Valorile calculate prin aplicarea metodei prezentate sînt,
vîrf 1 2 3 4 5 6 7
d
0 0
1 0 1 1 1 1
2 0 1 1 1 2 2 1
0 1 1 1 2 2 1
Exemple
1.3.1. Pentru graful,
1
2 3
6
4
7
5
şi v0=1, prin aplicarea metodei descrise, rezultă următoarea evoluţie.
c
1 2 3 4 5 6 7
t
t=1 1 0 0 0 0 0 0
t=2 1 1 1 1 0 0 1
t=3 1 1 1 1 0 1 1
t=4 1 1 1 1 0 1 1
t=5 1 1 1 1 1 1 1
t=6 1 1 1 1 1 1 1
t=7 1 1 1 1 1 1 1
t=8 1 1 1 1 1 1 1
S
t
t=1 1
t=2 7 4 3 2
t=3 6 4 3 2
t=4 4 3 2
t=5 5 3 2
t=6 3 2
t=7 2
Ordinea în care sînt vizitate vîrfurilor corespunzător acestei variante de parcurgere DF este: 1, 2,
3, 4, 7, 6, 5.
O variantă de implementare a metodei DF rezultă prin gestionarea stivei S în modul următor.
Iniţial vîrful v0 este unicul component al lui S. La fiecare etapă se preia, fără ştergere, ca vîrf curent
vîrful stivei. Se introduce în stivă unul dintre vecinii vîrfului curent încă nevizitat. Vizitarea unui vîrf
revine la introducerea lui în S. Dacă vîrful curent nu are vecini încă nevizitaţi, atunci el este eliminat
din stivă şi este efectuat un nou acces de preluare a noului vîrf al stivei ca vîrf curent. Calculul se
încheie în momentul în care este efectuat un acces de preluare a vîrfului stivei ca vîrf curent şi se
constată că S este vidă. Evident, nici în cazul acestei variante nu vor fi vizitate vîrfurile care nu sînt
conectate cu vîrful iniţial ales.
Lema 1.4.1. Fie G=(V,E) un graf, V n . Dacă A este matricea de adiacenţă asociată grafului,
(p)
atunci, pentru orice p1, a ij este numărul vi-vj drumurilor distincte de lungime p din graful G, unde
A p aij( p ) .
Definiţia 1.4.4. Fie Mn({0,1)} mulţimea matricelor de dimensiuni nxn, componentele fiind
elemente din mulţimea {0,1}. Pe Mn({0,1)}se definesc operaţiile binare, notate şi , astfel:
pentru orice A=(aij), B=(bij) din Mn({0,1)}, A B=(cij), A B=(dij), unde
1 i , j n , cij=max{aij, bij}
dij=max{min{aik, bkj}, 1 k n }.
Dacă A=(aij)
1 k ( k 1 )
Mn({0,1)}, se notează A k a (ijk ) ; k 1 secvenţa de matrice definită prin:
A A, A A A , k 2 .
Dacă A este matricea de adiacenţă a unui graf G=(V,E), atunci pentru fiecare k, 1 k n 1 ,
( k ) 1, dacă există drum de la i la j de lungime k
a ij
0 , altfel
Exemplu
1.4.3. Pentru graful,
2
4
0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1
1 0 0 0 2 0 1 1 1 3 1 0 1 1 1 1 1 1
A , A , A , M
1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1
Observaţie Calculul matricei existenţei drumurilor permite verificarea dacă un graf dat este
conex. Graful este conex dacă şi numai dacă toate componentele matricei M sînt egale cu 1.
Algoritmul Roy-Warshall calculează matricea existenţei drumurilor într-un graf G cu n
vîrfuri.
void Roy_Warshall (unsigned char a[10][10],unsigned n,unsigned char m[10][10])
{int i,j,k;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
m[i][j]=a[i][j];
for (j=0;j<n;j++)
for (i=0;i<n;i++)
if(m[i][j])
for (k=0;k<n;k++)
if (m[i][k]<m[k][j]) m[i][k]=m[k][j];}
Datele de intrare sînt: n, numărul de noduri şi A, matricea de adiacenţă corespunzătoare grafului.
Matricea M calculată de algoritm constituie ieşirea şi este matricea existenţei drumurilor în graful G.
Algoritmul Dijkstra
Următorul algoritm a fost propus de către E. W. Dijkstra pentru determinarea w-distanţelor
D(u0,v) şi a cîte unui u0-v drum de cost minim pentru fiecare vîrf vu0 într-un graf ponderat, unde u0
este prestabilit. Fie G=(V,E,w) un graf conex ponderat, u0V, SV, u0S. Se notează S V \ S şi
D u 0 , S min D u 0 , x ; x S . Fie v S astfel încît D(u0,v)=D(u0, S ), : u0, u1,…,upv un u0-v
drum de cost minim. Evident, 0ip uiS şi ’: u0, u1,…,up un u0- up drum de cost minim. De
asemenea,
D u 0 , S min D u 0 ,u w( uv ); u S ,v S ,uv E .
Dacă xS, y S astfel încît
D u0 , S D u0 , x w( xy ) , rezultă
D u 0 , y D u 0 , x w( xy ) .
Pentru determinarea a cîte unui cel mai ieftin u 0-v drum, algoritmul consideră o etichetare
dinamică a vîrfurilor grafului.Eticheta vîrfului v este (L(v),u), unde L(v) este lungimea unui cel mai
ieftin u0-v drum determinat pînă la momentul respectiv şi u este predecesorul lui v pe un astfel de
drum.
Pentru (V,E,w) graf conex ponderat, V n şi u0V, calculul implicat de algoritmul Dijkstra
poate fi descris astfel:
Pas 1: i=0; S0={u0}; L(u0)=0, L(v)= pentru toţi v V, v≠u0. Dacă n=1 atunci stop
Pas 2: Pentru toţi v S i , dacă L(v)>L(ui)+w(uiv), atunci L(v)=L(ui)+w(uiv) şi etiche-tează v cu
(L(v),ui).
Pas 3: Se determină d=min{L(v), v S i } şi se alege ui+1 S i astfel încît L(ui+1)=d.
Pas 4: Si+1=Si {ui+1}
Pas 5: i=i+1. Dacă i=n-1, atunci stop. Altfel, reia Pas 2.
Exemplu
1.5.1. Fie graful ponderat,
1
5 1
2 9
3
16
2
5 5
4
Drumurile de cost minim de la vîrful 1 la fiecare dintre vîrfurile grafului se stabilesc pe baza
sistemului de etichete astfel: drumul de la 1 la un vîrf v este dat de: v 1, eticheta lui v, v2 eticheta lui v1
şamd, pînă se ajunge la eticheta 1. Astfel, v0 -drumurile de cost minim sînt:
pînă la 2: 2,1;
pînă la 3: 3,1;
pînă la 4: 4,2,1;
pînă la 5: 5,4,2,1.
În anumite aplicaţii este necesară exclusiv determinarea w-distanţelor D(v0,v), pentru toţi vV.
În acest caz algoritmul Roy-Floyd permite o rezolvare a acestei probleme mai simplu de implementat
decît algoritmul Dijkstra.
Algoritmul Roy-Floyd
Pentru (V,E,w) graf ponderat, V n şi W matricea ponderilor, sistemul de w-distanţe D(v0,v),
vV, poate fi calculat pe baza următoarei funcţii (similară algoritmului Roy-Warshall),
Matricea D calculată de algoritm este matricea w-distanţelor D(u,v) în graful ponderat conex
(V,E,w); pentru orice 1 i , j n
D( v i , v j ), vi ,v j sunt conectate
d ij
, altfel
Într-adevăr, procedura realizează calculul dinamic al w-distanţei între oricare două vîrfuri i şi k,
astfel: dacă există un drum i-k drum ce trece prin j ( 1 j n ), cu costul corespunzător (dij+djk)
inferior costului curent (dik), atunci noul drum de la i la k via j este de cost mai mic decît costul
drumului vechi, deci w-distanţa între i şi k trebuie reactualizată la dij+djk.