05 - Grafuri

17
Grafuri

Transcript of 05 - Grafuri

Page 1: 05 - Grafuri

Grafuri

Page 2: 05 - Grafuri

Grafuri

• 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

• Circuite şi cicluri– Algoritmul Marimont

Page 3: 05 - Grafuri

Definiţii

• 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 sînt adiacente în G dacă uv E.

• Graful G=(V,E) este graf finit, dacă V este o mulţime

finită.

• Fie Gi =(V i,Ei), i=1,2 grafuri. G2 este un subgraf al

grafului G1 dacă V2 e inclus în V1 şi E2 e inclus în E1. G2

este este un graf parţial al lui G1 dacă V2=V1 şi G2 este

subgraf al lui G1.

Page 4: 05 - Grafuri

Definiţii

• 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. Un graf direcţionat 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 din V, nu neapărat distincte. Evident, orice digraf este un

graf direcţionat.

• 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,vV. Secvenţa de vîrfuri u0, u1, .., un este un u-

v drum dacă u0=u, un=v, uiui+1E pentru toţi i.

• Fie G=(V,E) un graf. Elementul vV se numeşte vîrf izolat dacă,

pentru orice e E, v nu este incident cu e.

Page 5: 05 - Grafuri

Reprezentări• Intuitivă, grafică

– G=(V,E) graf cu V={1,2,3,4,5,6}, E={(1,2),(1,3),(2,5),(3,5),(5,6)}.

– D=(V,E) digraf, V={1,…,5}, E={(1,2), (1,3), (1,5), (2,5), (3,5), (4,1), (5,4)}.

1

2

3

4

5

6

1

2

3

5

4

Page 6: 05 - Grafuri

Reprezentare

• D=(V,E) graf direcţionat, V={1,2,3,4,5}, E={(1,2), (1,3), (1,5) (2,5), (3,5), (4,4)}.

• G=(V,E,W) graf ponderat, V={1,2,3,4}, E={(1,2), (1,3), (1,4), (2,3), (2,4)}, W((1,2))=5, W((1,3))=1, W((1,4))=7, W((2,3))=4, W((2,4))=2.

1

3 2

4

5 1

2 7

4

1

2

3

4

5

Page 7: 05 - Grafuri

Reprezentări

• Matricea de adiacenţă

altfel,0

Ev,vdacă,1a ji

ij

altfel

Evvdacăa

ji

ij,0

,,1

1

2

3

4

5

6

010000

100110

000000

010001

010001

000110

A

11000

00001

10000

10000

10110

A

1

2

3

5

4

1

2

3

4

5

00000

01000

10000

10000

10110

A

Page 8: 05 - Grafuri

Reprezentare

altfel,

Ev,vdacă,)v,v(Ww jiji

j,i

27

41

245

715

W

1

3 2

4

5 1

2 7

4

• Matricea de adiacenţă pentru graf ponderat

Page 9: 05 - Grafuri

Rprezentare

• Tabelară

65

53

52

31

21

A

45

14

53

52

51

31

21

A

44

53

52

51

31

21

A

242

741

432

131

521

A

Page 10: 05 - Grafuri

Reprezentare

• Liste dinamice

Page 11: 05 - Grafuri

Parcurgere (traversare)

• Î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 0), unde

• Algoritm– coada C este iniţializată cu vîrful v0; – 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]=0 şi a[i][k]=1). Vîrfurile i ce au fost introduse în coadă sînt marcate prin v[i]=1.

,0

,1ic

Page 12: 05 - Grafuri

Parcurgere (traversare) în lăţime

• Fie graful:

• Rezultatul parcurgerii, pornind de la 1, este:– 1, 2, 3, 4, 6, 5, 7

1

2 3

4

5 7

6

8

9 10

11

Page 13: 05 - Grafuri

Parcurgere (traversare) în lăţime

void BF(int vi,int a[10][10],int n,int rez[10],int* nr){ TNOD* cap=NULL; int v[10], i, r, k; for(i=0; i<n; v[i++]=0); push(&cap,vi); v[vi]=1; *nr=0; while(cap) { r=pop(&cap, &i); rez[(*nr)++]=i+1; for(k=0; k<n; k++) if((a[i][k]==1)&&(v[k]==0)) { push(&cap,k); v[k]=1; } }}

Page 14: 05 - Grafuri

Parcurgere (traversare)

• Î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 0), unde

• Algoritm– stiva S este iniţializată cu vîrful v0; – 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]=0 şi a[i][k]=1). Vîrfurile i ce au fost introduse în stivă sînt marcate prin v[i]=1.

,0

,1ic

Page 15: 05 - Grafuri

Parcurgere (traversare) în adîncime

• Fie graful:

• Rezultatul parcurgerii, pornind de la 1, este:– 1, 3, 6, 7, 4, 5, 2

1

2 3

4

5 7

6

8

9 10

11

Page 16: 05 - Grafuri

Parcurgere (traversare) în lăţime

void DF(int vi,int a[10][10],int n,int rez[10],int* nr){ TNOD* cap=NULL; int v[10], i, r, k; for(i=0; i<n; v[i++]=0); push(&cap,vi); v[vi]=1; *nr=0; while(cap) { r=pop(&cap, &i); rez[(*nr)++]=i+1; for(k=0; k<n; k++) if((a[i][k]==1)&&(v[k]==0)) { push(&cap,k); v[k]=1; } }}

Page 17: 05 - Grafuri

Parcurgerea DF generalizată