Limbaje Evoluate de Programare - Cap 3 B0n06sgi90oo

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

Sunteți pe pagina 1din 18

1

Limbaje evoluate de
programare

11/4/2013 4:59 PM

Grafuri

11/4/2013 4:59 PM

Grafuri

Fie o mulime finit de elemente X={ x1 , x2 ,, xn }.


Dac fiecrui element xi din mulimea X i corespund
unul sau mai multe elemente din X, sau eventual nici
unul, se va forma, n sensul teoriei mulimilor, un
graf. Fie X x X legea care reprezint
corespondena considerat. Vom numi graf perechea
ordonat G=( X, ).

Grafuri

Noiuni specifice:

noduri / vrfuri
arce / muchii
noduri adiacente
muchii incidente
vrf izolat

Gradul unui nod:

gradul de intrare
gradul de ieire

Reprezentarea grafurilor

reprezentarea grafic:

reprezentare prin intermediul matricei de adiacene

Reprezentarea grafurilor

reprezentarea prin liste de adiacene:

reprezentarea prin lista muchiilor


struct Muchie {
int x,y; // extremitatile muchiei
};
Muchie *V=new Muchie[m];

Tipologii de grafuri

graf neorientat:

graf orientat:

Tipologii de grafuri

graf ponderat:

graf etichetat:

Clase speciale de grafuri

graf complet:

graf parial:

10

Clase speciale de grafuri

subgraf:

graf bipartit:

10

11

11

Drumuri / Lanuri

Definiii:

drum / lan ntr-un graf


circuit
drum elementar; drum neelementar
drum simplu; drum complex (compus)
drum hamiltonian; circuit hamiltonian;
hamiltonian
lan eulerian; circuit eulerian; graf eulerian.
lungimea unui drum / circuit

graf

12

12

Conexitate

Graf conex un graf n care exist un drum ntre


oricare dou noduri distincte x i y. n grafurile
orientate, trebuie s existe drum i ntre y i x.
Component conex a unui graf G=(X,U) un
subgraf H=(Y,V) conex al grafului G, maximal n
raport cu proprietatea de conexitate.
Componentele conexe ale unui graf sunt
subgrafuri disjuncte ale acestuia.
Un graf este conex dac i numai dac are o
singur component conex.

13

13

Parcurgerea grafurilor neorientate

Const n definirea unei modaliti de vizitare a


nodurilor sale.
Se pleac dintr-un nod dat i se trece (se
prelucreaz) prin toate nodurile accesibile din el.
Un graf poate fi parcurs n dou moduri:

n lime
n adncime

14

14

Parcurgerea grafurilor neorientate

Parcurgerea n lime (BF - breadth first):


se lucreaz cu o structur de tip coad:

se introduce nodul iniial n coad;


ct timp coada nu este vid:
se extrage un nod din coad;
se prelucreaz nodul;
se introduc n coad nodurile adiacente lui care
nu au fost introduse anterior.

15

15

Parcurgerea grafurilor neorientate


void ParcurgBF(int a[20][20], int v[20], int n) {
// parcurgerea in latime
while (!CoadaVida(prim)) {
int nod_crt=Pop(prim);
cout<<nod_crt<<" ";
// nodurile adiacente nevizitate se introduc in coada
for (int i=1;i<=n;i++)
if (a[nod_crt][i] && !v[i]) {
Push(prim,ultim,i);
v[i]=1;
}
}
cout<<endl;
}

16

16

Parcurgerea grafurilor neorientate

Parcurgerea n adncime (DF - depth first):


se utilizeaz o structur de tip stiv:

se introduce nodul iniial n stiv;


ct timp coada nu este vid:
se prelucreaz nodul, dac nu a fost prelucrat
anterior
dac nodul curent mai are noduri adiacente
nevizitate, se introduce n stiv un singur nod
adiacent lui care nu a fost vizitat anterior
dac nodul curent nu mai are noduri adiacente
nevizitate, se extrage din stiv..

17

Parcurgerea grafurilor neorientate


void ParcurgDF(int a[20][20], int v[20], int n) {
// parcurgerea in adancime
int w[20];
for (int i=1;i<=n;i++) w[i]=0;
while (!StivaVida(prim)) {
int nod_crt=prim->cheie;
//se prelucreaza nodul curent
if (!w[nod_crt]) {
cout<<nod_crt<<" ";
w[nod_crt]=1;
}
// un singur nod adiacent nevizitat se introduce in stiva
for (int i=1;i<=n;i++)
if (a[nod_crt][i] && !v[i]) {
Push(prim,i);
v[i]=1;
break;
}
// daca nu mai sunt noduri adiacente nevizitate se extrage nodul
if (i>n) Pop(prim);
}
}

17

18

END

18

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