Sunteți pe pagina 1din 12

1.

1 Definiţii şi reprezentări ale grafurilor


Definiţia 1.1.1. Se numeşte graf sau graf neorientat o structură G=(V,E), unde V este o mulţime
nevidă iar E este o submulţime posibil vidă a mulţimii perechilor neordonate cu componente distincte
din V.
Elementele mulţimii V se numesc vîrfuri, iar obiectele mulţimii E se numesc muchii. Dacă e 
E, e  (u, v) not. uv , vîrfurile u şi v se numesc extremităţi ale lui e, muchia e fiind determinată de
vîrfurile u şi v. Dacă e=uv  E se spune că vîrfurile u, v sînt incidente cu muchia e.
Definiţia 1.1.2. Fie G=(V,E) graf. Vîrfurile u, v sînt adiacente în G dacă uv  E.
Definiţia 1.1.3. Graful G=(V,E) este graf finit, dacă V este o mulţime finită.
Definiţia 1.1.4. Fie Gi =(V i,Ei), i=1,2 grafuri. G2 este un subgraf al grafului G1 dacă V2  V1 şi
E 2  E1 . G2 este este un graf parţial al lui G1 dacă V2=V1 şi G2 este subgraf al lui G1.
Definiţia 1.1.5. Un digraf este o structură D=(V,E), unde V este o mulţime nevidă de vîrfuri, iar
E este o mulţime posibil vidă de perechi ordonate cu componente elemente distincte din V. Elementele
mulţimii E sînt numite arce sau muchii ordonate. Un graf direcţionat este o structură D=(V,E), unde V
este o mulţime nevidă de vîrfuri, iar E este o mulţime posibil vidă de perechi ordonate cu componente
elemente din V, nu neapărat distincte. Evident, orice digraf este un graf direcţionat.
Definiţia 1.1.6. Se numeşte graf ponderat o structură (V,E,W), unde G=(V,E) este graf şi W este
o funcţie definită prin W : E   0 ,  . Funcţia W este numită pondere şi ea asociază fiecărei muchii a
grafului un cost/cîştig al parcurgerii ei.
Definiţia 1.1.7. Fie G=(V,E) un graf, u,vV. Secvenţa de vîrfuri :u0,u1,..,un este un u-v drum
dacă u0=u, un=v, uiui+1E pentru toţi i, 0  i  n .
Definiţia 1.1.8. Fie G=(V,E) un graf. Elementul vV se numeşte vîrf izolat dacă, pentru orice e
 E, u nu este incident cu e.
Cea mai simplă reprezentare a unui graf este cea intuitivă, grafică; fiecare vîrf este figurat
printr-un punct, respectiv muchiile sînt reprezentate prin segmentele de dreaptă, orientate (în cazul
digrafurilor) sau nu şi etichetate (în cazul grafurilor ponderate) sau nu, avînd ca extremităţi punctele
corespunzătoare vîrfurilor care o determină.

Exemple
1.1.1. Fie G=(V,E) graf, cu V={1,2,3,4,5,6}, E={(1,2),(1,3),(2,5),(3,5),(5,6)}. O posibilă
reprezentare grafică este,
1

2
4
6
5
3

1.1.2. Fie D=(V,E) digraf, V={1,…,5}, E={(1,2), (1,3), (1,5), (2,5), (3,5), (4,1), (5,4)}. Digraful
poate fi reprezentat grafic astfel,
1

4
2

3
5

1.1.3. Fie G=(V,E,W) graf ponderat, V={1,2,3,4}, E={(1,2), (1,3), (1,4), (2,3), (2,4)},
W((1,2))=5, W((1,3))=1, W((1,4))=7, W((2,3))=4, W((2,4))=2. O posibilă reprezentare grafică este:
1

5 1
2 3
4
2
7

În scopul reprezentării grafurilor în memoria calculatorului sînt utilizate în general următoarele


structuri de date.

Reprezentarea matriceală
Grafurile, digrafurile şi grafurile direcţionate pot fi reprezentate prin matricea de adiacenţă.
Dacă G=(V,E ) este graf, digraf sau graf direcţionat cu V  n , atunci matricea de adiacenţă A 
1, dacă v ,v E
Mnxn({0,1}) are componentele a   , unde vi, vj reprezintă cel de-al i-lea,
i j
ij
0 , altfel
respectiv cel de-al j-lea nod din V. În cazul unui graf neorientat, matricea de adiacenţă este simetrică.

Exemplu
1.1.4. Graful din exemplul 1.1.1 şi digraful din exemplul 1.1.2sunt reprezentate prin,
0 1 1 0 0 0
  0 1 1 0 1
1 0 0 0 1 0  
1  0 0 0 0 1
0 0 0 1 0
A  (1.1.1), A   0 0 0 0 1  (1.1.2)
0 0 0 0 0 0  
  1 0 0 0 0
0 1 1 0 0 1  
0  0 0 0 1 1
 0 0 0 1 0

În cazul grafurilor ponderate, reprezentarea poate fi realizată prin matricea ponderilor. Dacă
G=(V,E,W) este graf ponderat, V  n, W  Mnxn((0,  )) are componentele,
W ( v i , v j ) , dacă v ,v E
, unde vi, vj reprezintă cel de-al i-lea, respectiv cel de-
i j
wi , j  
 , altfel
al j-lea nod din V,   0 , dacă ponderea are semnificaţia de cîştig, respectiv    în cazul în care se
doreşte reprezentarea costurilor ca ponderi ale grafului.

Exemplu
1.1.5. Presupunînd că ponderile reprezintă costuri, matricea de reprezentare a grafului din
  5 1 7 
 

exemplul 1.1.3. este  5
.
4 2 
W   1 
4  

7 

 2   

Reprezentarea tabelară
Reţinînd muchiile prin intermediul extremităţilor şi eventual valoarea ponderii ei, se obţine
reprezentarea tabelară, mai economică din punctul de vedere al spaţiului de memorie necesar. Dacă
graful conţine vîrfuri izolate atunci este necesară păstrarea acestora într-un vector suplimentar VS.
Mulţimea muchiilor este reţinută într-o matrice A cu E linii şi c coloane, unde c=2 dacă graful nu
este ponderat, altfel c=3. În primele două coloane se scriu perechile de vîrfuri ce determină muchiile,
în cazul grafurilor ponderate cea de-a treia coloană conţine valoarea ponderii muchiei respective.

Exemple
T
1 1 2 3 5
1.1.6. Graful din exemplul 1.1.1 poate fi reprezentat astfel, VS=(4), A   
2 3 5 5 6

T
1 1 1 2 3 4 5
1.1.7. Digraful din exemplul 1.1.2 este reprezentat prin A    .
2 3 5 5 5 1 4

1 2 5
 
1 3 1
1.1.8. Graful ponderat din exemplul 1.1.3. este reprezentat prin A   2 3 4 .

1 4 7
 
2 4 2

Reprezentarea prin intermediul listelor


Această reprezentare permite utilizarea economică a spaţiului de memorare şi, în anumite cazuri,
implementări mai eficiente pentru anumite clase de algoritmi. Vîrfurile grafului sînt memorate într-o
listă, fiecare nod al listei N conţinînd o referinţă spre lista vecinilor vîrfului memorat ca informaţie în
N.
Dacă graful nu este ponderat, el poate fi reprezentat prin structura listă de liste, şi
anume: nodurile grafului se trec într-o listă L_nod, fiecare celulă avînd structura,
Infor legătură legătură nod
maţie vecini următor
Unde cîmpul informaţie conţine identificatorul nodului, legătură vecini reprezintă referinţa spre
începutul listei vecinilor şi legătură nod următor conţine adresa următoarei celule din lista L_nod.
Un graf ponderat poate fi reprezentat în mod similar, cu diferenţa că, fiecare celulă din lista
vecinilor conţine şi ponderea muchiei respective.

1.2 Parcurgerea grafurilor în lăţime

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

1.2.1. Fie graful,


1

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

Fie G=(V,E) un graf, V  n . O alternativă de implementare a metodei BF este construită prin


utilizarea următoarelor structuri de date,
 A matricea de adiacenţă a grafului;
 o structură de tip coadă, C, în care sînt introduse vîrfurile ce urmează a fi vizitate şi procesate
(în sensul cercetării vecinilor lor);
 un vector c cu n componente, unde,
1dacă
, i a fost adăugat în coadă
ci  
0altfel
,
Componentele vectorului c sînt iniţializate cu valoarea 0.

Parcurgerea BF poate fi descrisă astfel,


 coada C este iniţializată cu vîrful v0;
 cît timp C  Ø, este extras şi vizitat un vîrf i din coadă, apoi sînt introduşi în coadă vecinii
lui i care nu au fost deja introduşi (acele vîrfuri k cu proprietatea că c[k]=0 şi a[i][k]=1). Vîrfurile i ce
au fost introduse în coadă sînt marcate prin c[i]=1.

Exemplu
1.2.2. Pentru graful din exemplul 1.2.1., aplicarea metodei de traversare BF determină
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 1 0 1
t=4 1 1 1 1 1 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
C
t
t=1 1
t=2 2 3 4 7
t=3 3 4 7 5
t=4 4 7 5 6
t=5 7 5 6
t=6 5 6
t=7 6
t=8

Observaţie Deoarece graful din exemplul 1.2.1. este conex, traversarea BF realizează vizitarea
tuturor vîrfurilor grafului. Aplicarea metodei BF unui graf neconex nu determină vizitarea tuturor
vîrfurilor. Cu alte cuvinte, metoda BF aplicată unui graf determină vizitarea tuturor vîrfurilor care sînt
conectate cu vîrful iniţial selectat.

1.3 Metoda de parcurgere DF (Depth First)


Ideea metodei DF revine la parcurgerea în adîncime a grafurilor. Considerînd v0 vîrf iniţial şi M
mulţimea vîrfurilor vizitate de procedură, pentru vizitarea vecinilor este considerat unul din vîrfurile
din M cu proprietatea că lungimea drumului calculat de metodă pînă la vîrful iniţial v0 este maximă.
Implementarea acestei metode poate fi realizată în mai multe moduri, pentru menţinerea
mulţimii vîrfurilor grafului disponibilizate pînă la momentul curent fiind utilizată o structură de de
date de tip stivă S. La momentul iniţial se introduce în stivă v0. La fiecare pas, se preia cu ştergere ca
vîrf curent vîrful stivei S şi se introduc în stivă vecinii încă nevizitaţi ai vîrfului curent. Un vîrf se
marchează ca vizitat în momentul introducerii lui în S. Calculul continuă pînă cînd este efectuat un
acces de preluare din stivă şi se constată că S este vidă. Pentru gestiunea vîrfurilor vizitate, se
utilizează un vector c cu n componente, unde n reprezintă numărul vîrfurilor grafului şi, la fiecare
moment, componentele sînt:
1, dacă i a fost vizitat
ci  
0, altfel

Componentele vectorului c vor fi iniţializate cu valoarea 0.

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.

Exemplu
1.3.2. 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 0 0 0 0 0
t=3 1 1 0 1 0 0 0
t=4 1 1 1 1 0 0 0
t=5 1 1 1 1 0 1 0
t=6 1 1 1 1 0 1 1
t=7 1 1 1 1 0 1 1
t=8 1 1 1 1 0 1 1
t=9 1 1 1 1 0 1 1
t=10 1 1 1 1 1 1 1
t=11 1 1 1 1 1 1 1
t=12 1 1 1 1 1 1 1
t=13 1 1 1 1 1 1 1
t=14 1 1 1 1 1 1 1
S
T
t=1 1
t=2 2 1
t=3 4 2 1
t=4 3 4 2 1
t=5 6 3 4 2 1
t=6 7 6 3 4 2 1
t=7 6 3 4 2 1
t=8 3 4 2 1
t=9 4 2 1
t=10 5 4 2 1
t=11 4 2 1
t=12 2 1
t=13 1
t=14

Ordinea în care sînt vizitate vîrfurile corespunzător acestei variante este: 1, 2, 4, 3, 6, 7, 5.

1.4. Drumuri în grafuri. Conexitate

Una dintre cele mai importante proprietăţi ale grafurilor o constituie posibilitatea de accesare,
prin intermediul unei secvenţe de muchii (arce), dintr-un vîrf dat a oricărui alt vîrf al grafului,
proprietate cunoscută sub numele de conexitate sau conexiune. Aşa după cum a rezultat în §1.2. şi 1.3,
dacă G=(V,E) este un graf conex, atunci pentru orice vîrf iniţial v0 considerat metodele BF şi DF
permit vizitarea tuturor vîrfurilor din V.
Definiţia 1.4.1. Fie G=(V,E) un graf, u,vV. Secvenţa de vîrfuri : u0, u1,..,un este un u-v drum
dacă u0=u, un=v, uiui+1E pentru toţi i, 0  i  n . Lungimea drumului, notată l() este egală cu n.
Convenţional, se numeşte drum trivial, un drum  cu l()=0.
Definiţia 1.4.2. Fie : u0, u1,..,un un drum în graful G=(V,E).  este un drum închis dacă u0=un;
în caz contrar,  se numeşte drum deschis. Drumul  este elementar dacă oricare două vîrfuri din 
sînt distincte, cu excepţia, eventual, a extremităţilor. Drumul  este proces dacă, pentru orice
0  i  j  n  1 uiui+1  ujuj+1.
Evident, orice drum elementar este un proces.

Exemplu
1.4.1. Pentru graful,
v2

v4
v5

v1 v3
1: v1, v2, v3, v2, v5, v3, v4 este un v1- v4 drum care nu este proces;
2: v1, v2, v5, v1, v3, v4 este un v1- v4 proces care nu este drum elementar;
3: v1, v3, v4 este un v1- v4 drum elementar.

Definiţia 1.4.3. Fie : u0, u1,..,un un drum în graful G=(V,E). ’: v0, v1,..,vm este un subdrum al
lui  dacă ’ este un drum şi pentru orice j, 0  j  m , există i, 0  i  n astfel încît ui=vj.

Observaţie Orice drum cu lungime cel puţin 1 conţine cel puţin un drum elementar cu aceleaşi
extremităţi.
Într-adevăr, dacă : u0, u1,..,un nu este elementar, atunci există 0  i  j  n şi i  0 sau j  n
astfel încît ui=uj. Atunci drumul
u j u j  1 ...u n , dacă i  0

 '
: u 0 u 1 ...u i , dacă j  0
u  0, 
 0 u 1 ... u i u j  1 ...u n , dacă i j n

este de asemenea un u0-un drum. Aplicînd în continuare eliminarea duplicatelor vîrfurilor în modul
descris, rezultă în final un u0-um drum elementar.

Exemplu
1.4.2. În graful,
v2 v6 v7

v1 v4 v5 v8 v10

v3 v9

dacă : v1, v2, v4, v5, v3, v1, v2, v5, v6, v7, v8, v9, v5, v9, v8, v10, atunci 1: v1, v2, v5, v9, v8, v10, 2: v1, v2, v4, v5,
v9, v8, v10 sînt v1-v10 subdrumuri elementare.

Matricea existenţei drumurilor; algoritmul Roy-Warshall

Lema 1.4.1. Fie G=(V,E) un graf, V  n . Dacă A este matricea de adiacenţă asociată grafului,
(p)
atunci, pentru orice p1, 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

Matricea M  A( 1 )  A( 2 )    A( n 1 ) se numeşte matricea existenţei drumurilor în graful


G. Semnificaţia componentelor matricei M este:
0 , dacă nu există vi  v j drum în G
1  i , j  n , mij  
1, 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.

Componente conexe ale unui graf


Definiţia 1.4.5. Fie G=(V,E) graf netrivial. Vîrfurile u,v  V sînt conectate dacă există un u-v
drum în G.
Definiţia 1.4.6. Dacă G este un graf, atunci o componentă conexă a lui G este un subgraf conex
al lui G, maximal în raport cu proprietatea de conexitate.

Exemplu
1.4.4. Componentele conexe ale grafului
1
5

2
6

4
3

sînt: C1={1,2,3}, C2={4,5}, C3={6}.

Observaţii
Un graf este conex dacă şi numai dacă numărul componentelor sale conexe este 1.
Mulţimile de vîrfuri corespunzătoare oricăror două componente conexe distincte sînt disjuncte.
Rezultă că mulţimile de vîrfuri corespunzătoare componentelor conexe ale unui graf formează o
partiţie a mulţimii vîrfurilor grafului.

Problema determinării componentelor conexe corespunzătoare unui graf poate fi rezolvată în


modul următor. Iniţial, este selectat drept vîrf curent un vîrf al grafului pentru care este calculată
componenta conexă care îl conţine. Dacă există vîrfuri care nu aparţin componentei conexe
determinate, este ales drept vîrf curent unul dintre aceste vîrfuri. În continuare este aplicată aceeaşi
metodă, pînă cînd au fost găsite toate componentele conexe ale grafului.
Determinarea componentei conexe care conţine un vîrf v 0 dat poate fi realizată pe baza
următorului algoritm.
Pentru G=(V,E), V  n , n  1 şi v0  V, paşii algoritmului sînt:
Pas1: V0={v0}; E0=  ; i=0;
Pas 2: repetă Pas 3 pînă cînd Vi=Vi-1 şi Ei=Ei-1
Pas 3: i=i+1;
Vi  Vi 1   v / v  V, u  Vi 1 , uv  E ;
E i  E i 1   e / e  E, u  Vi 1 , u incident cu e;
Ieşirea este Gi=(Vi,Ei), componenta conexă din care face parte v0.

Exemplu
1.4.5. Pentru graful,
1 7 3
2

4 5 8 9 6

Aplicarea algoritmului descris pentru v0=1, determină următoarea evoluţie:

I Vi Ei
i=0 {1} Ø
i=1 {1,2,4} {(1,2),(1,4)}
i=2 {1,2,4,7,8,5} {(1,2),(1,4),(2,7),(2,8),(7,8),(4,5),(4,7),(5,8)}

1.5. Drumuri de cost minim


Definiţia 1.5.1. Fie G=(V,E,w) un graf ponderat. Costul drumului : u1,u2,..,un, notat L(), este
definit prin:
n 1
L     w u i ,u i 1  .
i 1
Pentru orice u şi v vîrfuri conectate în G, u  v, w-distanţa între u şi v, notată D(u,v), este
definită prin,
D u , v   min L   ,   Duv  , unde Duv desemnează mulţimea tuturor u-v drumurilor
elementare din G. Dacă   Duv este astfel încît D(u,v)=L(), drumul  se numeşte drum de cost
minim.

Observaţie Cu toate că este utilizat termenul de w-distanţă, în general D nu este o distanţă în


sensul matematic al cuvîntului.În particular, dacă funcţia pondere asociază valoarea 1 fiecărei muchii a
grafului, atunci pentru fiecare pereche de vîrfuri distincte ale grafului, costul D(u,v) este lungimea unui
cel mai scurt drum între cele două vîrfuri. În acest caz D este o distanţă pe mulţimea vîrfurilor.

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 vu0 într-un graf ponderat, unde u0
este prestabilit. Fie G=(V,E,w) un graf conex ponderat, u0V, SV, u0S. 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, 0ip uiS ş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ă xS, 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 u0V, 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.

Observaţie Dacă (V,E,w) graf ponderat neconex, atunci, pentru u0V, algoritmul lui Dijkstra
permite determinarea w-distanţelor D(u0,v) şi a cîte unui u0-v drum de cost minim pentru toate vîrfurile
v din componenta conexă căreia îi aparţine u0.
Exemplu
1.5.1. Fie graful ponderat,
1

5 1

2 9
3
16
2
5 5
4

Considerînd u0=1, etapele în aplicarea algoritmului Dijkstra sînt:


P1: i=0; S0={1}; L(1)=0, L(i)=  pentru toţi i  2,5 .
P2: S 0 ={2,3,4,5}, u0=1
L(2)=  >L(1)+5=5  L(2)=5, etichetează 2 cu 1
L(3)=  >L(1)+1=1  L(3)=1, etichetează 3 cu 1
L(4)=  >L(1)+9=9  L(4)=9, etichetează 4 cu 1
L(5)=  , w(1,5)=  , deci L(5) nu se modifică
P3: selectează u1=3, L(3)=1, cea mai mică dintre w-distanţele calculate la P2
P4: S1={1,3}
P5: i=i+1=1 ≠ 4, reia P2

P2: S1 ={2,4,5}, u1=3


Nu se modifică nici o etichetă şi nici o w-distanţă (w(3,i)=  , pentru toţi i din S1
P3: selectează u2=2, L(2)=5, cea mai mică dintre w-distanţele calculate la P2
P4: S2={1,3,2}
P5: i=i+1=2 ≠ 4, reia P2

P2: S 2 ={4,5}, u2=2


L(4)= 9>L(2)+2=7  L(4)=7, etichetează 4 cu 2
L(5)=  >L(2)+16=21, etichetează 5 cu 2
P3: selectează u3=4, L(4)=7, cea mai mică dintre w-distanţele calculate la P2
P4: S3={1,3,2,4}
P5: i=i+1=3 ≠ 4, reia P2

P2: S 3 ={5}, u3=4


L(5)= 21>L(4)+5=12, etichetează 5 cu 4
P3: selectează u4=5, L(5)=12, cea mai mică dintre w-distanţele calculate la P2
P4: S3={1,3,2,4,5}
P5: i=i+1=4, stop.
Algoritmul calculează următoarele rezultate:

Vîrful v pînă la care este 1 2 3 4 5


calculată w-distanţa
D(1,v), eticheta lui v 0, 1 5, 1 1, 1 7, 2 12, 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 vV.
Î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),
vV, poate fi calculat pe baza următoarei funcţii (similară algoritmului Roy-Warshall),

void Roy_Floyd (float w[10][10],unsigned n,float d[10][10],float MAX)


{int i,j,k;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
d[i][j]=w[i][j];
for (j=0;j<n;j++)
for (i=0;i<n;i++)
if(d[i][j]<MAX)
for (k=0;k<n;k++)
if (d[i][k]>d[i][j]+d[j][k])
d[i][k]=d[i][j]+d[j][k];
}

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.

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