IX. GRAFURI. e 1. e 2

Σχετικά έγγραφα
Examen AG. Student:... Grupa:... ianuarie 2011

Examen AG. Student:... Grupa: ianuarie 2016

(a) se numeşte derivata parţială a funcţiei f în raport cu variabila x i în punctul a.

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor X) functia f 1

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor

Planul determinat de normală şi un punct Ecuaţia generală Plane paralele Unghi diedru Planul determinat de 3 puncte necoliniare

Laborator 11. Mulţimi Julia. Temă

decembrie 2016 Grafuri. Noţiuni fundamentale. Grafuri euleriene şi grafuri hamilto

Curs 10 Funcţii reale de mai multe variabile reale. Limite şi continuitate.

Grafuri. Liviu P. Dinu University of Bucharest Faculty of Mathematics and Computer Science

Criptosisteme cu cheie publică III

Algoritmica grafurilor XI. Cuplaje in grafuri. Masuri de calitate. Numere Ramsey

MARCAREA REZISTOARELOR

a n (ζ z 0 ) n. n=1 se numeste partea principala iar seria a n (z z 0 ) n se numeste partea

Capitolul IC.07. Grafuri

Metode iterative pentru probleme neliniare - contractii

a. 11 % b. 12 % c. 13 % d. 14 %

Geometrie computationala 2. Preliminarii geometrice

DISTANŢA DINTRE DOUĂ DREPTE NECOPLANARE

III. Serii absolut convergente. Serii semiconvergente. ii) semiconvergentă dacă este convergentă iar seria modulelor divergentă.

Definiţia generală Cazul 1. Elipsa şi hiperbola Cercul Cazul 2. Parabola Reprezentari parametrice ale conicelor Tangente la conice

Analiza în curent continuu a schemelor electronice Eugenie Posdărăscu - DCE SEM 1 electronica.geniu.ro

Curs 4 Serii de numere reale

5.4. MULTIPLEXOARE A 0 A 1 A 2

Arbori și structuri decizionale

Seminariile Capitolul X. Integrale Curbilinii: Serii Laurent şi Teorema Reziduurilor

Sisteme diferenţiale liniare de ordinul 1

Seminar 5 Analiza stabilității sistemelor liniare

Metode de interpolare bazate pe diferenţe divizate

ELEMENTE DE TEORIA GRAFURILOR

V.7. Condiţii necesare de optimalitate cazul funcţiilor diferenţiabile

Curs 1 Şiruri de numere reale

Ecuaţia generală Probleme de tangenţă Sfera prin 4 puncte necoplanare. Elipsoidul Hiperboloizi Paraboloizi Conul Cilindrul. 1 Sfera.


R R, f ( x) = x 7x+ 6. Determinați distanța dintre punctele de. B=, unde x și y sunt numere reale.

COLEGIUL NATIONAL CONSTANTIN CARABELLA TARGOVISTE. CONCURSUL JUDETEAN DE MATEMATICA CEZAR IVANESCU Editia a VI-a 26 februarie 2005.

7.2 Problema săptămânii Seminar Seminar Seminar Seminar Conexitate Teorie...

5. FUNCŢII IMPLICITE. EXTREME CONDIŢIONATE.

Universitatea din Bucureşti Facultatea de Matematică şi Informatică. Algebră (1)

Subiecte Clasa a VIII-a

Integrala nedefinită (primitive)

Curs 4. I.4 Grafuri. Grafuri orientate

FLUXURI MAXIME ÎN REŢELE DE TRANSPORT. x 4

Componente şi Circuite Electronice Pasive. Laborator 3. Divizorul de tensiune. Divizorul de curent

GRAFURI NEORIENTATE. 1. NoŃiunea de graf neorientat

4/29/2011. Arbori minimi de acoperire

Esalonul Redus pe Linii (ERL). Subspatii.

Subiecte Clasa a VII-a

5.5. REZOLVAREA CIRCUITELOR CU TRANZISTOARE BIPOLARE

Laborator 1: INTRODUCERE ÎN ALGORITMI. Întocmit de: Claudia Pârloagă. Îndrumător: Asist. Drd. Gabriel Danciu

III. Reprezentarea informaţiei în sistemele de calcul

Aplicaţii ale principiului I al termodinamicii la gazul ideal

Dumitru Fanache TEORIA ALGORITMICĂ A GRAFURILOR NOŢIUNI FUNDAMENTALE. Volumul I EDITURA PARALELA 45

Cursul 11. Cuplaje. Sisteme de reprezentanti distincţi. Arbori de acoperire. Enumerarea tuturor arborilor cu număr fixat de noduri.

RĂSPUNS Modulul de rezistenţă este o caracteristică geometrică a secţiunii transversale, scrisă faţă de una dintre axele de inerţie principale:,

Să se arate că n este număr par. Dan Nedeianu

Conice. Lect. dr. Constantin-Cosmin Todea. U.T. Cluj-Napoca

Cercetari operationale. O.M. Gurzău

Spatii liniare. Exemple Subspaţiu liniar Acoperire (înfăşurătoare) liniară. Mulţime infinită liniar independentă

Grafuri planare Colorarea grafurilor. Curs 12. Grafuri planare. Colorarea grafurilor. Polinoame cromatice. 23 decembrie 2016.

GRAFURI ORIENTATE ASPECTE TEORETICE. 1. NoŃiunea de graf orientat

Asupra unei inegalităţi date la barajul OBMJ 2006

Curs 14 Funcţii implicite. Facultatea de Hidrotehnică Universitatea Tehnică "Gh. Asachi"

6. Algoritmi greedy. 6.1 Tehnica greedy

Fig Impedanţa condensatoarelor electrolitice SMD cu Al cu electrolit semiuscat în funcţie de frecvenţă [36].

1.7. AMPLIFICATOARE DE PUTERE ÎN CLASA A ŞI AB

CONCURSUL DE MATEMATICĂ APLICATĂ ADOLF HAIMOVICI, 2017 ETAPA LOCALĂ, HUNEDOARA Clasa a IX-a profil științe ale naturii, tehnologic, servicii

2 Transformări liniare între spaţii finit dimensionale

Lectia VI Structura de spatiu an E 3. Dreapta si planul ca subspatii ane

VII.2. PROBLEME REZOLVATE

ALGORITMICA GRAFURILOR. C. Croitoru

B={0,1,...,MAX-1} : K

riptografie şi Securitate

CURS XI XII SINTEZĂ. 1 Algebra vectorială a vectorilor liberi

Profesor Blaga Mirela-Gabriela DREAPTA

Capitolul 4 PROPRIETĂŢI TOPOLOGICE ŞI DE NUMĂRARE ALE LUI R. 4.1 Proprietăţi topologice ale lui R Puncte de acumulare

GEOMETRIE PLANĂ TEOREME IMPORTANTE ARII. bh lh 2. abc. abc. formula înălţimii

Curs 2 Şiruri de numere reale

Vectori liberi Produs scalar Produs vectorial Produsul mixt. 1 Vectori liberi. 2 Produs scalar. 3 Produs vectorial. 4 Produsul mixt.

V O. = v I v stabilizator

Problema a II - a (10 puncte) Diferite circuite electrice

Teme de implementare in Matlab pentru Laboratorul de Metode Numerice

TEMA 9: FUNCȚII DE MAI MULTE VARIABILE. Obiective:

z a + c 0 + c 1 (z a)

BARAJ DE JUNIORI,,Euclid Cipru, 28 mai 2012 (barajul 3)

2. Sisteme de forţe concurente...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...3

SEMINAR 14. Funcţii de mai multe variabile (continuare) ( = 1 z(x,y) x = 0. x = f. x + f. y = f. = x. = 1 y. y = x ( y = = 0

Metode Runge-Kutta. 18 ianuarie Probleme scalare, pas constant. Dorim să aproximăm soluţia problemei Cauchy

2.1 Sfera. (EGS) ecuaţie care poartă denumirea de ecuaţia generală asferei. (EGS) reprezintă osferă cu centrul în punctul. 2 + p 2

2. Circuite logice 2.4. Decodoare. Multiplexoare. Copyright Paul GASNER

Orice izometrie f : (X, d 1 ) (Y, d 2 ) este un homeomorfism. (Y = f(x)).

SERII NUMERICE. Definiţia 3.1. Fie (a n ) n n0 (n 0 IN) un şir de numere reale şi (s n ) n n0


4. Liste. Generalităţi. a1, a2,,an p<n ap+1 p>1 n Operaţii specifice listelor. operaţii fundamentale NULL

Erori si incertitudini de măsurare. Modele matematice Instrument: proiectare, fabricaţie, Interacţiune măsurand instrument:

Olimpiada Naţională de Matematică Etapa locală Clasa a IX-a M 1

Descompunerea unui graf in componente triconexe Algoritmul - J.E. Hopcroft si R.E. Tarjan

* K. toate K. circuitului. portile. Considerând această sumă pentru toate rezistoarele 2. = sl I K I K. toate rez. Pentru o bobină: U * toate I K K 1

Sisteme liniare - metode directe

Matrice. Determinanti. Sisteme liniare

Transcript:

IX. GRAFURI. Elemente de teoria grafurilor: definiţii şi terminologie. Relaţiile între obiecte sunt descrise în mod natural prin intermediul grafurilor. Interconexiunea elementelor într-un circuit sau o reţea de drumuri pot fi modelate prin grafuri. Un graf este un obiect matematic format din două mulţimi: G = (V, E), în care V este o mulţime de vârfuri, iar E o mulţime de muchii (sau arce) care conectează vârfurile. Mulţimea muchiilor E este o relaţie binară pe V, adică: E V V, E = {(u, v) u V, v V muchiile sunt reprezentate prin perechi de vârfuri conectate (obiecte aflate în relaţie). Grafurile pot fi grafuri orientate (sau digrafuri) sau grafuri neorientate. Un graf orientat este format din arce (u, v), care reprezintă perechi ordonate de vârfuri. Vârful u este originea arcului (u, v), iar v este destinaţia arcului. Arcele (u, v) şi (v, u) sunt distincte (relaţia nu este simetrică, u R v nu implică v R u). a e 5 e 1 d e 4 e 3 b c e 2 G=(V,E) V={a, b, c, d E={e 1, e 2, e 3, e 4, e 5 e 1 =(a,b), e 2 =(b,c), e 3 =(c,b), e 4 =(c,a), e 5 =(a,d) Două arce sunt arce multiple (sau paralele) dacă au aceeaşi origine şi aceeaşi destinaţie. Un graf simplu nu conţine arce multiple şi nici bucle. Un graf neorientat este format din muchii {u, v, u v, care sunt perechi neordonate de vârfuri. Muchiile {u, v şi {v, u sunt identice (relaţia este simetrică, u R v v R u ). Muchia {u, v este incidentă vârfurilor u şi v. Extremităţile u şi v ale muchiei {u, v sunt adiacente. Intr-un graf complet oricare două vârfuri sunt adiacente. Arcul (u, v) este incident din (pleacă din) u şi este incident în (intră în) v. Gradul unui vârf deg(v), într-un graf neorientat, reprezintă numărul muchiilor incidente în acel vârf. Un vârf izolat este un vârf având gradul. Gradul interior (sau gradul de intrare) indeg(v) a unui vârf a unui graf orientat este egal cu numărul arcelor care intră în acel vârf. Un vârf cu gradul interior este un vârf de ieşire (sursă). Gradul exterior (sau gradul de ieşire) outdeg(v) a unui vârf a unui graf orientat este egal cu numărul arcelor care ies din acel vârf. Un vârf cu gradul exterior este un vârf de intrare (puţ). Ordinul unui graf este egal cu numărul de vârfuri al grafului: n = V. Dimensiunea unui graf este egală cu numărul de muchii (arce) ale grafului: m = E. 1

a e 1 d b e 3 e 4 e 2 e c G=(V,E) V={a, b, c, d, e E={e 1, e 2, e 3, e 4 E1=(a,b), e2=(b,c), e3=(b,d), e4=(d,e) Un drum de lungime p între două vârfuri a şi b este o succesiune de vârfuri v, v 1,..., v p, cu v =a şi v p =b şi {v i-1, v i E pentru i=1:p. Drumul conţine atât muchiile (v,v 1 ),..., (v p-1, v p ) cât şi vârfurile v,...,v p. Dacă există un drum de la a la b, atunci b este accesibil din a (a b). Un drum elementar într-un graf orientat are toate vârfurile de pe el distincte. Un ciclu este un drum (v, v 1,, v p ) în care v = v p. O buclă (a,a)este un ciclu de lungime 1. Un ciclu elementar are toate vârfurile distincte (exceptând vârful de plecare) şi nu conţine bucle. Un graf aciclic (pădure) nu conţine cicluri. Un graf neorientat este conex, dacă oricare două vârfuri pot fi unite printr-un drum. Un graf conex aciclic este arbore liber. Componentele conexe ale unui graf neorientat sunt clasele de echivalenţă ale vârfurilor prin relaţia este accesibil din. Un graf neorientat este conex, dacă are o singură componentă conexă. Un graf orientat este tare conex dacă, pentru oricare două vârfuri a şi b, a este accesibil din b şi b este accesibil din a. Graful G =(V,E ) G este subgraf al grafului G=(V,E), dacă V V şi E E. Subgraful indus de mulţimea de vârfuri V V este graful: G =(V,E ) în care: E = {(u,v) E : u,v V Graful G =(V,E ) este un graf parţial (sau subgraf de acoperire) al grafului G=(V,E) dacă E E Intr-un graf bipartit, mulţimea vârfurilor V se partiţionează V = V 1 V 2, V 1 V 2 = astfel încât (u, v) E u V 1, v V 2 sau u V 1, v V 2. Pentru un graf neorientat cu m muchii: n n ( n 1) 2 E = O( n ) 2 2 deg(v) = 2m. v V Intr-un graf orientat cu m arce E n 2 in deg(v) = v V v V out deg(v) = m 2

Într-un graf dens E Θ( V 2 ), iar într-un graf rar E Θ( V ) Oricărei muchii din graf i se asociază un atribut numit ponderea muchiei. În general, aceasta este o valoare reală şi pozitivă. Intern o muchie este referită printr-un indice. Intr-un graf G, următoarele condiţii sunt echivalente: 1. G este conex aciclic 2. G este aciclic maximal (prin adăugarea unei muchii apare un ciclu) 3. G este conex minimal (prin ştergerea unei muchii graful îşi pierde conexitatea). Intr-un graf G neorientat, cu n vârfuri şi m muchii: 1. dacă G este conex, m n 1 2. dacă G este arbore liber, m = n 1 3. dacă G este pădure, m < n 1 Operaţii asociate vârfurilor grafului. Oricărui vârf i se asociază o etichetă; aceasta este de obicei un şir de caractere. Referirea la un vârf prin eticheta sa se face numai la creerea grafului, prin adăugarea de vârfuri şi la afişarea rezultatelor. Cheia poate fi modificată pe parcurs. Intern, un vârf în graf este identificat printr-un indice întreg cheie, reprezentând poziţia vârfului în tabelul de vârfuri al grafului. Acest atribut este setat de constructorul grafului şi poate fi numai interogat. Pentru simplificarea operaţiilor de traversare vom asocia fiecărui vârf: o etichetă (şir de caractere). o culoare (cu una din valorile ALB, GRI sau NEGRU întregii,1,2) o distanţă (faţă de un vârf reper) un predecesor La traversarea unui graf unui vârf i se ataşează şi alte atribute întregi precum: momentul descoperirii vârfului start şi momentul terminării prelucrării vârfului stop. // interfata TAD Varf (fisierul Varf.h) struct varf; typedef struct varf *Varf; Varf V_New(char *etv); // constructor char* V_GetEt(Varf u); // da eticheta varfului u int V_GetCol(Varf u); // da culoarea varfului u double V_GetDist(Varf u); // da distanta varfului u Varf V_GetPred(Varf u); // da varful predecesor varfului u void V_SetEt(Varf u, char *et);//schimba eticheta varfului u void V_SetCol(Varf u, int c); //schimba culoare varfului u void V_SetDist(Varf u,double d); //schimba distanta varfului u void V_SetPred(Varf u, Varf p);//schimba predecesorul varfului u Operaţii asociate arcelor grafului.. Unui arc i se asociază următoarele atribute: o etichetă (un şir de caractere) o cheie (o valoare întreagă) reprezentând poziţia arcului în tabloul de arce capetele arcului (de tip Varf) ponderea arcului (o valoare reală) // interfata TAD Arc (fisierul Arc.h) struct arc; typedef struct arc *Arc; Arc A_New(Varf u1, Varf u2, double pond, char *et); //constructor Varf V1(Arc a); //selectare varf origine arc Varf V2(Arc a); //selectare varf destinatie arc 3

Varf Opus(Arc a, Varf u); double A_GetCost(Arc a); char* A_GetEt(Arc a); //selectie varf opus lui u in arcul a //extrage ponderea arcului //extrage eticheta arcului TAD Graf Vom presupune limitări pentru numărul maxim de vârfuri N şi de muchii M. #define N 1 #define M 1 Vom considera separat grafurile orientate şi cele neorientate. Unificarea conduce la complicaţii inutile. De asemenea, grafurile neponderate vor fi tratate ca grafuri ponderate, cu costul muchiilor 1. // interfaţa TAD Graf (fisierul Graf.h) struct graf; typedef struct graf *Graf; typedef enum{alb,gri,negru color; Graf G_New(); //constructor initializare graf vid //operatii relative la varfuri void G_AddV (Graf G, char *etv);//adauga un varf cu eticheta data void G_DelV (Graf G, Varf u); //sterge un varf specificat int G_IsV (Graf G, Varf u); //test existenta varf in graf Varf G_GetVK(Graf G, int ch); //varful avand cheia ch int G_GetKV(Graf G, Varf u); //da cheia varfului //operatii relative la muchii void G_AddA (Graf G, Varf u, Varf v, double pond, char *eta); void G_DelA(Graf G, Varf u, Varf v); void G_DelA(Graf G, Arc a); int G_IsA (Graf G, Varf u, Varf v); Arc G_GetArc(Graf G, Varf u, Varf v); Arc G_GetAK(Graf G, int ch); //arcul avand cheia ch int G_GetKA(Graf G, Arc a); //da cheia arcului //operatii generale int G_Size(Graf G); int G_Dim(Graf G); int G_Deg(Graf G, Varf u); int G_OutDeg(Graf G, Varf u); int G_InDeg(Graf G, Varf u); //ordin graf //dimensiune graf //grad varf //grad exterior varf(graf orientat) //grad interior varf(graf orientat) Iterarea vârfurilor şi muchiilor unui graf. Pentru a realiza enumerarea vârfurilor sau muchiilor unui graf printr-o iterare de tipul instrucţiunii for, vom preciza: primul element din enumerare, condiţia de terminare şi modul de trecere la următorul element. Astfel iterarea tuturor vâfurilor unui graf, de tipul: for(v V(G)) se reprezintă prin: Varf v; for(v=primv(g);!dultimv(g); v=avansv(g,v)) if(g_isv(g,v)){... Iterarea tuturor muchiilor unui graf de tipul: for(e E(G)) reprezintă prin: Arc e; for(e=prima(g);!dultima(g); e=avansa(g,e)) if(g_isa(g,e)){... 4

Iterarea vârfurilor adiacente unui vârf u, de tipul: for(v Vecini(u))se reprezintă prin: Varf u,v; for(v=primvad(g,u);!dultimvad(g,u); v=avansvad(g,u,v)) if(g_isv(g,v){... Iterarea pe muchiile incidente unui vârf u se reprezintă prin: Arc a; for(a=primainc(g,u);!dultainc(g,u); a=avansainc(g,a,u)) if(g_isa(g,a)){... cu operaţiile primitive: Arc primainc(graf G, Varf v) prima muchie incidentă unui vârf v Arc avansainc(graf G, Arc a, Varf v) următoarea muchie incidentă vârfului v, după muchia a int dultainc(graf G, Varf v) 1 dacă s-a folosit şi ultima muchie incidentă vârfului v Implementarea operaţiilor independente de reprezentarea grafurilor. // implementare TAD Varf (fisierul Varf.c) struct varf{ char *etv; //eticheta int col; //culoare double dist; //distanta Varf pred; //predecesor ; Varf V_New(char *etv){ Varf v = (Varf)malloc(sizeof(struct varf)); v->etv = strdup(etv); v->col = ; v->dist =.; v->pred = NULL; return v; char* V_GetEt(Varf u) { return u->etv; int V_GetCol(Varf u) { return u->col; double V_GetDist(Varf u){ return u->dist; Varf V_GetPred(Varf u){ return u->pred; void V_SetEt(Varf u, char *et){u->etv = strdup(et); void V_SetCol(Varf u,int c) {u->col = c; void V_SetDist(Varf u, double d){u->dist = d; void V_SetPred(Varf u, Varf p){u->pred = p; // implementare TAD Arc (fisierul Arc.c) struct arc{ char *eta; //eticheta muchie Varf v1; //un capat al muchiei Varf v2; //celalalt capat al muchiei double cost; //ponderea muchiei ; Arc A_New(Varf u1, Varf u2, double pond, char *et){ Arc a = (Arc)malloc(sizeof(struct arc)); a->v1 = u1; a->v2 = u2; a->eta = strdup(et); a->cost = pond; 5

Varf V1(Arc a){ if(a==null) return NULL; return a->v1; Varf V2(Arc a){ if(a==null) return NULL; return a->v2; Varf Opus(Arc a, Varf u){ assert(v1(a)==u V2(a)==u); if(v1(a)==u) return V2(a); return V1(a); double A_GetCost(Arc a){return a->cost; char* A_GetEt(Arc a){return a->eta; Structura care descrie graful va conţine: n = primul vârf liber m = primul arc liber Din motive de eficienţă, mulţimea vârfurilor va fi reprezentată printr-un tablou de pointeri la structuri vârfuri. În acest tablou (alocat de dimensiune maximă N) vor exista şi poziţii cu valoarea NULL, corespunzător vârfurilor nealocate încă sau a celor care au fost şterse. Adăugara unui vârf leagă prima poziţie liberă din tabloul de vârfuri V la structura vârf. Ştergerea unui vârf eliberează memoria ocupată de structura vârf şi face pointerul corespunzător NULL. Mulţimea muchiilor este reprezentată printr.un tablou de pointeri la structuri arce (de dimensiune maximă M). Adăugara unui arc leagă prima poziţie liberă din tabloul de arce A, la structura arc. Ştergerea unui arc eliberează memoria ocupată de structura arc şi face pointerul corespunzător NULL. struct graf{ int n; // indice prim varf nealocat int m; // indice prim arc nealocat Varf *V; // tablou de pointeri la structuri varfuri Arc *E; // tablou de pointeri la structuri arce... // parte dependenta de reprezentare ; Urmează partea dependentă de modul de reprezentare: cu matrice de adiacenţe sau cu liste de adiacenţe, care va fi discutată după prezentarea funcţiilor independente de reprezentare. Acestea sunt funcţiile generale: ordin şi dimensiune graf şi funcţiile relative la vârfuri. Ordinul grafului se stabileşte numărând intrările nenule din tabloul V (care are goluri). //functii independente de reprezentare. //ordin graf(numar de noduri) int G_Size(Graf G){ int i, nn=; for(i=; i<g->n; i++) if(g->v[i]!=null) nn++; return nn; //dimensiune graf(numar de muchii) int G_Dim(Graf G){ int i, na=; for(i=; i<g->m; i++) 6

if(g->e[i]!=null) na++; return na; Pentru adăugarea unui vârf cu etichetă precizată, se creează o structură cu atributele vârfului care se leagă în tabloul de vârfuri în prima poziţie neocupată. void G_AddV (Graf G, char *etv){ int ch = G->n; //cheia ce se asociaza varfului G->V[ch] = V_New(etv); //creaza o structura varf si o leaga //in tabloul de varfuri G->n++; //actualizare primul varf liber int G_GetKV(Graf G, Varf u){ return (u - G->V[])/sizeof(Varf); Varf G_GetVK()){ return G->V[k]); Implementarea grafurilor cu matrice de adiacenţe. Dacă folosim cheile asociate vârfurilor grafului (întregii, 1,, n-1) atunci graful se poate reprezenta printr-o matrice MA numită matrice de adiacenţe, în care, în mod clasic: 1 dacă (i, j) E MA[i][j] = dacă (i, j) E (i şi j sunt cheile a două vârfuri oarecare) Pentru o referire mai simplă la muchiile grafului, în matricea de adiacenţe, în locul marcării unei muchii prin 1 se va pune un pointer în vectorul de muchii. Structura Graf va fi: struct graf{ int n; // indice prim varf nealocat int m; // indice prim arc nealocat Varf *V; // tablou de pointeri la structuri varfuri Arc *E; // tablou de pointeri la structuri arce Arc MA[N][N] ; // parte dependenta de reprezentare ; 1 1 2 3 4 a b 2 1 1 1 c 2 3 1 1 1 4 1 d e 3 4 7

Reprezentarea prin matrice de adiacenţe asigură o simplitate a reprezentării, dar utilizează în mod ineficient memoria (consumul de memorie este O(n 2 ), iar matricea de adiacenţe este o matrice rară). Algoritmii dezvoltaţi au în general complexitate O(n 2 ). Constructorul alocă memorie pentru tablourile de vârfuri V şi de muchii E şi pentru matricea de adiacenţe MA..Se iniţializează de asemenea, prima poziţie liberă din tablourile V şi E la. Graf G_New (){ Graf G=(Graf)malloc(sizeof(struct graf)); int i,j; G->n = ; G->m = ; G->V = (Varf*)calloc(N, sizeof(varf)); G->E = (Arc*)calloc(M, sizeof(arc)); for(i=; i<n; i++) for(j=; j < N; j++) G->MA[i][j] = NULL; return G; A m B p C n Varf *V char *etv A B C int col double dist Varf pred Arc MA Ø Ø Ø Ø Ø Ø Arc *E char *eta m n p Varf v1 Varf v2 double cost 1 1 1 8

Ştergerea unui vârf eliberează memoria ocupată de atributele vârfului şi pune pe NULL pointerul la acel vârf (crează o poziţie liberă). //sterge varful si muchiile incidente in varf void G_DelV (Graf G, Varf v){ int k = V_GetKV(G, v); assert(k < G->n && G->V[k]); int i; for(i=; i<n; i++) //sterge referinte la arce incidente in v if(i!=k && G->V[k] && G->MA[i][k]) G->MA[i][k]=G->MA[k][i]=NULL; G->V[k] =NULL; //sterge varful Varf u = v; free(u); //sterge muchiile incidente varfului for(i=; i < M; i++) if(g->e[i].v1==v G->E[i].v2==v){ free(g->e[i]); G->E[i] = NULL; int G_IsV(Graf G, Varf u){ int k = G_GetKV(G,u); if(k<) return ; return 1; //adauga un arc; intoarce indicele arcului adaugat void G_AddA(Graf G, Varf u1, Varf u2, int pond, char *eta){ assert(g_isv(g,u1) && G_IsV(G,u2)); Arc a=a_new(u1,u2,pond,eta); G->E[G->m++]=a; G->MA[G_GetKV(G,u1)][G_GetKV(G,u2)]=a; void G_DelA(Graf G, Varf u1, Varf u2){ int ku1, ku2; assert(g_isv(g,u1) && G_IsV(G,u2)); ku1 = G_GetKV(G,u1); ku2 = G_GetKV(G,u2); Arc a=g_ma[ku1][ku2]; free(a); G_MA[ku1][ku2]=NULL; //test prezenta muchie intre varfurile u si v void G_IsA(Graf G, Varf u1, Varf u2){ if(!g_isv(g,u1)!g_isv(g,u2)) return ; return G_MA[G_GetKV(G,u1)][G_GetKV(G,u2)]!=NULL; Pentru un graf neorientat gradul unui vârf u este egal cu numărul de referinţe nenule (numărul de muchii) din linia u (sau coloana u) a matricei de adiacenţe. int G_Deg(Graf G, Varf u){ int ku = G_GetKV(G,u); assert(g->v[ku]); int dg=, i; for(i=; i<g->n; i++) 9

if(g->v[i] && G->MA[ku][i]!=NULL) dg++; return dg; Pentru un graf orientat, gradul de ieşire OutDeg(G, u) al unui vârf u este numărul de referinţe nenule din linia u a matricei de adiacenţe, în timp ce gradul de intrare InDeg(G, u) este numărul de referinţe nenule din coloana u a matricei de adiacenţe În reprezentarea cu matrice de adiacenţă, iterarea pe muchiile incidente unui vârf v se realizează prin: Arc primainc(graf G, Varf v){ Arc a; int i, kv; kv = G_GetKV(G,v); for(i=; i<g->n; i++) if((a=g->ma[kv][i])!=null) return A_New(v, G_GetVK(G,i), A_GetCost(a), A_GetEt(a)); return NULL; Arc avansainc(graf G, Arc a, Varf v){ int i, j; Varf u1, u2, u; u1 = V1(a); u2 = V2(a); assert(u1==v u2==v); if(u1==v) //mai simplu u = Opus(G,a,u) u = u2; else u = u1; j = G_GetKV(G, u); for(i=j+1; i<g->n; i++) if((e=g->ma[j][i])!=null) return A_New(u, G_GetVK(G,i), A_GetCost(a), A_GetEt(a)); return NULL; Reprezentarea grafurilor prin liste de adiacenţe. Pentru grafuri neorientate, fiecărui vârf i se asociază o listă de muchii incidente vârfului. Graful va fi reprezentat printr-un tablou de liste de muchii. Pentru a itera mai uşor pe muchiile grafului, într-o implementare mai bună, elementele listei de adiacenţe a unui vârf nu sunt muchii, ci referinţe la muchiile incidente acelui vârf. struct graf{ int n; int m; Varf *V; Arc *E; Lista *LA; ; Constructorul iniţializează listele de adiacenţe cu liste vide. Graf G_New (){ Graf G=(Graf)malloc(sizeof(struct graf)); int i,j; G->n = ; G->m = ; for(i=; i < N; i++) G->V[i] = NULL; for(i=; i < M; i++) G->E[i] = NULL; 1

for(i=; i < N; i++) G->LA[i] = L_New(); return G; Astfel pentru graful neorientat: a ab b ac bc ad c cd d avem reprezentarea: LA E eta ab ac ad bc cd V1 v2 pond V etv dist a b c d pred col //test prezenta arc intre u si v (Complexitate O(deg(u)) int G_IsA(Graf G, Varf u, Varf v){ int ku = G_GetKV(G,u); 11

int kv = G_GetKV(G,v); assert(g->v[ku] && G->V[kv]); List_Iter p; for(p=l_begin(g->la[ku]); p!=l_end(g->la[ku]);p=l_next(g->la[ku],p)) if(v2((arc)l_get(g->la[ku],p)) ==v) return 1; return ; Gradul unui vârf dintr-un graf neorientat este lungimea listei de adiacenţe a vârfului. int G_Deg(Graf G, Varf u){ return L_Size(G->LA[G_GetKV(G,u)]; Gradul de ieşire al unui vârf dintr-un graf orientat este numărul muchiilor având ca origine acel vârf, adică lungimea listei de adiacenţe a succesorilor. Dacă am folosi numai această listă de adiacenţe, determinarea gradului de intrare al vârfului, ar căuta ineficient în toate listele de adiacenţe a muchiilor având ca vârf destinaţie vârful dat. Pentru a face eficientă această operaţie vom introduce pentru grafuri orientate o a doua listă de adiacenţe, asociată predecesorilor unui vârf (pentru fiecare vârf lista muchiilor având ca destinaţie acel vârf). struct graf{ int n; int m; Varf *V; Arc *E; Lista *LAS; Lista *LAP; ; int OutDeg(Graf G, Varf u){ return L_Size(G->LAS[G_GetKV(G,u)]; int InDeg(Graf G, Varf u) { return L_Size(G->LAP[G_GetKV(G,u)]; Astfel pentru graful orientat: a ab b ca cb ad c dc d Reprezentarea cu liste de adiacenţe 12

LAS LAP E eta ab ad ca cb dc V1 v2 pond V etv a b c d dist pred col void G_DelA(Graf G, Arc a){ int ka=g_getka(g, a); Varf u, v; int ku, kv; u = V1(a); v = V2(a); ku = G_GetKV(G, u); kv = G_GetKV(G, v); 13

List_Iter p; //cauta arcul in lista de adiacente a varfului u p = L_Find(G->LA[ku], a, comp); if(p) L_Modif(G_LA[ku], p, NULL); p = L_Find(G->LA[kvu], a, comp); if(p) L_Modif(G_LA[kv], p, NULL); free(g->e[ka]; G->E[ka] = NULL; Implementarea iteratorilor. Varf primv(graf G){ return G->V[]; int dultimv(graf G, Varf v){ return v >= G->V[G->n]; Varf avansv(graf G, Varf v) { return ++v; Arc prima(graf G){ return G->E[]; int dultima(graf G, Arc a){ return a >= G->E[G->m]; Arc avansa(graf G, Arc a) { return ++a; Implementarea iteratorilor pe vârfurile v, adiacente unui vârf u consideră modul de reprezentare al grafului: //implementare iteratori pe varfurile adiacente unui varf //in reprezentarea cu liste de adiacente Varf primvad(graf G, Varf u){ Arc a; List_Iter p=l_begin(g->la[g_getkv(g,u)]); if(p==null) return NULL; a = (Arc)(L_Get(G->LA[G_GetKV(G,u)], p)) if(v1(a)==u)return V2(a); return V1(a); //implementare iteratori pe muchiile imcidente unui varf //in reprezentarea cu liste de adiacente Arc primainc(graf G, Varf u){ Arc a; List_Iter p=l_begin(g->la[u]); if(p==null) return NULL; a = (Arc)(L_Get(G->LA[u], p)) return A_New(V1(a), V2(a), A_GetCost(a), A_GetEt(a)); Arc avansainc(graf G, Arc a, Varf u){ Arc e; List_Iter p = L_Find(G_LA[u], (void*)a, comp); if(p==null) return NULL; p = L_Next(G_LA[u],p); if(p==null) return NULL; e = (Arc)L_Get(G_LA[u],p); return A_New(V1(e), V2(e), A_GetCost(e), A_GetEt(e)); return NULL; int dultimainc(graf G, Arc a, Varf u){ List_Iter p =L_Find(G->LA[u],(void*)a,comp); if(p==null L_Next(G->LA[u],p)==NULL) return 1; return ; 14