Sunteți pe pagina 1din 3

Grafuri

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;
nod* a[M];

// numr de noduri
// 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);
}

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