Sunteți pe pagina 1din 25

Grafuri

Liviu P. Dinu
University of Bucharest
Faculty of Mathematics and Computer Science
Sumar
Definiii
Reprezentri Reprezentri
Parcurgere n lime
Parcurgere n adncime
Drumuri n grafuri. Conexitate
Matricea existenei drumurilor.
Algoritmul Roy-Warshall
Componente conexe
Drumuri de cost minim. Algoritmul
Dijkstra. Algoritmul Roy-Floyd
Definitii
Se numete graf sau graf neorientat o structur G=(V,E), unde
V este o mulime nevid iar E este o submulime posibil vid a
mulimii perechilor neordonate cu componente distincte din V. mulimii perechilor neordonate cu componente distincte din V.
Vrfurile u, v sunt adiacente n G dac uv E.
Graful G=(V,E) este graf finit, dac V este o mulime finit.
Fie G
i
=(V
i
,E
i
), i=1,2 grafuri. G
2
este un subgraf al grafului G
1
dac V
2
e inclus n V
1
i E
2
e inclus n E
1
. G2 este este un graf
parial al lui G1 dac V2=V1 i G2 este subgraf al lui G1.
Definitii
Un digraf este o structur D=(V,E), unde V este o mulime
nevid de vrfuri, iar E este o mulime posibil vid de
perechi ordonate cu componente elemente distincte din V. perechi ordonate cu componente elemente distincte din V.
Elementele mulimii E snt numite arce sau muchii
ordonate.
Definitii
Se numete graf ponderat o structur (V,E,W), unde
G=(V,E) este graf i Weste o funcie numit pondere
care asociaz fiecrei muchii a grafului un cost/ctig care asociaz fiecrei muchii a grafului un cost/ctig
al parcurgerii ei.
Fie G=(V,E) un graf, u,v V. Secvena de vrfuri u
0
, u
1
,
.., u
n
este un u-v drum dac u
0
=u, u
n
=v, u
i
u
i+1
E
pentru toi i.
Fie G=(V,E) un graf. Elementul v V se numete vrf
izolat dac, pentru orice e E, v nu este incident cu
e.
Reprezentari
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), D=(V,E) digraf, V={1,,5}, E={(1,2), (1,3), (1,5), (2,5), (3,5), (4,1),
(5,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
2
3
4
5
6
1
2
3
5
4
Reprezentari
Matricea de adiacen
( )


=
altfel
E v v dac
a
j i
ij
, 0
, , 1

1
2
4
6
|
|
|
|
|
|
|

|
=
0 0 0 0 0 0
0 1 0 0 0 1
0 1 0 0 0 1
0 0 0 1 1 0
A
1
2
4
3
5
6
|
|
|
|

\
0 1 0 0 0 0
1 0 0 1 1 0
0 0 0 0 0 0
|
|
|
|
|
|

\
|
=
1 1 0 0 0
0 0 0 0 1
1 0 0 0 0
1 0 0 0 0
1 0 1 1 0
A
1
2
3
5
4
2
3
4
5
|
|
|
|
|
|

\
|
=
0 0 0 0 0
0 1 0 0 0
1 0 0 0 0
1 0 0 0 0
1 0 1 1 0
A
Matricea de adiacen pentru graf ponderat
( ) ( )


=
E v , v dac , ) v , v ( W
w
j i j i

=
altfel ,
w
j i j i
j , i

1
3 2
4
5 1
2
7
4
|
|
|
|
|

\
|

=
2 7
4 1
2 4 5
7 1 5
W
Parcurgeri
1. n lime
Fie G=(V,E) un graf.
A - matricea de adiacen a grafului;
C - o structur de tip coad, n care snt introduse vrfurile C - o structur de tip coad, n care snt introduse vrfurile
ce urmeaz a fi vizitate i procesate
V - un vector cu n componente (iniializate cu 0), unde
Algoritm
coada C este iniializat cu vrful v
0
;
ct timp C ,
Se extrage i viziteaz un vrf i din coad,
Se introduc n coad vecinii lui i care nu au fost deja
introdui (acele vrfuri k cu proprietatea c c[k]=0 i
a[i][k]=1). Vrfurile i ce au fost introduse n coad snt
marcate prin v[i]=1.

=
, 0
, 1
i
c
Parcurgere in latime
1
2
3
8
Rezultatul parcurgerii, pornind de la 1, este:
1, 2, 3, 4, 6, 5, 7
4
5 7
6
9 10
11
Parcurgere in latime
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); 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 in adancime
2. n adncime
Fie G=(V,E) un graf.
A - matricea de adiacen a grafului;
S - o structur de tip stiv, n care snt introduse vrfurile ce
urmeaz a fi vizitate i procesate
V - un vector cu n componente (iniializate cu 0), unde
Algoritm
stiva S este iniializat cu vrful v
0
;
ct timp S ,
Se extrage i viziteaz un vrf i din stiv,
Se introduc n stiv vecinii lui i care nu au fost deja
introdui (acele vrfuri k cu proprietatea c c[k]=0 i
a[i][k]=1). Vrfurile i ce au fost introduse n stiv snt
marcate prin v[i]=1.

=
, 0
, 1
i
c
Parcurgere in adancime
1
3
8
Rezultatul parcurgerii, pornind de la 1, este:
1, 3, 6, 7, 4, 5, 2
2
3
4
5 7
6
9 10
11
Parcurgere in adancime
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); 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;
}
}
}
Drumuri in grafuri
Fie G=(V,E) un graf, u,vV. Secvena de vrfuri : u
0
, u
1
, ..., u
n
este un u-v drum dac u
0
=u, u
n
=v, u
i
u
i+1
E, 0 i n.
Lungimea drumului, notat l() este egal cu n. Convenional Lungimea drumului, notat l() este egal cu n. Convenional
se numete drum trivial un drum cu l()=0.
Fie : u
0
, u
1
, ..., u
n
un drum n graful G=(V,E). este un drum
nchis dac u
0
=u
n
; n caz contrar se numete drum deschis.
Drumul este elementar dac oricare dou vrfuri din snt
distincte, cu excepia, eventual, a extremitilor.
Matricea existenei drumurilor
Fie G=(V,E) un graf, A matricea de adiacen. A
p
indic
numrul de drumuri distincte ntre oricare 2 vrfuri.
Fie operaiile binare de adunare i nmulire pentru matrice
binare. Notnd A=(a
ij
), B=(b
ij
), atunci A+B=(c
ij
), AxB=(d
ij
), unde binare. Notnd A=(a
ij
), B=(b
ij
), atunci A+B=(c
ij
), AxB=(d
ij
), unde
pentru 0 i, j n
c
ij
=max{a
ij
, b
ij
}
d
ij
=max{min{a
ik
, b
kj
}, 0 k n}
Matricea obinut adunnd puterile de la 1 la n-1 ale matricei de
adiacen constituie matricea existenei drumurilor n graf.
Algoritmul Roy-Warshall
void Roy_Warshall (unsigned char a[10][10],
unsigned n,
unsigned char m[10][10])
{ int i,j,k; { int i,j,k;
for( i=0; i<n; i++ )
for( j=0; j<n; j++ )
m[i][j] = a[i][j];
for( j=0; j<n; j++ )
for( i=0; i<n; i++ )
if( m[i][j] )
for( k=0; k<n; k++ )
if( m[i][k] < m[k][j] )
m[i][k]=m[k][j];
}
Componente conexe ale unui graf
Fie G=(V,E) graf netrivial. Vrfurile u,v snt conectate
dac exist un u-v drum n G.
Dac G este un graf, atunci o component conex a lui Dac G este un graf, atunci o component conex a lui
G este un subgraf conex al lui G, maximal n raport cu
proprietatea de conexitate.
Un graf este conex dac i numai dac numrul
componentelor sale conexe este 1.
Mulimile de vrfuri corespunztoare oricror dou
componente conexe distincte snt disjuncte.
Conexitate
Algoritm pentru determinarea unei componente conexe
(subgraf, mulimi de vrfuri i muchii).
Se iniializeaz componenta vid
Se adaug la mulimea de vrfuri vrful iniial
Repet
Se caut toi vecinii noi ai vrfurilor selectate i se
adaug la mulimea de vrfuri
Se caut toate muchiile noi dintre vrfurile selectate i se
adaug la mulimea de muchii
Pn cnd nu se mai gsesc vorfuri noi
Fie G=(V,E,w) un graf ponderat. Costul drumului :
u
0
, u
1
, ..., u
n
, notat L(), este definit prin:
( ) ( )

=
1 n
u , u w L
Pentru orice u i v vrfuri conectate n G, u v, w-
distana ntre u i v, notat D(u,v), este definit prin
unde D
uv
desemneaz mulimea tuturor u-v drumurilor
elementare din G.
Drumul pentru care D(u,v)=L(), se numete drum
de cost minim.
( ) ( )

=
+
=
1 i
1 i i
u , u w L
( ) ( ) { }
uv
D , L min v , u D =
Roy-Floyd
Se considera un graf orientat cu n noduri, pentru
care se da matricea costurilor. Se cere ca, pentru
fiecare pereche de noduri (i, j), sa se tipareasca fiecare pereche de noduri (i, j), sa se tipareasca
costul drumului minim de la i la j.
Plecam de la urmatoarea idee: daca drumul minim
intre doua noduri oarecare i si j trece printr-un nod k,
atunci drumurile de la i la k si de la k la j sunt la
randul lor minime. Pentru fiecare pereche de noduri
(i, j ), cu i, j in {1,2,,n}, procedam astfel:
Roy-Floyd
Dam lui k pe rand valorile 1,2,,n, pentru ca nodul k
despre care vorbeam mai sus poate fi, cel putin
teoretic, orice nod al grafului. Pentru fiecare k: teoretic, orice nod al grafului. Pentru fiecare k:
daca suma dintre costul drumului de la i la j si costul
drumului de la k la j este mai mica decat costul
drumului de la i la j {a[i, k]+a[k, j]<a[i, j]}, atunci
drumul initial de la i la j este inlocuit cu drumul
indirect i->k->j. aceasta inlocuire se va reflecta in
matricea costurilor: {a[i, j]:=a[i, k]+a[k, j]}.
Drumuri de cost minim
Algoritmul Roy-Floyd
void Roy_Floyd (float w[10][10], unsigned n
float d[10][10], float MAX)
{ int i,j,k; { int i,j,k;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
d[i][j] = w[i][j];
for (j=0;j<n;j++)
for (i=0;i<n;i++)
if(d[i][j]<MAX)
for (k=0;k<n;k++)
if (d[i][k] > d[i][j] + d[j][k])
d[i][k] = d[i][j] + d[j][k];
}
Dijkstra
Algoritmul descris aici presupune o
etichetare dinamica a varfurilor;
Fiecare varf v va fi etichetat cu o eticheta Fiecare varf v va fi etichetat cu o eticheta
(L(v), u), unde u este predecesorul lui v pe
cel mai ieftin vo-v drum determinat pana la
acel moment, iar L(v) lungimea acelui drum
Notatie: pentru o submultime S a lui V, notam
S complementara acelei multimi.
Dijskstra
Intrare: (V,E,W), graf conex ponderat de ordin p; v0 varf
initial
1. i=0; So={vo};L(vo)=0; L(v)=max pt. toti v din V-{vo};Daca 1. i=0; So={vo};L(vo)=0; L(v)=max pt. toti v din V-{vo};Daca
p=1, STOP
2. Pt. toti v din Si, daca L(v) >L(vi)+w(viv), then
L(v):=L(vi)+w(viv) si etichetam v cu (L(v), vi)
3. Determina d=min{L(v), v in Si}si aleg vi+1 a.i. L(vi+1)=d
4. Si+1:=SiU{vi+1}
5. i:=i+1; daca i=p-1, STOP, altfel reia Pasul 2
Iesire: etichetele atasate varfurilor v din V.