Documente Academic
Documente Profesional
Documente Cultură
Andrei CORLAT
GRAFURI
Noiuni. Algoritmi. Implementri
Chiinu, 2012
Cuprins
Introducere ............................................................................................................7
Capitolul 1. Noiuni generale.................................................................................9
1.1 Definiii ........................................................................................................9
1.2 Structuri de date pentru reprezentarea unui graf ....................................17
Exerciii: ...........................................................................................................20
Capitolul 2. Parcurgeri. Conexitate......................................................................21
2.1 Parcurgerea grafului ..................................................................................21
2.2 Grafuri tare conexe ...................................................................................25
Algoritmul Kosaraju .........................................................................................26
2.3 Baze n graf ................................................................................................28
Exerciii: ...........................................................................................................29
Capitolul 3. Mulimi independente i dominante ...............................................30
3.1 Mulimi independente ..............................................................................30
3.2 Generarea tuturor mulimilor maximal independente .............................31
3.3 Mulimi dominante....................................................................................36
Exerciii ............................................................................................................38
Capitolul 4. Colorri .............................................................................................39
4.1 Numrul cromatic ......................................................................................39
4.2. Algoritmul exact de colorare ....................................................................42
4.3. Algoritmi euristici de colorare ..................................................................43
Exerciii: ...........................................................................................................45
Capitolul 9. Cicluri................................................................................................89
9.1 Numrul ciclomatic i mulimea fundamental de cicluri .........................89
9.2 Tieturi ......................................................................................................91
9.3 Cicluri Euler ................................................................................................93
9.4 Algoritmul de construcie a ciclului eulerian .............................................95
Exerciii ......................................................................................................... 100
Capitolul 10. Cicluri hamiltoniene .................................................................... 101
10.1 Cicluri i lanuri hamiltoniene .............................................................. 101
10.2 Algoritmul pentru determinarea ciclurilor (lanurilor) hamiltoniene .. 103
10.3 Problema comisului voiajor .................................................................. 106
Exerciii ......................................................................................................... 109
Capitolul 11. Fluxuri n reea ............................................................................ 110
11.1 Preliminarii ........................................................................................... 110
11.2.Algoritm ................................................................................................ 111
11.3 Flux maxim cu surse i stocuri multiple ............................................... 118
11.4 Flux maxim pe grafuri bipartite ........................................................... 119
11.5 Flux maxim pe grafuri cu capaciti restricionate ale vrfurilor i
muchiilor....................................................................................................... 120
Exerciii ......................................................................................................... 122
Capitolul 12. Cuplaje......................................................................................... 123
12.1 Cuplaje .................................................................................................. 123
12.2 Graf asociat........................................................................................... 124
12.3 Funcia de generare a grafului asociat ................................................. 125
12.4 Generarea tuturor cuplajelor maxime ................................................. 126
Exerciii ......................................................................................................... 129
Bibliografie ....................................................................................................... 130
vbcb
Introducere
Aprute din necesitatea de a modela diverse situaii, relaii sau
fenomene n form grafic, grafurile i-au gsit o multitudine de
aplicaii n cele mai diverse sfere ale activitii umane: construcii i
sociologie, electrotehnic i politologie, chimie i geografie acest ir
poate fi continuat la nesfrit.
Teoria grafurilor a luat natere de la problema podurilor din
Konigsberg, cercetat de Euler i s-a dezvoltat ca un compartiment al
matematicii clasice pn la momentul apariiei sistemelor electronice de
calcul i a teoriei algoritmilor. n contextul rezolvrii problemelor de
calcul automat, grafurile s-au dovedit a fi un instrument universal i
extrem de flexibil, devenind un compartiment al matematicii aplicate.
O adevrat revoluie a cunoscut-o teoria grafurilor n anii 60
80 ai secolului trecut, cnd a fost stabilit posibilitatea de utilizare a lor
pentru rezolvarea problemelor de optimizare. Algoritmii pentru
determinarea drumului minim, punctelor mediane, centrelor, de
maximizare a fluxurilor, dar i multe altele au devenit componente
vitale ale cercetrilor operaionale i a metodelor de optimizare.
n aspect informatic grafurile apar i n calitate de structuri
eficiente de date, n special arborii, care permit realizarea optim a
algoritmilor de sortare i cutare.
Numrul de lucrri, care studiaz aspectele algoritmice ale
teoriei grafurilor este unul impuntor. Printre primele apariii se
numr Applied graph theory de Wai-Kai Chen; Graph Theory. An
Algorithmic approach de Nicos Christofides; urmate de Algorithmic
ghaph theory de Alan Gibbons, Algorithms in C de Thomas Sedgewick i
multe alte ediii. Totui, majoritatea ediiilor se axeaz doar pe
descrierea matematic a algoritmilor, fr a le suplini prin
implementri ntr-un limbaj de programare sau altul, or, tocmai
implementarea algoritmului este componenta de importan maxim
pentru programatorii practicieni.
n prezenta lucrare se ncearc abordarea vertical a
algoritmilor clasici ai teoriei grafurilor: de la noiuni teoretice, definiii
7|Page
Autorii
1.1 Definiii
Def. Graf neorientat (graf) o pereche arbitrar G (V , E ) E {u, v}: u, v V & u v
2
1
G (V , E ) , n care E V V
Des 1.1. Graf neorientat
V
formeaz mulimea vrfurilor
grafului, E mulimea muchiilor. De obicei
vrfurile grafului sunt reprezentate n plan
prin puncte sau cercuri iar muchiile prin
segmente care unesc vrfurile.
Pentru
graful
din
desenul
1.1
2
1
9|Page
u, v ,
adiacente muchiei.
Grade
Def.
Gradul vrfului
(vi ) .
vi .
Pentru
vrful
din
graful
reprezentat
pe
desenul
1.2
10 | P a g e
Subgrafuri
Def. Subgraf al grafului G (V , E ) se numete orice graf G (V , E)
astfel nct V V , E E .
Subgrafurile se obin din graful iniial fie prin excluderea
muchiilor, fie prin excluderea muchiilor i vrfurilor din graful iniial.
n cazul cnd din graful iniial se exclude vrful vi , odat cu el se
exclud i toate muchiile incidente acestuia. Excluderea muchiei (u, v)
nu presupune i excluderea din graf a vrfurilor u, v.
Dac n subgraful G (V , E) are loc relaia V V , subgraful
este unul bazic (desenul 1.3 B). Subgraful
VS V , ES E
dac
se
vi VS , (vi ) (vi )
numete
subgraf
generat
pentru
orice
2
1
2
1
Des 1.3 Graful iniial (A), subgraf bazic (B), subgraf generat (C).
11 | P a g e
Tipologia grafurilor
Def.
v , v E
i
nu exist.
Def.
Des 1.4
Graf complet K5 (A),
graf bipartit (B).
Necesitate. V V A
lungime impar vi1 , vi2 ,...vik , vi1 i vi1 V A . Deoarece lungimea ciclului
este impar, numrul de vrfuri, care descriu ciclul este par. G este
bipartit, prin urmare, vrfurile cu indici pari din ciclul vi1 , vi2 ,...vik , vi1
aparin componentei V . Prin urmare i vi1 V B , ceea ce contrazice
B
presupunerea iniial.
Suficien. Fie c n G nu exist nici un ciclu de lungime impar. n
acest caz se va construi o divizare corect a V n dou submulimi
distincte V
iar sfritul n V .
B
cu aceeai proprietate.
Fie v ultimul vrf comun al cilor 1 , 2 diferit de vik . Dac n
1 semnele v vi
v,..., vik al cii 1 i v,..., vik al cii 2 , are un numr par de muchii, iar
cellalt un numr impar (des. 1.6). Respectiv, ciclul determinat de
reuniunea acestor dou fragmente va avea o lungime impar, ceea ce
contrazice condiiile iniiale. n consecin, cazul (b) este unul imposibil
n grafurile bipartite.
Cazul (c) indic divizarea grafului n subgrafuri izolate, prin urmare
fiecare dintre acestea urmeaz s fie cercetat separat. Prin urmare
cazul se reduce la (a).
Def.
v V A , v V B (v, v) E
Graful bipartit complet cu pri formate din n i m vrfuri se
noteaz K n ,m (desenul 1.7)
Def.
A
B
Des. 1.8 Graf conex (A), graf neconex (B)
Des. 1.7
Graful bipartit complet K3,3
Def.
nmr 2
unde: n numrul de vrfuri ale grafului, m numrul de muchii, r
numrul de fee.
m 0. n 1& r 1. 1 0 1 2.
Fie teorema este adevrat pentru m k.
Se adaug nc o muchie
Dac
muchia
unete
n k r 2.
m k 1.
dou
vrfuri
existente,
atunci
r r 1.
n (k 1) (r 1) n k r 1 1 n k r 2.
15 | P a g e
(n 1) (k 1) r n k r 1 1 n k r 2.
2 nmr nm
2m
6 3n 3m 2m m 3n 6
3
Ponderi
n unele cazuri muchiile grafului posed caracteristici numerice
suplimentare, numite ponderi. Muchiei (arcului) (vi , v j ) i se pune n
coresponden valoarea ci , j - ponderea (costul, lungimea etc.). Graful,
muchiilor cruia -i sunt asociate ponderi se numete graf cu muchii
ponderate. Pentru rezolvarea unor probleme este necesar i aplicarea
ponderilor la vrfurile grafului. Vrfului vi i se pune n coresponden
caracteristica numeric ci - ponderea (costul). Graful, vrfurilor cruia
-i sunt asociate ponderi se numete graf cu vrfuri ponderate.
Dac graful G (V , E ) este unul ponderat, atunci pentru cile
din graf se introduce caracteristica numeric l - cost (lungime) egal cu
suma ponderilor muchiilor din care este format o cale C .
l (C )
( vi , v j )C
16 | P a g e
ci , j
0
0
1
1
1
3
4
(3,4)
0
1
0
1
(2,4)
(3,4)
0
1
1
(3,2)
(2,4)
1
0
0
1
(1,4)
( ,3)
1
1
0
0
(2,1)
(1,4)
1
2
3
4
Des. 1.2
(1,2)
Des.1.1
+1
-1
0
0
-1
0
0
+1
0
+1
-1
0
0
+1
0
-
0
0
-1
+1
acest caz ineficient, deoarece doar cte dou elemente din fiecare linie
vor conine date real utilizabile.
G (V , E ) este
(i, j ) al
tabloului.
Pentru grafurile din des. 1.1,1.2 matricele de adiacen vor fi
Des. 1.1
1
1
2
1
0
3
1
4
2
1
0
1
1
3
0
1
0
1
4
1
1
1
0
Des. 1.2
1
0
1
1
2
0
3
0
4
2
0
0
1
0
3
0
0
0
0
4
1
1
1
0
Des. 1.2
(1,2)(1,4)(2,3)(2,4)(3,4)
(1,4)(2,1)(2,4)(3,2)(3,4)
18 | P a g e
19 | P a g e
Exerciii:
1. Pentru grafurile din imagini construii:
a)
b)
c)
d)
Matricea de inciden
Matricea de adiacen
Lista de muchii
Lista de vecini
i afiarea ei pe
20 | P a g e
u.
Una dintre cele mai eficiente metode de parcurgere n graf este
parcurgerea n adncime4. La baza metodei st principiul de
selectare recursiv a vrfurilor i etichetare a lor. Iniial toate vrfurile
se consider neatinse. Fie v0 vrful de la care ncepe parcurgerea. v0 se
eticheteaz ca fiind atins. Se alege un vrf u , adiacent v0 i se repet
procesul, pornind de la u . n general, fie v vrful curent. Dac exist
un vrf u , nou (neatins), adiacent v ( (v, u) E ), atunci procesul se
repet pornind de la u. Dac pentru vrful curent v nu mai exist
vrfuri vecine neatinse, el se eticheteaz ca fiind cercetat, iar procesul
de parcurgere revine n vrful precedent (din care s-a ajuns n v ). Dac
4
vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare
1
1
1
1
1
1
1
1
1
1
1
1
2
0
2
0
2
0
2
0
2
0
2
0
3
0
3
0
3
1
3
1
3
1
3
1
4
0
4
0
4
0
4
1
4
2
4
2
5
0
5
0
5
0
5
0
5
0
5
1
6
0
6
1
6
1
6
1
6
1
6
1
Pas 7
Pas 8
Pas 9
Pas 10
Pas 11
Pas 12
vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare
1
1
1
1
1
1
1
1
1
1
1
2
2
1
2
2
2
2
2
2
2
2
2
2
3
1
3
1
3
1
3
2
3
2
3
2
4
2
4
2
4
2
4
2
4
2
4
2
5
1
5
1
5
2
5
2
5
2
5
2
6
1
6
1
6
1
6
1
6
2
6
2
return 0;
}
O( N 2 ) . Odat
Pas 1
atins
cercetat
atins
cercetat
atins
cercetat
atins
cercetat
Pas 2
Pas 3
Pas 4
Pas 5
6
1
2
1
3
1
Pas 6
3
6
5
6 2
Pas 7
atins
cercetat
atins
cercetat
atins
cercetat
5 4
1 6 2 3
4
1 6 2 3 5
1 6 2 3 5 4
24 | P a g e
v j ) i v j cu vi ( v j
vi
v j sau v j
v j i v j
vi .
este
GT (V , ET ) unde
ET (vi , v j ) : (v j , vi ) E . Graful
1 dac Aj ,i 1
AiT, j
i, j 1,..., n
0 n caz contrar
25 | P a g e
G (V , E ) i graful transpus
GT (V , ET ) , reprezentate grafic.
Algoritmul Kosaraju
Pseudocod
Pas 1. Se construiete graful GT (V , E T )
Pas 2. Se lanseaz cutarea n adncime pornind de la fiecare vrf
necercetat din GT . Pentru fiecare parcurgere se memoreaz
cumulativ ordinea de cercetare a vrfurilor n vectorul f .
Pas 3. Se lanseaz cutarea n adncime pe graful iniial
G,
26 | P a g e
Exemplu implementare:
Se folosete matricea de adiacen a pentru reprezentarea
grafului iniial, at pentru reprezentarea grafului transpus, vectorul b
pentru descrierea strii vrfurilor, vectorul black pentru ordinea de
cercetare.
Input: Graful G (V , E )
Output: componentele tare conexe ale grafului, separate pe linii.
int DFS_DIR (int s) { // . . . descrisa anterior - DFS }
int DFS_TRANS (int s)
{ int i;
b[s]=1;
for(i=1;i<=n;i++)
if( at[s][i] !=0 && b[i]==0) DFS_TRANS(i);
//amplasarea in stiva ordinii de cercetare
k++; black[k]=s;
return 0;
}
int main()
{ // . . .citirea datelor initiale
// transpunerea grafului
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
if (a[i][j]==1) at[j][i]=1;
// Cautarea in adancime pe graful transpus
for(i=1;i<=n; i++) if (b[i]==0) DFS_TRANS(i);
// resetarea starii varfurilor
for(i=1;i<=n;i++) b[i]=0; printf("\n");
// parcurgerea in adancime pe graful initial
for(i=n;i>=1;i--) //Afisarea componentelor tare conexe
if (b[i]==0) {DFS_DIR(black[i]); printf("\n");}
return 0;
}
27 | P a g e
complexitate
O( N 2 ) .
Prin
urmare,
complexitatea
total
28 | P a g e
Exerciii:
1. Simulai, pe pai, pentru graful
din imagine, parcurgerea n lime,
de la vrful 1
2. Simulai, pe pai, pentru graful din
imagine, parcurgerea n adncime,
de la vrful 1
V 20 )
6. Elaborai un program pentru determinarea componentelor tare
conexe ale grafului ( V 20 )
7. Elaborai un program pentru generarea tuturor bazelor unui
graf cu cel mult 20 de vrfuri.
29 | P a g e
este o
(S ) .
30 | P a g e
G (V , E ) . Numrul G max Q
SQ
se va numi numr de
31 | P a g e
Motivarea algoritmului
Algoritmul se bazeaz pe arborele de cutare. Prin urmare, este
eficient realizarea lui recursiv.
n general la pasul k mulimea independent S k se extinde prin
adugarea unui vrf nou, pentru a obine mulimea Sk 1 la pasul k 1 .
Procesul se repet att timp, ct este posibil. La momentul, n care nu
mai putem aduga vrfuri avem obinut o mulime maximal
independent.
Fie Qk va fi la pasul k - mulimea maximal de vrfuri, pentru
care (Sk )
urmtoarea:
a) selectarea unui nod xik Qk
b) construirea mulimii Sk 1 Sk
c) formarea
Qk1 Qk ( xik )
(*)
x
ik
cnd Qk i Qk . Dac
Prezena n
Qk a unui vrf x Qk : ( x) Qk
(**)
Optimizarea algoritmului
Optimizarea poate fi obinut din contul apariiei ct mai rapide
a pasului de ntoarcere. Prin urmare se va ncerca ndeplinirea ct mai
grabnic a condiiei (**). O metod sigur (n special pentru grafuri
Pseudocod
Pas 1.
S0 Q0 , Q0 V , k 0.
Adugarea vrfurilor
Pas 2. Este selectat un vrf
k
Verificarea posibilitii de continuare
: ( x) Qk
se trece la pasul 5,
altfel - la pasul 4.
Pas 4.
a)
33 | P a g e
c)
Micarea napoi
Pas 5. k
a)
b)
Se reconstruiesc Qk , Qk : Qk Qk xik
c)
Qk xik
intermediul
apelurilor
recursive.
Restriciile
de
dimensiune
else { j=n;
while (s[j]==0 && j>=1) j--;
r=j+1;
for (i=r;i<=n;i++)
if (q[i]==1)
{ fillc(rest,0,n);
s[i]=1; q[i]=0;
for (j=1;j<=n;j++)
if (a[i][j] != 0 && q[j]==1)
{q[j]=0; rest[j]=1;}
mind (s,q);
// micarea inainte
s[i]=0;q[i]=1; //micarea napoi
for (j=1;j<=n;j++)
if(rest[j]==1) q[j]=1;
}
}
return 0;
}
int main()
{
readdata();
fillc(s,0,n); fillc(q,1,n);
mind(s,q); return 0;
}
5 10
7 8
8 10
9 10
3 7 8 11
3 9 11
4 6 9
4 7
6 9 11
5
6 9 10
9 10 11
10 11
35 | P a g e
( xi , x j ), xi S .
(S ) V .
Def.
S S .
G (V , E ) . Numrul G min Q
SQ
se va numi indice de
36 | P a g e
(S ) . Rezult c S
este
37 | P a g e
Exerciii
1. Pentru graful din imagine, determinai:
a) Mulimea maxim
independent de putere
minim
b) Mulimea maxim
independent de putere
maxim
c) Una dintre mulimile dominante
2. Completai implementarea prezentat cu subprogramele lips i
structurile de date pentru a obine un program funcional, care
va realiza algoritmul pentru grafuri cu |V| < 30.
3. Realizai o modificare a programului, care va verifica toate
optimizrile indicate n descrierea algoritmului (3.2)
4. Implementai un algoritm similar celui pentru determinarea
mulimii maxim independente, care va construi mulimile
dominante pe un graf orientat.
5. Elaborai o funcie pentru generarea aleatorie a grafurilor i
estimai statistic timpul mediu de lucru al algoritmilor realizai
n dependen de numrul de vrfuri ale grafului
38 | P a g e
Capitolul 4. Colorri
n acest capitol:
(G) .
(G) reieind
din numrul de vrfuri (n) i muchii (m) ale grafului. Este evident
k
posibilitatea
de
a
colora
graful
n
culori
(
( Kn ) 1, ( Kn ) n , ( Kn ,n ) 2 , (T ) 2 , etc.
1
(G) 1 (G). 6
c)
V k.
Pentru
un
vrf
arbitrar
v V are
loc
relaia:
2 n n 1
n 1
n
a) Fie
Prin
urmare,
max pi
i 1
n
.
k
Deoarece
Vi
sunt
p
i 1
n.
mulimi
c max pi
1
n
n
. Astfel, k n .
k
k
ab
ab
2 2 n
2
. Prin urmare,
c) Prin inducie dup n se va demonstra c p 1 .
Pasul 1. n 1, 1& 1 .
Pasul k-1. Fie k pentru toate grafurile cu k 1 vrfuri.
Pasul k. Fie G cu k vrfuri i un vrf v V . Atunci
(G) (G) (G v) 1 (G v) 1 d 1 k d 1 1 k 1
n 1
d) Din a) c) 2 n 1. Prin urmare
.
2
2
(G) 5 .
(G v) 5 . Se va colora vrful v .
41 | P a g e
Iniializare V {1,..., n} C [ ] 0,
se
Pas 3.
iniializeaz
cu
0.
k 1 . Vectorul culorilor
Culoarea
activ
1.
Ct V se repet
Pentru fiecare v V
Pentru fiecare u (v)
Dac C [u ] k , se trece la urmtorul v
C[v] k ; V V v
k
43 | P a g e
Implementare
Input: Graful G : matricea de adiacen a, structura vrfurilor v.
Output: O colorare posibil a grafului G , n vectorul culorilor c.
int sort ()
{ // sorteaz vrfurile n descreterea gradelor }
int readdata()
{ // citete graful G. matricea de adiacen }
int printcc()
{ // afieaz o colorare a grafului G }
int nocolor()
{ verific prezena vrfurilor necolorate }
int main(int argc, char *argv[])
{ int j,i,r;
readdata();
// initializare
for (i=1;i<=n;i++)
{v[i].ind=i;
for (j=1; j<=n;j++) v[i].grad+=a[i][j];
}
// sortare
sort();
// colorare
k=1;
fillc(c,0,n);
while (nocolor())
{ for( i=1;i<=n;i++)
{ if (c[v[i].ind]==0)
{ r=0;
for (j=1;j<=n;j++)
if (a[v[i].ind][j] != 0 && c[j]==k) r++;
if (r==0) c[v[i].ind]=k;
}
}
k++;
}
printcc();
return 0;
}
44 | P a g e
Exerciii:
1. Pentru grafurile din imagine determinai
(G)
un
program
care
va
determina
colorarea
45 | P a g e
Preliminarii
Ponderea unei muchii
46 | P a g e
toate
vrfurile
vi ( p)
care
nu
au
marcaje
distan
ale
47 | P a g e
Dac
se
modific
x, l x .sursa . Se
consider
48 | P a g e
din S drumul
Fie v j
Des. 5.2
1
0
1
p
10
49 | P a g e
Iteraia 1
Vrf
distana
sursa
marcaj
1
0
1
p
2
10
Iteraia 2
Vrf
distana
sursa
1
0
1
2
10
marcaj
Iteraia 3
Vrf
distana
sursa
marcaj
1
0
1
p
Iteraia 4
Vrf
distana
sursa
marcaj
1
0
1
p
Iteraia 5
Vrf
distana
sursa
marcaj
1
0
1
p
Iteraia 6
Vrf
distana
sursa
marcaj
1
0
1
p
Iteraia 7
Vrf
distana
sursa
marcaj
1
0
1
p
50 | P a g e
1
t
4
5
1
t*
3
5
10
1
t*
7
6
10
7
6
8
10
10
1
t
*
7
6
8
10
10
1
p
4
t
9
10
10
30
5
t
1
t
4
5
2
10
4
5
5
10
1
p
4
t
2
10
3
30
4
5
5
10
6
18
7
6
8
10
1
p
2
t
1
p
4
t*
2
t
1
p
4
t
2
10
3
30
4
5
5
10
6
18
7
6
8
10
1
p
2
t
1
p
4
p
2
t
1
p
4
t*
2
10
3
30
4
5
5
10
6
18
7
6
8
10
9
30
10
30
1
p
2
t
1
p
4
p
2
t*
1
p
4
p
8
t
5
t
2
10
3
30
4
5
5
10
6
18
7
6
8
10
9
30
10
24
1
p
2
t
1
p
4
p
2
p
1
p
4
p
8
t
6
t*
Implementare
Graful este descris prin matricea de adiacen a. Marcajele se pstreaz
n tabloul liniar vert cu elemente tip articol, avnd componentele
distana, sursa, stare.
int find()
{ // fuctia returneaza indicele varfului cu marcaj temporar
//de valoare minima. Daca nu exista, returneaza 0.
}
int tipar()
{ // functia afiseaza tabloul de marcaje
}
int main()
{ // citire date
// formare marcaje
for (i=1;i<=n;i++)
for (j=i+1; j<=n; j++) k+=a[i][j];
k++;
for (i=1;i<=n;i++)
{vert[i].dist=k; vert[i].sursa=i; vert[i].stare=0;}
vert[s].stare=1; vert[s].dist=0;
// repetare iteratii
while (find ())
{ p=find();
for(i=1;i<=n;i++)
if (a[p][i] !=0 && vert[i].stare !=2 )
{ dc= vert[p].dist+a[p][i];
if(dc<vert[i].dist){vert[i].dist=dc; vert[i].sursa=p;}
vert[i].stare=1;
51 | P a g e
}
vert[p].stare=2;
}
// afisare rezultate
tipar();
return 0;
}
vj
drumul minim dintre ele trece doar prin vrfurile mulimii {v1 , v2 ,..., vk }
Pseudocod
Pas 0. (Preprocesare). Fie dat matricea distanelor C, n care
i j
0,
C[i ][ j ] di , j , (i, j ) E
,
(i, j ) E
Pas 1. (Iniializare) k 0
Pas 2
Pas 3
Pas 4
52 | P a g e
v j va
Exerciii
1. Determinai distana minim ntre vrfurile indicate pe grafurile
de mai jos:
39
14
54 | P a g e
Centre n graf
Centre interioare i exterioare
Raza grafului
Algoritmi exaci pentru determinarea centrului
Centrul absolut
P centru
Algoritmi euristici pentru determinarea p-centrelor
6.1 Divizri
0
Pentru orice vrf vi al grafului G (V , E ) se va nota prin R (vi )
55 | P a g e
R (v ) v : d v , v , v V
R0 (vi ) v j : d vi , v j , v j V
t
s0 (vi ) max d vi , v j
v j V
st (vi ) max d v j , vi
v j V
v1
v2
v3
v4
v5
v6
v7
v8
s0
v1
v2
v3
v4
v5
2
*
v6
v7
v8
determinat de valoarea
maxim din rndul i al
st
3
*
3
*
Este
evident,
*
Vrful v0 pentru care are loc relaia s0 (v0 ) min s0 (vi ) se
vi V
vi V
grafului G.
Centrul exterior este vrful (sau vrfurile) care minimizeaz cea
mai lung distan de la el spre oricare alt vrf al grafului. Din
matricea distanelor el poate fi determinat ca minimul valorilor maxime
de pe fiecare linie. Pentru graful de pe desenul 6.1 centrul exterior este
vrful 5. Centrul interior este vrful (sau vrfurile) care minimizeaz
cea mai lung distan spre el de la oricare alt vrf al grafului. Din
matricea distanelor el poate fi determinat ca minimul valorilor maxime
de pe fiecare coloan. Pentru graful de pe desenul 6.1 centre exterioare
sunt vrfurile 4 i 8. ntr-un graf neorientat centrul interior i cel
exterior coincid.
Def.
vi V
vi V
interioar a grafului G.
Pentru graful de pe desenul 6.1 raza exterioar are valoarea 2, n
timp ce raza interioar are valoarea 3.
Pentru un graf neorientat raza interioar i raza exterioar sunt
egale, iar centrele exterioare coincid cu cele interioare.
Def.
vi V
vi V
grafului G.
57 | P a g e
Def.
*
Vrful v0 pentru care are loc relaia s(v0 ) min s(vi ) se numete
vi V
6.3 P-centre
Fie n municipiu sunt amplasate mai multe (P) centre de
asisten medical urgent, cu echipe mobile de medici. n cazul
recepionrii unei cereri de asisten la centrul comun de apel, ctre
solicitant se deplaseaz echipajul de medici de la cel mai apropiat
centru de asisten.
n acest caz amplasarea iniial a celor P centre de asisten
medical urgent este organizat ntr-un mod, care asigur minimul de
ateptare a pacientului, indiferent de locaia acestuia.
d Vp , vi min d v j , vi
v j V p
s0 (V p ) max d V p , v j
v j V
Def.
Mulimea
de
vrfuri
V p*,0
pentru
care
are
loc
relaia
Mulimea de vrfuri
V p*,t
58 | P a g e
Def.
V p G
V p G
interioar a grafului G.
Pseudocod
Pas 0. Se formeaz matricea distanelor minime (algoritmul Floyd)
Pas 1. Se alege n calitate de aproximare iniial a p-centrului o
mulime arbitrar de vrfuri C. Vrfurile v j V C vor fi
considerate avnd marcajul strii egal cu 0 (neverificate).
59 | P a g e
i0 , j max i , j .
vi C
i.
Des. 6.2
Amplasarea optim a centrului de deservire:
a. Numai pe vrfurile existente
b. Pe vrfurile sau muchiile existente
s0 (u ) max d u, v j ,
st (u ) max d v j , u
v j V
Def.
v j V
*
Punctul u0 pentru care are loc relaia s0 (u0 ) min s0 (u) se
uG
*
numete centru exterior absolut al grafului G. Vrful ut pentru
care are loc relaia st (ut ) min st (u) se numete centru interior
*
uG
absolut al grafului G.
Def.
uG
a grafului G. Valoarea
eE
s0 (u ) max d u, v j , st (u ) max d v j , u
v j V
v j V
62 | P a g e
vl V
vl V
Tl d (v j , vl )
Tl ci , j d (vi , vl )
i cercetate ca funcii de . Pentru graficele funciilor se determin
punctul de intersecie i semidreptele inferioare ce pornesc din el.
Aceste semidrepte se vor numi semidrepte de minimizare inferioare.
Semidreptele de minimizare se construiesc pentru toate vl V , apoi pe
baza lor se construiete linia de maximizare. Aceasta prezint o linie
frnt, cu mai multe puncte de minimum. Din toate punctele de
minimum este ales cel maximal (conform formulei.). Acesta va fi centrul
absolut situat pe muchia ek . Pentru a determina centrul absolut al
ntregului graf se va selecta minimul dintre centrele absolute pe toate
muchiile din G.
63 | P a g e
Exemplu
v1
v2
v3
v4
v5
v6
v1
v2
10
v3
10
10
v4
10
10
v5
0
v6 5 8 10 4 2
Des. 6.4.
Graful pentru care se calculeaz centrul absolut i matricea distanelor lui.
Pe muchia 1
T1 d (v3 , v1 ) 8;
T1 c3,1 d (v1 , v1 ) 8 .
T2 d (v3 , v2 ) 2;
T2 c3,1 d (v1 , v2 ) 17 .
T3 d (v3 , v3 ) ;
T3 c3,1 d (v1 , v3 ) 16 .
T4 d (v3 , v4 ) 10;
T4 c3,1 d (v1 , v4 ) 14 .
T5 d (v3 , v5 ) 8;
T5 c3,1 d (v1 , v5 ) 11 .
T6 d (v3 , v6 ) 10 ;
T6 c3,1 d (v1 , v6 ) 13 .
Des. 6.5.a
64 | P a g e
Pe muchia 2
T1 d (v3 , v1 ) 8;
T1 c3,2 d (v1 , v2 ) 11 .
T2 d (v3 , v2 ) 2;
T2 c3,2 d (v2 , v2 ) 2 .
T3 d (v3 , v3 ) ;
T3 c3,2 d (v3 , v2 ) 4 .
T4 d (v3 , v4 ) 10;
T4 c3,2 d (v2 , v4 ) 12 .
T5 d (v3 , v5 ) 8;
T5 c3,2 d (v2 , v5 ) 14 .
T6 d (v3 , v6 ) 10 ;
T6 c3,2 d (v2 , v6 ) 16 .
Des. 6.5.b
Pe muchia 3
T1 d (v2 , v1 ) 9;
T1 c5,2 d (v2 , v1 ) 9 .
T2 d (v2 , v2 ) ;
T2 c5,2 d (v5 , v2 ) 12 .
T3 d (v2 , v3 ) 2;
T3 c5,2 d (v5 , v3 ) 14 .
T4 d (v2 , v4 ) 10;
T4 c5,2 d (v5 , v4 ) 10 .
T5 d (v2 , v5 ) 6;
T5 c5,2 d (v5 , v5 ) 6 .
T6 d (v2 , v6 ) 8 ;
T6 c5,2 d (v5 , v6 ) 8 .
Des. 6.5.c
65 | P a g e
Pe muchia 4
T1 d (v1 , v1 ) ;
T1 c5,1 d (v5 , v1 ) 6 .
T2 d (v1 , v2 ) 9;
T2 c5,1 d (v5 , v2 ) 9 .
T3 d (v1 , v3 ) 8;
T3 c5,1 d (v5 , v3 ) 11 .
T4 d (v1 , v4 ) 6;
T4 c5,1 d (v5 , v4 ) 7 .
T5 d (v1 , v5 ) 3;
T5 c5,1 d (v5 , v5 ) 3 .
T6 d (v1 , v6 ) 5;
T6 c5,1 d (v5 , v6 ) 5 .
Des. 6.5.d
Pe muchia 5
T1 d (v1 , v1 ) ;
T1 c4,1 d (v4 , v1 ) 12 .
T2 d (v1 , v2 ) 9;
T2 c4,1 d (v4 , v2 ) 16 .
T3 d (v1 , v3 ) 8;
T3 c4,1 d (v4 , v3 ) 16 .
T4 d (v1 , v4 ) 6;
T4 c4,1 d (v4 , v4 ) 6 .
T5 d (v1 , v5 ) 3;
T5 c4,1 d (v4 , v5 ) 10 .
T6 d (v1 , v6 ) 5;
T6 c4,1 d (v4 , v6 ) 10 .
66 | P a g e
Des. 6.5.e
Pe muchia 6
T1 d (v5 , v1 ) 3;
T1 c4,5 d (v4 , v1 ) 10 .
T2 d (v5 , v2 ) 6;
T2 c4,5 d (v4 , v2 ) 14 .
T3 d (v5 , v3 ) 8;
T3 c4,5 d (v4 , v3 ) 14 .
T4 d (v5 , v4 ) 4;
T4 c4,5 d (v4 , v4 ) 4 .
T5 d (v5 , v5 ) ;
T5 c4,5 d (v4 , v5 ) 8 .
T6 d (v5 , v6 ) 2;
T6 c4,5 d (v4 , v6 ) 8 .
Des. 6.5.f
Pe muchia 7
T1 d (v6 , v1 ) 5;
T1 c4,6 d (v4 , v1 ) 10 .
T2 d (v6 , v2 ) 8;
T2 c4,6 d (v4 , v2 ) 14 .
T3 d (v6 , v3 ) 10;
T3 c4,6 d (v4 , v3 ) 14 .
T4 d (v6 , v4 ) 4;
T4 c4,6 d (v4 , v4 ) 4 .
T5 d (v6 , v5 ) 2;
T5 c4,6 d (v4 , v5 ) 8 .
T6 d (v6 , v6 ) ;
T6 c4,6 d (v4 , v6 ) 8 .
Des. 6.5.g
67 | P a g e
Pe muchia 8
T1 d (v6 , v1 ) 5;
T1 c5,6 d (v5 , v1 ) 5 .
T2 d (v6 , v2 ) 8;
T2 c5,6 d (v5 , v2 ) 8 .
T3 d (v6 , v3 ) 10;
T3 c5,6 d (v5 , v3 ) 10 .
T4 d (v6 , v4 ) 4;
T4 c5,6 d (v5 , v4 ) 6 .
T5 d (v6 , v5 ) 2;
T5 c5,6 d (v5 , v5 ) 2 .
T6 d (v6 , v6 ) ;
T6 c5,6 d (v5 , v6 ) 4 .
Des. 6.5.h
Pe muchia 9
T1 d (v4 , v1 ) 4;
T1 c4,3 d (v3 , v1 ) 18 .
T2 d (v4 , v2 ) 10;
T2 c4,3 d (v3 , v2 ) 12 .
T3 d (v4 , v3 ) 10;
T3 c4,3 d (v3 , v3 ) 10 .
T4 d (v4 , v4 ) ;
T4 c4,3 d (v3 , v4 ) 20 .
T5 d (v4 , v5 ) 4;
T5 c4,3 d (v3 , v5 ) 18 .
T6 d (v4 , v6 ) 4;
T6 c4,3 d (v3 , v6 ) 20 .
Des. 6.5.i
68 | P a g e
69 | P a g e
Exerciii:
Des. 6.7.
70 | P a g e
Capitolul 7. Mediane
n acest capitol:
Mediane n graf
Mediane interioare i exterioare
Algoritmi exaci pentru determinarea medianei
Mediana absolut
P mediana
Algoritmi euristici pentru determinarea p-medianei
7.1 Mediane
Mai multe probleme de amplasare a punctelor de deservire presupun minimizarea sumei distanelor de la o serie de puncte terminale
pn la un punct central (de colectare, comutare, depozite, etc.)
Punctele care corespund soluiei optime ale problemei se numesc
puncte mediane ale grafului.
Fie graful G (V , E ) . Pentru fiecare vrf vi se definesc dou
valori, care se numesc indici de transmitere:
0 (vi )
t (vi )
d v , v
v j V
d v , v
v j V
71 | P a g e
Def.
grafului
vi V
G.
Vrful
vt
pentru
care
v1
v2
v3
v4
v5
v6
v7
v8
v1
15
v2
22
v3
16
v4
15
v5
10
v6
18
v7
21
v8
20
25
15
15
14
19
16
21
12
72 | P a g e
(v) ( y)
d ( y, v ) d (v , v ) c d (v , v )
j
v j V
v j V
v j V
( y)
d (v , v ) d (v , v ) .
j
v j V
Deoarece V
( y)
d (v , v ) V
v j V
v j V
73 | P a g e
7.3 P-mediane
Noiunea de p-median se introduce prin analogie cu noiunea de
p-centru.
d Vp , vi min d v j , vi
(*)
v j Vp
(**)
Dac vj este vrful din V p , pentru care se obine valoarea minim a (*)
sau (**), se spune c vi este arondat la vj .
Indicii de transmitere pentru mulimea V p se calculeaz la fel ca i
pentru vrfurile solitare:
0 (Vp )
Def.
Mulimea
d V , v ,
v j V
de
vrfuri
V p ,0
t (Vp )
pentru
d v ,V
v j V
care
are
loc
relaia
numete
p-median
interioar
grafului G.
Teorema 2. Pentru orice mulime Y
74 | P a g e
Algoritmul euristic
Pentru valori mari ale lui n i p poate fi folosit un algoritm
euristic, similar algoritmului pentru determinarea p-centrului.
Pas 0. Se formeaz matricea distanelor minime (algoritmul Floyd)
Pas 1. Se alege n calitate de aproximare iniial a p-medianei o
mulime arbitrar de vrfuri C. Vrfurile v j V C vor fi
considerate avnd marcajul strii egal cu 0 (neverificate).
Pas 2. Se alege un vrf arbitrar de stare 0 v j V C i pentru fiecare
vrf vi C se calculeaz valorile i , j (C ) (C {vi } {v j })
75 | P a g e
Pas 3. Se determin
iii.
i0 , j max i , j .
vi C
iv.
v j este marcat
Implementare
Input: Graful
77 | P a g e
Exerciii:
Des 7.2
un
program
pentru
determinarea
medianelor
V 200
G (V , E ),
V 20
V 20
G (V , E ),
V 100
G (V , E ),
V 100
8. Demonstrai Teorema 2.
78 | P a g e
Capitolul 8. Arbori
n acest capitol:
G* (V , T ) T E
2
1
este
arbore
2
1
4
3
mai permit atingerea repetat din alt nod. Prin urmare, apariia
ciclurilor n procesul parcurgerii este imposibil.
Urmtoarea modificare a funciei DFS afieaz lista muchiilor
pentru carcasa ce corespunde parcurgerii n adncime a grafului:
int DFS (int s)
{ int i;
b[s]=1;
for(i=1;i<=n;i++)
if(a[s][i] !=0 && b[i]==0)
{printf("\n %d - %d", s, i); DFS(i);}
return 0;
}
ik.
Muchia curent ei (v, v) . Pe graful T se lanseaz funcia
(ii)
(iii)
T T
ei , c c 1
funcie
se
genereaz
toate
carcasele,
care
ncep
de
la muchia ek
Algoritm
Pas 1.
k 0
Pas 2
de
muchii
carcas
c0
Pas 3. CARCASE(k,0)
Pas 4
Implementare
Input: Graful G : matricea de adiacen a; lista de muchii v;
Output: Arborii pariali a grafului G , generai consecutiv n tabloul
arb.
int tipar()
{ .. //afieaz soluia curent matricea de adiacen a
arborelui parial}
int scoatemuchie(int ind)
{ // exclude muchia cu
construcie}
int punemuchie(int ind)
{ // include muchia
construcie}
cu
indicele
indicele
ind
ind
din
arborele
arborele
{ // citire date
// formarea lista muchii
for (i=1;i<=n;i++)
for (j=i+1; j<=n; j++)
if (a[i][j]==1) {k++; ed[k].vi=i; ed[k].vj=j;}
// cutare carcase
for (i=1;i<=k-n+1;i++)
back(i,0);
return 0; }
G* (V , T ) se
ponderilor
formeaz.
va
nelege
muchiilor,
S (G )
*
( v ,u )T
suma
care
cv ,u
Pentru
grafurile
neponderate
toi
arborii
de
acoperire au acelai cost. n cazul
prezenei ponderilor n graf apare
10
6
0
0
15
0 0
0 8
0 20 5
0 20
0 0
0 0
0 10 0
6 0
5 9
0 0
0 0
10 6
0 0
0 0
0 0
83 | P a g e
Algoritmul Kruskal
Fie G (V , E ) un graf ponderat cu n vrfuri. Algoritmul Kruskal
folosete tehnica greedy i presupune crearea unui graf G* (V , T ) , n
care iniial T . Ulterior, muchiile din G se sorteaz dup creterea
ponderilor. La urmtoarea etap se efectueaz adugarea consecutiv
n G * a muchiilor din irul sortat, cu condiia c la adugarea muchiei
n G * nu se formeaz un ciclu. Lucrul algoritmului se sfrete cnd
numrul de muchii adugate devine n-1.
Pseudocod:
Pas 1. Se construiete G* (V , T ) , T .
Pas 2. Muchiile din G (V , E ) se sorteaz n ordinea creterii
ponderilor. Se obine irul m1 ,..., m E
Pas 3.
k 0, i 1
Pas 4. While k V 1 do
a) if T mi nu formeaz un ciclu n G * , then
T T mi , k
b)
Implementare:
Input: Graful G : matricea de adiacen a; liata de muchii v; arborele
parial de cost minim arb, tabloul componentelor conexe c.
Output: Un arbore parial de cost minim a G , n tabloul arb.
int sort ()
{ // functia de sortare a listei de muchii }
84 | P a g e
int readdata()
{ // functa de citire a datelor initiale }
int printv()
{ // functia de tipar a rezultatelor}
int makeedgelist()
{ // functia pentru crearea listei de muchii }
int main(int argc, char *argv[])
{ int j,i,r;
readdata();
makeedgelist();
sort();
for (i=1;i<=n;i++) c[i]=i; // initializare componente conexe
i=0;
while(k<n-1)
{ i++;
if (c[v[i].vi] != c[v[i].vj])
// verificare posibilitate adaugare muchie
{k++; arb[k]=v[i];
for(j=1;j<=n;j++)
if (c[j] == c[v[i].vj] ) c[j]=c[v[i].vi];
}
}
printv(); // afisare rezultate
return 0;
}
Algoritmul Prim
Spre deosebire de algoritmul Kruskal algoritmul Prim genereaz
arborele parial de cost minim prin extinderea unui singur subgraf Ts ,
care iniial este format dintr-un vrf. Subarborele Ts se extinde prin
adugarea consecutiv a muchiilor (vi , v j ) , astfel nct vi Ts , v j Ts ) ,
iar ponderea muchiei adugate s fie minim posibil. Procesul continu
pn la obinerea unui numr de n 1 muchii n Ts .
85 | P a g e
Pseudocod
Pas 1.
Se construiete G* (V , T ) , T .
Pas 2.
Pas 3.
consider nefolosite.
k 0
Pas 4.
Ct timp k V 1 :
a)
b)
i 1
Dac muchia mi (v, v) este nefolosit i
Implementare
Input: Graful G : matricea de adiacen a; lista de muchii v; arborele
parial de cost minim arb, tabloul c de stare a nodurilor (se folosete
pentru a modela starea muchiilor).
Output: Un arbore parial de cost minim a G , n tabloul arb.
int sort ()
{ // functia de sortare a listei de muchii }
int readdata()
{ // functa de citire a datelor initiale }
int printv()
{ // functia de tipar a reyultatelor}
int makeedgelist()
{ // functia pentru crearea listei de muchii }
int main(int argc, char *argv[])
86 | P a g e
{ int j,i;
readdata();
makeedgelist();
sort();
for (i=1;i<=n;i++) c[i]=0;
c[v[1].vi]=c[v[1].vj]=1; k=1;
arb[1]=v[1];
while(k<n-1) // cat arboreal nu e construit
{ i=1;
while (c[v[i].vi]+ c[v[i].vj] != 1 ) i++;
// se gaseste cea mai scurta muchie care poate fi adaugata
k++; arb[k]=v[i]; // se adauga muchia
c[v[i].vj]=c[v[i].vi]=1; // se modifica starea nodurilor
muchiei adaugate
}
printv();
return 0;
}
87 | P a g e
Exerciii
Des. 8.3
V 20
V 20 . (folosii algoritmul
Kruskal).
4. Elaborai un program pentru determinarea arborelui parial de
cost minim a unui graf G (V , E ),
V 20 . (folosii algoritmul
Prim).
5. Estimai complexitatea temporal a algoritmului Kruskal.
6. Estimai complexitatea temporal a algoritmului Prim.
7. Estimai complexitatea temporal a algoritmului de generare a
tuturor carcaselor unui graf G (V , E ) .
88 | P a g e
Capitolul 9. Cicluri
n acest capitol:
v(G) m n p m (G) se
numete
numrul
De remarcat c ciclul Ci se
Cicluri independente dac conin cel puin cte o muchie, care aparine
doar unuia din ele
89 | P a g e
8
a
b
c
Desenul 9.1 Graful G (a), un arbore parial T (b), ciclurile fundamentale (c)
Pentru
graful
G : n 6, m 9, p 1 .
Numrul
ciclomatic
modific
90 | P a g e
9.2 Tieturi
Def.
V0
se
numete
C (V0 ) v, v :" v V0 , v V 0
tietur
C V0
grafului
a
Des. 9.3 . Tieturi n graf.
91 | P a g e
Def.
C (V0 ) u, v : u V0 , v V 0
u, v : u V , v V
0
Cicluri Euler
Def.
93 | P a g e
Des. 9.5 Graf fr ciclu i lan eulerian (a), cu ciclu eulerian (b), cu lan eulerian (c).
(ii)
L
Pas 1. Este selectat un vrf arbitrar v0 . L v0 . vrful curent v v0 .
Pas 0.
95 | P a g e
d[x].st=2;
k=1; while (d[k].st !=1) k++;
x=k;
} while (x!=t);
l=1; k=1;
s[l]=lant[k]=t;
while (x !=s1)
{
x=d[x].sursa;
l++; k++;
s[l]=lant[k]=x;
}
return 1;
}
int grad(int x)
// subprogram pentru determinarea gradului vrfului n graf
{ int s=0,i;
for (i=1;i<=n; i++)
if (transa[x][i]!=0) s++;
return s;
}
int exclude_cic()
// subprogram pentru excluderea ciclului curent din graf
{ int i;
transa[s[1]][s[l]]=transa[s[l]][s[1]]=0;
for (i=1;i<l;i++)
transa[s[i]][s[i+1]]= transa[s[i+1]][s[i]]=0;
return 1;
}
int exist()
// verificare a existenei vrfurilor pentru adugare
{ int i;
for (i=1;i<=n;i++) if (grad(i)>0) return i;
return 0;
}
int insert(int x) // subprogram pentru inserarea ciclului
curent n lan
{ int i,j, news[???];
for (i=1;i<=x; i++) news[i]=s[i]; i--;
for (j=1;j<=k; j++) news[i+j]=lant[j];j--;
for (i=x+1;i<=l;i++) news[i+j]=s[i];
97 | P a g e
l+=k;
for (i=1;i<=l;i++) s[i]=news[i];
return 1;
}
int primul()
// determinarea primului vrf de cretere a lanului
{ int i;
for (i=1;i<=l;i++)
if (grad(s[i])>0) {pr=i; return s[i];}
return 0;
}
int ciclu () // determinarea ciclului de cretere a lanului
{ int i, x;
s1=primul();
for (i=1;i<=n;i++) if (transa[s1][i] > 0) {t=i; break;}
for (i=1;i<=n;i++) d[i].st=0;
d[s1].st=1; x=s1;
transa[s1][t]=transa[t][s1]=0;
do
{ for(i=1;i<=n;i++)
if(transa[x][i] !=0 && d[i].st==0)
{
d[i].st=1; d[i].sursa=x;}
d[x].st=2;
k=1; while (d[k].st !=1) k++;
x=k;
} while (x!=t);
k=1; lant[k]=t;
while (x !=s1)
{
x=d[x].sursa;
k++; lant[k]=x;
}
return 1;
}
int main()
{ readdata();
if (verif()==0) {printf ("/n Graful nu este eulerian /n ");
return 0;}
lan();
do {
exclude_cic();
if (exist()!=0)
98 | P a g e
ciclu();
insert(pr);
print(l);
}
} while (exist()>0);
return 0;
}
Des. 9.6 Ilustrarea rezultatelor generate de program. Lanul iniial 6-3 (a). Cicluri
de cretere 6-4-3-5-6 (b), 6-7-8-6 (c), 7-1-4-7 (d), 1-2-3-1 (e).
99 | P a g e
Exerciii
1. Elaborai un program pentru determinarea mulimii
fundamentale de cicluri n baza unei tuturor carcase a unui graf
G (V , E ),
V 20
V 20
100 | P a g e
V 20
101 | P a g e
i, j
n
2
Teorema Ore
Fie G (V , E ) un graf neorientat cu n 2 vrfuri. Dac suma gradelor
oricror
dou
vrfuri
neadiacente
din
graf
Teorema Bondy-Chvtal
Notaii: Fie G (V , E ) un graf neorientat cu n vrfuri. Se numete
nchidere a grafului G graful G , obinut prin adugarea a cte o
muchie u, v pentru fiecare pereche de vrfuri u, v neadiacente n G ,
cu proprietatea c d (u) d (v) n . nchiderea grafului G se noteaz i
cl (G) .
102 | P a g e
Teorema
Fie G (V , E ) un graf neorientat. G este hamiltonian dac i
numai dac cl (G) este un graf hamiltonian
Pseudocod (Roberts-Flores)
Pas 1. Se formeaz tabloul M [mi , j ] de dimensiuni
k n ,
n care
vi
v vi .
v j i v v j
Implementare (recursiv)
Urmtorul
program
permite
determinarea
lanurilor
hamiltoniene. Matricea de adiacen este stocat n tabloul a, soluiile
se formeaz n tabloul s. Programul permite urmrirea dinamicii
construciei lanurilor hamiltoniene. Tehnica de implementare
reluare.
#include <conio.h>
#include <stdio.h>
int a[30][30], m[30][30], s[30], n,i,j,k,ne;
FILE *f;
int readdata()
{ int i,j;
f=fopen("dataham.in", "r");
fscanf(f, "%d", &n);
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
fscanf(f, "%d", &a[i][j] );
fclose(f);
return 0;
}
int make_m()
{ int i,j,k;
for (i=1;i<=n;i++)
{ k=0;
for (j=1;j<=n;j++)
if ( a[i][j] != 0)
104 | P a g e
{ k++;
m[k][i]=j;
}
}
}
int print_s(int q)
{ int i;
printf("\n");
for (i=1; i<=q; i++) printf("%d ", s[i]);
getch();
return 0;
}
int exist (int a,int pos)
{ int i,k=0;
for (i=1;i<=pos;i++)
if (s[i] == a) k=1;
return k;
}
int hamilton(int element, int index)
{ int i,j;
if (exist (element, index-1)) return 0;
s[index]=element;
if (index==n) { printf("\n solutie "); print_s(index);
index--; return 0;}
else { index++;
j=1;
do
{ hamilton(m[j][element], index); j++; }
while (m[j][element] !=0);
index--;
}
return 0;
}
int main()
{ readdata();
make_m();
hamilton(1,1);
return 0;
}
105 | P a g e
Exemplu
astfel nct
C [ci, j ] unde
cj ,1 c j ,1 w
c1, j c1, j w
v v1 , v2
c2, j c2, j w j
cj ,2 c j ,2 w
ci, j ci , j 2w vi , v j v1 , v2
ci, j ci , j
vi , v j v1 , v2
p(k )
107 | P a g e
recalculeaz
matricea
costurilor
conform
formulei:
108 | P a g e
Exerciii
1. Elaborai un program pentru determinarea ciclului hamiltonian
(sau a lipsei acestuia) ntr-un graf G (V , E ),
V 20
K N , N 20 . (folosii tehnica
relurii)
3. Elaborai un program pentru rezolvarea problemei comisului
voiajor pe un graf complet K N ,
N 20 . (folosii algoritmul de
aplicare a amenzilor)
109 | P a g e
11.1 Preliminarii
Problema fluxului maxim, la fel
ca multe alte probleme formulate pe
grafuri, i are rdcinile n economia
modern, mai exact n optimizarea
economic. Mai recente sunt aplicaiile
n domeniul reelelor i fluxurilor
informaionale. Dac este cercetat o
Des. 11.1.
reea de transportare a unui material Reea de transport cu sursa n vrful
din un punct n care acesta este produs 1 i stocul n vrful 10.
(surs) ntr-un punct de depozitare sau
prelucrare (stoc) prin canale de transport cu anumite capaciti,
inevitabil apare problema determinrii capacitii de transportare a
materialului de la surs ctre stoc pentru toat reeaua. Materialul i
canalele de transport pot avea cea mai divers natur: produse
petroliere i conducte; piese i transportoare; pachete de date i canale
informaionale, etc.
Pe grafuri problema se formuleaz astfel: Este dat un graf
orientat G (V , E ) , cu ponderi anexate arcelor: pentru arcul (i, j )
ponderea este ci , j . Pentru dou vrfuri date s, t V se cere s se
110 | P a g e
11.2.Algoritm
Descriere general
Algoritmul se bazeaz pe determinarea iterativ a unor drumuri
de cretere a fluxului i acumularea acestora ntr-un flux total, pn la
apariia n reea a unei tieturi9, care separ sursa de stoc.
Se cerceteaz graful G (V , E ) cu capacitile arcurilor
ci , j ,
w vi s
ei , j ek ,i w vi t
v j ( vi )
vk 1 ( vi )
0 v s , t
i
Cu alte cuvinte: sursa s produce un flux de mrime w. Pentru
orice vrf intermediar fluxul de intrare este egal cu fluxul de ieire. n
stocul t intr un flux de mrime w.
Problema fluxului maxim se reduce la determinarea unui w:
v j ( s )
ei , s
ek ,t max
vk ( t )
Tietur n graf un set de muchii (arcuri), lichidarea crora divide graful n dou
componente conexe.
111 | P a g e
9
V0 i sfritul n V0 , sau w V0 V0
Tietura
minim
(Vm Vm )
ci , j .
este
tietura
vi ,v j V0 V0
pentru
care
w Vm Vm min
c
i, j
V0 V0 vi ,v j V0 V0
Notaii:
Pentru implementarea algoritmului vor fi folosite att marcaje
pentru arcuri ct i marcaje pentru vrfurile grafului. Marcajul unui
vrf v este format din trei componente: precedent, flux, stare, care au
semnificaia:
precedent vrful care l precede pe v n drumul de cretere
curent
flux mrimea fluxului, care ajunge n vrful v pe drumul de
cretere curent
stare starea curent a vrfului v (vrful poate fi n una din trei
stri: necercetat [marcaj nul, valoarea - 0], atins[vecin al unui vrf
cercetat, valoarea - 1], cercetat[toi vecinii atini, valoarea - 2]).
Vecinii vrfului x
( x) : V V : z V , ( x, z ) E (mulimea vrfurilor
n care se poate ajunge direct din vrful x).
( x) : V V : z V , ( z, x) E (mulimea
vrfurilor
Pseudocod
Pas 0
Pas 1
112 | P a g e
Pas 2
Iniializarea sursei s.
Marcajul sursei s : (+s, +, 1)10 Se consider vi s .
Pas 3
vi , ,1 , unde
min(vi , e j ,i ) .
ez ,v ez ,v c ,
altfel, dac vrful v are marcajul de tip z, ,* valoarea
fluxului de-a lungul arcului (v, z) este micorat cu c :
ev, z ev, z c ;
c.
Exemplu
Graful 11.1. Sursa - vrful 1, stocul vrful 10.
ITERAIA 1
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
1
2
3
4
5
7
:
:
:
:
:
:
2-(1,30,1); 3-(1,30,1);
5-(2,30,1);
4-(3,10,1); 9(3,10,1)
7-(4,10,1);
8-(5,25,1);
10 -(7,10,1);
nod
precedent
1
1
2
1
3
1
4
3
5
2
flux
stare
30 30 10 30
2 2 2 2 2
6
0
7
4
8
5
1-(1,,2 )
2-(1,30,2)
3-(1,30,2)
4-(3,10,2)
5-(2,30,2)
7-(4,10,2)
9
3
10
7
0 10 25 10
0 2 1 1
10
1
ITERAIA 2
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
1
2
3
5
4
7
:
:
:
:
:
:
2-(1,30,1); 3-(1,20,1);
5-(2,30,1);
9(3,10,1)
4-(5,10,1); 8-(5,25,1);
7-(4,8,1);
10 -(7,8,1);
2
1
3
1
4
5
8
5
1-(1,,2 )
2-(1,30,2)
3-(1,20,2)
5-(2,30,2)
4-(5,10,2)
7-(4,8,2)
nod
precedent
1
1
5
2
6
0
7
4
9
3
10
7
flux
stare
30 20 10 30
2 2 2 2 2
0
0
8 25 10
2 1 1
8
1
ITERAIA 3
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
1
2
3
5
4
8
:
:
:
:
:
:
2-(1,22,1); 3-(1,20,1);
5-(2,22,1);
9(3,10,1)
4-(5,2,1); 8-(5,22,1);
6-(8,5,1);10 -(8,22,1);
nod
precedent
1
1
flux
stare
22 20
2 2 2
114 | P a g e
1-(1,,2 )
2-(1,22,2)
3-(1,20,2)
5-(2,22,2)
4-(5,2,2)
8-(5,22,2)
2
1
3
1
4
5
5
2
6
8
7
0
8
5
9
3
10
8
2 22
2 2
5
1
0 22 10
0 2 1
22
1
ITERAIA 4
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
(9,5,2)
cercetare
(4,5,2)
cercetare
4,5,2)
cercetare
(9,10,2)
1 : 3-(1,20,1);
1-(1,,2 )
3 : 9(3,10,1)
3-(1,20,2)
9 : 4-(9,5,1); 7-(9,10,1);
9-(3,10,2)
4
: 2-(4,5,1); 5-(-4,5,1)
42
2-
: 8-(5,3,1)
5-(-
: 10-(7,7,1)
7-
nod
precedent
1
1
2
4
3
1
flux
stare
5 20
2 2
4 5
9 -4
6
0
5
2
0 10
0 2
5
2
7
9
8
5
9
3
10
7
3 10
1 2
7
1
ITERAIA 5
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
1
3
9
4
2
5
7
8
:
:
:
:
:
:
:
:
3-(1,13,1);
9(3,3,1)
4-(9,3,1); 7-(9,3,1);
2-(4,3,1); 5-(-4,3,1)
8-(5,3,1)
10-(8,3,1)
nod
precedent
1
1
2
4
3
1
flux
stare
3 13
2 2
1-(1,,2 )
3-(1,13,2)
9-(3,3,2)
4-(9,3,2)
2-(4,3,2)
5-(-4,3,2)
7-(9,3,2)
8-(5,3,2)
4 5
9 -4
6
8
7
9
8
5
9
3
10
8
3
2
3
1
3
2
3
2
3
2
3
1
3
2
115 | P a g e
Implementare algoritm
Urmtorul
fragment
de
cod
realizeaz
o
variant
demonstraional a algoritmului pentru determinarea fluxului maxim
n reea. Reeaua din N vrfuri este descris prin matricea de adiacen
A[NN], marcajele arcurilor (fluxul generat) se pstreaz n tabloul
E[NN], marcajele vrfurilor n tabloul VERT[N].
#include <conio.h>
#include <stdio.h>
int a[30][30], e[30][30],i,j,n,s,t, delta, big=0;
struct vertex{int flux; int sursa; int stare;} vert[30];
FILE *f;
int readdata()
{ int i,j;
f=fopen("flux.in", "r");
fscanf(f, "%d", &n);
fscanf(f, "%d %d", &s, &t);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{fscanf(f, "%d", &a[i][j]); big+=a[i][j];}
fclose(f);
return 0;
}
int init_vert()
{ int i;
for (i=1;i<=n;i++)
{vert[i].flux=big; vert[i].sursa=vert[i].stare=0;}
vert[s].stare=1; vert[s].sursa=+s;
return 0;
}
int activ()
{
int i;
for (i=1;i<=n;i++)
if (vert[i].stare ==1) return i;
return 0;
}
116 | P a g e
int fluxtotal()
{ int i,ft=0;
for (i=1;i<=n;i++) ft+=e[s][i];
return ft;
}
int abs(int x)
{ if (x<0) return x*-1; else return x;
}
int flux()
{ int x,i,d,q;
// miscarea inainte, constructie lant
do
{ x=activ();
//dupa G+
for (i=1;i<=n;i++)
if (vert[i].stare==0 && a[x][i]>0 && e[x][i]<a[x][i])
{ d=a[x][i]-e[x][i];
if ( d<vert[x].flux) vert[i].flux=d;
else vert[i].flux=vert[x].flux;
vert[i].stare=1; vert[i].sursa=+x;
};
// dupa Gfor (i=1;i<=n;i++)
if (vert[i].stare==0 && e[i][x]>0)
{ d=e[i][x];
if (d<vert[x].flux) vert[i].flux=d;
else vert[i].flux=vert[x].flux;
vert[i].stare=1; vert[i].sursa=-x;
}
vert[x].stare=2;
}
while (vert[t].stare !=1 && activ() !=0 );
// miscarea inapoi, extinderea fluxului
delta=0;
if (vert[t].stare==1 )
{ x=t;
delta=vert[t].flux;
do
{ q=abs(vert[x].sursa);
if (vert[x].sursa>0) e[q][x]=e[q][x]+delta;
if (vert[x].sursa<0) e[x][q]=e[x][q]-delta;
x=q;
117 | P a g e
}
while (x!=s);
}
int main()
{ readdata();
do
{ init_vert();
flux();
} while (delta !=0);
printf("\n%d", fluxtotal());
return 0;
}
stocuri
c( s, si ) c si , v j
k
j 1
c(ti , t ) c v j , ti
r
j 1
c s, si c( si , v j ) se
j 1
c(ti , t ) c v j , ti se
r
j 1
G (V , E )
V V V , V V i
bipartit:
e (u, v) E u V , v V sau v V , u V , neorientat, neponderat.
Fie
Transformare graf
Pas 1. Se adaug dou vrfuri s, t iniial izolate. V V
s, t .
Rezultat:
Arcele
de
forma
e (u, v) E
u V , v V
sau
119 | P a g e
graful
ci , j (i 1,..., n; j 1,..., n)
G (V , E )
i
capacitile
cu
ponderile
vrfurilor
arcelor
z j ( j 1,..., n)
e
i 1
i, j
zj
( j 1,..., n)
, v j
Arcele
v , v
i
v , v din
i
120 | P a g e
originea n vrful v j :
v , v
j
trec n
v , v . Exemplu transformare,
desenul 11.4:
121 | P a g e
Exerciii
1. Elaborai un program pentru separarea mulimii de vrfuri a
unei reele de transport n dou componente distincte: mulimea
de surse i mulimea de stocuri.
2. Elaborai un program pentru determinarea fluxului maxim pe
grafuri cu surse i destinaii multiple.
3. Elaborai un program pentru transformarea grafului cu restricii
aplicate pe vrfuri ntr-un graf cu restricii aplicate pe muchii.
4. Elaborai un program pentru determinarea fluxului maxim pe
grafuri cu restricii aplicate pe vrfuri.
122 | P a g e
12.1 Cuplaje
ntr-un graf neorientat G (V , E ) mulimea de muchii M se
numete cuplaj dac oricare dou muchii din M nu an vrfuri comune.
Cuplajul M se numete maxim, dac e E M , n mulimea
e : e e v* ; v* V . La fel ca i mulimile
Des. 12.1 Cuplaje maxime n graful (a). Cuplaj maxim pe patru muchii (1,4) (2,3)
(5,8) (6,7) (b); cuplaj maxim pe trei muchii (1,5) (2,3) (6,8) (c)
GA (VA , EA ) ,
VA e1 ,..., eM
unde
iar
EA ei , e j : u V , u ei & u e j .
Exemplu: fie graful G (V , E ) din figura 12.2.a. Fiecare muchie din se
transform ntr-un vrf al grafului GA (VA , EA ) din desenul 12.2.b
a
Des. 12.2 Graful iniial (a) i asociat (b).
124 | P a g e
e , e din
i
Fie
M A e1A ,...eAk
mulime
maxim
independent
e* este o mulime
125 | P a g e
Algoritm:
Pas 1. Se creeaz lista muchiilor din G (V , E ) . L e1 ,...em .
Pas 2. Se creeaz tabloul bidimensional E matricea de adiacen a
grafului GA .
Pas 3. Pentru toi i de la 1 la m-1.
Pentru toi j de la i+1 la m
Dac n G (V , E ) ei
e j ; ei , e j E ,
Implementare
Intrare: graful G (V , E ) , descris n tabloul bidimensional a.
Ieire: matricea de adiacen a grafului GA (VA , EA ) . Matricea de
adiacen este localizat n tabloul bidimensional b.
int asociat ()
{ int i,j;
// modelare lista muchii
for (i=1;i<=n;i++)
for (j=1+i; j<=n; j++)
if (a[i][j]!=0 ){m++; list[m].v1=i;list[m].v2=j;}
// modelare matrice adiacenta
for (i=1;i<=m;i++)
for (j=1+i; j<=m; j++)
if (list[i].v1==list[j].v1 ||
list[i].v1==list[j].v2 || list[i].v2==list[j].v1
|| list[i].v2==list[j].v2 ) b[i][j]=b[j][i]=1;
}
126 | P a g e
corespunztoare din G (V , E ) .
Exemplu: prototip program pentru generarea tuturor cuplajelor
maxime
Intrare: graful G (V , E ) .
Ieire: toate cuplajele maxime ale grafului G (V , E ) .
#include <conio.h>
#include <stdio.h>
struct edge{int v1; int v2;} list[400];
int a[20][20],b[400][400], q[20], s[20], m=0,i,j,n,k;
FILE *f;
int asociat ()
{ int i,j;
for (i=1;i<=n;i++)
for (j=1+i; j<=n; j++)
if (a[i][j]!=0 ){m++; list[m].v1=i;list[m].v2=j;}
for (i=1;i<=m;i++)
for (j=1+i; j<=m; j++)
if (list[i].v1==list[j].v1 || list[i].v1==list[j].v2
|| list[i].v2==list[j].v1 || list[i].v2==list[j].v2
) b[i][j]=b[j][i]=1;
}
int fillc(int *x, int z, int num)
{ int i;
for (i=1;i<=num;i++) x[i]=z;
return 0;
}
int print()
{ int i;
printf("\n");
127 | P a g e
for (i=1;i<=m;i++)
if (s[i]==1) printf("(%d %d)", list[i].v1, list[i].v2);
printf("\n");
}
int mind(int *s, int *q)
{ int i,j,k=0,r, rest[20];
for (i=1;i<=m;i++) if(q[i]!=0) k=1;
if (k==0) {print();}
else { j=m;
while (s[j]==0 && j>=1) j--;
r=j+1;
for (i=r;i<=m;i++)
if (q[i]==1){ fillc(rest,0,m);
s[i]=1; q[i]=0;
for (j=1;j<=m;j++)
if (b[i][j] != 0 && q[j]==1)
{q[j]=0; rest[j]=1;}
mind (s,q);
s[i]=0;q[i]=1;
for (j=1;j<=m;j++)
if(rest[j]==1) q[j]=1;
}
}
return 0;
}
int main()
{
f=fopen("data.in", "r");
fscanf(f, "%d", &n);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
fscanf(f,
&a[i][j]);
fclose(f);
asociat();
fillc(s,0,m);
fillc(q,1,m);
mind(s,q);
return 0;
}
Rezultate:
128 | P a g e
"%d",
Exerciii
Des. 12.3
129 | P a g e
Bibliografie
1. Sedgewick Th, Algorithms in C, 2001, Addison Wesley
2. Gibbons Alan, Algorithmic ghaph theory, 1999, Addison Wesley
3. ., , 1988, ,
4. .., ,
2001, ,
5. ., ,1981,
,
6. ., . , 1978,
,
7. Cormen Th., Leiserson Ch., Rivest R., Introducere n algoritmi.
Agora, Cluj, 2001.
8. Cristian A.Giumale, Introducere n analiza algoritmilor. Teorie i
aplicaie. Polirom, Iai, 2004
9. Ptru Bogdan. Programarea calculatoarelor. Teora, Bucureti,
1998.
10. Cerchez Em., erban M. Programarea n limbajul C/C++ pentru
liceu. Vol III. Teoria Grafurilor. Polirom, Iai, 2006.
11. ., ., .
. , , 1985
130 | P a g e
Abrevieri i notaii
A B
- din A rezult B.
A B
- A este echivalent cu B
x X, x X
- x aparine X (x nu aparine X)
x X : Q
A B
( X )
- cardinalul mulimii X
a1 ,..., an
( a , b)
- pereche ordonat
A B
a b
- valoarea elementului
- valorile elementelor
a i b sunt interschimbate
(a b) (b a)
131 | P a g e
132 | P a g e