Sunteți pe pagina 1din 17

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
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.
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,vV. Secvenţa de vîrfuri u0, u1, .., un este un u-
v drum dacă u0=u, un=v, uiui+1E pentru toţi i.
• Fie G=(V,E) un graf. Elementul vV se numeşte vîrf izolat dacă,
pentru orice e  E, v nu este incident cu e.
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)}.
1

2
4
6
5
3

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


(4,1), (5,4)}. 1

4
2

3
5
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)}.
1

4
2

3
5

• 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

5 1
2 3
4
2
7

4
1, dacă vi ,v j  E
aij  
0 , altfel

Reprezentări
1, dacă vi , v j  E
• Matricea de adiacenţă aij  
0, altfel
1 0 1 1 0 0 0
  1
1 0 0 0 1 0
2 1 0 0 0 1 0
4 A 
6 0 0 0 0 0 0 4
5   2
3 0 1 1 0 0 1
0 0 0 0 1 0 

3
5
1
0 1 1 0 1
 
0 0 0 0 1 0 1 1 0 1
 
4 A  0 0 0 0 1 0 0 0 0 1
2  
1 0 0 0 0 A  0 0 0 0 1
   
3 0 0 0 1 1 0 0 0 1 0
5  
0 0 0 0 0
Reprezentare

• Matricea de adiacenţă pentru graf ponderat

W ( vi ,v j ), dacă vi ,v j  E


wi , j  
 , altfel

1
 5 1 7
 
5 1 5  4 2
W 
2 3 1 4  
4
 
2
7 2   
7

4
Rprezentare

• Tabelară
1 2 1 2 1 2
      1 2 5
1 3 1 3  
1 3 1 5 1 1 3 1
  5
A  2 5 A  2 5 A  A  2

3 4

    2 5
3 5 3 5   1 4 7
5 4 1 3 5  
 6   
4 
4
 4  2 4 2
5
Reprezentare

• Liste dinamice
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 1,
c 
– V - un vector cu n componente (iniţializate cu 0), unde 0, i

• 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.
Parcurgere (traversare) în lăţime

• Fie graful: 1 8

3
2

6
4 9 10

11
5 7

• Rezultatul parcurgerii, pornind de la 1, este:


– 1, 2, 3, 4, 6, 5, 7
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;
}
}
}
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
1,
– V - un vector cu n componente (iniţializate cu 0), unde c  0, i

• 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.
Parcurgere (traversare) în adîncime

• Fie graful: 1 8

3
2

6
4 9 10

11
5 7

• Rezultatul parcurgerii, pornind de la 1, este:


– 1, 3, 6, 7, 4, 5, 2
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;
}
}
}
Parcurgerea DF generalizată

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