Grafuri Liviu P. Dinu University of Bucharest Faculty of Mathematics and Computer Science
Sumar Definiții Reprezentări Parcurgere în lățime Parcurgere în adîncime Drumuri în grafuri. Conexitate Matricea existenței drumurilor. Algoritmul Roy-Warshall Componente conexe Drumuri de cost minim. Algoritmul Dijkstra. Algoritmul Roy-Floyd
Definitii 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. Vîrfurile u, v sunt adiacente în G dacă uv E. Graful G=(V,E) este graf finit, dacă V este o mulțime finită. Fie G i =(V i,e i ), i=,2 grafuri. G 2 este un subgraf al grafului G dacă V 2 e inclus în V şi E 2 e inclus în E. G2 este este un graf parțial al lui G dacă V2=V şi G2 este subgraf al lui G.
Definitii 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.
Definitii Se numeşte graf ponderat o structură (V,E,W), unde G=(V,E) este graf şi W este o funcție numită pondere care asociază fiecărei muchii a grafului un cost/cîştig al parcurgerii ei. Fie G=(V,E) un graf, u,v V. Secvența de vîrfuri u, u,.., u n este un u-v drum dacă u =u, u n =v, u i u i+ E pentru toți i. Fie G=(V,E) un graf. Elementul v V se numeşte vîrf izolat dacă, pentru orice e E, v nu este incident cu e.
Reprezentari Intuitivă, grafică G=(V,E) graf cu V={,2,3,4,5,6}, E={(,2),(,3),(2,5),(3,5),(5,6)}. D=(V,E) digraf, V={,,5}, E={(,2), (,3), (,5), (2,5), (3,5), (4,), (5,4)}. G=(V,E,W) graf ponderat, V={,2,3,4}, E={(,2), (,3), (,4), (2,3), (2,4)}, W((,2))=5, W((,3))=, W((,4))=7, W((2,3))=4, W((2,4))=2 2 3 5 4 6 2 3 4 5
Reprezentari Matricea de adiacență ( ) = altfel E v v dacă a j i ij,,, 2 4 6 = A 4 3 5 = A 2 3 5 4 2 3 4 5 = A
Matricea de adiacență pentru graf ponderat ( ) ( ) = E,v v ),dacă,v W(v w j i j i =,altfel w j, i α 3 2 4 5 2 7 4 = 2 7 4 2 4 5 7 5 W
Parcurgeri. În lățime Fie G=(V,E) un graf. A - matricea de adiacență a grafului; C - o structură de tip coadă, în care sînt introduse vîrfurile ce urmează a fi vizitate şi procesate V - un vector cu n componente (inițializate cu ), undec i = Algoritm coada C este inițializată cu vîrful v ; cît timp C Ø, Se extrage şi vizitează un vîrf i din coadă, Se introduc în coadă vecinii lui i care nu au fost deja introduşi (acele vîrfuri k cu proprietatea că c[k]= şi a[i][k]=). Vîrfurile i ce au fost introduse în coadă sînt marcate prin v[i]=.,,
Parcurgere in latime 8 2 3 4 6 9 5 7 Rezultatul parcurgerii, pornind de la, este:, 2, 3, 4, 6, 5, 7
Parcurgere in latime void BF(int vi,int a[][],int n,int rez[],int* nr) { TNOD* cap=null; int v[], i, r, k; for(i=; i<n; v[i++]=); push(&cap,vi); v[vi]=; *nr=; while(cap) { r=pop(&cap, &i); rez[(*nr)++]=i+; for(k=; k<n; k++) if((a[i][k]==)&&(v[k]==)) { push(&cap,k); v[k]=; } } }
Parcurgere in adancime 2. În adîncime Fie G=(V,E) un graf. A - matricea de adiacență a grafului; S - o structură de tip stivă, în care sînt introduse vîrfurile ce urmează a fi vizitate şi procesate, V - un vector cu n componente (inițializate cu ), undec i =, Algoritm stiva S este inițializată cu vîrful v ; cît timp S Ø, Se extrage şi vizitează un vîrf i din stivă, Se introduc în stivă vecinii lui i care nu au fost deja introduşi (acele vîrfuri k cu proprietatea că c[k]= şi a[i][k]=). Vîrfurile i ce au fost introduse în stivă sînt marcate prin v[i]=.
Parcurgere in adancime 8 2 3 4 6 9 5 7 Rezultatul parcurgerii, pornind de la, este:, 3, 6, 7, 4, 5, 2
Parcurgere in adancime void DF(int vi,int a[][],int n,int rez[],int* nr) { TNOD* cap=null; int v[], i, r, k; for(i=; i<n; v[i++]=); push(&cap,vi); v[vi]=; *nr=; while(cap) { r=pop(&cap, &i); rez[(*nr)++]=i+; for(k=; k<n; k++) if((a[i][k]==)&&(v[k]==)) { push(&cap,k); v[k]=; } } }
Drumuri in grafuri Fie G=(V,E) un graf, u,v V. Secvența de vîrfuri Γ: u, u,..., u n este un u-v drum dacă u =u, u n =v, u i u i+ E, i n. Lungimea drumului, notată l(γ) este egală cu n. Convențional se numeşte drum trivial un drum Γ cu l(γ)=. Fie Γ: u, u,..., u n un drum în graful G=(V,E). Γ este un drum închis dacă u =u n ; î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.
Matricea existenței drumurilor Fie G=(V,E) un graf, A matricea de adiacență. A p indică numărul de drumuri distincte între oricare 2 vîrfuri. Fie operațiile binare de adunare şi înmulțire pentru matrice binare. Notînd A=(a ij ), B=(b ij ), atunci A+B=(c ij ), AxB=(d ij ), unde pentru i, j n c ij =max{a ij, b ij } d ij =max{min{a ik, b kj }, k n} Matricea obținută adunînd puterile de la la n- ale matricei de adiacență constituie matricea existenței drumurilor în graf.
Algoritmul Roy-Warshall void Roy_Warshall (unsigned char a[][], unsigned n, unsigned char m[][]) { int i,j,k; for( i=; i<n; i++ ) for( j=; j<n; j++ ) m[i][j] = a[i][j]; for( j=; j<n; j++ ) for( i=; i<n; i++ ) if( m[i][j] ) for( k=; k<n; k++ ) if( m[i][k] < m[k][j] ) m[i][k]=m[k][j]; }
Componente conexe ale unui graf Fie G=(V,E) graf netrivial. Vîrfurile u,v sînt conectate dacă există un u-v drum în G. 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. Un graf este conex dacă şi numai dacă numărul componentelor sale conexe este. Mulțimile de vîrfuri corespunzătoare oricăror două componente conexe distincte sînt disjuncte.
Conexitate Algoritm pentru determinarea unei componente conexe (subgraf, mulțimi de vîrfuri şi muchii). Se inițializează componenta vidă Se adaugă la mulțimea de vîrfuri vîrful inițial Repetă Se caută toți vecinii noi ai vîrfurilor selectate şi se adaugă la mulțimea de vîrfuri Se caută toate muchiile noi dintre vîrfurile selectate şi se adaugă la mulțimea de muchii Pînă cînd nu se mai găsesc vorfuri noi
Fie G=(V,E,w) un graf ponderat. Costul drumului Γ: u, u,..., u n, notat L(Γ), este definit prin: n ( ) = wu (, ) L Γ i= i u i + 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 ( ) { ( ) } Du,v = minl Γ, Γ D uv unde D uv desemnează mulțimea tuturor u-v drumurilor elementare din G. Drumul pentru care D(u,v)=L(Γ), se numeşte drum de cost minim.
Roy-Floyd Se considera un graf orientat cu n noduri, pentru care se da matricea costurilor. Se cere ca, pentru fiecare pereche de noduri (i, j), sa se tipareasca costul drumului minim de la i la j. Plecam de la urmatoarea idee: daca drumul minim intre doua noduri oarecare i si j trece printr-un nod k, atunci drumurile de la i la k si de la k la j sunt la randul lor minime. Pentru fiecare pereche de noduri (i, j ), cu i, j in {,2,,n}, procedam astfel:
Roy-Floyd Dam lui k pe rand valorile,2,,n, pentru ca nodul k despre care vorbeam mai sus poate fi, cel putin teoretic, orice nod al grafului. Pentru fiecare k: daca suma dintre costul drumului de la i la j si costul drumului de la k la j este mai mica decat costul drumului de la i la j {a[i, k]+a[k, j]<a[i, j]}, atunci drumul initial de la i la j este inlocuit cu drumul indirect i->k->j. aceasta inlocuire se va reflecta in matricea costurilor: {a[i, j]:=a[i, k]+a[k, j]}.
Drumuri de cost minim Algoritmul Roy-Floyd void Roy_Floyd (float w[][], unsigned n float d[][], float MAX) { int i,j,k; for (i=;i<n;i++) for (j=;j<n;j++) d[i][j] = w[i][j]; for (j=;j<n;j++) for (i=;i<n;i++) if(d[i][j]<max) for (k=;k<n;k++) if (d[i][k] > d[i][j] + d[j][k]) d[i][k] = d[i][j] + d[j][k]; }
Dijkstra Algoritmul descris aici presupune o etichetare dinamica a varfurilor; Fiecare varf v va fi etichetat cu o eticheta (L(v), u), unde u este predecesorul lui v pe cel mai ieftin vo-v drum determinat pana la acel moment, iar L(v) lungimea acelui drum Notatie: pentru o submultime S a lui V, notam S complementara acelei multimi.
Dijskstra Intrare: (V,E,W), graf conex ponderat de ordin p; v varf initial. i=; So={vo};L(vo)=; L(v)=max pt. toti v din V-{vo};Daca p=, STOP 2. Pt. toti v din Si, daca L(v) >L(vi)+w(viv), then L(v):=L(vi)+w(viv) si etichetam v cu (L(v), vi) 3. Determina d=min{l(v), v in Si}si aleg vi+ a.i. L(vi+)=d 4. Si+:=SiU{vi+} 5. i:=i+; daca i=p-, STOP, altfel reia Pasul 2 Iesire: etichetele atasate varfurilor v din V.