Un graf cu n noduri se memoreaz ca un tablou a de n pointeri: a[k]
este adresa listei de noduri vecine cu nodul k (posibil vid). Ordinea n listele de adiacen nu este important, dar se prefer adugarea nodurilor la nceputul listei nodurilor vecine. Pentru grafuri neorientate, o muchie (v-w) face ca lista lui v s conin pe w i lista lui w s conin pe v. De exemplu, pentru un graf cu 4 vrfuri i muchiile urmtoare: 1-3, 2-3, 3-4, avem listele de adiacen: 13 23 3124 43 Tipul "graf" este definit astfel: struct nod { int val; nod* leg; }; struct graf { int n; // numr de noduri nod* a[M]; // tablou de liste de vecini };
Exerciiul 1 S se scrie urmtoarele funcii pentru operaii cu grafuri neorientate, reprezentate printr-un tablou de pointeri la liste de vecini ai fiecarui nod: a) void initG (graf & g, int n); // iniializare graf cu n noduri i fr arce b) void addM (graf & g, int x, int y); // adaug muchia x-y la graful g c) void build (graf & g, int m, int v[], int w[]); // creare graf cu m muchii v[i]-w[i] d) void delV (graf & g, int v); // eliminare nod v din graf n cadrul acestei funcii, se apeleaz o funcie ajuttoare, care elimin nodul v din lista p: void del (nod* & p, int v); e) int grad (graf g, int v); // gradul nodului v (numrul de vecini) f) void grade (graf g) ; // apeleaz funcia grad pentru fiecare nod al grafului i afieaz gradul asociat nodului respectiv g) void show (graf g); // afiare graf ca liste de vecini S se testeze funciile cu urmtorul program principal: int main () { int n=9,m=12, v[]={1,1,2,2,3,4,4,5,5,6,7,8}, w[]={2,4,3,5,6,5,7,6,8,9,8,9}; graf g; initG(g,n); build(g,m,v,w); show(g); grade(g); delV(g, 5); show(g); grade(g); }
Exerciiul 2 S se scrie o funcie, cu prototipul: void vcover (graf & g), pentru algoritmul de acoperire cu un numr minim de vrfuri a tuturor muchiilor unui graf. O muchie este acoperit dac are cel puin un vrf n mulimea rezultat (o submulime a tuturor vrfurilor). n exemplul cu 4 vrfuri i 3 muchii, mulimea rezultat conine numai vrful 3. Algoritmul n pseudocod este: repet ct timp mai exist noduri cu vecini (muchii neacoperite) gsete un nod v cu numr maxim de vecini afieaz nodul v elimin din graf nodul v S se testeze funcia cu urmtorul program principal: int main () { int n=9,m=12, v[]={1,1,2,2,3,4,4,5,5,6,7,8}, w[]={2,4,3,5,6,5,7,6,8,9,8,9}; graf g; initG(g,n); build(g,m,v,w); show(g); grade(g); printf("\nVertex Cover:\n"); vcover(g); }