Anda di halaman 1dari 116

Theory without practice is useless; practice without theory is blind

Roger Bacon
Aceast lucrare cuprinde o selecie de probleme importante care pot fi
rezolvate cu ajutorul teoriei grafurilor. n acest scop am enunat probleme
teoretice mpreun cu aplicaii practice ale acestora, urmate de descrieri ale
unor metode de rezolvare.
Primul capitol ncepe cu o introducere n analiza algoritmilor, urmat de
prezentarea unor noiuni de baz din teoria grafurilor. Capitolul continu cu
tehnici de reprezentare a grafurilor, i se ncheie cu un algoritm de conversie
ntre tehnicile de reprezentare descrise. Se insist asupra acelor tehnici care
conduc la algoritmi eficieni din punctul de vedere al complexitii.
Urmtoarele capitole prezint probleme clasice din acest domeniu:
parcurgerea unui graf n lime i adncime, drumuri minime i maxime,
determinarea unui arbore parial de cost minim. Pentru fiecare problem snt
descrii algoritmi eficieni de rezolvare i aplicaii ale acestora.
Alte probleme tratate n cadrul acestei lucrri: reele de transport i
grafuri planare. Ultimul capitol este rezervat problemelor NP-complete, un
subiect foarte fierbinte la ora actual n informatica teoretic.
n ceea ce privete algoritmii descrii, nu am urmrit perfeciunea din
punctul de vedere al complexitii. Atunci cnd am avut de ales ntre un
algoritm excesiv de eficient i un altul avnd o complexitate acceptabil, am
preferat un algoritm care are o descriere simpl i uor de urmrit. n unele
cazuri am prezentat mai multe soluii, urmnd ca informaticianul s decid
ce algoritm alege n funcie de problema concret, volumul datelor de
intrare, simplitatea implementrii etc.
Pentru unele probleme enunate am detaliat algoritmi de rezolvare,
descrii astfel nct implementarea s fie imediat. Pentru alte probleme am
sugerat doar ideea de baz, rmnnd ca informaticianul s elaboreze un
algoritm de rezolvare a acestora.
Manualul prezint n anexa de la sfrit i alte tehnici de reprezentare a
grafurilor, precum i algoritmi simpli pentru rezolvarea unor probleme
bazai pe aceste tehnici de reprezentare. Am preferat s includ aceste
subiecte ntr-o anex, deoarece scopul acestui manual este de a prezenta cele
mai eficiente soluii pentru rezolvarea diverselor probleme care se bazeaz
pe teoria grafurilor.
Manualul poate fi folosit cu succes de elevii i studenii care se
pregtesc pentru concursuri de informatic, dar i de informaticienii care
trebuie s proiecteze aplicaii eficiente bazate pe teoria grafurilor.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

1. Preliminarii
1.1. Algoritmi
Toi algoritmii descrii n cadrul acestei lucrri folosesc structuri
de date de tip graf. Unele descrieri snt nsoite de o analiz a
complexitii algoritmului respectiv. Pentru ca analiza s poat fi
urmrit mai uor de cititor, n cadrul acestei seciuni snt prezentate
noiuni de baz.
Definiia 1.1. Un algoritm este un set de instruciuni care trebuie
executate pentru a se obine un rspuns la o problem dat.
Un algoritm are urmtoarele proprieti (Knuth) (Burdescu, p 10):
finitudine: trebuie s se termine ntotdeauna dup un numr finit de
pai (instruciuni);
determinism: fiecare pas trebuie s fie exact precizat, n mod riguros
i neambiguu;
generalitate: trebuie s rezolve problema pentru orice date de intrare
din domeniul precizat;
efectivitate: fiecare instruciune trebuie s fie exact i de durat
finit.
Ultima proprietate trebuie nuanat, avnd n vedere faptul c
memoria oricrui calculator este limitat. Nu ntotdeauna operaiile
aritmetice se efectueaz exact, n unele cazuri obinndu-se o
aproximare a rezultatelor, cum snt de exemplu implementrile bazate
pe aritmetica n virgul mobil (Goldberg).
n cadrul acestei lucrri algoritmii snt descrii ntr-un limbaj de
tip Algol, un precursor al limbajului Pascal (cf Aho et al).
Avnd un algoritm care rezolv o problem dat, urmeaz s
determinm resursele acestuia. Concret, de ct memorie i timp avem
nevoie ca s obinem soluia problemei? n acest scop facem
urmtoarele simplificri: fiecare operaie elementar a algoritmului se
execut ntr-o unitate de timp, informaiile despre un obiect elementar
se memoreaz ntr-o locaie de memorie (Livovschi, Georgescu).
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Fie f:NN o funcie care indic relaia dintre numrul de


valori (date de intrare) prelucrate de un algoritm, i numrul de
operaii elementare efectuate de acesta pentru obinerea rezultatelor.
Funcia f poate avea o expresie analitic destul de complicat, de
aceea considerm nc o funcie g:NN cu o expresie analitic
simplificat.
Definiia 1.2. Funcia f are ordinul de mrime cel mult g(n),
notaie: fO(g(n)), dac i numai dac exist dou valori, c> 0 i
n0N astfel nct pentru orice n>n0 s avem f(n) cg(n).
O(g) = { h : N N | c> 0, n0N a. . n>n0, h(n) c
g(n)}.
Definiia 1.3. Funcia f are ordinul de mrime cel puin g(n),
notaie: f (g(n)), dac i numai dac exist dou valori, c> 0 i
n0N astfel nct pentru orice n>n0 s avem f(n) cg(n).
(g) = { h : N N | c> 0, n0N a. . n>n0, h(n) c
g(n)}.
Definiia 1.4. Funcia f are ordinul de mrime g(n), notaie: f
(g(n)), dac i numai dac exist trei valori, c1,c2> 0 i n0N
astfel nct pentru orice n>n0 s avem c1 g(n) f(n) c2g(n).
(g) = { h : N N | c1,c2> 0, n0N a. . n>n0,
c1 g(n) h(n) c2g(n)}.
Prezentm dou rezultate remarcabile care vor fi folosite pe
parcursul lucrrii (Knuth):
(1) Se d un ir de n valori dintr-un domeniu pe care este definit
o relaie de ordine total. Cel mai eficient algoritm de ordonare a
irului dat, care se bazeaz pe comparaii, are complexitate de ordin
(n log n).
(2) Se d un ir de n valori ordonate. Cutarea unei valori
(localizarea poziiei acesteia sau obinerea unui rspuns negativ) n
irul dat necesit un timp de ordin O(log n).
O categorie special de probleme, numite NP-complete, se
caracterizeaz prin urmtoarele:
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

nu se cunosc algoritmi eficieni (de complexitate polinomial), se


cunosc n schimb algoritmi de complexitate exponenial pentru
rezolvarea acestora;
o problem NP-complet este polinomial transformabil ntr-o alt
problem tot NP-complet: dac se rezolv o problem A, soluia unei
alte probleme B se poate obine printr-o transformare n timp
polinomial din soluia problemei A.
Cea mai general problem NP-complet este problema
satisfiabilitii: fiind dat o expresie logic n forma normal
conjunctiv cu n variabile, s se determine dac pot fi atribuite valori
logice variabilelor astfel nct expresia s fie adevrat (Cook).
Complexitatea medie. Considerm un algoritm care proceseaz
n valori date la intrare. Pentru o anumit configuraie a valorilor,
probabilitatea configuraiei fiind pi, snt necesare fi(n) operaii.
Complexitatea medie a algoritmului este o sum ponderat:

p
i

f i (n) .

Exemplu. Algoritmul Quick-sort necesit un timp de ordin


O(nlogn) n majoritatea cazurilor pentru a ordona un ir de n valori.
Exist ns cteva configuraii (foarte puine) care au nevoie de un
timp de ordin O(n2) pentru a fi procesate. Complexitatea medie a
acestui algoritm este de ordin O(nlogn) (Knuth).
ntr-un mod similar se poate defini noiunea de complexitate
pentru necesarul de memorie. Aceasta arat ct memorie este
necesar pentru rezultatele intermediare i cele de ieire.
Definiiile date mai sus asigur o estimare a eficienei unui
algoritm independent de o implementare practic a acestuia,
implementare bazat pe un limbaj concret de programare, urmrinduse ascunderea factorului multiplicativ. Totui acest factor nu poate
fi ntotdeauna ignorat, deoarece exist probleme care admit mai muli
algoritmi cu acelai ordin de complexitate. n asemenea situaii se
poate determina, pe baza unor experimente, care este algoritmul cel
mai eficient din punct de vedere practic. Pot fiu luate n considerare
mai multe criterii: timpul mediu de rspuns cel mai bun, simplitatea
implementrii etc.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Se apreciaz c un algoritm este eficient dac are complexitate de


ordin cel mult O(nlogn). Dac volumul datelor de intrare este mic
(pn la ordinul miilor) se poate accepta i un algoritm de ordin O(n2).

1.2. Grafuri: noiuni de baz


Grafuri orientate
Definiia 1.5. Un graf orientat este un cuplu G= (X,U), unde X
este o mulime finit i nevid de elemente numite vrfuri, i U
X X este o mulime de elemente numite arce.
n continuare vom nota |X|= n, |U|= m; aceste notaii vor fi
folosite pe parcursul ntregii lucrri, i au fost preluate din literatura
francez (Berge) (Gondran, Minoux). Notaiile consacrate n literatura
anglo-saxon snt: V (vertices) i E (edges).
Fie un arc u=(x,y)U. Spunem c arcul u are sensul (sau
orientarea) de la x la y. Vrful x este extremitate iniial i
predecesorul lui y, i vrful y este extremitate final i succesorul lui
x. Deci n precizarea unui arc conteaz ordinea vrfurilor.
Fie un arc u=(x,y)U. Dac exist i arcul u=(y,x)U atunci
fiecare arc este inversul celuilalt.
Dou vrfuri snt adiacente dac ntre ele exist un arc. Dou arce
distincte snt adiacente dac au o extremitate comun.
Definiia 1.6. Un graf orientat este un cuplu G= (X, ), unde X
este o mulime de elemente numite vrfuri, i este o aplicaie
multivoc :XX (adic o funcie definit pe X cu valori n
familia P(X) a prilor lui X).
(x) desemneaz lista succesorilor vrfului x. Dac xX atunci
y (x) precizeaz c de la vrful x la vrful y exist un arc i
spunem c y este succesor al lui x. Spunem c x este predecesor al lui

y i notm x 1(y). 1(x) desemneaz lista predecesorilor


vrfului x.

Fiind dat un graf G= (X, ), graful G= (X, 1) este graful


invers asociat grafului G. n literatura de specialitate acesta este numit
graful transpus, deoarece matricea de adiacen a acestui graf este
transpusa matricei grafului original.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

Definiia 1.7. Fie un graf G= (X, ) i xX un vrf. Notm cu


g+(x) numrul succesorilor si, adic | (x)|; acest numr se numete

semigradul exterior al lui x. Notm cu g (x) numrul predecesorilor

si, adic | 1(x)|; acest numr se numete semigradul interior al lui

x. Suma g(x)= g+(x)+g (x) se numete gradul lui x. Dac g(x)= 0


spunem c vrful x este izolat.
Cele dou definiii snt analoge:
(x)= {yX|(x,y)U};
(x,y)U dac i numai dac y
(x).
Grafuri particulare. Un graf orientat este simetric dac pentru
orice pereche de vrfuri x,yX avem: (x,y)U implic (y,x)U.
Un graf este bipartit dac exist o partiie X= X1 X2 astfel nct
pentru orice (x,y)U avem xX1 i yX2.
Un graf G= (A,V) este subgraf al grafului G=(X,U) dac
AX i V= (A A) U.
Un graf G= (X,V) este graf parial al grafului G= (X,U) dac
VU.
Un graf G= (A,V) este subgraf parial al grafului G= (X,U)
dac AX i V (A A) U.
S observm c un graf parial are aceeai mulime de vrfuri cu
graful iniial, i doar o parte din arcele acestuia. n schimb un subgraf
are doar o parte din vrfurile grafului iniial, i toate arcele acestuia
care au ambele extremiti n aceast submulime de vrfuri.
Definiia 1.8 (drumuri ntr-un graf). Fiind dat un graf orientat
G= (X,U), un drum n graful G este o succesiune de arce cu
proprietatea c extremitatea terminal a unui arc coincide cu
extremitatea iniial a arcului urmtor din drum. Un drum se poate
defini i prin succesiunea de vrfuri care snt extremiti ale arcelor ce
compun drumul: o succesiune de vrfuri cu proprietatea c orice dou
vrfuri consecutive snt unite printr-un arc.
Un drum ntr-un graf este:
simplu, dac nu folosete de dou ori un acelai arc;
compus, dac nu e simplu;
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

elementar, dac nu trece de dou ori prin acelai vrf;


eulerian, dac este simplu i folosete toate arcele grafului;
hamiltonian, dac este elementar i trece prin toate vrfurile
grafului;
circuit, dac extremitatea iniial a drumului coincide cu cea final.
Un lan este o succesiune de arce cu proprietatea c orice arc are
un vrf comun cu arcul precedent i cellalt vrf comun cu arcul
urmtor.
S observm c ntr-un drum toate arcele au aceeai orientare, de
la vrful iniial la vrful final. n schimb ntr-un lan fiecare arc poate
avea orice orientare.

Grafuri neorientate
Definiia 1.9. Un graf neorientat este un cuplu G=(X,U), unde
X este o mulime de elemente numite vrfuri, i U este o mulime de
perechi neordonate de vrfuri numite muchii. O muchie (x,y) nu are
orientare, astfel c (x,y)= (y,x).
O muchie este incident vrfurilor care snt extremiti ale sale.
Dou vrfuri snt adiacente dac ntre ele exist o muchie. Dou
muchii snt adiacente dac au o extremitate comun. Gradul unui vrf
x este numrul de muchii incidente cu acesta i se noteaz g(x).
Definiia 1.10. Un lan este o succesiune de muchii cu
proprietatea c orice muchie are un vrf comun cu muchia precedent
i cellalt vrf comun cu muchia succesoare.
n mod analog definim noiunea de ciclu corespunztoare noiunii
de circuit de la grafuri orientate.

Grafuri ponderate
Definiia 1.11. Un graf ponderat este un triplet G= (X,U,c),
unde X i U au semnificaiile cunoscute, i c:UR+ este o funcie
cost care asociaz fiecrui arc (fiecrei muchii) o valoare (pondere).
Un graf ponderat poate fi definit i cu ajutorul funciei .
Exemplu. Avem o hart rutier care conine urmtoarele
informaii: poziia fiecrei localiti, legturile directe dintre localiti
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

mpreun cu distana i timpul necesare parcurgerii fiecrei legturi.


Trebuie s determinm un drum de cost minim (criteriul fiind
distana sau timpul) dintre dou localiti. Graful asociat problemei se
obine lund ca vrfuri localitile, i nlocuind fiecare legtur cu
dou arce avnd acelai cost i orientri opuse dac legtura este n
ambele sensuri, sau cu un singur arc dac legtura este ntr-un singur
sens.

1.3. Tehnici de reprezentare


Reprezentare grafic
S considerm cteva puncte de interes ale unei localiti i
legturile directe dintre acestea. Punctele de interes snt reprezentate
prin vrfuri ale grafului, i legturile dintre acestea prin arce. Dac
toate legturile dintre dou puncte snt n ambele sensuri, atunci graful
este neorientat; n acest caz o muchie este reprezentat printr-o linie
dreapt. Dac exist cel puin o legtur ntr-un singur sens, atunci
graful este orientat; n acest caz este precizat orientarea arcului.

Figura 1.1. Un graf neorientat (a), un graf orientat (b).

Pentru graful orientat din figura 1.1 (b) avem:


X= {0,1,2,3,4}
U= {(0,1),(0,3),(1,2),(1,3),(2,4),(3,0),(3,2),(3,4),(4,2)}
Funcia este definit astfel:
(0)= {1,3}; (1)= {2,3}; (2)= {4};
(3)= {0,2,4}; (4)= {2}.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

10

Exemple de trasee pentru graful neorientat din figura 1.1 (a):

(x0,x1,x2,x4,x3,x0) ciclu hamiltonian;


(x1,x0,x3,x1,x2,x3,x4,x2) lan eulerian.
Exemple de trasee pentru graful orientat din figura 1.1 (b):

(x0,x1,x3,x2,x4) drum hamiltonian;


(x0,x1,x2,x3,x4) lan; nu este drum deoarece nu exist
arcul (x2,x3) ci numai arcul (x3,x2).
Reprezentare bazat pe lista arcelor
Se folosesc dou masive, ambele au un numr de elemente egal
cu numrul de arce, i pentru fiecare arc se memoreaz cele dou
extremiti. Exemplu:
Extr_ini
Extr_fin

0
1

0
3

1
2

1
3

2
4

3
0

3
2

3
4

4
2

Pentru un graf ponderat se folosete un al treilea masiv de


memorie, unde se memoreaz costurile arcelor.

Reprezentare bazat pe funcia (liste de succesori)


Se folosesc dou masive de memorie; primul masiv are n+1
elemente, i indic poziiile din cel de-al doilea masiv unde se gsesc
valorile funciei pentru fiecare vrf al grafului; al doilea masiv are
m elemente.
Graful orientat din figura 1.1 (b) se reprezint astfel (considerm
c indicii celor dou masive iau valori ncepnd cu 0):
(H) Poziii
0 2 4 5 8 9
(S) Valorile
1 3 2 3 4 0 2 4 2
funciei (0) (1) (2) (3) (4) (5) (6) (7) (8)
Primul masiv (H) are semnificaia de tabel hash pentru o cutare
rapid n cel de-al doilea masiv (S). Fiecare list de succesori (x) se
descrie pe poziiile de la H[x] pn la H[x+1]1. Pentru a uura
citirea corespondenei dintre cele dou masive am pus n eviden
indicii pentru masivul care reprezint valorile funciei .
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

11

Pentru un graf ponderat se folosete un al treilea masiv de


memorie, unde se memoreaz costurile arcelor.
Tehnica descris mai sus este cea mai compact i mai eficient
pentru majoritatea algoritmilor care se bazeaz pe parcurgerea unui
graf (Gondran, Minoux, p 8-9). n acelai timp aceasta poate fi
folosit numai pentru grafuri statice i numai dac se cunoate de la
nceput topologia acestuia. Pentru grafuri care se actualizeaz n mod
dinamic se recomand alte structuri de date adecvate acestui scop (de
exemplu liste nlnuite).
n ultima seciune a acestui capitol este descris un algoritm care
permite obinerea reprezentrii unui graf pe baza funciei .

Reprezentare implicit
Spre deosebire de reprezentrile descrise mai sus, care snt
explicite, n continuare vom vedea c legturile dintre vrfuri pot fi
deduse dintr-o hart descris ntr-un anumit mod.
Fie un labirint de form dreptunghiular, cu o hart cunoscut
avnd n linii i m coloane. n continuare prezentm dou posibile
reprezentri ale acestuia.
(1) Considerm mai nti un labirint n care pereii snt construii
din blocuri avnd forma unui ptrat de latur unitate. Descrierea este
foarte simpl, fiecare element aij avnd semnificaia:

aij =

1, p e r e t e

0, d r u dmea c c e s

Liniile snt numerotate de la 0 la n1 de sus n jos, i coloanele


snt numerotate de la 0 la m1 de la stnga la dreapta.
Direciile posibile de deplasare dintr-o camer de coordonate (x,y)
snt:
(x,y1) spre nord;
(x1,y) spre vest;
(x,y+1) spre sud;
(x+1,y) spre est.
Aceast reprezentare permite doar descrierea unui graf neorientat.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

12

(2) n al doilea caz labirintul este alctuit din camere, fiecare


camer putnd comunica sau nu cu oricare din camerele vecine.
Descrierea este mai complex, fiecare camer avnd asociat o valoare
aij care se reprezint pe 4 bii astfel:
bitul 0 are valoarea zero dac exist u spre est;
bitul 1 are valoarea zero dac exist u spre nord;
bitul 2 are valoarea zero dac exist u spre vest;
bitul 3 are valoarea zero dac exist u spre sud.
Liniile snt numerotate de la 0 la n1 de sus n jos, i coloanele
snt numerotate de la 0 la m1 de la stnga la dreapta.
O camer de ieire se afl pe frontiera labirintului i are o u care
permite ieirea n direcia respectiv.
Exemple:
(0,y,?0??), (x,0,??0?), (m1,y,???0), (x,n1,0???).
Am marcat cu ? biii a cror valoare nu intereseaz.
Spre deosebire de reprezentarea anterioar, aceasta permite
descrierea unui graf orientat, astfel c poate fi modelat cazul n care o
u se deschide ntr-un singur sens.
Reprezentrile implicite snt foarte folosite n prelucrarea
imaginilor reprezentate n format bitmap.

Convenii pentru reprezentare


Majoritatea algoritmilor descrii n cadrul acestei lucrri folosesc
reprezentarea bazat pe funcia . Un graf neorientat va fi
reprezentat ca un graf orientat simetric. ntr-o implementare concret,
reprezentarea bazat pe lista arcelor este necesar doar n faza de
creare a grafului.
Reprezentarea bazat pe lista arcelor este folosit de algoritmul
lui Kruskal, care are nevoie de lista arcelor, nu are importan
orientarea acestora. Algoritmii de tip Bellman pot folosi oricare din
cele dou tehnici de reprezentare.
Pentru o aplicaie eficient bazat pe grafuri recomandm
urmtoarea strategie. ntr-o faz anterioar lansrii aplicaiei graful se
construiete pe baza listei arcelor, dup care se memoreaz n fiier
reprezentarea bazat pe funcia . Toate informaiile se memoreaz
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

13

n format binar astfel: mai nti valorile n i m, lista H (n+1 valori),


lista (m valori), i dac este nevoie lista C.

1.4. Parcurgerea unui graf


S presupunem c este dat un graf G, orientat sau neorientat, i fie
dou vrfuri x i y n G; cum putem determina dac exist un drum
ntre x i y? n mod intuitiv, am dori s plecm din x, s examinm
toate vrfurile care pot fi atinse din x traversnd arcuri din G, i s ne
oprim atunci cnd depistm vrful y sau cnd examinm toate vrfurile
care ar putea fi atinse plecnd din x. Mai general, dorim s efectum o
operaie oarecare pentru fiecare vrf s o numim Visit. Acest proces
se numete parcurgere (vizitare) a grafului G plecnd din x (Larry,
Denenberg, p 432).

Figura 1.2. Dou tehnici de parcurgere plecnd din vrful x0:


n lime (breadth first search): x0 x1 x3 x2 x4 x5
n adncime (depth first search): x0 x1 x2 x4 x3 x5

Trebuie s remarcm faptul c o parcurgere ncepnd cu vrful x


viziteaz exact acele vrfuri y cu proprietatea c exist un drum n G
de la x la y. Tehnicile de parcurgere snt cel mai adesea folosite
tocmai pentru a vizita vrfurile ntr-o anumit ordine dat de legturile
dintre acestea.
Figura 1.2 prezint un exemplu de parcurgere a unui graf n lime
i n adncime. Aceste tehnici vor fi detaliate n capitolele urmtoare,
unde vor fi prezentate i aplicaii.
Pe parcursul lucrrii vom ntlni foarte frecvent secvene
asemntoare celei de mai jos:
for (each xX) do
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

14

for (each y (x)) do


Prelucrare-arc (x,y);
Aceast secven parcurge lista arcelor unui graf reprezentat pe
baza funciei (liste de succesori). S analizm complexitatea
acestei secvene, presupunnd c:
graful este reprezentat pe baza funciei ;
prelucrarea unui arc dureaz o unitate de timp O(1).
Pentru un anumit vrf x, n ciclul for interior se prelucreaz attea
arce ci succesori are vrful x, adic | (x)|. Considerm nc o
unitate de timp pentru trecerea de la un vrf x la urmtorul, la o iteraie
a ciclului for exterior. Dac x {0, 1, ..., n1} obinem:
1 + | (0)| + 1 + | (1)| + ... + 1 + | (n1)| = n + m
Aceast secven are complexitate de ordin O(n+m).
Nu am contorizat separat aciunea de trecere la urmtorul vrf din
lista de succesori a vrfului x, deoarece am considerat c aceasta este
inclus n lista de operaii elementare care efectueaz prelucrarea
arcului (x,y).
Am ignorat faptul c prelucrarea unui arc (ciclul for interior)
presupune n mod evident mai multe operaii elementare (aritmetice i
logice pe care le efectueaz procesorul), dect simpla aciune de
trecere la urmtorul vrf din mulimea X (ciclul for exterior). Conform
definiiei complexitii unui algoritm, constanta multiplicativ nu este
relevant. Desigur, aceast simplificare este destul de grosier, dar ea
se face din punct de vedere teoretic pentru a evalua marginea
superioar a complexitii unui algoritm studiat.

1.5. Obinerea listelor de succesori


Descriem n continuare un algoritm de conversie a listei de arce n
liste de succesori (funcia ). Acest algoritm poate fi folosit i
pentru a construi reprezentarea 1 a grafului invers asociat unui graf
dat.
Algoritm Conversie-Arce-Gamma;
Intrare. Lista U a arcelor unui graf: (xi, yi), i = 0, 1, ..., m1.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

15

Ieire. Listele de succesori, memorate n dou masive, H i S.


begin
Ordoneaz lista U a arcelor unui graf: (xi, yi), i = 0, 1, ..., m1;
Prin parcurgerea listei U se determin n, numrul de vrfuri;
for (k := 0, ..., n) do H[k] := 0;
k := 0; i := 0;
while (k < m) do begin
a := x[k];
repeat
i := i + 1;
until (i = m) or (x[i] > a);
H[a+1] := i; k := i;
end
for (k := 1, ..., n) do
if (H[k] = 0) then
H[k] := H[k1];
for (i := 0, 1, ..., m1) do S[i] := y[i];
end (algoritm).
Ideea algoritmului este urmtoarea. Dup ordonarea arcelor se
parcurge aceast list (while) cu scopul de a stabili repere pentru
poziiile pe care se vor memora succesorii fiecrui vrf. Concret,
pentru fiecare vrf a se completeaz H[a+1], care reprezint de fapt
prima poziie ocupat de un succesor al lui a+1.
Este posibil ca unele vrfuri s nu aib succesori, i de aceea
parcurgerea masivului H completeaz reperele i pentru aceste vrfuri.
n final se completeaz masivul S cu listele de succesori, concret cu
vrfurile finale ale arcelor.
Ordonarea arcelor se efectueaz ntr-un timp de ordin O(mlogm).
Lista de arce este parcurs ntr-un timp de ordin O(m) O(mlogm).
Lista H se iniializeaz i se corecteaz ntr-un timp de ordin O(n).
Rezult
Teorema 1.1. Conversia listei arcelor n liste de succesori (funcia
) necesit un timp de ordin O(mlogm + n).
Lista de succesori a unui vrf x poate fi parcurs astfel:
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

16

for (j:= H[x], H[x]+1, ..., H[x+1]1) do begin


y := S[j]; Prelucrare-arc (x,y);
end
Algoritmul de conversie poate fi folosit pentru a genera inversul
unui graf dat. Se genereaz lista arcelor grafului invers (y,x) pentru
(x,y), i n final aceast list este convertit n funcia 1.

1.6. Grafuri dinamice

Exist unele probleme care cer ca pe parcurs s se elimine din


graf unele arce prelucrate, fr s fie nevoie s se introduc ulterior
alte arce noi. Pentru aceste probleme se poate adopta urmtoarea
tehnic de reprezentare, descris n continuare. Se introduce un masiv
suplimentar F, care pstreaz iniial limitele de sus ale poziiilor
succesorilor fiecrui vrf. Masivul F se completeaz astfel:
for (x := 0, 1, ..., n1) do F[x] := H[x+1];
Ulterior, dac se dorete eliminarea unui arc cu originea n x, al
crui succesor este memorat pe poziia j (avem H[x] j<F[x]), se
copiaz pe aceast poziie succesorul aflat pe ultima poziie (F[x]1)
din lista asociat lui x. Dac graful este ponderat, aceeai operaie se
repet pentru costul arcului eliminat.
Un succesor al vrfului x, aflat pe poziia j, se elimin astfel:
F[x] := F[x] 1; S[j] := S[F[x]];
Se poate adopta i o alt soluie, mai simpl dar cu eficien ceva
mai mic, bazat doar pe masivele H i S. Eliminarea unui succesor de
pe poziia j (H[x] j<H[x]) se face mult mai simplu, nlocuind
valoarea de pe poziia respectiv cu o valoare negativ:
S[j] := 1;
Dar aceasta presupune ca, de fiecare dat cnd se parcurge lista de
succesori, fiecare valoare S[j] trebuie verificat, i dac nu este
negativ ea reprezint un succesor valid.

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

17

2. Parcurgerea unui graf n lime


2.1. Metoda general
n tehnica de parcurgere n lime (breadth first search) ordinea
n care snt vizitate vrfurile rezult astfel: prima dat se viziteaz
vrful s, apoi succesorii lui s (evitnd un vrf deja vizitat), apoi
succesorii succesorilor lui s, i aa mai departe. Metaforic vorbind
putem spune c aceast tehnic descrie un cerc cu centrul n s i care
se extinde (Larry, Denenberg, p 433-434) (Burdescu, p 43-52).
Prezentm mai jos tehnica general de parcurgere a unui graf n
lime. Iniial toate vrfurile snt nemarcate, i atunci cnd un vrf este
ntlnit prima dat este marcat i introdus ntr-o coad. Atunci cnd un
vrf este extras din coad este vizitat i fiecare succesor este adugat
n coad, cu excepia vrfurilor deja ntlnite care nu mai snt
procesate.
Algoritm BreadthFirstSearch general (cf Lee, 1961);
Intrare. Un graf (X, ) i un vrf s din X.
Ieire. Mk, informaii obinute de procedura de vizitare a vrfurilor.
begin
for (each x X) do Mk[x] := False;
Q := InitQueue(s); Mk[s] := True;
while not EmptyQueue(Q) do begin
x := DeQueue(Q); Visit(x);
for (each y (x)) do
if (Mk[y] = False) then begin
Mk[y] := True; EnQueue(Q,y);
end
end (algoritm).
Operaia iniial de tergere a marcajelor necesit un timp de
ordin O(n). Dup cum vom vedea n exemplele prezentate n
seciunile urmtoare, procedura de Visit necesit un timp de ordin
constant pentru un vrf oarecare. Fiecare arc este parcurs cel mult de
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

18

dou ori (cte o dat pentru fiecare vrf al su vizitat), i fiecare vrf
este introdus n / extras din coad cel mult o dat.
S observm c algoritmul prezentat mai sus proceseaz vrfurile
grafului ntr-o ordine care depinde de modul cum snt descrise listele
succesorilor fiecrui vrf.
Prezentm n continuare o tehnic foarte simpl de implementare
a cozii, valabil numai pentru grafuri statice. Coada Q este un masiv
cu n elemente, i limitele u i v au semnificaia urmtoare:
u poziia primului element care va fi extras din coad;
v poziia unde va fi inserat urmtorul element n coad.
Operaiile asupra cozii se implementeaz astfel:
Operaie

Implementare

Q := InitQueue(s);
not EmptyQueue(Q)
x := DeQueue(Q);
EnQueue(Q,y);

Q[0] := s; u := 0; v := 1;
(u < v)
x := Q[u]; u := u + 1;
Q[v] := y; v := v + 1;

Presupunnd c prelucrarea unui vrf (procedura Visit) dureaz o


unitate de timp, obinem
Teorema 2.1. Parcurgerea n lime a unui graf necesit un timp
de ordin O(n+m).

2.2. Componente conexe


Definiia 2.1. Un graf neorientat este conex dac ntre orice dou
vrfuri exist un lan.
Un graf conex i fr cicluri se numete arbore.
O component conex a unui graf neorientat este un subgraf
conex maximal n raport cu operaia de incluziune. Cu alte cuvinte, nu
exist o submulime de vrfuri mai numeroas care s induc un
subgraf conex.
Problem. Fie un graf neorientat G=(X, ); s se determine
componentele sale conexe.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

19

Aplicaie. X reprezint o mulime de calculatoare, i indic


pentru fiecare calculator care snt calculatoarele conectate direct la
acesta. Evident, fiecare conexiune este n ambele sensuri. S se
determine cte reele independente exist, i care snt calculatoarele
care compun fiecare reea (figura 2.1).

Figura 2.1. Graf cu dou componente conexe: {x0, x1, x3, x4} i {x2, x5, x6}.

Algoritm CompConexe;
Intrare. Un graf neorientat (X, ).
Ieire. Un masiv C: componentele conexe ale acestuia.
begin
for (each s X) do C[s] := 0;
k := 0;
for (each s X) do
if (C[s] = 0) then begin
k := k + 1; u := 0; v := 1;
C[s] := k; Q[0] := s;
while (u < v) do begin
x := Q[u]; u := u + 1;
for (each y (x)) do
if (C[y] = 0) then begin
Q[v] := y; v := v + 1;
C[y] := k;
end
end
end
end (algoritm).
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

20

Ideea acestui algoritm este urmtoarea. Iniial toate vrfurile snt


nemarcate i nu avem determinat nici o component conex. Primul
vrf nemarcat (fie acesta s) desemneaz prima component conex
depistat i aceasta va include toate vrfurile care pot fi atinse cu
ajutorul unui drum care pleac din s. Pentru aceasta se introduc ntr-o
coad i se marcheaz toi succesorii nemarcai ai lui s. n continuare
se extrage cte un vrf din coad i se repet procedura pn cnd
coada devine goal. n acest moment am determinat toate vrfurile
care fac parte din aceeai component conex ca i s. Toate vrfurile
snt marcate cu 1.
Urmtorul vrf nemarcat desemneaz urmtoarea component
conex pentru care se repet aceeai procedur. Toate vrfurile care
fac parte din aceeai component conex snt marcate cu numrul de
ordine al acesteia. n masivul C se memoreaz pentru fiecare vrf
componenta creia i aparine.

2.3. Grafuri bipartite


Definiia 2.2. Un graf neorientat G= (X,U) este bipartit dac
exist o partiie X= X1 X2 astfel nct pentru orice (x,y)U avem
xX1 i yX2. Caracterizarea unui graf bipartit este dat de
Teorema 2.2 (Knig) Urmtoarele afirmaii snt echivalente:
(i) un graf G este bipartit;
(ii) un graf G este bicromatic (poate fi colorat cu dou culori astfel
nct dou vrfuri adiacente s fie colorate diferit);
(iii) un graf G nu conine cicluri de lungime impar.
Problem. Fie un graf neorientat G=(X, ); s se coloreze
graful cu dou culori astfel nct oricare dou vrfuri adiacente s fie
colorate cu culori diferite (figura 2.2).
Aplicaie. X reprezint o mulime de muncitori i maini, i
indic pentru fiecare muncitor pe care maini poate lucra, respectiv
pentru fiecare main care muncitori o pot utiliza. Ne punem
ntrebarea dac graful este corect descris; rspunsul la aceast
ntrebare l aflm dup ce ncercm s colorm graful cu dou culori.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

21

Figura 2.2. Un graf bipartit: X1 = {x0, x2, x4}, X2 = {x1, x3, x5, x6}.

Algoritm Bipartit;
Intrare. Un graf neorientat (X, ).
Ieire. Un masiv C: culoarea fiecrui vrf (1 sau 2).
Valoare returnat True sau False: graful este sau nu bipartit.
begin
for (each s X) do C[s] := 0;
for (each s X) do
if (C[s] = 0) then begin
C[s] := 1; Q[0] := s;
u := 0; v := 1;
while (u < v) do begin
x := Q[u]; u := u + 1;
for (each y (x)) do
if (C[y] = 0) then begin
Q[v] := y; v := v + 1;
C[y] := 3 C[x];
end
else
if (C[y] = C[x]) then
return False;
end
end
return True;
end (algoritm).
Ideea acestui algoritm este urmtoarea. Iniial toate vrfurile snt
nemarcate. Primul vrf nemarcat (fie acesta s) este marcat cu culoarea
1 i toi succesorii si nemarcai se introduc ntr-o coad i se
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

22

marcheaz cu culoarea 2. n continuare se extrage cte un vrf din


coad i se repet procedura pn cnd coada devine goal. Dac un
vrf extras din coad are culoarea 2, toi succesorii si nemarcai se
marcheaz cu culoarea 1. n acest moment am marcat toate vrfurile
care fac parte din aceeai component conex ca i s.
Urmtorul vrf nemarcat desemneaz urmtoarea component
conex pentru care se repet aceeai procedur de colorare.
Este posibil uneori ca un vrf s aib un succesor marcat. Dac
marcajele celor dou vrfuri difer se continu cu alt succesor. Dac
n schimb marcajele celor dou vrfuri coincid graful nu poate fi
colorat cu dou culori, deci nu este bipartit.

2.4. Ordonare topologic


Definiia 2.3. ntr-un graf orientat, dou vrfuri distincte xi y snt
n relaie de ordine topologic, notaie x y, dac este ndeplinit una
din urmtoarele condiii:
fie exist un drum de la x la y i nu exist nici un drum de la y la x;
fie nu exist nici drum de la x la y, nici drum de la y la x.
n al doilea caz relaia de ordine topologic poate fi definit i
altfel: y x, dar n acest caz nu mai poate fi definit relaia x y.
Aceast relaie de ordine este doar tranzitiv i nu poate fi definit
ntre dou vrfuri care aparin unui circuit. Relaia este parial i este
doar tranzitiv; nu este reflexiv, nici simetric, nici antisimetric.

Figura 2.3. Ordonare topologic.

n figura 2.3 snt marcate rangurile vrfurilor n conformitate cu


ordonarea topologic. O ordonare topologic posibil este: (x0, x2, x1,
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

23

x3, x4), cu precizarea c vrfurile x0 i x2 snt interschimbabile pe


primele dou poziii, i vrfurile x1 i x3 snt interschimbabile pe
urmtoarele dou poziii.
Problem. Fie un graf orientat G=(X, ); s se ordoneze
topologic vrfurile din mulimea X n concordan cu relaiile definite
de funcia .
Aplicaie (capitolul cinci). X reprezint o mulime de activiti, i
reprezint legturi de tipul urmtor: y (x) dac activitatea y se
poate executa numai dup ce s-a terminat activitatea x (terminarea
activitii x este necesar pentru a putea ncepe activitatea y).
mpreun cu ordonarea topologic se va determina i rangul fiecrui
vrf, care arat poziia acestuia n lista ordonat. Pot exista mai multe
vrfuri cu acelai rang, dac ntre acestea nu exist nici o relaie de
dependen.
Algoritm TopoSort;
Intrare. Un graf neorientat (X, ).
Ieire. Un masiv Q: vrfurile grafului n ordine topologic.
Un masiv R: rangul fiecrui vrf.
Valoare True sau False: graful nu are (sau are) circuite.
begin

Se determin (prin inspectare ) valorile g (x) pentru fiecare vrf x:

for (each x X) do g (x) := 0;


for (each x X) do

for (each y (x)) do g (y) := g (y) + 1;

Toate vrfurile x pentru care g (x) = 0 se introduc n coada Q:


v := 0;
for (each x X) do

if (g (x) = 0) then begin


Q[v] := x; v := v + 1;
R[x] := 0;
end
Se ordoneaz topologic vrfurile grafului:
while (u < v) do begin
x := Q[u]; u := u + 1;
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

24

for (each y (x)) do begin

g (y) := g (y) 1;

if (g (y) = 0) then begin


Q[v] := y; v := v + 1;
R[y] := R[x] + 1;
end
end
end
return (v = n);
end (algoritm).
Ideea acestui algoritm este urmtoarea. Iniial se determin, prin
inspectarea tuturor vrfurilor grafului i a fiecrui succesor, gradul
interior al fiecrui vrf. Vrfurile care au gradul interior zero (nu au
predecesori) snt introduse n coad, toate aceste vrfuri avnd rangul
zero. n continuare se extrage cte un vrf x din coad, i se reduce cu
o unitate gradul interior al fiecrui succesor y (x). Dac un
succesor y ajunge s aib gradul interior zero, acesta este introdus n
coad i i se asociaz rangul imediat urmtor: R[x] + 1.
n final, dup ce coada devine vid, se verific dac au trecut prin
coad toate cele n vrfuri ale grafului. n caz afirmativ graful nu are
circuite i se poate defini o relaie de ordine topologic pe mulimea
vrfurilor acestuia.
Acest algoritm va fi folosit n capitolul cinci, rezervat problemei
de ordonanare.
Ideea acestui algoritm este preluat din literatura francez
(Gondran, Minoux, p 41-44) unde se determin i rangul fiecrui vrf.
Alte lucrri prezint algoritmi bazai pe parcurgerea n adncime
(Larry, Denenberg, p 436-438) (Burdescu, p 69-74).

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

25

3. Parcurgerea unui graf n adncime


3.1. Metoda general
O a doua tehnic important de parcurgere a unui graf este
parcurgerea n adncime (depth first search). Caracteristica definitorie
a acestei tehnici este faptul c fiecare vrf este explorat n ntregime
imediat ce este ntlnit prima dat. Cu alte cuvinte, vrful este vizitat i
fiecare din succesorii lui este imediat procesat. Dar procesarea
fiecrui succesor presupune aplicarea acestei tehnici n mod recursiv.
Pentru a nelege modul cum opereaz aceast tehnic, s presupunem
c plecm din vrful s. Mai nti este vizitat vrful s, apoi primul
succesor al acestuia (fie acesta s1) este ntlnit i vizitat. n continuare
considerm fiecare din succesorii lui s1; fiecare la rndul lui este
vizitat i explorat ct mai adnc posibil nainte ca urmtorul succesor
al lui s1 s fie examinat. Numai dup ce toi succesorii lui s1 (cu
excepia eventual a lui s) au fost explorai n ntregime continum cu
urmtorul succesor s2 al lui s. Desigur, urmtorul succesor este posibil
s fi fost vizitat la un moment dat n explorarea lui s1, i n acest caz
nu mai este examinat. Numele depth first search reflect ideea c
parcurgerea avanseaz ct mai adnc posibil i mai departe de vrful de
plecare, avansnd de la fiecare vrf la succesorul acestuia, de la un
succesor la succesorul acestuia, i aa mai departe, revenind pentru
verificarea altor succesori numai atunci cnd ntlnim un vrf care nu
mai are succesori neexaminai i deci nu putem avansa mai departe
(Larry, Denenberg, p 435-436) (Burdescu, p 54-67). n figura 1.2
avem un exemplu de parcurgere n adncime.
ntr-o parcurgere n adncime avem dou momente cnd putem
efectua o procedur de vizitare: un vrf poate fi vizitat imediat ce este
ntlnit prima dat, chiar nainte ca primul su succesor s fie procesat
(aa cum am descris n paragraful precedent), sau vrful poate fi
vizitat dup ce toi succesorii si au fost explorai n ntregime. Pentru
a distinge aceste posibiliti definim separat procedurile PreVisit i
PostVisit n conexiune cu tehnica depth first search. Aceast tehnic
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

26

se implementeaz n modul cel mai natural posibil cu ajutorul unui


algoritm recursiv.
Algoritm DepthFirstSearch general;
Intrare. Un graf (X, ) i un vrf s din X.
Ieire. Informaii obinute de procedurile de vizitare a vrfurilor.
begin
for (each x X) do Mk[x] := False;
RecursivDFS(s);
end (algoritm).
Procedura RecursivDFS(vrf x);
begin
Mk[x] := True; PreVisit(x);
for (each y (x)) do
if (Mk[y] = False) then RecursivDFS(y);
PostVisit(x);
end (procedur).
Este necesar o atenie deosebit la implementarea algoritmilor
recursivi: trebuie identificate variabilele locale i variabilele globale,
numai astfel poate fi garantat funcionarea corect a programului.
Procedura de parcurgere poate fi descris i iterativ nerecursiv,
cu ajutorul unui algoritm de tip back-tracking.
Procedura IterativDFS(vrf s);
begin
Mk[s] := True;
k := 0; L[0] := s; (primul vrf din list este s)
P[0] := H[s]; (poziia n S a primului succesor al vrfului s)
while (k 0) do begin
j := P[k]; x := L[k]; (extrage un vrf din list)
PreVisit(x);
while (j < H[x+1]) do begin (x nc mai are succesori)
y := S[j]; (un succesor al lui x)
if (Mk[y] = True) then j := j + 1;
else break; (caut un succesor nemarcat)
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

27

end
if (j < H[x+1]) then begin
k := k + 1; Mk[y] := True; (succesorul y se introduce n
list)
L[k] := y; P[k] := j; (se memoreaz i poziia acestuia n S)
end
else begin
PostVisit(x); (x nu mai are succesori)
k := k 1;
end
end
end (procedura).
S comparm cele dou descrieri:
descrierea recursiv este foarte compact i poate fi implementat
fr dificulti;
descrierea iterativ este destul de elaborat: este dependent de
modul de reprezentare a grafului, i stiva trebuie gestionat explicit.
Exist totui un avantaj n cazul descrierii iterative. Este mult mai
simplu s se precizeze condiii particulare de ncheiere a parcurgerii,
fr s se ating toate vrfurile posibile. De exemplu, un test dac s-a
atins un anumit vrf poate fi plasat imediat dup introducerea n stiv
a unui succesor.
O procedur iterativ de parcurgere n adncime poate fi folosit
pentru a determina un ciclu sau un lan eulerian ntr-un graf neorientat
(Burdescu, p 148-154).

3.2. Componente tare conexe


Definiia 3.1. Un graf orientat este tare conex dac ntre orice
dou vrfuri exist un drum.
O component tare conex a unui graf orientat este un subgraf
tare conex maximal n raport cu operaia de incluziune. Cu alte
cuvinte, nu exist o submulime de vrfuri mai numeroas care s
induc un subgraf tare conex.

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

28

Problem. Fie un graf orientat G=(X, ); s se determine


componentele sale tare conexe (figura 3.1).
Aplicaie. Avem o hart rutier a unei localiti n care X
reprezint interseciile, i indic pentru fiecare intersecie unde
putem ajunge dup un singur pas. Evident, nu ntre oricare dou
puncte de intersecie avem legturi n ambele sensuri. Dorim s aflm
dac orice intersecie este accesibil de oriunde, sau dac nu care
regiuni nu pot comunica ntre ele n ambele sensuri i care intersecii
fac parte din fiecare regiune.

Figura 3.1. Ambele grafuri orientate, (a) i (b), au cte dou


componente tare conexe: {x0, x1, x3} i {x2, x4, x5}.
Vrfurile snt marcate conform parcurgerii n adncime.

Algoritm CompTareConexe [cf Bur,78-84];


Intrare. Un graf orientat (X, ).
Ieire. Un masiv C: componentele tare conexe ale acestuia.
begin
for (each x X) do Mk[x] := False;
Md := 0;
for (each x X) do
if (Mk[x] = False) then TravMark(x);
Se ordoneaz descresctor marcajele masivului D, memornd
pentru fiecare marcaj crui vrf aparine;
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

29

for (each x X) do C[x] := False;


Se construiete graful invers G corespunztor grafului G;
nc := 0;
Procedura TravCnx prelucreaz graful G astfel:
for (each x X) do (vrfurile x se iau n ordinea din masivul D)
if (C[x] = 0) then begin
nc := nc + 1; TravCnx(x);
end
end (algoritm).
Procedura TravMark(vrf x);
begin
Mk[x] := True;
for (each y (x)) do
if (Mk[y] = False) then TravMark(y);
Md := Md + 1; D[x] := Md;
end (procedur).
Procedura TravCnx(vrf x);
begin
C[x] := nc;
for (each y (x)) do
if (C[y] = 0) then TravCnx(y);
end (procedur).
Se face o prim parcurgere n adncime a grafului, i n faza de
postvizitare a unui vrf acesta se marcheaz cu o valoare indicnd
adncimea maxim care a putut fi obinut pornind din vrful
respectiv. n continuare se ordoneaz vrfurile descresctor dup
valoarea acestor marcaje i se construiete graful invers
corespunztor grafului de intrare: dac n graful iniial exist arcul
(x,y) atunci n graful inversat se insereaz arcul (y,x). n final se face
o parcurgere a grafului invers (de aceast dat parcurgerea se poate
face fie n adncime fie n lime), lund vrfurile n ordinea
descresctoare a marcajelor obinute n prima faz. nainte de a doua
parcurgere se ordoneaz descresctor marcajele, i n final se
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

30

determin componentele tare conexe. n masivul C se memoreaz


pentru fiecare vrf componenta creia i aparine.
Fiecare etap de parcurgere a grafului necesit un timp de ordin
O(n+m). Etapa de ordonare a marcajelor masivului D necesit un
timp de ordin O(nlogn). Obinem
Teorema 3.1. Determinarea componentelor tare conexe ale unui
graf orientat necesit un timp de ordin O(nlogn).
Am preferat, pentru simplitatea descrierii, o prezentare a
algoritmului n trei faze: parcurgerea grafului iniial, ordonarea
marcajelor, parcurgerea grafului invers. Este posibil s se obin o
complexitate liniar a acestui algoritm, dac se observ c vrfurile
vizitate pot fi introduse ntr-o stiv n ordinea executrii operaiei
PostVisit. Graful invers va fi parcurs conform extragerii vrfurilor din
stiva astfel creat (Giumale, p 160-163).
Dintr-o list a vrfurilor marcate rezult o component tare
conex sau mai multe, n funcie de vrfurile care pot fi atinse
conform parcurgerii grafului invers. De altfel aceasta este ideea de
baz a algoritmului descris n literatura de specialitate: se parcurge
graful iniial pornind dintr-un vrf s, i n continuare se parcurge
graful invers n ordinea precizat mai sus. Doar vrfurile care pot fi
atinse n ambele parcurgeri fac parte din aceeai component tare
conex.

3.3. Biconectivitate
Definiia 3.4. Un vrf s al unui graf neorientat este vrf critic (sau
vrf de articulaie) dac exist dou vrfuri distincte x i y orice drum
elementar de la x la y trece prin s.
Definiia 3.3. Un graf neorientat este biconex dac, fiind date
dou vrfuri distincte x i y, exist cel puin dou drumuri elementare
ntre ele care nu au nici un vrf comun, cu excepia celor dou capete.
Cu alte cuvinte, un graf neorientat este biconex dac i numai dac nu
are vrfuri critice.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

31

Exemplu. Graful din figura 3.2 (a) este biconex, pe cnd cel din
figura 3.2 (b) nu. Al doilea graf are dou vrfuri critice: x0 i x1.

Figura 3.2. Un graf biconex(a); un graf cu dou vrfuri critice (b). Graful
(b) admite trei componente biconexe: {x0, x5}, {x0, x1, x2} i {x1, x3, x4}.

Problem. Fie un graf neorientat G=(X, ); s se determine


vrfurile sale critice.
Aplicaie (concurs ACM, Bucureti 1998). X reprezint o mulime
de calculatoare, i indic pentru fiecare calculator care snt
calculatoarele conectate direct la acesta. Evident, fiecare conexiune
este n ambele sensuri. Un calculator care corespunde unui vrf critic
afecteaz comunicarea n reea dac se defecteaz. n acest caz exist
cel puin dou noduri, aflate n componente biconexe diferite, care nu
mai pot comunica. Dac se defecteaz un calculator, fie acesta z, care
nu corespunde unui vrf critic, comunicarea nu este totui afectat. S
presupunem c un drum care unete dou vrfuri x i y trece prin acel
calculator. n acest caz, deoarece z nu este critic, se poate gsi un alt
drum de la x la y care s nu treac prin z.
S se determine toate calculatoarele critice din reea.
Pentru a nelege cum trebuie aplicat tehnica depth first search
n problema biconectivitii unui graf, s revedem algoritmul general.
Considerm c graful G este neorientat i conex. Procedura recursiv
RecursivDFS proceseaz fiecare vrf x marcndu-l i considernd pe
rnd fiecare succesor. Dac un succesor y a fost deja marcat
procedura ignor pur i simplu arcul (x,y). Dac un succesor y nu a
fost marcat, procedura se autoapeleaz pentru a-l procesa; spunem c
procedura avanseaz pe arcul (x,y). S fixm acum un vrf r de start
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

32

(rdcin) pentru tehnica de parcurgere. Fie T graful parial care se


compune din vrfurile lui G i arcele de avansare; acest graf este
obinut din graful G dup ce am eliminat arcele ignorate n timpul
parcurgerii (Athanasiu et al).
S artm c T este un arbore. ntr-adevr, T conine toate
vrfurile din G prin definiie, i este conex deoarece orice parcurgere
n adncime a grafului G (care este conex) ntlnete fiecare vrf din
G. Mai mult, T nu conine nici un ciclu deoarece de fiecare dat cnd
ntlnim un arc ce unete dou vrfuri deja marcate acesta este ignorat
i nu este adugat la T. Putem considera c T este un arbore cu
rdcina r, i un vrf x este printele lui y dac i numai dac y este
primul succesor nemarcat al lui x.
Graful original G se compune din arborele T i arcele ignorate.
S facem o observaie important (Larry, Denenberg, p439-441):
fiecare arc ignorat unete dou vrfuri ntre care exist o relaie de
ancestralitate: dac (x,y) este arc ignorat, atunci fie x este un strmo
al lui y, fie y este un strmo al lui x. Pentru a vedea aceasta, fie (x,y)
un arc oarecare ignorat n G, i s presupunem c explorarea lui x s-a
terminat nainte ca explorarea lui y s se fi terminat. Putem arta c y
trebuie s fie un strmo al lui x; cellalt caz poate fi analizat n mod
analog. S considerm momentul n care explorarea lui x s-a
terminat. n mod cert y trebuie s fi fost ntlnit deja, altfel arcul (x,y)
nu ar fi fost ignorat n timpul explorrii lui x. Dar atunci o explorare a
lui y trebuie s fie n curs de desfurare, deoarece am presupus c
explorarea lui x se termin nainte de aceea a lui y. Aceast explorare
a lui y a fost efectuat de-a lungul unei secvene de arce de avansare
de la y la x, de unde rezult c orice arc din G este un strmo al lui x.
Deoarece fiecare arc din G este fie n T (de avansare) fie ignorat,
rezult c orice arc din G unete dou vrfuri care se afl n relaie de
ancestralitate n T. Figura 3.3 ilustreaz un exemplu de graf
neorientat i arborele corespunztor generat de arcele de avansare
selectate de parcurgerea n adncime.
Aceast descriere a procesului de parcurgere n adncime ne
conduce la o caracterizare a vrfurilor critice.
Teorema 3.2. 1) Vrful r, rdcina arborelui, este vrf critic dac
i numai dac are mai mult de un copil n T.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

33

2) Fie x un vrf oarecare din G diferit de r. Atunci x este vrf


critic dac i numai dac are un copil y n T astfel nct nici un arc
ignorat din G nu unete un descendent al lui y cu un strmo propriu
al lui x (diferit de el nsui).

Figura 3.3. Graful (a) are dou vrfuri critice: x0 i x1. n urma
parcurgerii n adncime a acestuia se obine arborele (b).

Exemplu. n figura 3.3 vrful x0 este critic deoarece are doi copii:
x1 i x6. Dac am elimina arcul (x0,x6) i am introduce arcul (x1,x6)
vrfurile ar fi parcurse n aceeai ordine dar vrful x0 nu ar mai fi critic
deoarece singurul lui copil ar fi x1.
Vrful x1 este critic deoarece unul dintre copiii lui, x3, nu are nici
un descendent care s fie unit n arbore printr-un arc cu un strmo
propriu al lui x1. Pe de alt parte, x3 nu este critic deoarece arcul
(x4,x1) unete un descendent al acestuia cu un strmo propriu al lui
x3; n aceeai situaie este i arcul (x5,x1). S observm c vrful x1
este critic chiar dac un succesor al acestuia (x2) este unit printr-un
arc cu un strmo propriu al lui x1 (x0); cellalt succesor (x3) nu are
aceast proprietate.
Faptul c un vrf y este unit cu un vrf z, strmo propriu al
vrfului x, este reflectat de relaia D[z]<D[x]<D[y]. Figura 3.3 (b)
indic i modul de marcare a vrfurilor, valorile reprezentnd
adncimea relativ la vrful rdcin (x0).

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

34

Aceste idei snt folosite n algoritmul prezentat mai jos, care


determin vrfurile critice ale unui graf conex. n loc s numerotm
vrfurile n ordinea n care snt ntlnite, fiecare vrf este marcat n
masivul D cu adncimea n arborele generat de arcele de avansare
plecnd din r. Funcia recursiv TravCritic completeaz acest masiv
efectund o parcurgere n adncime standard. Aceast funcie
returneaz minimul dintre marcajele de adncime ale vrfurilor
ntlnite n timpul explorrii complete a vrfului x; pe msur ce
fiecare succesor y este examinat (i probabil explorat recursiv)
reinem cea mai mic dintre valorile de marcaj ntlnite, inclusiv
aceea returnat de funcia TravCritic. Pe msur ce fiecare succesor y
al lui x este explorat putem spune dac exist un descendent al lui y
care s fie adiacent cu un strmo propriu al lui x un astfel de
strmo trebuie s aib adncimea mai mic dect a lui x. S
observm c testul se aplic numai descendenilor lui x n arbore, i
nu fiecrui succesor al lui x.
Dup cum am artat n teorema 3.2 rdcina parcurgerii este o
excepie de la aceast regul i este tratat separat n rutina
principal.
Algoritm VirfuriCritice (Larry, Denenberg, p 442);
Intrare. Un graf neorientat conex (X, ).
Ieire. Vrfurile critice ale grafului, marcate True n masivul Cv.
begin
for (each x X) do begin
Cv[x] := False; D[x] := 0;
end
r := un vrf oarecare din X;
TravCritic(r); k := 0;
for (each x (r)) do
if (D[x] = 1) then k := k + 1;
if (k 2) then Cv[r] := True;
end (algoritm).
Funcia TravCritic(vrf x);
begin
md := D[x];
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

35

for (each y (x)) do


if (D[y] = 0) then begin
D[y] := D[x] + 1;
m := TravCritic(y);
if (m D[y]) and (x r) then Cv[x] := True;
md := minim(m,md);
end
else md := minim(md,D[y]);
return md;
end (funcie).
Teorema 3.3. Determinarea vrfurilor critice ale unui graf
neorientat necesit un timp de ordin O(n+m).
Algoritmul poate fi completat pentru a determina componentele
biconexe astfel. Se introduc ntr-o stiv gestionat explicit toate
arcele de avansare pn cnd se depisteaz un vrf critic. n acest
moment se elimin din stiv ultimele arce pn cnd se depisteaz un
arc care a plecat din vrful depistat ca fiind critic. Toate vrfurile
ntlnite pe parcursul eliminrii arcelor din stiv formeaz o
component biconex. Aceeai procedur trebuie efectuat n mod
repetat i pentru vrful rdcin r, dac se depisteaz c este critic.
Aceast stiv separat poate fi organizat ca un masiv de cupluri (x,y)
avnd cel mult m elemente.

3.4. Cicluri i lanuri euleriene


Un lan (ciclu) eulerian folosete toate muchiile o singur dat.
Problem. Fiind dat un graf neorientat conex, s se precizeze
dac admite sau nu un ciclu / lan eulerian. n caz afirmativ s se
indice succesiunea de muchii a acestuia.
Aplicaie (Euler, 1736). Celebra problem a podurilor de la
Knigsberg era formulat astfel. Figura 3.4 (a) reprezint o hart a
insulei aflate pe cursul rului Pregel n localitatea Knigsberg. Este
posibil o plimbare astfel nct s se traverseze toate podurile o
singur dat?
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

36

Figura 3.4 (b) este o modelare a hrii cu ajutorul unui multigraf.


ntr-un multigraf putem avea mai multe muchii ntre dou vrfuri. O
tehnic de reprezentare bazat pe funcia (liste de succesori)
permite reprezentarea unui multigraf: pur i simplu un succesor este
memorat de mai multe ori n list. ntr-o matrice de adiacen, aij va
memora numrul de muchii care unesc cele dou vrfuri.

Figura 3.4. Podurile de la Knigsberg.

Aceast problem poate fi generalizat astfel. Fiind dat o figur


geometric construit din linii, este posibil desenarea acesteia fr
s ridicm creionul de pe hrtie i fr s desenm de mai multe ori o
linie?
Euler a dat soluia pentru problema general ntr-un articol
publicat n revista Academiei de tiine din Petersburg: Solutio
problematis ad geometriam situs pertinentis, pag 128-140.
Teorema 3.4. Dac un graf are n vrfuri i m muchii, atunci suma
gradelor tuturor vrfurilor este 2m.
Demonstraie (inducie complet). Fie un graf cu n vrfuri i fr
muchii: suma gradelor este zero. Se adaug cte o muchie i la un
moment dat avem k muchii. Presupunem c suma gradelor este 2k.
Dac mai adugm o muchie, suma gradelor crete cu doi.
Corolar 3.5. Orice graf are un numr par de vrfuri de grad impar
Teorema 3.6. Un graf admite un lan eulerian dac i numai dac
este conex (exceptnd eventualele puncte izolate) i numrul
vrfurilor de grad impar este 0 sau 2.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

37

Demonstraie. () Dac exist un lan eulerian, atunci graful este


conex. Cele dou vrfuri ale lanului (dac snt distincte) snt
singurele care au grad impar. Deci graful nu poate avea dect 0 sau 2
vrfuri de grad impar.
() Dac graful are o singur muchie afirmaia este evident.
Presupunem c afirmaia este adevrat pentru grafuri cu mai puin
de m muchii. Pentru fixarea ideilor presupunem c exist dou vrfuri
de grad impar: a i b (raionamentul se face la fel i pentru cazul cnd
nu exist vrfuri de grad impar).
Un voiajor care pleac din a ntr-o direcie oarecare i nu
parcurge aceeai muchie de dou ori va defini un lan . Dac el
ajunge ntr-un vrf x b, va utiliza un numr impar de muchii
incidente cu x, deci va putea pleca pe o muchie nealeas. Dac el
ajunge n b, la un moment dat nu va mai putea pleca. n acest lan
arbitrar de la a la b este posibil s nu fie folosite toate muchiile.
Rmne atunci un graf parial G' care are toate vrfurile de grad par.
Fie C1, C2, ... Ck componentele conexe ale lui G' care conin cel puin
o muchie. Prin ipotez ele admit ciclurile euleriene 1, 2, ... k.
Deoarece G este conex, lanul eulerian ntlnete succesiv toate
componentele Ci. S presupunem c ordinea este aceasta: x1C1,
x2C2, ...xkCk. S considerm lanul [a,x1]+ 1+ [x1,x2]+
2+ ...+ [xk,b]. Acest lan este un lan eulerian de la a la b.
Corolar 3.7. Dac un graf este conex i are 2q (q 1) vrfuri de
grad impar, atunci mulimea arcelor sale este reuniunea a q lanuri
simple disjuncte relativ la muchii (adic oricare dou lanuri distincte
nu folosesc aceeai muchie).
Demonstraie. S notm cu G graful obinut din G prin
adugarea unui nou vrf z, pe care l unim prin muchii cu toate cele
2q vrfuri de grad impar ale lui G. Rezult c G este conex i toate
vrfurile snt de grad par, deci admite un ciclu eulerian. Suprimnd
vrful z precum i toate muchiile incidente cu el, ciclul eulerian se
descompune n q lanuri simple cu proprietatea enunat mai sus.
Din demonstraia teoremei 3.6 se contureaz ideea unui algoritm
care s determine un ciclu sau un lan eulerian, n cazul n care graful
admite aa ceva. Se pleac din vrful a i se efectueaz o parcurgere n
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

38

adncime att timp ct acest lucru e posibil. Fiecare muchie este


eliminat pe msur ce se avanseaz n graf: aceast eliminare
presupune tergerea din list a celor dou arce gemene.
n continuare se determin, folosind un algoritm similar, cte un
ciclu eulerian pentru fiecare component conex rezultat. n final se
insereaz toate aceste cicluri printre vrfurile ciclului / lanului
determinat iniial, pentru a obine un ciclu / lan eulerian. Trebuie s
folosim o tehnic adecvat pentru reprezentarea grafului, care s
permit operaii de actualizare a grafului pe msur ce acesta este
parcurs: identificarea arcului geamn, tergerea unui arc.
Din pcate un astfel de algoritm poate avea un ordin mare de
complexitate cel puin O(m2), datorit necesitii de a examina o
list de muchii pentru fiecare component conex, cu scopul de a
determina punctele de nnodare. n continuare schim ideea unui
algoritm mai eficient, care are complexitate de ordin O(m).
Algoritm LantEulerian;
Intrare. Un graf neorientat G = (X, ) care admite un lan eulerian.
Ieire. Lista L a muchiilor n ordinea parcurgerii lanului.
begin
Fie a i b cele dou capete ale lanului (posibil a = b);
r := (a,0); (r este un reper pentru operaia de nnodare);
L := ; (organizat ca o list simplu nlnuit)
repeat
Fie (s,p) elementele reperului r;
Parcurge n adncime graful dat plecnd din s i nnodnd noua
list de vrfuri la poziia p;
Fiecare vrf preluat este introdus n lista L, i apoi arcul prelucrat
este eliminat din graf mpreun cu arcul invers corespunztor;
Dac n timpul parcurgerii un vrf x care urmeaz s fie introdus
n L are mai muli succesori, se memoreaz n reperul r vrful
x mpreun cu poziia pe care este memorat n lista L;
La sfritul parcurgerii cnd ajungem ntr-o fundtur, lanul
curent se nnoad la lista L n poziia p;
until (m = 0); (oprire cnd snt eliminate toate arcele din graf)
end (algoritm).
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

39

Teorema 3.8. Dac un graf admite un ciclu sau un lan eulerian,


acesta poate fi determinat ntr-un timp de ordin O(m).

Figura 3.5. Grafuri euleriene.

1) Graful din figura 3.5 (a) admite un ciclu eulerian. O prim


parcurgere d lanul (x0, x1, x2, x0). Parcurgerea s-a oprit la vrful x0, i
ultimele informaii memorate n rau fost despre vrful x2, memorat pe
poziia a treia. Relum parcurgerea cu vrful x2 i obinem lanul
(x4, x1, x3, x4, x5, x2), care se nnoad la poziia a treia a lanului de
baz. Rezult n final ciclul (x0, x1, x2, x4, x1, x3, x4, x5, x2, x0).
2) Graful din figura 3.5 (b) admite un lan eulerian. O prim
parcurgere d lanul (x1, x0, x2, x1, x3, x2). Parcurgerea s-a oprit la vrful
x2, i ultimele informaii memorate n rau fost despre vrful x3,
memorat pe poziia a cincea. Relum parcurgerea cu vrful x3 i
obinem lanul (x4, x5, x3), care se nnoad la poziia a cincea a lanului
de baz. Rezult n final lanul (x1, x0, x2, x1, x3, x4, x5, x3, x2).

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

40

4. Drumuri minime n grafuri


Acest capitol trateaz n detaliu dou probleme: drumuri de
lungime minim ntr-un graf neponderat i drumuri de cost minim
ntr-un graf ponderat.
Pentru fiecare din aceste probleme snt prezentai algoritmii cei
mai eficieni: algoritmul lui Lee pentru drumuri de lungime minim,
respectiv algoritmul lui Dijkstra pentru drumuri de cost minim.
Algoritmul lui Dijkstra este prezentat mpreun cu o structur de date
(arbore de selecie) care contribuie la creterea eficienei acestuia.
n literatura de specialitate snt prezentai i ali algoritmi care pot
rezolva aceste probleme, dar din pcate acetia au un ordin de
complexitate care i face inutilizabili pentru volume mari de date. n
capitolul urmtor va fi prezentat algoritmul lui Bellman, care poate fi
folosit (cel puin n scop didactic) pentru rezolvarea problemelor de
drum maxim i minim.

Figura 4.1. Drumuri minime ntre x0 i x3:


de lungime minim: x0 x1 x3 i x0 x2 x3
de cost minim: x0 x1 x2 x3

4.1. Drumuri de lungime minim


Problem. Fie un graf G = (X, ); s se determine un drum de
lungime minim (numr minim de arce) ntre dou vrfuri s i t.
Aplicaii. 1) X reprezint o mulime de staii CFR, i
reprezint legturile directe dintre staii: pentru fiecare staie, unde se
poate ajunge direct, cu un singur tren. S se determine o rut ntre
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

41

dou staii care necesit ct mai puine schimbri, dac ntre cele dou
staii nu exist o legtur direct.
2) X reprezint o mulime de camere dintr-un labirint, i
reprezint relaiile de vecintate: pentru fiecare camer, care snt
camerele unde se poate ajunge direct. S se determine un drum ct mai
scurt spre ieirea din labirint.
Exemplu. n figura 4.1, ntre x0 i x3 avem dou drumuri de
lungime minim: x0 x1 x3 i x0 x2 x3.
Pentru a rezolva aceast problem folosim tehnica breadth first
search. Deoarece aceast tehnic proceseaz vrfurile n ordinea
distanei de la vrful surs, putem gsi astfel lungimea celui mai scurt
drum ntre dou vrfuri date, concret numrul de arce ale acestuia.
Algoritm DrumLungMinim (Lee);
Intrare. Un graf orientat (X, ) i un vrf s din X.
Ieire. Lungimile minime de la s la toate celelalte vrfuri din X ntrun
masiv . Informaiile necesare reconstituirii unui drum de
lungime
minim de la s la orice alt vrf x din X ntr-un masiv P.
begin
for (each x X) do begin
P[x] := x; [x] := ;
end
Q[0] := s; [s] := 0;
u := 0; v := 1;
while (u < v) do begin
x := Q[u]; u := u + 1;
for (each y (x)) do
if ( [y] = ) then begin
[y] := [x] + 1; P[y] := x;
Q[v] := y; v := v + 1;
end
end
end (algoritm).
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

42

n masivul P se memoreaz informaii necesare reconstituirii unui


drum de lungime minim de la s la orice alt vrf x din X. Iniial fiecare
element din masiv indic spre el nsui, marcnd astfel faptul c pentru
nici un vrf x din X nc nu a fost definit predecesorul. Fiecare element
de indice x din P indic predecesorul vrfului x pe un drum de
lungime mai mic dect al unui drum gsit anterior. Reconstituirea
unui drum de la s la t se face astfel:
begin
k := 0; D[0] := t; x := t;
while (x s) do begin
x := p[x];
k := k+1; D[k] := x;
end
end
n masivul D se obine drumul cutat i vrfurile apar n ordine
invers de la t la s.
Dac se cere s se determine un drum de lungime minim de la s
la t, algoritmul se poate opri atunci cnd se extrage din coad vrful t:
x := Q[u]; u := u + 1;
if (x = t) then break;
Teorema 4.1. Un drum de lungime minim ntre dou vrfuri ale
unui graf poate fi determinat ntr-un timp de ordin O(n+m).

4.2. Drumuri de cost minim


Problem. Fie un graf ponderat G = (X, , c). S se determine
un drum de cost minim (suma costurilor arcelor) ntre dou vrfuri s i
t.
Exemplu. n figura 4.1, ntre x0 i x3 avem un drum de cost
minim: x0 x1 x2 x3. Se observ c acesta nu coincide cu nici unul
din drumurile de lungime minim.
Algoritm DrumCostMinim (Dijkstra);
Intrare. Un graf orientat ponderat (X, , c) i un vrf s din X.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

43

Ieire. Costurile minime de la s la toate celelalte vrfuri din X ntr-un


masiv . Informaiile necesare reconstituirii unui drum de cost
minim de la s la orice alt vrf x din X ntr-un masiv P.
begin
for (each x X) do begin
[x] := ; P[x] := x;
end
S := X; [s] := 0;
Actualizeaz reprezentarea cuplului (S, );
while (S ) do begin
x := Min(S, ); (extrage un vrf x S cu marca minim)
for (each y (x) S) do begin
w := [x] + c(x,y);
if ( [y] > w) then begin
[y] := w; P[y] := x;
Actualizeaz reprezentarea cuplului (S, );
end
end
end
end (algoritm).
Ideea acestui algoritm este urmtoarea. Pentru fiecare vrf x se
pstreaz o marc un cost tentativ ntre s i x; aceast marc poate
fi foarte mare, dar niciodat nu este mai mic dect costul real minim
dintre s i x. Iniial marca asociat vrfului s este 0, i toate celelalte
vrfuri au marca . Marca fiecrui vrf se memoreaz ntr-un masiv
. Se pstreaz de asemenea o mulime S de vrfuri neexaminate, al
cror cost real minim nu este nc cunoscut; dac un vrf x nu se afl
n S, costul real minim al acestuia coincide cu [x]. Iniial S coincide
cu X; algoritmul se termin cnd S = (putem termina i mai repede
n momentul n care se extrage din mulimea S un vrf t precizat
dinainte).
Cutarea se face ntr-un cerc cu centrul n jurul vrfului s dup
cum urmeaz. Se extrage un vrf x din S care are marca minim.
Considerm fiecare succesor y al lui x (y (x)) i se compar
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

44

marca [y] cu valoarea w:= [x]+c(x,y). Dac [y]>w atunci


[y] se corecteaz cu w i se nregistreaz faptul c x este un
predecesor al lui y pe un drum mai bun dect altul gsit anterior.
Aceast comparare se face numai pentru acei succesori ai lui x din S,
deoarece ceilali succesori nu mai au nevoie de corecie (marca
asociat coincide cu costul real minim). De fiecare dat procedura
extrage un singur vrf din S, astfel c se execut exact n pai.
Acest algoritm este evident unul de tip Greedy: de fiecare dat se
extrage vrful care are marca minim i, deoarece acesta nu se mai
afl n S, presupune c marca asociat este costul real minim.
Complexitatea acestui algoritm va fi analizat dup ce vor fi
studiate mai multe posibiliti de reprezentare a cuplului (S, ).
Tocmai din acest motiv am rezervat o procedur care actualizeaz
aceast reprezentare dup fiecare corectare a costului unui vrf.

4.3. Determinarea tuturor drumurilor minime

Figura 4.2. ntre x0 i x5 exist 3 drumuri.

n seciunea 4.1 am prezentat o tehnic ce ne permite memorarea


informaiilor necesare reconstituirii unui drum minim care pleac
dintr-un vrf dat. Dac dorim s determinm toate drumurile minime
ntre dou vrfuri date (figura 4.2), trebuie s folosim structuri de date
mai complexe pentru a memora toi predecesorii unui vrf. n
descrierile care urmeaz utilizm un tip de date mulime pentru a
memora aceste informaii, P (o list de mulimi) fiind reprezentat ca o
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

45

matrice care memoreaz listele predecesorilor. Ca i terminator de


list se poate folosi pentru fiecare linie o valoare special.
Iniializarea listelor de predecesori:
for (each x X) do P[x] := ;
Memorarea predecesorilor vrfului y:
w := [x] + cost(x,y);
(dac se cer drumuri de lungime minim atunci cost(x,y) este 1)
if ( [y] > w) then begin
[y] := w; P[y] := ;
end
if ( [y] = w) then P[y] := P[y] {x};
Toate drumurile minime ntre dou vrfuri date se determin cu
ajutorul unui algoritm de tip back-tracking, pstrndu-se pentru fiecare
vrf din drum o informaie care s indice urmtorul predecesor al
acestuia care ar putea conduce la un alt drum minim.
Exemplu. S se determine toate drumurile minime de la x0 la x5.
P[0] = ;
P[1] = {0};
P[2] = {0};
P[3] = {1};
P[4] = {1,2};
P[5] = {3,4};
Primul drum: (5(1), 3(), 1(), 0());
vrful 5 are nc un vrf n lista de predecesori pe poziia 1 (dup vrful
3 urmeaz vrful 4); celelalte vrfuri nu mai au predecesori n list;
Al doilea drum:
(5(), 4(1), 1(), 0());
vrful 4 are nc un vrf n lista de predecesori pe poziia 1 (dup vrful
1 urmeaz vrful 2);
Al treilea drum:
(5(), 4(), 2(), 0());
listele de predecesori ale tuturor vrfurilor snt vide.

4.4. Arbori de selecie


Cea mai simpl modalitate de reprezentare a cuplului (S, )
const n utilizarea a dou masive de cte n elemente, unul pentru lista
S a vrfurilor, cellalt pentru costuri. n acest caz, extragerea unui vrf
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

46

de cost minim presupune efectuarea a n verificri la prima iteraie,


n1 la a doua, o verificare la ultima. Rezult n total un numr de
operaii de ordin O(n2) doar pentru activitatea de extragere.
Actualizarea costurilor necesit un numr de operaii proporional cu
| (0)| + | (1)| + ... + | (n1)| = m
Folosind o astfel de reprezentare, algoritmul lui Dijkstra are
complexitate de ordin O(n2+m), ceea ce este inacceptabil pentru
grafuri cu numr foarte mare de vrfuri, de ordinul zecilor sau sutelor
de mii. Deoarece majoritatea problemelor practice snt modelate cu
ajutorul unor grafuri rare, unde numrul de arce nu depete cu mult
numrul de vrfuri, se recomand n implementare utilizarea unei
structuri de date de tip arbore de selecie.
O astfel de structur trebuie s permit efectuarea urmtoarelor
operaii ntr-un timp ct mai scurt (Johnson):
interogare: ce cost are vrful x?
extragerea unui vrf de cost minim;
micorarea costului unui vrf.
Cele dou operaii care modific structura trebuie s o
reorganizeze, astfel nct fiecare operaie ulterioar s poat fi
efectuat ntr-un timp ct mai scurt.
Reprezentarea cuplului (S, ) ca un arbore de selecie se face n
modul urmtor. S presupunem c avem = (9,8,8,2,7,11,7), i
lista S= (0,1,2,3,4,5,6). n figura 4.3 avem o reprezentare grafic
a unei posibile configuraii, care a rezultat n urma unor actualizri.

Figura 4.3. Arbore de selecie pentru memorarea cuplului (S, ).

Explicaie. Vrful x3 are costul 2 (minim), de aceea se afl n


vrful ierarhiei. Fiii si n aceast ierarhie snt x6 i x4, ambele vrfuri
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

47

avnd costul 7. Relaia de ordine ntre costuri se pstreaz doar pe


vertical, de la rdcin la oricare din frunze. Nu exist nici o relaie
de ordine pe orizontal.
Masivul K memoreaz informaii cheie despre fiecare vrf: c este
costul vrfului i a este poziia acestuia n arbore. Masivul A indic
ierarhia vrfurilor n arborele de selecie. Pe prima poziie (zero) se
memoreaz rdcina arborelui. Fiii unui vrf aflat pe poziia k se afl
pe poziiile 2k+1 i 2k+2.
K = (9,4), (8,6), (8,3), (2,0), (7,2), (11,5), (7,1).
A = (3, 6, 4, 2, 0, 5, 1).
Explicaie. Vrful x1 cu costul 8 se afl n arborele de selecie pe
poziia 6; n mod corespunztor trebuie s avem A[6] = x = 1.
Reinem ca o regul general relaia dintre cele dou masive:
(K[x].a = u) i (A[u] = x)
Nu este necesar s se memoreze informaii suplimentare de tipul
x X deoarece acestea pot fi codificate astfel: dac un vrf este extras
din coad, n masivul K poziia acestuia va fi o valoare negativ.
Iniializarea structurii:
for (each x X) do begin
K[x].c := ; K[x].a := x;
A[x] := x; P[x] := x;
end
na := n; Modifica(s, 0);
na reprezint numrul de elemente din arbore. Dup corectarea
costului vrfului s (procedura Modifica), acesta trebuie s urce n
ierarhie, pentru a se restabili relaia de ordine specific unui arbore de
selecie.
Procedura Modifica(vrf y, cost w) cf Athanasiu et al;
begin
K[y].c := w; u := K[y].a;
while (u > 0) do begin
v := (u1) / 2;
if (K[A[v]].c w) then break;
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

48

A[u] := A[v]; K[A[v]].a := u; u := v;


end
A[u] := y; K[y].a := u;
end (procedura);
Funcia Extrage() cf Athanasiu et al;
begin
x := A[0]; K[x].a := 1;
v := 0; na := na 1;
A[0] := A[na]; K[A[0]].a := 0;
while (True) do begin
u := 2 v + 1;
if (u na) then break;
if (u+1 < na) then
if (K[A[u]].c > K[A[u+1]].c) then
u := u + 1;
if (K[A[na]].c K[A[u]].c) then break;
A[v] := A[u]; K[A[u]].a := v;
v := u;
end
A[v] := A[A[na]]; K[A[na]].a := v;
return x;
end (funcie);
Termenul arbori de selecie este preluat din lucrarea Tehnici de
programare (Athanasiu et al).
Pentru extragere se reine care este vrful aflat n ierarhie, i se
marcheaz n masivul C faptul c acest vrf nu va mai face parte din
list. n continuare se aduce pe prima poziie a masivului A (n
rdcina arborelui) vrful aflat pe ultima poziie. Se actualizeaz
referina acestui vrf n masivul C.
De ce se aduce ultimul element din masivul A pe prima poziie?
Arborele de selecie trebuie s aib n acest masiv o reprezentare
compact.
n continuare elementul aflat n rdcina arborelui ar putea avea
un cost prea mare, i atunci trebuie restabilit relaia de ordine cu fiii
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

49

si. n acest scop vrful trebuie s coboare n ierarhie spre stnga sau
spre dreapta.
De fiecare dat cnd se modific ierarhia n arbore, la urcare sau la
coborre, informaiile despre poziie se actualizeaz i n masivul K.
Arborele are iniial n elemente, i nlimea acestuia este de ordin
O(log n). Acesta este i ordinul de complexitate al celor dou funcii,
de modificare a costului unui vrf i de extragere a elementului de cost
minim. Algoritmul lui Dijkstra efectueaz cel mult m modificri de
cost i cel mult n extrageri. Rezult
Teorema 4.2. Algoritmul lui Dijkstra, bazat pe arbori de selecie,
determin un drum de cost minim ntre dou vrfuri ale unui graf ntrun timp de ordin O((m+n) log n).
Acest ordin de complexitate este estimat pentru cele mai
defavorabile cazuri. n practic, unde se cere determinarea unui drum
de cost minim ntre dou vrfuri, numrul de operaii pe arborele de
selecie este dat de numrul de arce traversate pn ce se extrage din
arbore vrful final.

4.5. Algoritmul lui Dijkstra: revizuire


O mbuntire a performanelor acestui algoritm se poate obine
astfel (Giumale, 73-76). Iniial toate vrfurile au costul , i lista S
conine doar vrful s. Pe parcurs se introduc n lista S doar acei
succesori ai vrfului extras care au costul , pentru celelalte vrfuri se
modific doar costul. Vrfurile extrase nu mai apar n lista S.
O implementare simpl va folosi pentru lista S un ir de maximum
n indeci corespunztori vrfurilor grafului. O implementare eficient
presupune adaptarea funciilor prezentate n seciunea precedent.
n continuare prezentm doar corpul algoritmului modificat n
conformitate cu observaiile fcute mai sus.
begin
for (each x X) do begin
[x] := ; P[x] := x;
end
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

50

S := {s}; [s] := 0;
Actualizeaz reprezentarea cuplului (S, );
while (S ) do begin
x := Min(S, ); (extrage un vrf x S cu marca minim)
for (each y (x) S) do begin
w := [x] + c(x,y);
if ( [y] > w) then begin
if ( [y] = ) then S := S {x};
[y] := w; P[y] := x;
Actualizeaz reprezentarea cuplului (S, );
end
end
end
end (algoritm).
n lucrarea Introducere n algoritmi (Cormen et al), snt descrii
n detaliu mai muli algoritmi care determin drumuri optime n
grafuri. n conexiune cu algoritmul Dijkstra snt descrise dou
structuri de date care pot fi folosite pentru accelerarea performanelor
acestuia. Prima structur e deja cunoscut: arbori de selecie, a doua
se bazeaz pe arbori Fibonacci.
O implementare bazat pe arbori Fibonacci conduce n final la o
complexitate amoritzat de ordin O(nlogn+m), fapt care o face
atractiv pentru grafuri dense. Din pcate implementarea acestei
structuri este dificil, astfel c pentru probleme practice, unde intervin
grafuri rare, cea mai bun soluie este utilizarea structurilor de tip
arbore de selecie.
De altfel n prefa am precizat: nu am urmrit perfeciunea din
punctul de vedere al complexitii, am preferat algoritmi care au
complexitate acceptabil, o descriere simpl i snt uor de urmrit.

4.6. Drumuri minime n grafuri foarte mari


n problemele de planificare a traseelor optime este foarte
important s utilizm algoritmi performani care s determine drumuri
ntre dou vrfuri ale unui graf. Dac o aplicaie de transport
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

51

gestioneaz un graf foarte mare, unde |X| este de ordinul sutelor de


mii, i |U| de ordinul milioanelor, cum este cazul reelei complete de
drumuri ale unei ri de mrime mijlocie, atunci chiar i o
implementare dup algoritmul prezentat anterior are uneori un timp de
rspuns care cu greu poate fi acceptat. Problema devine critic atunci
cnd aplicaia ruleaz pe un server i trebuie s satisfac cereri care
pot veni de la mai muli utilizatori pe Internet.
Deoarece n asemenea cazuri determinarea unui drum de cost
minim poate lua mult timp, este de preferat s se determine un drum
de cost apropiat celui optim, dar care poate fi gsit foarte repede. n
multe probleme practice de aceast natur avem informaii
suplimentare despre vrfuri i despre legturi, cum ar fi:
(i) fiecare legtur poate fi o rut important sau secundar;
(ii) rutele importante snt n numr redus n comparaie cu cele
secundare (de exemplu 810%);
(iii) vrfurile importante aflate (numai) pe rute importante, snt
de asemenea n numr redus n comparaie cu celelalte;
(iv) rutele importante snt repartizate aproape uniform printre cele
secundare; aceeai observaie este valabil i pentru vrfuri.

Figura 4.4. Exemple de drumuri: (A, B, C), (C, I, D), (B, C, I, D, E, F).
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

52

Ideea pe care dorim s o punem n practic este urmtoarea


(figura 4.4) (Cozac). Fiind date dou vrfuri s i t, ambele aflate doar
pe rute secundare, determinm mai nti un drum de cost minim de la
s la cel mai apropiat vrf s1 aflat pe o rut important. De asemenea
determinm un drum de cost minim n sens invers de la t la cel mai
apropiat vrf t1 aflat pe o rut important. n continuare determinm
un drum de cost minim de la s1 la t1 lund n considerare numai rutele
importnate. Soluia problemei se obine reunind cele trei drumuri.
Astfel gsirea unei soluii este mult accelerat deoarece:
drumurile de la s la s1 i de la t la t1 se determin foarte repede
observaia (iv);
drumul de la s1 la t1 se determin de asemenea foarte repede
observaiile (ii) i (iii).
Pentru a putea utiliza algoritmul schiat mai sus trebuie s
pregtim dou structuri suplimentare.
Se parcurge graful original pentru a marca toate vrfurile care se
afl pe o rut important. Folosind aceste vrfuri se determin un
subgraf parial care are doar aceste vrfuri i rutele importante. Fie
acest subgraf parial Gs = (Xs, Us). Se determin de asemenea i
Gi = (X, Ui), graful invers corespunztor grafului original.
n continuare descriem algoritmul de determinare a unui drum de
cost apropiat celui optim.
Algoritm DrumAproapeOptim;
Intrare. Graful original G, graful invers Gi, subgraful parial Gs;
dou vrfuri distincte s i t.
Ieire. Un drum aproape optim de la s la t.
begin
* dac (s nu e pe o rut important) atunci
determin n graful G, folosind algoritmul Dijkstra i arbori
de selecie, un drum de cost minim D1 de la s la cel mai
apropiat vrf s1 aflat pe o rut important;
dac vrful t este depistat mai repede, stop:
am gsit drumul cutat;
altfel (s e pe o rut important)
fie s1 := s; D1 := ;
* dac (t nu e pe o rut important) atunci
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

53

determin n graful Gi, folosind algoritmul Dijkstra i arbori


de selecie, un drum de cost minim D2 de la t la cel mai
apropiat vrf t1 aflat pe o rut important;
altfel (t e pe o rut important)
fie t1 := t; D2 := ;
* determin n graful Gs, folosind algoritmul Dijkstra i arbori
de selecie, un drum de cost minim D3 de la s1 la cel mai
apropiat vrf t1 aflat pe o rut important;
* reunete cele trei drumuri: D := D1 D2 D3;
* raporteaz rezultatul: D;
end (algoritm).

Figura 4.5. Exemplu de graf pentru care algoritmul


DrumAproapeOptim nu funcioneaz corect:
nu gsete nici un drum de la A la D sau de la A la E.
Putem folosi acest algoritm n orice condiii? Rspunsul la aceast
ntrebare l d
Teorema 4.3. Algoritmul DrumAproapeOptim gsete un drum
ntre oricare dou vrfuri ale grafului G dac i numai dac grafurile
G i Gs snt tare conexe.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

54

Demonstraie. Condiiile snt evident suficiente, i este de


asemenea evident c graful G trebuie s fie tare conex. Rmne s
demonstrm c i graful Gs trebuie s fie tare conex. ntr-adevr, s
presupunem c graful Gs nu este tare conex. Pot aprea urmtoarele
situaii cnd algoritmul raporteaz n mod eronat c nu exist drum
ntre dou vrfuri, chiar dac un astfel de drum exist graful G este
tare conex (a se vedea figura 4.5):
putem gsi dou vrfuri distincte x i y, ambele aflate pe rute
importante, astfel nct s nu existe drum de la x la y format numai din
rute importante;
putem gsi dou vrfuri distincte x i y, cel puin unul aflat pe o rut
secundar, astfel nct s nu existe drum de la x la y format din rute
secundare i importante.

O tehnic eficient de reprezentare


n loc s se reprezinte un subgraf parial Gs separat, putem s-l
memorm ntr-o singur structur mpreun cu graful original G. S
presupunem c trebuie s reprezentm graful din figura 2.6; cele
dou grafuri pot fi reprezentate astfel:
X
Hg
Lt
Lp
Ls
Pos

A
0
1
0
B
0

B
1
2
2
C
1

C
2
4
3
I
2

D
4
6
5
A
3

E
6
7
6
C
4

F
7
8
8
E
5

G
8
9
8
F
6

H
9
10
10
D
7

I
10
12
11
H I
8 9

D G
10 11

Aceste masive se citesc astfel:


Ls este lista succesorilor vrfurilor A, , I;
Hg este o tabel de dispersie pentru mulimea Ls; de exemplu,
succesorii vrfului D snt memorai n tabloul Ls pe poziiile 4, 5, ;
Lt este un masiv care conine limitele superioare pentru ntreaga
list a succesorilor fiecrui vrf; de exemplu, succesorii vrfului C
snt memorai n masivul Ls pe poziiile 2 i 3; se memoreaz pe
primele poziii succesorii care snt vrfuri importante;

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

55

Lp este un masiv care conine limitele superioare pentru lista


succesorilor importani ai fiecrui vrf; de exemplu, singurul succesor
important al vrfului D este memorat n tabloul Ls pe poziia 4.
Pentru a uura citirea informaiilor, am indicat n lista Pos
indecii elementelor masivelor descrise mai sus.
Aceast structur este o extensie a reprezentrii menionate n
seciunea 2.2, i consum minimum posibil de memorie. Pe de alt
parte, aceasta poate fi folosit doar pentru grafuri statice.

Cum estimm uniformitatea?


Cum decidem dac drumurile importante snt uniform repartizate
printre cele secundare?
n faza de preprocesare, dup crearea tuturor structurilor de date
necesare, putem folosi urmtorul algoritm. Parcurgem ntreaga list
de vrfuri secundare pentru a determina, pentru fiecare vrf, ci pai
snt necesari pentru a atinge un vrf important. Un pas se consider
format din secvena de actualizare a marcajelor i a cuplului (S, )
(a se vedea algoritmul Dijkstra). Dac numrul maxim de pai nu
depete o limit impus apriori (de exemplu 8-10% din |U|),
decidem c graful G este uniform.

4.6. Drumuri minime n grafuri orar


Ce este un graf orar?
O reea de cale ferat este modelat cu ajutorul unui graf simetric
ponderat. Acest articol descrie modul de rezolvare a urmtoarelor
probleme:
cum se introduc datele pentru un nou mers al trenurilor;
cum se modeleaz acest mers cu ajutorul unui graf expandat;
cum se determin drumuri optime (trasee avnd timp minim de
cltorie) ntre dou staii.

Introducerea datelor
Fie un graf simetric ponderat G = (X, U, d) unde:
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

56

X este o mulime finit i nevid de noduri, asociat cu mulimea


staiilor CFR;
U este o mulime de arce care indic legturi directe ntre dou
staii: dac (x,y) U ntre x i y nu exist alte staii;
d este o funcie distan simetric, d:UN*: d(x,y)=d(y,x)
pentru orice (x,y) U.
Prima problem care trebuie rezolvat este cea a introducerii ct
mai comode a datelor despre un mers nou. Pentru fiecare tren se
precizeaz: care este traseul acestuia, prin ce staii trece, ora sosirii i
plecrii pentru fiecare staie.
Pentru un tren oarecare se introduc staia iniial de plecare i
staia final de sosire. n acest moment s-ar putea determina un drum
de distan minim ntre cele dou staii. Dar nu ntotdeauna un tren
parcurge traseul de distan minim dintre cele dou staii. Astfel c,
dac traseul trenului difer de cel avnd distana minim, trebuie s
precizm un nod intermediar, sau poate chiar dou. n continuare se
determin un traseu de distan minim care s treac prin toate
nodurile n ordinea dat. n acest scop poate fi folosit algoritmul
Dijkstra, deja cunoscut.
Avnd toate staiile de pe parcursul unui tren, se pot preciza
pentru fiecare staie ora sosirii i ora plecrii. Staia iniial de plecare
nu are asociat o or de sosire, i staia final de sosire nu are
asociat o or de plecare. De asemenea, este posibil ca o staie
intermediar s nu aib asociat orele de sosire i plecare, dac trenul
nu are oprire n staia respectiv.

Modelare cu ajutorul unui graf expandat


Exist modelri ale problemei mersului trenurilor disponibile pe
Internet. Prezentm n continuare un astfel de model (cf Schultz et
al), simplificat i completat pentru a modela ct mai bine unele
particulariti ale reelei CFR.
S presupunem c avem trei staii: Sa, Sb i Sc, i trei trenuri cu
urmtorul program de circulaie:
T1: (Sa, 8:00) (Sb, 8:15, 8:20) (Sc, 8:30);
T2: (Sb, 12:00) (Sc, 12:45, 12:50) (Sa, 13:10);
T3: (Sc, 14:00) (Sa, 14:15, 14:20) (Sb, 14:35).
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

57

Pentru fiecare staie, i pentru fiecare moment de sosire i plecare


se definete cte un nod n graful expandat. Astfel vom avea
urmtoarele noduri:
cele asociate staiei Sa: n1(T1,8:00), n2(T2,13:10),n3(T3,14:15),
n4(T3,14:20);
cele asociate staiei Sb: n5(T1,8:15), n6(T1,8:20), n7(T2,12:00),
n8(T3, 14:35);
cele asociate staiei Sc: n9(T1,8:30), n10(T2,12:45), n11(T2,12:50),
n12(T3,14:00).
Se definesc arce n graful expandat astfel:
arce care indic momente succesive din ruta unui tren:
(n1,n5), (n5,n6), (n6,n9), (n7,n10), (n10,n11), (n11,n2), (n12,n3), (n3,n4),
(n4,n8);
arce care indic legturi cu alte trenuri:
(n8,n7), (n8,n6), (n5,n7), (n2,n1), (n2,n3), (n4,n1), (n9,n11), (n9,n12), (n10,n12).
n a doua list se includ arcele care se refer la aceeai staie i
unesc un vrf de sosire corespunznd unui tren cu un vrf de plecare
corespunznd altui tren.
Uneori este necesar s introducem legturi suplimentare n graful
expandat, pentru a indica faptul c un tren de legtur trebuie luat
dintr-o staie vecin. Exemple: (Ploiesti Vest, Ploiesti Sud),
(Bucuresti Nord, Bucuresti Basarab).
n aceste situaii legturile trebuie s in seama de timpul
necesar pentru a ajunge dintr-o staie n cealalt cu un alt mijloc de
transport (de exemplu autobuz). Aceste arce suplimentare vor fi
definite astfel:
nodul iniial al arcului este asociat unui moment de sosire, i
nodul final unui moment de plecare;
se vor avea n vedere acele noduri care corespund unui interval
de timp cel puin egal cu cel necesar pentru a parcurge distana dintre
cele dou staii.
Graful expandat G = (X, U) asociat mersului trenurilor este un
graf orientat unde:
X este mulimea de noduri definite cum s-a artat mai sus; un
nod x X este un triplet (a,b,h) cu semnificaia: a - staie, b tren,
h ora plecrii sau sosirii;
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

58

U este mulimea de arce definite cum s-a artat mai sus.

Determinarea traseelor optime ntre dou staii


Fiind date dou staii s i t, trebuie s se determine ct mai multe
trasee optime (ca i timp de cltorie) de la s la t. Trebuie s
precizm mai exact ce nseamn traseu optim. Considernd staia s i
ora de plecare h, s se determine un traseu care ne permite s
ajungem n cel mai scurt timp n staia t. Dac vom considera diferite
ore de plecare, este posibil s avem trasee diferite cu durate diferite
de cltorie, toate fiind optime conform precizrii de mai sus.
Criteriul de optim este relativ la momentul plecrii. Dar dac se
identific dou trasee diferite, cu momente diferite de plecare, i
momentul sosirii coincide, va fi luat n considerare doar acel traseu
care are timpul total de cltorie minim.
Pentru a determina traseul optim se utilizeaz algoritmul Dijkstra
cu cteva modificri (cf Schultz et al).
Se determin o mulime SX asociat staiei s care se refer
doar la momente de plecare. Se determin de asemenea o mulime
TX asociat staiei t care se refer doar la momente de sosire.
Pentru fiecare nod sS se determin un traseu optim de la s la
primul nod t care este depistat n T. Pentru dou noduri consecutive
n1(a1,b1,h1) i n2(a2,b2,h2) timpul se determin astfel:
(1440+h2h1) mod 1440
dac momentele de timp snt date n minute n intervalul [0,1439].
Diferena fa de modelul propus de Schultz et al este
urmtoarea. Autorii citai propun ca n a doua list de arce se includ
acele arce care se refer la aceeai staie, i care unesc dou momente
consecutive de timp, indiferent de tipul acestora (plecare sau sosire),
la care se adaug un arc care unete ultimul moment de timp cu
primul, pentru a da posibilitatea de a obine legturi la momentul
trecerii de la o zi la alta.
Singurul avantaj

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

59

5. Problema ordonanrii
5.1. Enunul problemei

Figura 5.1. O problem de ordonanare.

Figura 5.1 este o reprezentare grafic a unui set de activiti care


trebuie executate pentru finalizarea unei lucrri. Aceste activiti snt:
x0, activitatea de pregtire, trebuie executat naintea tuturor
celorlalte activiti;
activitatea x1 trebuie s nceap dup cel puin patru uniti de timp
de la nceperea activitii x0;
activitatea x3 trebuie s nceap dup cel puin o unitate de timp de
la nceperea activitii x1;
momentul cnd poate ncepe activitatea x2 este determinat de
nceperea activitilor x0, x1 i x3: dup cel puin cinci uniti de timp
de la nceperea activitii x0, dup cel puin trei uniti de timp de la
nceperea activitii x1, i dup cel puin o unitate de timp de la
nceperea activitii x3;
recepia lucrrii (activitatea x4) se poate face dup cel puin dou
uniti de timp de la nceperea activitii x2, i dup cel puin o unitate
de timp de la nceperea activitii x3.
Arcele ponderate ale grafului din figura 5.1 pot fi interpretate
astfel:
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

60

activitatea x0 dureaz patru uniti de timp; activitatea x1 poate


ncepe imediat dup terminarea activitii x0, i activitatea x2 cel puin
cu o unitate de timp dup terminarea activitii x0 (nu mai devreme);
activitatea x3 dureaz o unitate de timp, i activitile x2 i x4 pot
ncepe imediat dup terminarea activitii x3;
Putem da i o alt interpretare:
activitatea x0 dureaz cinci uniti de timp; activitatea x1 poate
ncepe cel mult cu o unitate de timp naintea terminrii activitii x0
(n nici un caz mai devreme), i activitatea x2 imediat dup terminarea
activitii x0 dar numai cu respectarea tuturor celorlalte restricii.
Observaii importante. (1) Nu este posibil s modelm situaii n
care se impun restricii de tipul: activitatea xj trebuie s nceap cel
mult dup t uniti de timp dup nceperea activitii xi, dup cum se
poate deduce analiznd figura 5.1.
(2) Dac mai multe activiti independente trebuie executate
naintea tuturor celorlalte activiti, se definete cte un arc de cost
zero ntre o activitate x0 (fictiv) i fiecare din activitile respective.
(3) Este absurd s se defineasc dependene ntre activiti care s
conduc la apariia unui circuit n graful care modeleaz problema.
Problem. Fie un graf orientat ponderat G=(X, ,c), care
modeleaz o problem de planificare (ordonanare). S se determine,
pentru fiecare activitate, momentul cnd poate s nceap, astfel nct
lucrarea s fie recepionat ct mai devreme posibil.
Cele mai frecvente aplicaii ale acestei probleme apar n
construcii.
Activitile trebuie s nceap cel mai devreme la momentele: 0
x0, 4 x1, 7 x2, 5 x3, 9 x4. Lucrarea poate fi recepionat cel mai
devreme la momentul 9.
Activitile x0, x1, x2 i x4 se afl pe un drum de cost maxim de la
x0 la x4 i se numesc activiti critice, deoarece orice ntrziere a
oricrei activiti din list are ca efect decalarea termenului de
recepie a lucrrii. Drumul (x0, x1, x2, x4) este un drum critic, de aceea
aceast problem mai este numit problema drumului critic.
Fiecare activitate are dou mrci de timp, ele fiind egale pentru
activitile critice. Activitatea x3 nu este critic, de aceea aceasta poate
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

61

ncepe cel mai trziu la momentul 6, fr pericolul de a decala


termenul de recepie a lucrrii.

5.2. Rezolvare bazat pe ordonare topologic


Rezolvarea problemei de ordonanare presupune determinarea,
pentru fiecare activitate, a celor dou momente de ncepere: cel mai
devreme i cel mai trziu, astfel nct termenul final s nu fie decalat.
Aceast problem se rezolv n dou etape. n prima etap se
determin, pentru fiecare vrf, costul maxim al unui drum care pleac
din vrful iniial.
n etapa a doua se pleac de la momentul asociat vrfului final, i
se parcurge n sens invers graful spre vrful iniial, ncercnd pentru
fiecare vrf s se prelungeasc momentul de ncepere ct mai mult
posibil, fr a afecta momentele de timp deja determinate.
Un algoritm eficient de determinare a costurilor maxime ale
drumurilor care pleac din vrful iniial proceseaz vrfurile n ordinea
furnizat de ordonarea topologic.
Algoritm Ordonantare-Unu (prima faz);
Intrare. Un graf orientat ponderat G= (X, , c).
Ieire. Momentele de ncepere cel mai devreme, ntr-un masiv D.
begin
TopoSort(G, Q, R); (ordonare topologic)
for (each x X) do D[x] := 0;
for (i := 0, 1, ..., n1) do begin
x := Q[i];
for (each y (x)) do begin
w := D[x] + c(x,y);
if (D[y] <w) then D[y]:= w;
end
end
end (algoritm).
n etapa a doua se aplic un algoritm asemntor, dar pe inversul
grafului iniial.
Algoritm Ordonantare-Doi (a doua faz);
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

62

Intrare. Un graf orientat ponderat G= (X, 1, c), inversul grafului


G.
Momentele de ncepere cel mai devreme, ntr-un masiv D.
Ieire. Momentele de ncepere cel mai trziu, ntr-un masiv E.
begin
TopoSort(G, Q, R); (ordonare topologic)
for (each x X) do E[x] := D[x];
for (i := 0, 1, ..., n1) do begin
y := Q[i];
for (each x 1(y)) do begin
w := E[y] c(x,y);
if (E[x] >w) then E[x]:= w;
end
end
end (algoritm).
Ambii algoritmi au complexitate de ordin O(m+ n). Inversul
grafului iniial poate fi determinat (teorema 1.1) ntr-un timp de ordin
O(mlogm+ n). Rezult
Teorema 5.1. Problema ordonanrii poate fi rezolvat ntr-un
timp de ordin O(mlogm+ n).
Modelul prezentat n acest capitol construiete un graf poteniale
activiti, i este preluat din literatura francez (Gondran, Minoux,
50-55).

5.3. Algoritmul lui Bellman


Acest algoritm poate folosi pentru reprezentare oricare din
tehnicile prezentate n primul capitol. n orice caz cea mai bun
performan se obine pentru o reprezentare bazat pe lista arcelor.
Ideea de baz a acestui algoritm pentru prima faz este (Bellman):
D[x] := 0; x X
D[y] := max {D[x] + c(x, y) | x 1(y) }, y X , y
0
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

63

Valorile din masivul D se corecteaz n mod repetat pn cnd acestea


se stabilizeaz. Dar dac dup n iteraii aceste valori nu se
stabilizeaz, acest fapt se datoreaz existenei unor circuite n graf.
Algoritm Ordonantare-Unu (cf Bellman);
Intrare. Un graf orientat ponderat (X,U, c).
Ieire. Momentele de ncepere cel mai devreme, ntr-un masiv D.
begin
for (each x X) do D[x] := 0;
repeat
k := 0;
for (each (x,y) U) do begin
w := D[x] + c(x,y);
if (D[y] > w) then begin
D[y] := w; k := 1;
end
end
until (k = 0);
end (algoritm).
Am presupus c graful nu are circuite. Algoritmul poate fi
completat cu verificarea numrului de iteraii (repeat) efectuate.
Ideea de baz a acestui algoritm pentru a doua faz este:
E[x] := D[n1]; x X
E[x] := min { E[y] c(x, y) | y (x) }, x X , y n
1
Algoritm Ordonantare-Doi (cf Bellman);
Intrare. Un graf orientat ponderat (X,U, c).
Momentele de ncepere cel mai devreme, ntr-un masiv D.
Ieire. Momentele de ncepere cel mai trziu, ntr-un masiv E.
begin
for (each x X) do E[x] := D[n1];
repeat
k := 0;
for (each (x,y) U) do begin
w := E[y] c(x,y);

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

64

if (E[y] < w) then begin


E[y] := w; k := 1;
end
end
until (k = 0);
end (algoritm).
Teorema 5.2. Algoritmul lui Bellman ruleaz ntr-un timp de
ordin O(km), dac graful este reprezentat prin lista arcelor. k este
numrul de iteraii efectuate, 1 k n.
De remarcat faptul c acest algoritm poate folosi graful dat i
pentru faza a doua a problemei de ordonanare, nu are nevoie s
determine graful invers.
Acest algoritm poate fi folosit i pentru a determina un drum de
cost minim. S nu uitm c acest algoritm are doar un scop didactic,
nu este recomandat pentru grafuri mari datorit ordinului mare de
complexitate. Ideea de baz a acestui algoritm pentru problema
determinrii unui drum de cost minim este:
[x] := ; x X
[s] := 0;
[y] := min { [x] + c(x, y) | x 1(y) }; y X , y
s
Valorile din masivul se corecteaz n mod repetat pn cnd acestea
se stabilizeaz. Dac se permit costuri negative ale arcelor, este
posibil s apar circuite de valoare negativ. Prezena unui astfel de
circuit este depistat dac dup n iteraii valorile din masivul nu se
stabilizeaz.

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

65

6. Arbori pariali de cost minim


Un arbore este un graf conex i fr cicluri.
Fiind dat un graf conex ponderat G= (X, ,c) care descrie
posibilitile de conectare (construirea unor legturi directe) ntre
diferite perechi de vrfuri din X i costurile acestora, s se determine
un numr minim de legturi care trebuie construite astfel nct oricare
dou vrfuri s fie conectate (direct sau indirect) i costul total s fie
minim. Sntem condui la urmtoarea
Problem. Fie un graf neorientat ponderat G=(X, ,c). S se
determine un arbore T=(X,V) de cost minim (figura 6.1): dintre toi
arborii care se pot obine din graful G, T are costul minim, adic

c( v )
v
V

este minim.

Figura 6.1. Un graf neorientat ponderat; arbore


parial de cost minim marcat cu linii continue.

Aplicaie. ntr-o ar subdezvoltat trebuie reparat infrastructura


rutier. Se cunoate pentru fiecare arter costul reparaiei. Ce drumuri
trebuie reparate mai nti?

6.1. Algoritmul lui Prim


Acest algoritm folosete o strategie Greedy pentru a conduce la
rezultatul final, ca i algoritmul Dijkstra cu care se aseamn foarte
mult.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

66

Algoritm Prim varianta descriptiv;


Intrare. Un graf neorientat ponderat (X, , c).
Ieire. Un arbore parial T= (X,V) de cost minim.
begin
S:= {s}; (mulimea S se iniializeaz cu un vrf oarecare s al
mulimii X)
V := ; (mulimea de arce)
repeat (n1 iteraii) begin
(x,y) := o muchie de cost minim care are un vrf x n S
i cellalt vrf y n X\S;

S:= S {y}; V:= V {(x,y)};


end
end (algoritm).
Se pleac iniial cu o list vid de muchii; ca i vrf de plecare
pentru mulimea S putem lua orice vrf s din X. La fiecare pas se alege
o muchie care unete un vrf din mulimea S cu un altul din afara
acesteia i care are costul minim; acest vrf se adaug la mulimea S.
Prezentm mai jos o descriere a algoritmului lui Prim care poate fi
uor implementat.
Algoritm Prim varianta pentru implementare (Burdescu, p 99-104);
Intrare. Un graf conex ponderat (X, , c).
Ieire. Un arbore parial T = (X, V) de cost minim.
begin
S := X; V := ;
for (each x X) do begin
[x] := ; p[x] := x;
end
[s] := 0; (s este un vrf oarecare din X)
Actualizeaz reprezentarea cuplului (S, );
while (S ) do begin
x := Min(S, ); (extrage un vrf x S cu marca minim)
if (p[x] x) then
V := V {(p[x],x)};
for (each y (x) S) do begin
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

67

if ( [y] > c(x,y)) then begin


[y] := c(x,y); p[y] := x;
Actualizeaz reprezentarea cuplului (S, );
end
end
end
end (algoritm).

6.2. Algoritmul lui Kruskal


Prezentm n continuare o paralel ntre algoritmul lui Prim
prezentat mai sus i algoritmul lui Kruskal:
ambii algoritmi folosesc o strategie de tip Greedy pentru a
determina un arbore de cost minim;
algoritmul lui Prim construiete arborele pornind de la un vrf
oarecare i adaug muchii avnd costul minim la un singur arbore care
se extinde;
algoritmul lui Kruskal adaug muchii care pot forma la un moment
dat mai muli subarbori distinci, care pe parcurs se conecteaz i n
final formeaz unul singur;
algoritmul lui Prim folosete o reprezentare a grafului bazat pe
funcia ;
algoritmul lui Kruskal folosete o reprezentare a grafului bazat pe
lista arcelor.
Algoritm Kruskal varianta descriptiv;
Intrare. Un graf ponderat (X, U, c).
Ieire. Un arbore parial de cost minim T = (X, V).
begin
V := ;
repeat (n1 iteraii) begin
u := (x,y) := muchia de cost minim care nu a fost aleas din U,
i nu formeaz un ciclu cu muchiile din V;
V := V {(x,y)};
end;
end (algoritm).
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

68

nainte de a prezenta o descriere a algoritmului lui Kruskal care


poate fi uor implementat, s facem cteva observaii.
S reamintim faptul c operaia de baz n algoritmul lui Kruskal
este cutarea unei muchii de cost minim care unete dou componente
conexe distincte determinate pn n acel moment. Am divizat aceast
operaie n trei pri: caut o muchie de cost minim, determin dac o
muchie dat unete dou componente conexe distincte, i adaug o
muchie nou la graful construit pn n acel moment astfel se obine
din dou componente conexe una singur.
Pentru a rezolva corect prima problem trebuie ca, n cazul n care
o muchie nu poate fi adugat la graful care se construiete (deoarece
ambele capete aparin aceleiai componente conexe), aceasta s nu
mai fie folosit deloc, deoarece componenta conex nu va fi spart n
viitor. Astfel este suficient s considerm muchiile grafului G
ordonate cresctor dup cost.
Cea mai simpl soluie este ordonarea tuturor muchiilor dup
cost, care necesit un timp de ordin O(m log n).
Urmtoarele dou operaii se rezolv folosind o structur de date
auxiliar (U-arbori: Larry, Denenberg, p 445-446) (Burdescu, p 9298), detaliat n seciunea urmtoare:
determin, pentru fiecare vrf, din ce component face parte;
efectueaz reuniunea a dou componente.
n algoritmul descris mai jos, Init(M,X) iniializeaz o list M a
componentelor conexe. Fiecare component are un vrf special numit
reprezentantul mulimii.
Funcia Identif(y,M) determin reprezentantul componentei
conexe care l conine pe y.
Procedura Union(s,t,M) determin reuniunea a dou componente
conexe care le conin pe s, respectiv pe t.
Algoritm Kruskal varianta pentru implementare;
Intrare. Un graf ponderat (X, U, c).
Ieire. Un arbore parial de cost minim T = (X, V).
begin
Q := masiv cu muchiile grafului ordonate cresctor dup cost;
V := ; Init(M, X);
l := 1; k := 0;
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

69

while (l < n) and (k < m) do begin


(x, y) := muchia de pe poziia k din Q;
s := Identif(x, M); t := Identif(y, M);
k := k + 1;
if (s t) then begin
Union(s, t, M); V := V {(x,y)};
l := l + 1;
end
end
end (algoritm).
n final, dac graful iniial este conex, se obine (l = n). Aceast
afirmaie va fi justificat n seciunea urmtoare.

6.3. U-arbori
Fie o mulime X care are n elemente. Prima operaie pe care o
efectum este formarea unei partiii din n submulimi, fiecare avnd
exact un element. Aceasta este operaia de iniializare.
n continuare presupunem c avem o partiie M a mulimii X care
are k submulimi (k n). Considerm de asemenea c fiecare
submulime are un vrf special numit reprezentantul mulimii. n
aceste condiii definim nc dou operaii pe care le efectum pe
aceast partiie.
Fiind dat un element x, care este submulimea care l conine?
Concret, care este reprezentantul submulimii respective?
Se dau dou elemente s i t, fiecare fiind reprezentantul unei
submulimi. S se determine reuniunea celor dou submulimi.
Evident, n aceast situaie unul din cele dou elemente va deveni
reprezentantul noii submulimi astfel formate.
Partiia M este reprezentat printr-un masiv de n elemente, fiecare
element de pe poziia x (xX) avnd dou cmpuri, r i h, care ne dau
informaii despre statutul elementului x. Cmpul r indic dac x este
reprezentantul submulimii din care face parte (r= x), sau informaia
despre reprezentantul acesteia trebuie cutat n alt parte: concret, la
elementul indicat de r. Componenta h are semnificaie numai pentru
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

70

acel element x care este reprezentantul submulimii, i indic distana


maxim de la acesta la oricare din elementele submulimii.
Figura 6.2 ne sugereaz de ce aceast structur se numete Uarbore (n englez Up-tree: Larry,Denenberg, p 308-316). Un
element al structurii indic n sus spre un altul care face parte din
aceeai submulime, i conduce la reprezentantul submulimii.

Figura 6.2. O pdure de U-arbori.

Elementele partiiei M au urmtoarele valori:


(1,1) (1,2) (3,1) (4,2) (4,3) (4,1)
De exemplu, vrful x3 a fost la un moment dat reprezentantul unei
submulimi i a avut asociat nlimea 2. Acum el indic spre x4,
actualul reprezentant, care are asociat nlimea 3.
Procedura Init(partiie M; mulime X);
begin
for (each xX) do begin
M[x].r := x; (creeaz o mulime format numai din vrful x)
M[x].h := 1; (fiecare mulime format are nlimea 1)
end
end (procedur);
Funcia Identif(x,M) determin reprezentantul componentei
conexe care l conine pe x.
Funcia Identif(vrf x, partiie M);
begin
if (M[x].r = x) then return x;
else return Identif(M[x].r);
end (funcie);
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

71

Procedura Union(s,t,M) determin reuniunea a dou componente


conexe care au ca i reprezentani pe s, respectiv pe t.
Procedura Union(vrfuri s,t;partiie M);
begin
if (M[s].h < M[t].h) then (mulimea lui s are nlimea mai mic)
M[s].r := t; (s va aparine de acum mulimii lui t)
(mulimea lui t i pstreaz nlimea)
else
if (M[s].h > M[t].h) then (mulimea lui t are nlimea mai mic)
M[t].r := s; (t va aparine de acum mulimii lui s)
(mulimea lui s i pstreaz nlimea)
else begin (cele dou mulimi au aceeai nlime)
M[s].r := t; (nu are importan cum le asociem)
M[t].h := M[t].h + 1; (dac l-am asociat pe s lui t)
end
(nlimea lui t crete cu 1)
end (procedur);
Iniializarea partiiei M se efectueaz ntr-un timp de ordin O(n).
Reuniunea a dou submulimi se efectueaz ntr-un timp de ordin
O(1).
Pentru a analiza complexitatea funciei Identif s facem
urmtoarele observaii. Dac avem dou elemente, dup reuniune se
obine o structur cu nlimea 2. O structur cu nlimea 3 se obine,
n cel mai defavorabil caz, din reuniunea a dou structuri avnd fiecare
nlimea 2. Cel mai defavorabil caz este dat de o component conex
care are un numr minim de elemente i conduce la o nlime
maxim. n cazul general, dac mulimea iniial are 2l elemente, se
poate ajunge n final la o structur avnd nlimea l+1. Deducem c
funcia Identif se execut ntr-un timp de ordin O(log n).
Teorema 6.1. Fiind dat un graf neorientat ponderat, un arbore
parial de cost minim poate fi determinat ntr-un timp de ordin
O(m log n).
Ambii algoritmi se opresc dup ce au fost selectate n1 arce. S
artm c n final se obine ntr-adevr un arbore, studiind algoritmul
lui Prim. Dup primul pas avem ntr-adevr un arbore parial cu dou
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

72

vrfuri unite printr-o muchie. S presupunem c dup k1 pai avem


un subarbore parial cu k vrfuri din S i k1 muchii din V. La
urmtorul pas unul din vrfurile mulimii S se unete printr-o muchie
cu un vrf din mulimea X\S i obinem un arbore parial cu k+1
vrfuri i k muchii. Nu se obine nici un ciclu: pentru aceasta ar fi
trebuit ca vrful y ales s fi fost deja conectat cu unul din vrfurile din
S, ori vrful y nu a fost ales pn acum. Rezult
Teorema 6.2. Un arbore T = (X, V) are |X|1 muchii.

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

73

7. Probleme de transport
7.1. Reele de transport
Definiia 7.1. Un graf orientat ponderat G=(X,U,c) este o reea
de transport dac este conex i exist un singur vrf s fr predecesori
i un singur vrf t fr succesori:

sX este intrare n reea i 1(s)= i (s) ;

tX este ieire din reea astfel nct 1(t) i (t) = ;

pentru orice alt vrf xX (x s i x t), 1(x) i (x)


;
Valoarea c(u) 0 este capacitatea arcului u U.
Definiia 7.2. O funcie :UR+ definete un flux n reeaua
G dac:
a) pentru orice arc uU avem (u) c(u) (fluxul este compatibil
cu reeaua);
b)pentru orice vrf xX (x s i x t) se respect legea
conservrii fluxului:

(u ) =
(u ) ,

u
( x )

u
+( x )

unde am notat:

(x) = {(y,x)U|yX} mulimea arcelor incidente interior


vrfului x;
+
(x) = {(x,y)U|yX} mulimea arcelor incidente exterior
vrfului x;
Din b) se deduce relaia:

(u ) = (u )

u
( z )

u
+( a )

Valoarea comun a celor dou sume este valoarea fluxului i


se noteaz v( ).
Definiia 7.3. Un arc uU pentru care (u)= c(u) se numete
arc saturat.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

74

Problem. n mulimea fluxurilor compatibile cu o reea dat,


exist cteva fluxuri particulare:
un flux de valoare zero, numit fluxul nul;
unul sau mai multe fluxuri de valoare maxim, numite fluxuri
maxime.
Se cere s se determine un flux maxim ntr-o reea.
Aplicaie. Fie o reea de cale ferat, unde se cunoate capacitatea
fiecrei linii. Care este cantitatea maxim care poate fi transportat
de la o staie s la o alt staie t, respectndu-se definiia 7.2, i cum
trebuie organizat transportul?
Exemple.
(1) Problema ilustrat n figura 7.1 are mai multe soluii posibile,
fiecare conducnd la aceeai valoare a fluxului maxim: cinci.
Capacitile arcelor exprimate n uniti snt: arcul (x0,x1) cinci,
arcele (x0,x2) i (x2,x3) doi, i arcele (x1,x2) i (x1,x3) trei.
n prima soluie se propune transportarea a patru uniti de la x0
la x1, apoi dou uniti se transport de la x1 la x3, i celelalte dou
uniti de la x1 la x2. Din x0 se transport o unitate la x2, i de aici se
preiau trei (dou plus una) uniti care se transport la x3. Astfel din
x0 pleac cinci uniti care ajung n x3.

Figura 7.1. O reea de transport i dou soluii posibile.

(2) Problema ilustrat n figura 7.2 are o singur soluie. Pe ruta


(x0,x1,x4,x5) se transport o unitate, i pe ruta (x0,x2,x3,x5) se
transport de asemenea o unitate (figura 7.5).
Aceast problem va fi folosit ca exemplu n seciunea 7.4
pentru implementarea algoritmului Edmonds-Karp.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

75

Figura 7.2. Reea de transport, model pentru algoritmul Edmonds-Karp.

7.2. Determinarea unui flux maxim


ntr-o problem practic, nainte de a determina fluxul maxim,
graful se ajusteaz astfel: se renun la arcele care intr n vrful s, i
la arcele care ies din vrful t. nainte de a descrie un algoritm care
determin un flux maxim ntr-o reea definim noiunea de tietur n
reea.
Definiia 7.4. Fie YX o submulime cu proprietatea c sY i
+
tY. Submulimea (Y) = {(x,y)U|xY i yY} este o
tietur n reea. Capacitatea tieturii este:
+

c( (Y)) =

c(u )

u
+( Y )

Teorema 7.1. Pentru orice flux i orice tietur (Y) avem:


+
v( ) c( (Y)) (Ford, Fulkerson)
Demonstraie. Fiind dat o tietur, orice flux trebuie s o
strbat pentru a ajunge de la s la t. Fluxul poate s satureze unele
arce ale reelei, pe altele nu. Dac toate arcele ar fi saturate, am avea
+
+
v( ) = c( (Y)), altfel v( ) < c( (Y)).

Algoritmul Ford-Fulkerson
Se pornete iniial cu fluxul nul. Un flux compatibil oarecare se
majoreaz folosind urmtorul procedeu de marcare a vrfurilor, vrful
s fiind ntotdeauna marcat:
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

76

a)dac x este marcat i (x,y)U, iar (x,y)<c(x,y), atunci se


marcheaz vrful y cu +x;
b)dac x este marcat i (y,x)U, iar (y,x)> 0, atunci se marcheaz
vrful y cu x;
c)dac x este marcat i (x,y)= c(x,y) sau (y,x) = 0, atunci vrful
y nu se poate marca.
Dac prin acest procedeu se ajunge s se marcheze vrful t, exist
un lan de la s la t cu toate vrfurile marcate. Notm cu A
submulimea arcelor sale din categoria a) i cu B submulimea arcelor
sale din categoria b). Punem:
wa := min {c(u) (u)|uA};
wb := min { (u)| u C}
w := min (wa,wb)

Definim un flux nou astfel: (u) :=

(u) + w, u A

(u) w, u B
(u ) , u

care are proprietatea c v( ) = v( )+w


Pentru obinerea unui flux maxim se repet aceast procedur
pn cnd vrful t nu se mai poate marca.
Rmne s demonstrm c ultimul flux este maxim. Fie acesta
i fie Y submulimea vrfurilor care au putut fi marcate n reea dup
introducerea acestui flux. Deoarece sY i tY, se poate defini o
+
tietur (Y). Avem:
v( ) =
Dar

( u )
( u )

u
+( Y )

(u ) =

u
+(Y )

u
( Y )

c(u) deoarece altfel s-ar putea continua

marcajul n Y prin arce de categoria a).

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

77

De asemenea

( u )

u
(Y )

= 0 deoarece altfel s-ar putea

continua marcajul n Y prin arce de categoria b).


+
Deci v( )= c( (Y)) i, conform teoremei 7.1, fluxul este
+
maxim, iar capacitatea tieturii (Y) este minim. Rezult
Teorema 7.2 (Ford-Fulkerson, 1956). ntr-o reea de transport,
valoarea maxim a fluxului este egal cu capacitatea minim a
tieturilor.
n lucrarea Introducere n algoritmi (Cormen et al) snt descrii
n detaliu mai muli algoritmi care determin fluxul maxim. Cei mai
eficieni algoritmi folosesc conceptul de preflux. ntr-o prim faz se
parcurge reeaua de la s la t i se obine un pseudoflux, care nu
respect legea conservrii, deoarece are proprietatea:

(u )
(u )

u
( x )

u
+( x )

pentru orice x s i x t

Cantitatea care intr n vrful t coincide cu valoarea fluxului


maxim. n faza a doua se parcurge reeaua de la t la s pentru a elimina
surplusurile i astfel se obine un flux maxim.

7.3. Algoritmul Edmonds-Karp


Algoritmul Ford-Fulkerson nu precizeaz cum se determin
lanurile pe care se va mri fluxul dac se iau n considerare toate
lanurile posibile, complexitatea algoritmului poate deveni
exponenial. De aceea au fost elaborate metode de accelerare a
acestuia, care conduc la un ordin polinomial de complexitate. O astfel
de tehnic a fost elaborat de Edmonds i Karp.
Pentru a determina un lan pe care urmeaz s se mreasc fluxul
se construiete graful ecart al reelei de transport curente. Acest graf
are aceeai mulime de vrfuri X, i mulimea U a arcelor este definit
astfel:
arce de tip (a): dac (x,y) < c(x,y) atunci (x,y) U
arce de tip (b): dac (x,y) > 0 atunci (y,x) U

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

78

Fie un drum de lungime minim de la s la t n graful ecart, ( u 0' ,


u1' , ..., u k' 1 ). Acest drum corespunde unui lan n reeaua curent,
pe care se poate obine mrirea fluxului. Pe lanul corespondent L(
u0 , u1 , ..., u k 1 ), care nu este neaprat un drum, se determin:
wa := min { c(u) (u) | u L de tip (a) }
wb := min { (u) | u L de tip (b) }
w := min (wa, wb)
Pe acest lan se mrete fluxul:

(u) :=

(u) + w, u e s tae r cd et i p(a )

(u) w, u e s tae r cd et i p(b)

Dac nu exist nici un drum ntre s i t, algoritmul se ncheie i


fluxul obinut este maxim.
Algoritmul de determinare a unui drum de lungime minim
reuete s marcheze cteva vrfuri din graful ecart, cel puin vrful s.
Cu ajutorul algoritmului Edmonds-Karp se poate determina i
tietura de capacitate minim, dac se iau toate arcele cu vrfuri
iniiale din mulimea celor marcate i cu vrfuri finale din mulimea
celor nemarcate.
Algoritmul Edmonds-Karp are complexitate teoretic de ordin
O(n m2).

Tehnici de implementare
Reeaua de transport din figura 7.2 este folosit ca exemplu pentru
a arta cum lucreaz algoritmul Edmonds-Karp. Aceast reea se
reprezint astfel:
Hr 0 2 4 5 6 7 7
Sr 1 2 3 4 3 5 5
C 1 2 3 2 3 1 3
(0) (1) (2) (3) (4) (5) (6)
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

79

Pentru a uura citirea corespondenei dintre reeaua original i


graful ecart am pus n eviden indicii n masivul Sr.
n figura 7.3 se marcheaz fluxul nul (stnga) i se construiete
graful ecart (dreapta). n graful ecart este marcat un drum de lungime
minim (x0, x1, x3,x5) cu linie continu, i celelalte arce cu linie
ntrerupt.

Figura 7.3. Algoritmul Edmonds-Karp dup iniializare.

Pe acest drum se determin valoarea cu care va fi mrit fluxul:


(x0, x1): c(x0,x1) (x0,x1) = 1 0 = 1
(x1, x3): c(x1,x3) (x1,x3) = 3 0 = 3
(x3, x5): c(x3,x5) (x3,x5) = 1 0 = 1
Fluxul va fi mrit pe acest drum cu valoarea 1.
Graful ecart din figura 7.3 se reprezint astfel:
He 0 2 4 5 6 7 7
Se 1 2 3 4 3 5 5
P 0 1 2 3 4 5 6
(0) (1) (2) (3) (4) (5) (6)
Masivul P are urmtoarea semnificaie. (x,y) este un arc n graful
ecart, i succesorul y se afl pe poziia j n masivul Se: Se[j]= y. P[j]
indic poziia arcului corespondent din graful original. n aceast faz
P[j]= j (j= 0,1,...,n1) deoarece exist o coresponden unu la unu
ntre arcele celor dou grafuri, i orientrile arcelor corespondente
coincid.

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

80

Figura 7.4. Algoritmul Edmonds-Karp dup prima iteraie.

n figura 7.4 se marcheaz fluxul obinut dup mrire (stnga), i


se construiete graful ecart (dreapta). Drumul de lungime minim este
(x0,x2,x3,x1,x4,x5). n aceast figur exist un arc de tip (b) (x3,x1).
Iniial fluxul de pe arcul (x0,x1) a fost direcionat spre arcul (x1,x3) i
apoi spre arcul (x3,x5). La pasul urmtor se constat c de fapt un flux
care pleac pe ruta (x0,x2,x3) nu poate ajunge n x5, i de aceea fluxul
care a avut ruta (x0,x1,x3,x5) trebuie redirecionat pe o alt rut
(x0,x1,x4,x5). Astfel se explic de ce la a doua iteraie drumul
determinat n graful ecart este (x0,x2,x3,x1,x4,x5).
Pe acest drum se determin valoarea cu care va fi mrit fluxul:
(x0, x2): c(x0,x2) (x0,x2) = 2 0 = 2
(x2, x3): c(x2,x3) (x2,x3) = 3 0 = 3
(x3, x1): (x1,x3) = 1 (arcele corespondente au orientri
opuse)
(x1, x4): c(x1,x4) (x1,x4) = 2 0 = 2
(x4, x5): c(x4,x5) (x4,x5) = 3 0 = 3
Fluxul va fi mrit pe acest drum cu valoarea 1.
Graful ecart din figura 7.4 se reprezint astfel:
He 0 1 3 4 5 6 6
Se 2 3 4 3 1 5
P 1 2 3 4 2 6
(0) (1) (2) (3) (4) (5)
S analizm dou corespondene de arce pentru acest caz.
Arcul (x1,x4) din graful ecart, care corespunde arcului (x1,x4) din
reea, este memorat astfel. Pe poziia j= 2 este memorat vrful final
x4: Se[j]= 4. P[j]= k= 3 indic faptul c arcul corespondent din
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

81

reea este memorat pe poziia k: Sr[k]= 4. Ambele arce au acelai vrf


final, deci au aceeai orientare.
Arcul (x3,x1) din graful ecart, care corespunde arcului (x1,x3) din
reea, este memorat astfel. Pe poziia j= 4 este memorat vrful final
x1: Se[j]= 1. P[j]= k= 2 indic faptul c arcul corespondent din
reea este memorat pe poziia k: Sr[k]= 3. Cele dou arce nu au
acelai vrf final, deci au orientri opuse.
n figura 7.5 se observ c dup ce s-a marcat fluxul obinut dup
mrire (stnga), i s-a construit graful ecart (dreapta), nu mai exist
drumuri de la x0 la x5. n concluzie algoritmul se ncheie n aceast
faz, obinndu-se fluxul maxim de valoare doi.

Figura 7.5. Algoritmul Edmonds-Karp dup a doua iteraie.

Algoritmul de determinare a unui drum de la x0 la x5 reuete s


marcheze doar vrfurile x0, x2 i x3. Se obine astfel o tietur format
din arcele (x0,x1) i (x3, x5), care are capacitate doi.
Sintez. Pentru fiecare arc din graful ecart se memoreaz adresa
unde este localizat arcul corespondent din graful original, pentru a
putea vedea la examinarea drumului dac dou arce corespondente
snt identice sau au orientri opuse.
Arcul (x,y) este memorat pe poziia k n reea: Sr[k]= y. Cele
dou situaii posibile se trateaz astfel:
dac (x,y) < c(x,y), i y este memorat ca succesor al lui x pe
poziia j, atunci Se[j] := y i P[j] := k;
dac (x,y) > 0, i y este memorat ca succesor al lui x pe poziia j,
atunci Se[j] := x i P[j] := k.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

82

Pentru a mbunti performanele algoritmului, graful ecart se


reprezint astfel nct s fie posibil tergerea unui arc u, care are ca
i corespondent n graful original arcul u, n urmtoarele situaii:
dac u i u au aceeai orientare i (u) = c(u) dup actualizare;
dac u i u au orientri opuse i (u) > 0 dup actualizare.
Cnd nu se mai poate determina un drum ntre s i t n graful ecart,
acesta se reconstruiete dup regulile precizate mai sus. Algoritmul se
ncheie dac dup reconstruire se obine un graf ecart n care nu exist
nici un drum de la s la t.
Pentru a obine un graf ecart cu strictul necesar de arce, acesta nu
va avea arce care intr n s i nici arce care ies din t.

7.4. Flux minim ntr-o reea de transport


Problem. Fie G= (X,U,c) o reea de transport pentru care
definim o alt lege a compatibilitii fluxului: (u) c(u)
Se cere s se determine unui flux minim compatibil cu
capacitile arcelor din reea.
Deoarece fluxul nul nu este compatibil, dar respect legea
conservrii fluxului, este nevoie ca ntr-o prim faz s se obin un
flux compatibil.
Se determin un drum de la s la t care conine cel puin un arc
u astfel nct (u)<c(u). Pe acest drum fluxul se corecteaz astfel:
(u) := (u) + w, unde w:= max{c(u) (u) | u }
Aceast procedur se repet pn cnd (u) c(u) pentru orice
arc uU.
Identificarea unor drumuri care s acopere n final toate arcele
reelei este o procedur complex, deoarece dac reeaua are circuite
este nevoie s se ia n considerare toate arcele aflate pe aceste
circuite.
n faza a doua fluxul compatibil se micoreaz dup un algoritm
asemntor celui care determin un flux maxim. Mulimea U a
arcelor grafului ecart se definete astfel:
a) dac (x,y)U i (x,y)> c(x,y), atunci (x,y)U;
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

83

b) dac (x,y) U atunci (y,x)U.


Pe orice arc din categoria (a) fluxul ar putea scdea. Pe de alt
parte, pe orice arc fluxul ar putea crete, cu condiia s existe arce
vecine pe care fluxul s scad n compensaie.
Fie un drum de la s la t n graful ecart, ( u 0' , u1' , ..., u k' 1 ).
Acest drum corespunde unui lan n reeaua curent, pe care se poate
obine micorarea fluxului. Pe lanul corespondent L( u0 , u1 , ...,
u k 1 ), care nu este neaprat un drum, se determin:
w := min { (u) c(u) | u L de tip (a) }
Pe acest lan se micoreaz fluxul:

(u) :=

(u) w, u e s tae r cd et i p(a )

(u) + w, u e s tae r cd et i p(b)

Pentru problema fluxului minim nu se cunosc algoritmi de


complexitate polinomial, aceasta fiind NP-complet.

7.5. Problem de transport pentru graf bipartit


m

min

i=1 j=1

ij

xij

cij 0

xij

j=1

= ai

1 i m

= bj

1 j n

xij

i=1
xij 0
m

unde

1 i m, 1 j n

a i = b j

j=1
i=1

ai 0, bj 0

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

84

Acestei probleme i se asociaz un graf bipartit G = (S,D,U,c)


unde |S|= m, |D|= n, i c este o funcie cost.
Grafului bipartit i se asociaz un tabel de transport care are m
linii i n coloane. Fiecare celul (i,j) conine costul cij i valoarea
variabilei xij. Tabelul mai conine o coloan suplimentar n care snt
nscrise valorile ai (1 i m), i o linie suplimentar n care snt
nscrise valorile bj (1 j n).
Determinarea unei soluii iniiale de baz. O soluie a
sistemului de m+n ecuaii cu mn necunoscute este o soluie de baz
dac masivele coloan ale matricei sistemului corespunztori
componentelor nenule ale soluiei snt liniar independente. Deci o
soluie de baz are cel mult m+n-1 componente nenule (acesta este
rangul matricei sistemului).
Metoda general de obinere a unei soluii iniiale de baz este
urmtoarea. Se fixeaz o celul (i,j) i se atribuie variabilei x ij
valoarea x ij= min(ai,bj). Dac x ij= ai se suprim linia i din tabelul
de transport i se nlocuiete bj cu bjai. Dac x ij= bj se suprim
coloana j din tabelul de transport i se nlocuiete a i cu aibj. Dac x
ij= ai= bj se suprim la alegere linia i sau coloana j. Dac, de
exemplu, se suprim linia i, atunci bj se nlocuiete cu 0.
Procedeul se continu pe toate tabelele reduse care se pot obine
n acest mod. Numrul variabilelor care primesc componente nenule
prin aceast metod este cel mult m+n1.
Metode particulare de obinere a unei soluii iniiale de baz:
a) Metoda colului de nord-vest. Se alege pentru introducerea n baz
a variabilei corespunztoare celulei situate n prima linie i prima
coloan (colul de nord-vest) a tabelelor reduse.
b) Metoda costului minim. La fiecare pas al metodei generale se
selecteaz celula (i,j) corespunztoare costului minim cij din tabelele
reduse.
Notm cu B mulimea celulelor (i,j) corespunztoare variabilelor
iniializate, i cu S mulimea celorlalte celule din tabelul de transport.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

85

Graful parial care conine muchiile corespunztoare celulelor din B


este un arbore.
Teorem. Pentru fiecare celul (i,j)S exist un ciclu elementar
unic format de celula (i,j) cu o parte din celulele mulimii B. Acest
ciclu are proprietatea urmtoare: orice dou celule consecutive se afl
pe aceeai linie sau coloan a tabelului de transport, fr ca trei celule
s se afle pe aceeai linie sau coloan.
Demonstraie. Teorema este evident deoarece:
- dac se adaug o muchie ntr-un arbore, se formeaz un ciclu
elementar unic;
- un ciclu elementar nu trece de dou ori prin acelai vrf.
Determinarea unei soluii optime de baz. n aceast faz
fiecare pas al algoritmului de transport efectueaz urmtoarele
operaii:
a) Pentru fiecare celul (i,j)S se determin ciclul corespunztor.
Se marcheaz celulele din ciclu alternativ cu + i , ncepnd cu celula
(i,j) care se marcheaz cu +. Se determin suma algebric a costurilor
din celulele marcate, avnd ca semn marcajul celulelor.
b) Se reine celula (k,l)S pentru care suma algebric calculat este
minim. Dac suma este pozitiv sau zero, algoritmul se oprete:
soluia obinut este optim. n caz contrar se determin valoarea w =
min {xij | (i,j) este celul marcat cu n ciclul }.
Fie (p,q) celula pentru care w= xpq.
c) Pentru (i,j) celul din ? marcat cu + se calculeaz xij := xij+w.
Pentru (i,j) celul din ? marcat cu se calculeaz xij := xijw.
n acest moment variabila xkl intr n baz i variabila xpq iese din
baz. Se trece la punctul a).
Dac la sfritul pasului b suma algebric calculat este strict
pozitiv, problema de transport are soluie optim unic.
Determinarea tuturor soluiilor optime. Se reine tabelul de
transport din momentul obinerii unei soluii optime. Dac n acest
tabel suma algebric calculat pentru celula (k,l) este 0, se poate
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

86

obine o alt soluie optim prin introducerea n baz a variabilei xkl,


variabila care iese din baz fiind determinat cu criteriul obinuit.
Pentru determinarea tuturor soluiilor optime de baz, se caut n
tabelul reinut mai sus toate celulele (k,l)S pentru care suma
algebric calculat este zero.
Orice soluie optim a problemei de transport este o combinaie
liniar convex a soluiilor optime de baz. Un vector x este
combinaie liniar convex a vectorilor x1, x2, ... xk dac exist
numerele reale l1, l2, ... lk astfel nct:
0 li 1 pentru 1 i k i

i=1

i=1

i =1, x = i x i

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

87

8. Grafuri planare
8.1. Definiii i proprieti
Pentru a reprezenta unele structuri geometrice n plan sau n
spaiu se folosete o categorie special de structuri de date: grafuri
planare.
Definiia 8.1. Un graf G este planar dac este posibil s fie
reprezentat pe un plan astfel nct vrfurile s fie distincte, muchiile
curbe simple i dou muchii s nu se intersecteze dect la
extremitile lor (dac snt adiacente).
Reprezentarea grafului conform cu condiiile impuse se numete
graf planar topologic i se noteaz tot prin G. Nu se consider
distincte dou grafuri planare topologice dac le putem face s
coincid prin deformarea elastic a planului.
Definiia 8.2. O fa a unui graf planar este o regiune a planului
delimitat de muchii, care are proprietatea c orice dou puncte din
aceast regiune pot fi unite printr-o curb simpl care nu ntlnete
nici muchii i nici vrfuri.
Definiia 8.3. Frontiera unei fee este mulimea muchiilor care
ating faa respectiv. Dou fee snt adiacente dac frontierele lor au
cel puin o muchie comun.
ntr-un graf topologic, frontiera unei fee este format din unul
sau mai multe cicluri elementare disjuncte, din muchii suspendate sau
care unesc dou cicluri disjuncte (istmuri).
Definiia 8.4. Conturul unei fee este conturul ciclurilor
elementare care conin n interiorul lor toate celelalte muchii ale
frontierei.
Exist ntotdeauna o fa infinit i care are frontier, dar nu are
contur; toate celelalte fee snt finite i admit un contur.
Teorema 8.1 (Euler). ntr-un graf planar topologic conex cu n
vrfuri, m muchii i ffee avem relaia:
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

88

nm+f = 2
Demonstraie (Tomescu 1981, pg 203-204). Dac f = 1 atunci
m = n1 pentru un arbore (teorema 6.2), deci relaia este adevrat.
Presupunem afirmaia adevrat pentru orice graf planar conex
cu f 1 fee, i s considerm un graf planar conex cu f fee. Fie (x,y)
o muchie a unui ciclu; aceasta se afl pe frontiera a dou fee S i T.
Dac eliminm muchia (x,y) se obine un graf planar conex cu n = n
vrfuri, m = m1 muchii i f = f 1 fee. Conform ipotezei de
inducie nm+f = n1m+1+f = 2, de unde obinem c nm+f =
2.
Corolar 8.2. n orice graf planar topologic conex cu n vrfuri, m
muchii i f fee avem:
(i) n 2m/3 ;
m 3f6 ;
n 2f4
(dac fiecare vrf are gradul cel puin trei)
(ii) f 2m/3 ;
m 3n6 ;
f 2n4
(dac graful are cel puin dou muchii)
Demonstraie. (i) Din fiecare vrf pleac cel puin trei muchii, i
fiecare muchie unete dou vrfuri; rezult 3n 2m. Celelalte dou
inegaliti rezult prin simpl nlocuire.
(ii) Dac m = 2 atunci f = 1 i n = 3. Dac f = 1 i m > 2 atunci
n= m+1. Dac f 2 atunci fiecare fa are cel puin trei laturi
(muchii), i o muchie este comun la cel mult dou fee; rezult
3f 2m. Celelalte dou inegaliti rezult prin simpl nlocuire.
S considerm n spaiul tridimensional un poliedru convex cu n
vrfuri, m muchii i f fee. Putem s-l reprezentm pe o sfer astfel
nct dou muchii s nu se intersecteze dect la extremiti. Efectund
o proiecie stereografic al crei centru s fie n mijlocul unei fee,
poliedrul se poate reprezenta pe un plan. Graful fiind planar, se
obine relaia lui Euler nm+f = 2.
S considerm un graf planar topologic conex G, cruia i facem
s-i corespund un graf planar topologic G* astfel:
n interiorul fiecrei fee s din G plasm un punct x* din G*;

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

89

fiecrei muchii u din G i facem s-i corespund o muchie u* din


G* care unete vrfurile x* i y* corespunztoare feelor s i t
situate de o parte i de alta a muchiei u.
Graful G* este de asemenea planar (figura 8.1).

Figura 8.1. Un graf planar (a) i dualul su (b).

8.2. Reprezentarea unui graf planar


n continuare prezentm o descriere simplificat a unei structuri
de date (Preparata, Shamos) (de Berg et al), folosit pentru
reprezentarea n memorie a unui graf planar.
S considerm o diviziune a planului indus de un graf planar n
care muchiile snt segmente de dreapt (PSLG planar straight line
graph). Considerm de asemenea c o muchie este deschis, adic
vrfurile nu aparin muchiei. O fa a diviziunii este o mulime
conex maximal care nu conine nici un punct pe muchie i nici un
vrf; o fa este deci o regiune poligonal deschis a crei frontier
este format din muchii i vrfuri ale diviziunii. Complexitatea
diviziunii este definit ca suma dintre numrul de vrfuri, numrul de
muchii i numrul de fee care o compun. Dac un vrf este captul
unei muchii, spunem c vrful i muchia snt incidente, de asemenea
o fa i un vrf de pe frontier snt incidente.
O astfel de reprezentare a diviziunii este util, de exemplu, pentru
a parcurge frontiera unei fee date, sau pentru a determina o fa
adiacent alteia fiind dat o muchie comun. Reprezentarea discutat
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

90

n continuare suport toate aceste operaii; aceasta este numit list


de muchii dublu conectat (DCEL doubly connected edge list).
O list de muchii dublu conectat se compune din cte o
nregistrare pentru fiecare fa, muchie i vrf al subdiviziunii.
Informaiile despre geometria i topologia diviziunii memorate n
list trebuie s permit operaiile de baz menionate mai sus. Pentru
a putea parcurge frontiera unei fee n sens trigonometric memorm
un pointer de la fiecare muchie la urmtoarea. O muchie este
incident de regul la dou fee, astfel c este convenabil s vedem
cele dou orientri ale unei muchii ca i doi vectori distinci. Avem
deci un singur vector urmtor i un singur vector precedent pentru
fiecare vector. Aceasta nseamn c un vector este incident la o
singur fa. Cei doi vectori pe care i obinem dintr-o muchie se
numesc gemeni. Definirea vectorului urmtor al unui vector n raport
cu o parcurgere n sens trigonometric a unei fee pe care o mrginete
induce o orientare pentru fiecare vector: un vector este orientat astfel
nct faa pe care o mrginete se afl n stnga pentru un observator
aflat pe muchie. Deoarece un vector este orientat putem vorbi despre

originea i destinaia acestuia. Dac un vector e are vrful x ca


origine i vrful y ca destinaie, vectorul geamn are vrful y ca
origine i vrful x ca destinaie. Pentru a regsi frontiera unei fee
avem nevoie s memorm n nregistrarea feei un pointer ctre un
vector oarecare care mrginete faa. ncepnd cu acest vector putem
determina urmtorul vector i astfel s parcurgem faa.
n concluzie, lista de muchii dublu conectat se compune din trei
colecii de nregistrri: una pentru vrfuri, una pentru fee i una
pentru vectori. Aceste nregistrri memoreaz urmtoarea informaie
geometric i topologic:
nregistrarea de tip vrf memoreaz coordonatele unui vrf x, i
eventual un pointer spre unul din vectorii care au originea n acest
vrf;
nregistrarea de tip fa memoreaz un pointer spre nregistrarea
unui vector oarecare incident la faa respectiv; o fa este descris
ca o list circular nlnuit de vectori;

nregistrarea de tip vector a unui vector e memoreaz doi


pointeri spre vrfurile origine i destinai, un pointer spre geamnul
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

91


su, i un pointer spre faa Fata( e ) pe care o mrginete; originea

lui e se alege astfel nct faa incident s se afle la stnga dac


vectorul este parcurs de la origine la destinaie; se memoreaz de

asemenea un pointer ctre vectorul urmtor Urm( e ), care

mrginete aceeai fa ca i e .

Figura 8.2. Lista de muchii dublu conectat.

Vrf
x0
x1
x2
x3
Vector

e1, 2

e2 , 0

e0,1

e1, 3

e3, 2

Coord
(3,2)
(1,2)
(1,2)
(3,2)

Faa
f0
f1

Un vector incident

e1, 2

e2 , 4

e0,1

Origine
x0

Destinaie
x1

Geamn

Faa
f0

e1, 2

x1

x2

e2 ,1

f0

e2 , 0

x2

x0

f0

e2,1

x2

x1

e1, 2

f1

e1, 3

x1

x3

f1

Urm

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

92


e2,1

e3, 2

x3

x2

f1

n multe probleme practice nu avem nevoie ca regiunea infinit


s fie memorat n mod explicit. Un caz de excepie este de exemplu
reprezentarea unui poliedru convex, unde una din fee (nu are
importan care, nici nu se precizeaz n reprezentare) este
considerat a fi infinit. n exemplul din figura 8.2 am memorat n
list doar cele dou regiuni finite ale domeniului: f0 i f1, mpreun cu
cei ase vectori incideni acestor fee.
Dac trebuie s memorm i o fa infinit f2, atunci aceasta este

descris de succesiunea de vectori e0, 2 e2 ,3 e3,1 e1, 0 . n acest


caz se completeaz n mod corespunztor coleciile de nregistrri
corespunztoare feelor i vectorilor.
Definiia 8.5. O triangulare (graf planar triangulat) a unei
mulimi de puncte P este un graf planar cu urmtoarele proprieti:
conturul feei infinite coincide cu nfurtoarea convex a mulimii
P, i toate feele finite snt triunghiuri.
Un graf planar triangulat este folosit pentru a reprezenta
diagrama Delaunay a unei mulimi de puncte n plan (Preparata,
Shamos) (de Berg et al). Unii algoritmi, care determin
nfurtoarea convex a unei mulimi de puncte n spaiu, folosesc
de asemenea un graf planar triangulat. Aceste diagrame au o
proprietate special: cu excepia unor cazuri particulare degenerate,
toate feele finite snt triunghiuri. nfurtoarea convex n spaiu are
toate feele triunghiuri, i nu se pune problema unui marcaj special
pentru faa infinit, deoarece fiecare fa ar putea fi considerat astfel
(dac ar fi nevoie).
innd seama de particularitile algoritmilor care opereaz cu
grafuri planare triangulate, se poate utiliza o reprezentare
simplificat, descris n continuare. Aceasta prezint avantajul c o
fa este descris chiar de informaiile coninute n entitatea
respectiv, nemaifiind necesar o procedur de parcurgere care s
determine conturul acesteia. n continuare este descris o
reprezentare simplificat fa de cea din lucrarea citat, prin aducerea
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

93

vectorilor care descriu o fa n entitatea corespunztoare feei. n


plus, pentru a uura procedurile de gestionare a unei fee, se introduc
informaii auxiliare.
Mulimea vrfurilor (nodurilor) este memorat ntr-un tablou
unidimensional, i fiecare nod este identificat prin poziia acestuia n
tablou (p0, ..., pn1). Celelalte dou colecii de nregistrri, fiind
formate din entiti care se construiesc pe parcurs, unele fiind
nlocuite de altele, snt memorate sub form de liste dublu nlnuite.
Fiecare entitate de tip fa memoreaz urmtoarele informaii:
adresele celor trei muchii care definesc faa; ordinea acestora
descrie faa n sens trigonometric, o fa a nfurtorii convexe fiind
vzut astfel din exterior;
informaii auxiliare: descrierea planului care conine faa
(coeficienii planului), sau descrierea cercului circumscris feei
(centrul i raza acestuia).
Fiecare entitate de tip muchie memoreaz urmtoarele informaii:
indecii celor dou puncte care definesc muchia: i i j;
adresele celor dou fee incidente muchiei, prima fa fiind cea

aflat la stnga vectorului ei , j , a doua fiind cea aflat la dreapta.

8.3. Planificarea traiectoriei unui robot


Unul dintre scopurile finale ale roboticii este proiectarea unor
roboi autonomi: roboi crora s le spunem ce s fac fr s fie
nevoie s le spunem cum s fac. Printre altele, un robot trebuie s-i
poat planifica micarea. Pentru aceasta robotul trebuie s aib
cunotine despre mediul n care se va deplasa. De exemplu, un robot
mobil care se deplaseaz n jurul unei fabrici trebuie s tie unde snt
localizate obstacolele. Folosind informaii despre mediu robotul
trebuie s ajung ntr-o poziie final evitnd coliziunea cu orice
obstacol.
Problema general a planificrii micrii este destul de dificil,
de aceea facem o serie de simplificri. Considera problema
planificrii micrii n plan, astfel c mediul este o regiune planar
compus din obstacole de form poligonal. n prima etap
considerm c robotul este un punct, iar n a doua un disc.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

94

Presupunem de asemenea c mediul este static nu exist obstacole


mobile i cunoscut n ntregime de robot. Aceste restricii nu snt
chiar aa de severe cum ar prea la prima vedere: pentru un robot
care se deplaseaz ntr-un mediu planar de lucru, o modelare a
acestuia (poligoane pentru ziduri, mese, maini .a.) este adesea
suficient.
Micrile pe care le poate efectua un robot snt stabilite n
momentul proiectrii acestuia: unii roboi se pot deplasa n orice
direcie, se pot roti n jurul unei axe, n timp ce alii au limitri destul
de severe (de exemplu o main trebuie s se deplaseze paralel cu
frontiera unui obstacol).
Fie un robot punctual R i o mulime de obstacole poligonale
S := {P0, P1, ..., Pp1}, numrul total de vrfuri fiind n. Pentru nceput
construim o structur de date care memoreaz o reprezentare a
spaiului liber (n care robotul se poate deplasa). Aceasta poate fi
ulterior folosit pentru a determina o traiectorie ntre oricare dou
puncte date: cel de plecare (start) i cel destinaie (terminus).
Pentru a simplifica descrierea restrngem deplasarea robotului la
o zon dreptunghiular B care conine mulimea poligoanelor. Cu alte
cuvinte, adugm un extra-obstacol infinit care este zona aflat n
exteriorul dreptunghiului B. Spaiul liber este acel fragment al zonei
B neacoperit de nici un obstacol:
t

Free(S ) = B\
Pi

i =1

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

95

Figura 8.3. O subdiviziune trapezoidal a spaiului liber.

Pentru reprezentarea spaiului liber se folosete o structur de


date numit hart trapezoidal (trapezoidal map, figura 8.3). Aceasta
este o subdiviziune a planului format din trapeze, care se poate
determina folosind un algoritm bazat pe tehnica de scanare a
planului.
O hart trapezoidal poate fi determinat ntr-un timp de ordin
O(nlogn) (Preparata, Shamos) (de Berg et al). Deoarece ordinul de
mrime a hrii (numrul de trapeze) nu depete ordinul de mrime
al unei diagrame Delaunay (a se vedea capitolul 6), rezult c harta
are o mrime de ordin O(n), deci liniar.
Rmne un detaliu de rezolvat: cum se folosete Free(S ) pentru
a gsi o traiectorie ntre un punct ps i un punct pt? Dac cele dou
puncte se afl n acelai trapez, robotul se deplaseaz pur i simplu
din ps n pt.
n cazul n care cele dou puncte se afl n trapeze diferite,
traiectoria va traversa un anumit numr de trapeze i va avea un
anumit numr de schimbri de direcie. n acest scop construim un
graf G care reprezint harta drumurilor libere. Acesta este un graf
planar ale crui noduri i arce se afl n spaiul liber Free(S ). Cu
excepia punctului de start i a punctului terminus, orice traiectorie va
urma ntotdeauna aceast hart. S observm c orice dou trapeze
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

96

vecine partajeaz o muchie vertical, fapt care conduce la definirea


hrii dup cum urmeaz. Plasm cte un nod n centrul fiecrui
trapez, i de asemenea cte un nod n mijlocul fiecrei muchii comune
la dou trapeze. n continuare definim arce ntre dou noduri dac i
numai dac un nod este centrul unui trapez i cellalt este pe frontiera
aceluiai trapez. Arcele se reprezint grafic ca i segmente de
dreapt, astfel c parcurgerea unui arc de pe hart corespunde unei
deplasri n linie dreapt a robotului. Harta drumurilor poate fi
construit ntr-un timp de ordin O(n) prin traversarea listei de muchii
dublu conectate corespunznd la Free(S ). Folosind arcele din harta
drumurilor ne putem deplasa dintr-un nod aflat n centrul unui trapez
n nodul aflat n centrul unui trapez vecin via nodul aflat pe muchia
comun.

Figura 8.4. Determinarea hrii drumurilor libere


Putem folosi harta drumurilor, mpreun cu harta trapezoidal,
pentru a planifica deplasarea ntre dou puncte (figura 8.4). Mai nti
determinm trapezele s i t care conin cele dou puncte. Dac
acestea nu se afl n acelai trapez, s presupunem c vs i vt nodurile
din graf care au fost plasate n centrele celor dou trapeze. Drumul
dintre vs i vt pe care l construim se compune din trei pri: prima
parte este un segment de dreapt de la ps la vs, a doua parte este un
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

97

drum de la vs la vt, i a treia parte este un segment de dreapt de la vt


la pt.
Un drum ntre dou vrfuri poate fi determinat cu ajutorul
algoritmului lui Dijkstra.
n a doua etap presupunem c robotul R este un disc de raz r cu
centrul aflat n ps, i trebuie s ajung cu centrul n pt fr s
penetreze vreun obstacol. Am precizat mai sus c unii roboi au
limitri destul de severe n ceea ce privete libertatea de micare.
Pentru simplificare vom considera c discul acoper n ntregime
robotul.
Ca i pn acum, obstacolele snt poligoane disjuncte. Problema
robotului discoidal poate fi adus la problema precedent astfel. ntro prim faz, de preprocesare, se nconjur fiecare poligon cu o
band de lime egal cu r (raza discului), care este chiar urma pe
care ar lsa-o discul deplasndu-se de-a lungul frontierei poligonului
(a se vedea figura 4.??).
Se impune o observaie: prin extinderea obstacolelor este posibil
ca din dou obstacole s se obin unul singur, atunci cnd dou noi
obstacole nu mai snt disjuncte.
n faza a doua fiecare obstacol nou construit se ajusteaz pentru
vrfurile convexe, nlocuindu-se arcele de cerc cu segmente tangente
la aceste arce.
n continuare robotul poate fi redus la un punct i se poate astfel
determina un drum ntre cele dou vrfuri s i t.

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

98

9. Probleme NP-complete
9.1. Mulimi intern stabile
Definiia 9.1. Fie G = (X, U) un graf orientat. O mulime S X
este intern stabil (independent) dac pentru orice x,y X avem
(x,y) U i (y,x) U.
Proprieti. Dac I este familia mulimilor intern stabile atunci:
a) I ;
b) SI i AS AI ;
c) S1, S2 I S1 S2 I .
Definiia 9.2. O mulime S este intern stabil maximal dac
pentru orice AI , SA implic S = A.
Cu alte cuvinte, S este maximal n raport cu operaia de
incluziune.
Definiia 9.3. Numrul de stabilitate intern al grafului G este
valoarea (G) = max {|S| | SI }.
Mulimea intern stabil S pentru care |S| = (G) se numete
mulime intern stabil maxim.

Mulimi extern stabile


Definiia 9.4. Fie G = (X, U) un graf orientat. O mulime TX
este extern stabil (dominant) dac pentru orice y XT exist
xT astfel nct (x,y) U.
Proprieti. Dac E este familia mulimilor extern stabile
atunci:
a) XE ;
b) TE i TAX AE ;
c) T1, T2 E T1 T2 E ;
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

99

Definiia 9.5. O mulime T este extern stabil minimal dac


pentru orice AE , AT implic T= A.
Cu alte cuvinte, T este minimal n raport cu operaia de
incluziune.
Definiia 9.6. Numrul de stabilitate extern al grafului G este
valoarea (G) = min {|T| | TE }.
Mulimea extern stabil T pentru care |T| = (G) se numete
mulime extern stabil minim.
Pentru determinarea mulimilor extern stabile se definete mai
nti graful bipartit asociat unui graf orientat. Fie G = (X, G) un graf
orientat. Definim graful bipartit asociat G' = (X, X', ) astfel:
- X' = {x' | xX} este o mulime de vrfuri;
- :XX' este o aplicaie multivoc definit astfel: y' (x) dac i
numai dac x = y sau y (x).
Teorem. TX este extern stabil dac i numai dac (T) = X'
n G'.
Demonstraie. () Evident (T) X', deci rmne s
demonstrm c dac TX este extern stabil atunci X' (T). Fie
y'X'; dac yT atunci evident y' (y). Dac yX\T atunci exist
xT astfel nct (x,y) U, deci x (y) i atunci y' (x) (T).
() Fie y'X' = (T); cazul y T este banal; dac y X\T atunci
exist xT astfel nct y' (y), de unde rezult y (y) i deci (x,y)
U.

Nucleul unui graf


Definiie. Fie G = (X, U) un graf orientat. O mulime NX este
nucleu al grafului G dac este n acelai timp intern stabil i extern
stabil.
Nu orice graf admite un nucleu.
Proprieti. Dac N este nucleu al grafului G, atunci:
a) N (N) = i N (N) = X;
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

100

b) dac xX i x (x) atunci xN; dac xX i (x) = atunci


xN.
c) N este intern stabil maximal i extern stabil minimal.
Demonstraie. a) Afirmaia N (N) = este evident
deoarece N este mulime intern stabil. ntr-adevr, pentru orice x,y
N avem (x,y) U i deci x (y), de unde rezult N (N) = .
Pentru a demonstra a doua afirmaie trebuie s observm c N
(N) X, deci rmne s demonstrm c
X N (N). ntradevr, fie yX; dac y N\X, atunci (deoarece N este extern
stabil), exist xN astfel nct (x,y) U. Deci y (x) (N).
c) Presupunem c N nu este intern stabil maximal, deci exist o
mulime AI astfel nct NA i N A. Deci exist yA i yN.
Deoarece N este extern stabil, exist xN astfel nct (x,y) U, dar
xA i yA ceea ce contrazice presupunerea c AI . Deci N este
intern stabil maximal.

Numr cromatic
Definiia 1. Fiind dat un numr natural k, un graf este k-cromatic
dac vrfurile sale pot fi colorate cu cel mult k culori diferite, astfel
nct dou vrfuri adiacente s fie colorate diferit.
Definiia 2. Numrul cromatic al unui graf este cel mai mic
numr natural k pentru care graful este k-cromatic i se noteaz cu
(G).
Teorema lui Knig. Un graf este bicromatic dac i numai dac
nu conine cicluri de lungime impar.
Demonstraie. () Dac graful este bicromatic, atunci nu poate
conine cicluri de lungime impar, deoarece vrfurile unui astfel de
ciclu nu pot fi colorate cu dou culori fr s avem dou vrfuri
adiacente colorate identic.
() Considerm un graf fr cicluri impare i conex (dac nu este
conex, se consider separat fiecare component conex). Se
coloreaz din aproape n aproape vrfurile astfel:
- un vrf oarecare a se coloreaz n albastru;
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

101

- dac un vrf x este albastru, se coloreaz n rou toate vrfurile


adiacente cu x; dac un vrf y este rou, se coloreaz n albastru toate
vrfurile adiacente cu y.
Deoarece graful este conex, fiecare vrf va fi colorat i nici un vrf nu
va putea fi colorat n acelai timp cu dou culori, deoarece el s-ar gsi
pe un ciclu de lungime impar. Deci graful este bicromatic.
Observaii. 1) Teorema lui Knig se poate formula i astfel: Un
graf este bicromatic dac i numai dac este bipartit. Cele dou
submulimi disjuncte ale lui X se pot determina dup colorarea
vrfurilor, fiecare submulime coninnd toate vrfurile colorate cu
aceeai culoare.
2) Dac un graf bicromatic are cel puin o muchie, atunci
numrul su cromatic este 2.
Definiia 3. Indicele cromatic al unui graf G este numrul minim
de culori cu care se pot colora arcele grafului G, astfel nct dou
muchii adiacente s fie colorate cu culori diferite.
Determinarea numrului cromatic. Fie un graf G = (X, U), cu |
X| = n. Pentru diferite valori ale lui k (1, 2, 3, ...), se ncearc s se
formeze aranjamente cu repetiie de k elemente luate cte n (din
elementele mulimii {1, 2, ..., k}) respectndu-se urmtoarea regul:
dac (x,y) U atunci pe poziiile x i y trebuie s figureze valori
diferite (cele dou vrfuri trebuie colorate cu culori diferite). Dac
pentru o valoare a lui k au fost epuizate toate aranjamentele cu
repetiie, fr s se poat respecta aceast condiie, atunci se trece la
urmtoarea valoare a lui k. Prima valoare a lui k pentru care se poate
determina un aranjament n condiiile date este numrul cromatic al
grafului.
Metoda descris mai sus este foarte lent i nu poate fi aplicat
dect pentru grafuri de dimensiuni mici. Numrul de operaii necesare
pentru determinarea numrului cromatic are un ordin exponenial. De
aceea n practic ne mulumim cu o colorare care nu este optimal,
dar care poate fi determinat ntr-un timp rezonabil.
Determinarea mulimilor intern stabile maxime, a mulimilor
extern stabile minime i colorarea optim a unui graf snt probleme
NP-complete.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

102

Metoda "Branch and Bound"


Definiie. Un graf orientat G = (X,U) este o arborescen de
rdcin r dac:
a) -1(r) = ;
b) pentru orice x X (x r) exist un singur drum de la r la x.
Dac orice vrf x X (x r) are proprietatea c | (x)| 2, avem
o arborescen binar. Vrfurile
x X pentru care (x) = se
numesc vrfuri terminale.
Pentru rezolvarea unei probleme cu ajutorul metodei "Branch and
Bound" se construiete o arborescen binar dup cum urmeaz.
Presupunem c o problem de programare comport o mulime
de soluii S = {s1, s2, ...} i c pe aceast mulime putem defini o
funcie f : S R al crei minim s aib loc pentru soluia optim.
Astfel, cutarea soluiei optime se reduce la cutarea minimului
funciei f.
Fie b0 o born inferioar a valorilor funciei i PA o proprietate
care desface pe S n partiia
S = A A . Notm cu b1 b0 o
born inferioar a valorilor lui f pe A i cu b1' b0 o born
inferioar a valorilor lui f pe A .
Lum o alt proprietate PB care desface pe S n partiia S = B
B . Proprietatea PA PB este adevrat n A B; analog, PA P B
este adevrat n A B .a.m.d. (n total patru cazuri).
Nu considerm toate aceste patru cazuri, ci procedm astfel: dac
de exemplu b1' < b1, studiem numai A B i A B . Dac mai
departe b2 este borna inferioar a funciei pe A B i b2' pe A B ,
iar b2 < b2', trecem la A B C i la A B C .a.m.d. n
general, continum ntotdeauna s construim aceast arborescen de

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

103

la acea frunz creia i corespunde cea mai mic dintre bornele


inferioare ale funciei, gsite pn atunci.
Astfel sntem siguri c valorile succesiv gsite pentru bi i bi'
borneaz inferior ntreaga mulime a soluiilor (ntreaga referenial
S), deoarece reuniunea tuturor frunzelor dau evident pe S. De
exemplu, n figur avem:

A ( A B ) ( A B C ) ( A B C) = A ( A B ) (
A B) = A A = S.
Dac nu se respect aceast regul, se poate ajunge la o born
inferioar a funciei pe submulimea aleas, fr ca ea s borneze
inferior ntreaga referenial. De aceea, de fiecare dat se continu pe
arborescen cu acea frunz care are borna asociat de valoare
minim. Astfel, pe msur ce cardinalul submulimilor succesive de
soluii descrete, borna inferioar a funciei pe ntreaga mulime
crete monoton, deci ea devine egal cu minimul funciei cnd, pe
aceast cale, ajungem la o submulime format dintr-un singur
element al lui S, care este soluia optim (prin ipotez asociat cu
minimul funciei). Dac exist mai multe soluii, pot fi gsite toate pe
diversele ramuri ale arborescenei care conduc la borne inferioare ale
funciei, egale cu minimul acesteia.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

104

Exist unele probleme care se rezolv cu ajutorul acestei metode,


fr s se cear o soluie optim. n acest caz metoda "Branch and
Bound" se folosete pentru determinarea tuturor soluiilor problemei.
Dificulti ntmpinate n practic:
- gsirea funciei al crei minim s fie asociat soluiei (soluiilor)
optime;
- alegerea proprietilor separatoare, pentru ca ele s conduc la
bipartiii ale lui S;
- stabilirea unui procedeu adecvat de bornare.

Circuite hamiltoniene minime


Definiie. Un circuit hamiltonian este un circuit care trece prin
toate vrfurile grafului o singur dat.
S considerm un graf G=(X,U) orientat i o funcie l:UR+
care asociaz fiecrui arc uU un numr l(u)0. Matricea A asociat
grafului se definete astfel:

, i = j ( xi , x j ) U
aij =
c( xi , x j ),( xi , x j ) U

Pentru determinarea circuitelor hamiltoniene minime se folosete


algoritmul lui Little, bazat pe metoda "Branch and Bound". n acest
scop lum drept referenial mulimea C = {c1, c2, ... cp} a tuturor
circuitelor hamiltoniene din graf i i asociem funcia f : C R+,
unde f(c) este lungimea circuitului c (dat de suma valorilor fiecrui
arc component). Circuitele pentru care se obine minimul funciei f
snt soluiile optime ale problemei puse.
Proprietile separatoare (generatoare de bipartiii succesive) vor
fi de forma Pij, prin aceasta nelegnd c lum n considerare
circuitele care conin arcul (xi,xj). P ij conduce la circuitele care nu
conin acest arc. Notm cu Cij submulimea circuitelor care conin
arcul (xi,xj) i cu C ij complementara sa.

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

105

Pe msur ce naintm de-a lungul unei ramuri a arborescenei,


eliminm arcele folosite, de asemenea i arcele care ar nchide
circuite nehamiltoniene (care au un numr de arce mai mic dect |X|).
Pentru bornare definim operaia de reducere a matricei A: scdem
din elementele fiecrei linii componenta sa cea mai mic, iar apoi
procedm la fel pentru fiecare coloan; fie s suma tuturor elementelor
sczute.
Prima born (b0) este chiar valoarea s obinut n urma operaiei
de reducere. Bornele urmtoare se calculeaz tot cu ajutorul unor
matrice deduse din A.
Trebuie s alegem un arc prin care s efectum prima bipartiie.
Fie acesta (xi,xj) ales dintre arcele care au valoarea 0 n matricea
redus.
Calculm o born inferioar pentru Cij astfel: copiem matricea A
n matricea A i punem aij = ; dup ce efectum reducerea
matricei A , obinem borna b1' = b0+s. n practic, pentru a ajunge
mai repede la minimul funciei f, se analizeaz fiecare arc (xi,xj)
pentru care aij = 0, i se alege acel arc pentru care se obine valoarea
s cea mai mare.
Calculm o born inferioar pentru Cij astfel: n matricea A
suprimm linia i i coloana j (punem peste tot; astfel ordinul
matricei A scade cu o unitate) i eliminm toate arcele care ar putea
nchide circuite nehamiltoniene; dup ce efectum reducerea matricei
A, obinem b1 = b0 + s.
Cu aceasta s-a terminat prima bipartiie i calculul bornelor
aferente ei. Fiecrui vrf al arborescenei i s-a ataat i matricea de
calcul a bornei respective.
n continuare se prezint urmtoarele posibiliti:
a) b1 b1'. n acest caz se continu pe arborescen cu mulimea Cij i
matricea A.
b) b1 > b1'. n acest caz se continu pe arborescen cu mulimea Cij
i matricea A .
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

106

n matricea aleas pentru continuare (A sau A ) se alege un nou


arc (xk,xl) pentru care akl= 0, aa cum s-a procedat mai sus. Se ajunge
la o nou bipartiie i la calculul bornelor inferioare ale lui f pe Ckl i
Ckl .
Ct timp bornele calculate de-a lungul unei ramuri nu le depesc
pe cele calculate pentru celelalte frunze, ordinul matricelor scade
treptat pn ajunge la 1. n acest moment s-a identificat un circuit
optim din mulimea C.
Algoritmul se poate continua de la celelalte frunze care au borna
egal cu minimul funciei f (care este acum cunoscut), pentru a obine
toate soluiile.
Determinarea unui circuit hamiltonian optim ntr-un graf este o
problem NP-complet.

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

107

Anexa A
A.1. Alte tehnici de reprezentare
Reprezentare bazat pe funcia (liste de succesori)
Se folosete un vector Ns[] pentru a memora ci succesori are
fiecare vrf. Se folosete o matrice Ls[][] pentru a memora lista
succesorilor fiecrui vrf.
Exemplu (graful orientat din figura 1.2):
Ns: 2 2 1 3 1
primele dou vrfuri au cte doi succesori, al treilea unul
singur
Ls: 1 3 (vrful x0 are doi succesori: x1 i x3)
2 3
4 (vrful x2 are un singur succesor: x4)
0 2 4
2
Implementare n limbajul C:
unsigned n,j,Ns,*Ls;
Citete(n); numr de vrfuri
Ns = calloc(n,sizeof(unsigned));
Ls = calloc(n,sizeof(unsigned *));
Ciclu (pentru fiecare vrf x Xcare are succesori):
Citete(Ns[x]); ci succesori are x
Ls[x] = calloc(Ns[x],sizeof(unsigned));
for (j=0; j<Ns[x]; j++)
Citete(Ls[x][j]) al j-lea succesor al vrfului x
Listele succesorilor fiecrui vrf:
for (x=0; x<n; x++) {
printf("\nSuccesorii lui %u: ",x);
for (j=0; j<Ns[x]; j++)
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

108

printf(" %u",Ls[x][j]);

Eliberare memorie:
free(Ns);
for (j=0; j<n; j++) free(Ls[j]);
free(Ls);
n comparaie cu tehnica descris n primul capitol, aceast soluie
consum ceva mai mult memorie, n schimb nu necesit conversie
din lista arcelor. Se recomand pentru aplicaii de test, n cazul n care
graful este descris cu ajutorul funciei astfel:
n, numrul de vrfuri;
pentru fiecare vrf x:
numrul de succesori;
pentru fiecare succesor: indexul acestuia i costul legturii.

Matricea de adiacen
Pentru grafuri neponderate se folosete o matrice An n:

1, (i, j) U
a =

0, (i, j ) U
ij

Graful orientat din figura 1.2 se reprezint astfel:


0

0
0

1
0

1
0
0
0
0

0
1
0
1
1

1
1
0
0
0

0
1

1
0

Un graf ponderat poate fi reprezentat astfel:

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

109

aij

c(i, j ), (i, j ) U

= 0, i = j
, (i , j ) U

Este contraindicat pentru aplicaii practice deoarece necesit un


volum de memorie de ordin O(n2), i un timp de prelucrare de ordin
cel puin O(n2). Am amintit aici i aceast metod deoarece este
prezent n aproape toate manualele pentru elevii de la profilul
matematic-informatic.
Listele succesorilor fiecrui vrf (limbajul C):
for (i=0; i<n; i++) {
printf("\nSuccesorii lui %u: ",i);
for (j=0; j<n; j++)
if (a[i][j])
printf(" %u",a[i][j]);
}

A.2. Algoritmi bazai pe matricea de adiacen


Matricea drumurilor
(k )

Fie Ak puterea k a matricei de adiacen (k> 0). Un element a ij


are urmtoarea semnificaie: numrul de drumuri distincte de la vrful
xi la vrful xj care au lungimea (numr de arce) k.
Pentru a decide dac exist drumuri de la vrful xi la vrful xj se
determin toate puterile k (:= 1, 2, ..., n) ale matricei k, operaie care
necesit un timp de ordin O(n4). Dac avem nevoie doar s tim ntre
care vrfuri exist drumuri, putem folosi o soluie mai simpl bazat
pe algoritmul Roy-Warshall:
Algoritm Roy-Warshall;
Intrare. An n, matricea de adiacen a unui graf orientat.
Ieire. Dn n, matricea drumurilor grafului dat.
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

110

begin
D := A;
for (each k X) do
for (each i X) do
for (each j X) do
dij := dij dik dkj;
end (algoritm).
i snt operaiile logice OR i AND, considernd c matricea D
are coeficieni valori booleene. Se observ c acest algoritm are
complexitate de ordin O(n3).
Valoarea dij indic dac ntre vrfurile xi i xj exist cel puin un
drum (dij = 1) sau nici unul (dij = 0).

Componente tare conexe


Dou vrfuri xi i xj se afl n aceeai component conex dac i
numai dac dij = dji = 1. Rezult
Algoritm Comp-tare-conexe;
Intrare. Matricea D a drumurilor unui graf.
Ieire. Un masiv C: componentele tare conexe ale acestuia.
begin
nc := 0;
for (each i X) do C[i] := 0;
for (each i X) do
if (C[i] = 0) then begin
nc := nc + 1;
for (each j X) do
if (cij = cji = 1) then
C[j] := nc;
end
end (algoritm).
Acest algoritm are complexitate de ordin O(n2), i deoarece se
bazeaz pe algoritmul Roy-Warshall, rezult c determinarea
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

111

componentelor tare conexe pe baza matricei drumurilor necesit un


timp de ordin O(n3).

Drumuri de cost minim


Algoritmul lui Floyd este foarte asemntor cu algoritmul RoyWarshall prezentat mai sus. Spre deosebire de algoritmii prezentai n
capitolul patru, unde pentru reconstituirea drumului minim am folosit
un masiv, acest algoritm folosete o matrice.
Algoritm Drum-Cost-Minim;
Intrare. An n, matricea de adiacen a unui graf orientat ponderat.
Ieire. Cn n: matricea de adiacen a unui graf orientat ponderat.
Pn n: matricea de preceden pentru reconstituirea unui drum.
begin
C := A;
for (each i X) do
for (each j X) do
pij := i;
for (each k X) do
for (each i X) do
for (each j X) do begin
w := cik + ckj;
if (cij > w) then begin
cij := w; pij := pkj;
end
end
end (algoritm).
Explicaie. Dac cij > cik + ckj atunci exist un alt drum de la xi la
xj, mai bun dect cel depistat pn n prezent, i care trece prin xk. pij
reprezint vrful predecesor vrfului xj ntr-un drum de la xi la xj. Dac
un drum mai bun de la xi la xj trece prin xk, atunci vrful pkj este
predecesor ntr-un astfel de drum (figura A.1).
Acest algoritm are complexitate de ordin O(n3), i necesit
memorie de ordin O(n2). Un drum de la s la t se reconstituie astfel:
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

112

Write(t); x := t;
while (x s) do
begin
x := psx; Write(x);
end

Figura A.1.
Modificarea
relaiei de
preceden.

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

113

Bibliografie
A. V. Aho, J. E. Hopcroft, J. D. Ullman The design and analysis of
computer algorithms / Addison-Wesley, Reading Mass, 1974
Irina Athanasiu, Valeriu Cristea, Valentin Iorga, Eugenia Kalisz Tehnici
de programare / Editura Teora, 1994
R. E. Bellman On a routing problem / Quat. Applied Mathematics 16,
1958, pg 87-90
Mark de Berg, Marc van Kreveld, Mark Overmars, Ottfried Schwarzkoph
Computational geometry. Algorithms and applications / Springer, 1997
Claude Berge Teoria grafurilor i aplicaii / Editura Tehnic, 1969
Dumitru Dan Burdescu Analiza complexitii algoritmilor / Editura
Albastr, 1998
Stephen A. Cook The complexity of theorem-proving procedure / 3-rd
ACM Symposium of Computing, 1970, pg 151-158
Thomas H. Cormen, Charles E. Leiserson, Ronald R. Rivest Introducere
n algoritmi / Editura Libris, 2000
Ion Cozac Minimum cost path in a huge graph / Studia Universitas
Babe-Bolyai Cluj-Napoca, Informatica 2, 2002, pg 23-28
E. Dijkstra A note on two problems in connection with networks /
Numerische Mathematik, 1, 1959, pg 169-271
J. Edmonds, R. M. Karp Theoretical improvements in algorithmic
efficiency for network flow problems / Journal of the ACM, vol 19 no
2,1972, pg 248-264
L. R. Ford, D. R. Fulkerson Maximal flow through a network
Canadian Journal of Mathematics, 8, 1956, pg 399-404

M. R. Garey, R. L. Graham, D. S. Johnson Some NP-complete geometric


problems / 8-th Annual Symposium on Theory of Computation, may 1976,
pg 10-22

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

114

Cristian Giumale Un atelier de programare / Computer Libris Agora,


2000
David Goldberg What every computer scientist should know about
floating-point arithmetic / ACM Computing Surveys 23(10), mart 1991, pg
5-48
Michel Gondran, Michel Minoux Graphes et algorithmes / Editions
Eyrolles, Paris 1979
D. B. Johnson A note on Dijkstras shortest path algorithm / Journal of
ACM 20, 1973, pg 385-388
Donald Knuth Tratat de programarea calculatoarelor. Algoritmi
fundamentali / Editura Tehnic, 1974
Donald Knuth Tratat de programarea calculatoarelor. Sortare i
cutare / Editura Tehnic, 1976
J. B. Kruskal On the shortest spanning subtree of a sraph and the
traveling salesman problem / Proceedings American Mathematical
Society, 71, 1956, pg 48-50
C. Y. Lee An algorithm for path connection and its applications / IRE
Transactions on Electronic Computers, EC-10 (3), 1961, pg 346-365
Harry Lewis, Larry Denenberg Data structures and their algorithms /
Harper Collins Publishers, 1991
Leon Livovschi, Horia Georgescu - Sinteza i analiza algoritmilor /
Editura tiinific i Enciclopedic, 1986
Joseph O'Rourke Computational geometry in C / Cambridge University
Press, 1995
Franco Preparata, Michael Ian Shamos Computational geometry; an
ntroduction / Springer Verlag 1988
R. C. Prim Shortest connection network and some generalizations / Bell
System Technical Journal 36, 1957, p 1389
D. J. Rosenkrantz, R. E. Stearns, P. M. Lewis Approximate algorithms
for the traveling salesperson problem / 15-th Annual IEEE Symposium on
Switching and Automata Theory, may 1974, pg 33-42

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

115

Frank Schulz, Dorothea Wagner, Christos Zaroglias Using multilevel


graph for time-table information on railway systems / Editors: D. Mount
and C. Steiri, ALENEX 2000, LNCS 2409, pp 43-59
Robert Sedgewick Algorithms / Addison-Wesley Publishing Company,
august 1984
Steven S. Skiena The algorithm design manual / Springer-Verlag, NewYork, 1997
R. E. Tarjan Depth first search and linear algorithms / SIAM Journal of
Computing 1, 1972, pg 146-160
Teodor Toadere, Ion Cozac Branch and bound method for independent
and dominant sets in graph / Studia Universitas Babe-Bolyai ClujNapoca, Informatica, vol II no 1, 1997, pg 31-38
Teodor Toadere Grafe. Teorie, algoritmi, aplicaii / Editura Albastr,
2002
Ioan Tomescu Introducere n combinatoric / Editura Tehnic, 1972
Introduction to combinatorics / Collets Publishers Ltd, 1975
Ioan TomescuProbleme de combinatoric i teoria grafurilor / Editura
Didactic i Pedagogic, Bucureti 1981
B. Roy Cheminement et connexit dans les graphes / Thse, Universit
de Paris, 1962
R. W. Floyd Algorithm 97: Shortest path / Communications of the
ACM 9, 1962, pg 345
S. Warshall A theorem on boolean matrices / Journal of the ACM 9,
1962, pg 11-12
Herbert S. Wilf Algorithms and complexity /
http://www.cis.upenn.edu/~wilf/AlgComp3.html

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

116

Cuprins
1. Preliminarii. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.1. Algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2. Grafuri: noiuni de baz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3. Tehnici de reprezentare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4. Parcurgerea unui graf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5. Obinerea listelor de succesori . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.6. Grafuri dinamice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4
7
10
13
15
17

2. Parcurgerea unui graf n lime . . . . . . . . . . . . . . . . . . . . . . . .

18

2.1. Metoda general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


2.2. Componente conexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3. Grafuri bipartite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4. Ordonare topologic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18
19
21
23

3. Parcurgerea unui graf n adncime . . . . . . . . . . . . . . . . . . . . .

26

3.1. Metoda general


....................................
3.2. Componente tare conexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3. Biconectivitate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4. Cicluri i lanuri euleriene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26
28
31
36

4. Drumuri minime n grafuri . . . . . . . . . . . . . . . . . . . . . . . . . . .

41

4.1. Drumuri de lungime minim . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


4.2. Drumuri de cost minim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3. Determinarea tuturor drumurilor minime. . . . . . . . . . . . . . . . . . . .
4.4. Arbori de selecie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.5. Drumuri minime n grafuri foarte mari . . . . . . . . . . . . . . . . . . . . .
4.6. Drumuri minime n grafuri orar . . . . . . . . . . . . . . . . . . . . . . . . . . .

41
43
46
50
??
??

5. Problema ordonanrii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

??

5.1. Enunul problemei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


5.2. Rezolvare bazat pe ordonare topologic. . . . . . . . . . . . . . . . . . . .
5.3. Algoritmul lui Bellman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

??
??
??

6. Arbori pariali de cost minim . . . . . . . . . . . . . . . . . . . . . . . . .

??

6.1. Algoritmul lui Prim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


6.2. Algoritmul lui Kruskal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.3. U-arbori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

??
??
??

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

117

7. Probleme de transport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

??

7.1. Reele de transport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


7.2. Algoritmul Ford-Fulkerson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.3. Algoritmul Edmonds-Karp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.4. Flux minim ntr-o reea de transport . . . . . . . . . . . . . . . . . . . . . . .

??
??
??
??

8. Grafuri planare. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

??

8.1. Definiii i proprieti. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


8.2. Reprezentarea unui graf planar. . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.3. ?
............................

??
??
??

9. Probleme NP-complete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

??

9.1. A
9.2. A
9.3. U

....................................
..................................
.............................................

??
??
??

Anexa A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

??

A.1. Alte tehnici de reprezentare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


A.2. Algoritmi bazai pe matricea de adiacen . . . . . . . . . . . . . . . . . .

??
??

Bibliografie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

??

_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
_______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

118