Sunteți pe pagina 1din 42

Teoria grafurilor

Capitolul

Reprezentarea grafurilor
Traversarea grafurilor
Implementri sugerate
Probleme propuse
Soluiile problemelor

5.1. Reprezentarea grafurilor


Exist mai multe modaliti de a reprezenta grafurile. Alegerea unei reprezentri se
realizeaz n funcie de algoritmul folosit pentru rezolvarea unei probleme. Notm cu
G = (X, U) un graf neorientat, avnd n noduri n mulimea X (numerotate cu primele n
numere naturale) i cu m muchii n mulimea U.

5.1.1. Matricea de adiacen


Matricea de adiacen este o matrice ptratic avnd n linii i n coloane, cte o linie
1 dac (i, j ) U

pentru fiecare nod din graf, n care elementele Aij =

0 dac (i, j ) U

Avnd n vedere c ntr-un graf neorientat pentru o muchie (i, j) U este adevrat
relaia (i, j) = (j, i) rezult c matricea de adiacen este simetric fa de diagonala
principal.
Fie graful din figura al1
0 1 0 1 1
1 0 0 1 0
turat. Pentru acest graf ma2

tricea de adiacen este vizuA = 0 0 0 1 0


5
alizat alturat figurii:
4

1 1 1 0 1
1 0 0 1 0

Pentru o matrice de adiacen este nevoie de spaiu de memorie care nu depinde de


numrul de muchii, ci doar de numrul de noduri. n unele probleme este folosit memorarea doar a elementelor situate deasupra diagonalei principale, avnd n vedere c
matricea este simetric i pentru o valoare mare a lui n este folosit foarte mult memorie.

126

5. Teoria grafurilor

Muchia (x, y) exist n graf, dac elementul Axy este egal cu 1, n caz contrar nu
exist astfel de muchie n graf. O alt proprietate a matricei de adiacen este c suma
tuturor elementelor matricei este egal cu 2 m, iar numrul elementelor de pe linia x
este chiar gradul vrfului x.
Construirea matricei de adiacen se poate realiza direct dac matricea se citete
din fiierul de intrare, sau poate fi iniial completat cu elemente nule, urmnd s se
citeasc m perechi de numere corespunztoare vrfurilor de la extremitile muchiilor
i pentru fiecare pereche de numere x i y se atribuie lui Aij 1, respectiv Aji 1.
Matricea de adiacen se poate folosi, de asemenea pentru a memora grafurile orientate. Diferena fa de cele neorientate se datoreaz faptului c un arc (x, y) dintr-un
graf orientat are urmtoarea proprietate (x, y) (y, x). Din acest motiv matricea de
adiacen a unui graf orientat nu este simetric, iar suma elementelor matricei este
egal cu numrul arcelor din graf.

5.1.2. Lista vrfurilor adiacente


Lista vrfurilor adiacente este format din n liste, unde a i-a list conine vrfurile
adiacente vrfului i. Memorarea se realizeaz ntr-o matrice, astfel nct linia i conine
vrfurile adiacente cu vrful i. Pentru fiecare vrf i se memoreaz, de asemenea, numrul vrfurilor din list. O alt variant de utilizare a listei vrfurilor adiacente este
aceea de a folosi listele liniare memorate static sau dinamic.
Pentru graful din figura dat anterior se formeaz urmtoarele liste de adiacen:
Numr ataat vrfului
1
2
3
4
5

Liste de adiacen
245
14
4
1235
14

Numrul vrfurilor adiacente ale unui vrf este chiar gradul acestuia i, evident, suma lungimilor listelor este egal cu 2 m.
Pentru a determina dac o muchie aparine grafului, aceasta trebuie cutat n lista
extremitilor unuia dintre vrfuri, ceea ce implic un algoritm mai lung dect n cazul
cutrii ntr-o matrice de adiacen.
Construirea listelor de adiacen se poate realiza n momentul citirii datelor.

5. Teoria grafurilor

127

Subalgoritm Liste_de_adiacen:
citete n
{ citirea numrului de vrfuri }
ct timp nu urmeaz marca de sfrit de fiier execut:
{ citirea extremitilor a unei muchii }
citete i,j
nvec[i] nvec[i] + 1
{ crete numrul vrfurilor adiacente lui i }
nvec[j] nvec[j] + 1
{ crete numrul vrfurilor adiacente lui j }
a[i,nvec[i]] j
{ memorm vrful adiacent cu i }
{ memorm vrful adiacent cu j }
a[j,nvec[j]] i
sfrit subalgoritm

De asemenea, listele de adiacen se pot utiliza la memorarea grafurilor orientate.

5.1.3. Lista extremitilor muchiilor


Lista extremitilor muchiilor este format dintr-o matrice cu dou coloane i m linii n
care pe o linie din matrice se afl valorile celor dou extremiti ale unei muchii.
Aceast matrice se memoreaz pe 2 m locaii de memorie.
Pentru graful din figura din exemplu lista extremitilor este:
12
14
15
24
34
45
Construirea acestei liste se realizeaz prin simpla citire a perechilor de numere.
Aceast construcie poate fi folosit i la memorarea grafurilor orientate cu meniunea
c elementele din prima coloan sunt vrfurile iniiale ale arcelor, iar cele din a doua
coloan sunt vrfurile finale ale arcelor.

5.1.4. Matricea costurilor


Matricea costurilor este o matrice ptratic de ordin n, similar cu cea de adiacen.
Diferena dintre ele este c matricea costurilor este utilizat atunci cnd se asociaz
grafului un cost, adic fiecrei muchii i se asociaz un numr, reprezentnd o lungime
sau o cantitate, n funcie de problem.
Un element al matricei costurilor: Cij = c dac (i, j ) U , unde c este costul asociat
0 n caz contrar

muchiei (i, j).


Construirea matricei costurilor se realizeaz similar cu construirea matricei de adiacen. Matricea costurilor poate fi utilizat i n cazul grafurilor orientate, dac muchiilor li s-au asociat costuri.

128

5. Teoria grafurilor

5.1.5. Matricea de inciden


Matricea de inciden se mai numete matrice vrfuri-arce i se utilizeaz n cazul
grafurilor orientate. Aceast matrice are pentru fiecare vrf o linie i pentru fiecare arc
o coloan, deci matricea are n linii i m coloane.
1 dac (i, j ) U
Bij = 1 dac ( j , i ) U
0 dac n rest
Pe fiecare coloan a matricei de inciden se afl exact dou elemente nenule.

5.2. Traversarea grafurilor


Traversarea grafurilor se refer la examinarea vrfurilor unui graf, astfel nct fiecare
dintre ele s fie parcurs.

5.2.1. Traversarea n lime


n traversarea n lime (Breadth First) se pornete de la un vrf i se parcurg toate
vrfurile adiacente lui, dup care se parcurg vecinii acestora (care nu au fost parcuri
pn la momentul respectiv) i aa mai departe, pn se viziteaz toate vrfurile grafului.
Aceast traversare determin cele mai scurte drumuri de la primul vrf considerat
la celelalte i este, de asemenea, folosit n algoritmul lui Prim pentru a determina arborele parial de cost minim etc.
n parcurgerea n lime se rein ntr-un ir valorile vrfurilor parcurse i pentru fiecare dintre ele se adaug la sfritul irului vrfurile adiacente care nu au fost scrise
nc. De exemplu, avnd graful din figura urmtoare i pornind de la vrful 1 prin parcurgerea n lime se obine urmtoarea succesiune de vizitare a vrfurilor: 1, 2, 4, 3,
6, 5.
1
2

3
4

Pentru nceput, pe prima poziie se reine primul vrf parcurs, i anume 1. Apoi se
adaug toate nodurile adiancente cu el. Astfel irul devine: 1, 2, 4. Urmeaz s se viziteze nodurile adiacente cu 2, care nu au fost scrise deja n ir acesta devine: 1, 2, 4,
3. Se trateaz apoi nodurile adiacente lui 4 i se obine: 1, 2, 4, 3, 6. Apoi urmeaz
vrfurile adiacente cu 3, dar vrful 2 i vrful 6 sunt vizitate deja, deci nu vor fi scrise
n ir. La sfrit se parcurg vrfurile adiacente lui 6, adic doar 5 care este nevizitat i
cele adiacente lui 5 (care nu mai are vecini nevizitai). Se obine irul final: 1, 2, 4, 3,
6, 5.

5. Teoria grafurilor

129

n algoritm am notat cu c irul n care se vor reine pe rnd etichetele vrfurilor grafului, iar n viz inem evidena vizitrilor. Dac valoarea lui vizi este adevrat, nseamn c nodul i a fost parcurs deja.
Subalgoritm BF:
c[1] i { se determin vrfurile la care se poate ajunge pornind de la nodul i }
{ k este lungimea irului c }
k 2
z 1
{ z parcurge irul nodurilor memorate n c }
ct timp z < k execut:
{ se iau toate vrfurile din irul c }
t c[z]
{ se caut vecinii nodului de pe poziia z n ir }
{ se marcheaz faptul c acest nod a fost parcurs }
viz[t] adevrat
pentru j=1,n execut:

{ dac exist noduri adiacente nevizitate nc}


dac (a[t,j] = 1) i (nu viz[j]) atunci
viz[j] adevrat
{ se marcheaz ca fiind vizitat }
{ i se adaug j n c }
c[k] j
{ se mrete lungimea lui c }
k k + 1
sfrit dac
sfrit pentru
z z + 1
{ se trece la urmtorul vrf din c s i se caute vecinii nevizitai }
sfrit ct timp
sfrit ct timp

5.2.2. Traversarea n adncime


n cazul traversrii n adncime (Depth First) parcurgerea pornete de la un vrf a i se
caut un vrf adiacent b, dup care se caut un vecin a lui b care nu a fost parcurs i
aa mai departe, pn se parcurg toate vrfurile grafului. Dac la un moment dat un
vrf nu mai are vrfuri adiacente neparcurse se revine la vrful anterior i se caut un
alt vrf neparcurs.
Prin parcurgerea unui graf n adncime se obine o succesiune de vrfuri care se
memoreaz ntr-un ir. Astfel, pentru graful din ultima figur succesiunea care se obine pornind de la vrful 1 este: 1, 2, 3, 6, 5, 4.
S parcurgem graful din figur. Pentru nceput pe prima poziie se reine primul
vrf parcurs i anume 1. Apoi se adaug un nod adiacent cu el, n cazul de fa 2, dup
care se caut un nod adiacent cu nodul 2 i care nu a fost trecut deja n ir. Astfel irul
devine: 1, 2, 3. Urmeaz s se viziteze un nod adiacent cu 3 i care nu a fost scris deja
n ir acesta devine: 1, 2, 3, 6. Se trateaz apoi un nod adiacent cu 6 i se obine: 1,
2, 3, 6, 5. Apoi ar trebui parcurs un vrf adiacent cu 5, dar nu mai exist un astfel de
nod care s nu fi fost trecut deja n ir. n situaia dat se caut un alt vrf adiacent cu
6 i se gsete vrful cu eticheta 4. Dac nu mai sunt vrfuri adiacente cu un anumit

130

5. Teoria grafurilor

vrf, se caut vecini pentru vrfuri anterior memorate n ir. Astfel se obine succesiunea de parcurgere a vrfurilor grafului din prima figur din acest capitol.
Pentru o astfel de parcurgere este recomandat memorarea grafului sub form de
liste ale vrfurilor adiacente. n cazul grafului din a doua figur din acest capitol listele
de adiacen sunt:
(2, 4); (1, 3); (2, 6); (1, 6); (6); (3, 4, 5).
Parcurgerea n adncime poate fi utilizat n determinarea componentelor conexe
care apeleaz un subalgoritm recursiv pentru a putea parcurge toate vrfurile din graf.
Subalgoritm FD(i):
viz[i] adevrat
pentru j=1,nveci execut:
dac nu viz[a[i,j]] atunci
FD(a[i,j])
sfrit dac
sfrit pentru
sfrit subalgoritm

{ se marcheaz vrful i ca fiind vizitat }


{ pentru toate vrfurile adiacente lui i }
{ dac nu au fost vizitate }
{ se caut vecinii vecinului lui i }

Aceast secven se apeleaz atta timp ct mai exist vrfuri nevizitate.

5.3. Implementri sugerate


Pentru a v familiariza cu modul n care trebuie rezolvate problemele din teoria
grafurilor, v sugerm s ncercai s implementai algoritmi pentru:
1. reprezentarea grafurilor prin matricea de adiacen;
2. reprezentarea grafurilor prin lista vrfurilor adiacente;
3. reprezentarea grafurilor prin lista extremitilor muchiilor;
4. reprezentarea grafurilor prin matricea de inciden;
5. reprezentarea grafurilor prin matricea costurilor;
6. reprezentarea grafurilor prin matricea succesorilor vrfurilor;
7. reprezentarea grafurilor prin irul succesorilor vrfurilor;
8. problema comis-voiajorului (Se consider un graf neorientat complet cu N vrfuri.
Fiecrei muchii i se atribuie un cost numit distan. S se determine un drum hamiltonian de cost minim. Se va aplica metoda euristic greedy.)
9. colorarea grafurilor (Se consider un graf neorientat avnd N vrfuri. S se determine numrul minim de culori necesare pentru a colora vrfurile grafului, astfel
nct oricare dou vrfuri legate printr-o muchie s fie colorate diferit. Se va aplica
metoda euristic greedy.)
10. stabilirea componentelor conexe ale unui graf (prin traversare n lime i adncime);
11. sortarea topologic;
12. determinarea unui ciclu eulerian.

5. Teoria grafurilor

131

5.4. Probleme propuse


5.4.1. Campanie electoral
n campania electoral un candidat dorete s in discursuri n mai multe localiti
dintr-o anumit zon a rii. El dorete s se ntlneasc cu alegtorii din toate oraele
respective, astfel nct s nu treac de dou ori prin acelai ora i, n plus, s se ntoarc de unde a plecat.
Dndu-se numrul localitilor i distanele dintre ele, realizai planul cltoriei de lungime minim a politicianului, tiind c ntre oricare dou orae exist legtur direct.
Date de intrare
Pe prima linie a fiierului de intrare ORASE.IN este scris un numr ntreg n, reprezentnd numrul oraelor care trebuie parcurse. Pe urmtoarele n linii se gsesc cte n numere pe fiecare, separate prin spaii, reprezentnd distanele dintre orae.
Date de ieire
Fiierul de ieire ORASE.OUT va conine pe prima linie un numr reprezentnd lungimea celui mai scurt traseu, iar pe a doua linie va conine n + 1 numere de ordine ale
oraelor n ordinea parcurgerii lor n traseu.
Restricii i precizri
1 n 100;
ntre oricare dou orae exist cel mult un drum;
trebuie vizitate toate oraele;
traseul politicianului poate s nceap n oricare ora, cu condiia s se termine n
acelai ora.
Exemplu
ORASE.IN
5
0 1 5 1 2
1 0 3 7 2
5 3 0 4 4
1 7 4 0 2
2 2 4 2 0

ORASE.OUT
11
2 1 4 5 3 2

2
5

4
2

3
1 7
4

132

5. Teoria grafurilor

5.4.2. Parcul colorat


Se deschide un nou parc de distracii cu multe csue n care pe copii i ateapt tot
felul de surprize. Pentru a oferi un ambient ct mai plcut, organizatorii s-au gndit ca
fiecare csu s fie colorat, astfel nct toate csuele care se vd una din cealalt
s fie colorate diferit. n parc exist unele perechi de csue care nu se vd una din
cealalt, deoarece n parc se afl o mulime de arbori. Organizatorii i pun ntrebarea
cte culori trebuie achiziionate, astfel nct s foloseasc un numr minim de culori.
Cunoscnd numrul de csue, precum i perechile de csue care se vd ntre ele,
se cere s se determine numrul minim de culori necesare pentru a colora csuele,
precum i o colorare posibil.
Date de intrare
Pe prima linie a fiierului de intrare PARC.IN se afl un numr ntreg n, reprezentnd
numrul csuelor. Pe urmtoarele linii se gsesc cte dou numere i i j separate prin
spaiu, reprezentnd faptul c cele dou csue i i j se vd una pe cealalt i, deci,
trebuie colorate diferit.
Date de ieire
Pe prima linie a fiierului de ieire PARC.OUT se va scrie un numr natural, reprezentnd numrul minim de culori necesare, iar a doua linie va conine n numere naturale,
desprite prin cte un spaiu, reprezentnd numerele de ordine ale culorilor asociate
fiecrei csue n parte.
Restricii i precizri
1 n 100.
Exemplu
PARC.IN
5
1 5
1 4
2 5
2 3
4 3

PARC.OUT
3
1 1 2 3 2

1
2

4
3

5.4.3. Cluburi maritime


De-a lungul coastei unui continent des vizitat de turiti exist mai multe porturi pe lng staiuni. Pentru a ctiga ci mai muli clieni, porturile se asociaz n cluburi maritime. Un club are reguli stricte de funcionare, i anume deine i accept doar curse
ale navelor care aparin porturilor care fac parte din acelai club maritim.

5. Teoria grafurilor

133

Un turist afl care sunt porturile ntre care exist curse directe ale navelor i dorete
s stabileasc cluburile maritime existente.
S se scrie un algoritm care ajut turistul s determine numrul de cluburi i componena lor.
Date de intrare
Pe prima linie a fiierului de intrare CLUB.IN se afl un numr natural n, reprezentnd
numrul porturilor din zona respectiv. Pe urmtoarele linii se gsesc cte dou numere i i j, separate prin spaiu, reprezentnd faptul c ntre porturile i i j exist curs
direct.
Date de ieire
Pe prima linie a fiierului de ieire CLUB.OUT se va scrie un numr natural nc, reprezentnd numrul de cluburi existente, iar pe urmtoarele nc linii vor fi trecute numere
naturale separate prin spaiu, reprezentnd numerele de ordine ale porturilor care fac
parte dintr-un acelai club.
Restricii i precizri
1 n 100.
Exemplu
CLUB.IN
5
1 5
1 4
2 3

CLUB.OUT
2
1 4 5
2 3

1
2

4
3

5.4.4. mprirea fluturailor


n oraul X se deschide un nou supermagazin. Patronii au decis s anune locuitorii
oraului despre eveniment cu ajutorul fluturailor i au angajat n acest sens
distribuitori.
Un astfel de distribuitor primete o list de strzi i harta acestora. Pentru a-i termina treaba mai repede el i propune s-i optimizeze deplasarea, astfel nct s nu
treac de dou ori pe aceeai strad, s nu parcurg inutil alte strzi, s le parcurg pe
toate i s se ntoarc de unde a plecat. Cu alte cuvinte el dorete ca dup ce a terminat
de parcurs o strad s continue cu o alta adiacent.
Se consider c fiecare strad se afl ntre dou intersecii. O intersecie poate fi
confluena uneia, a dou, sau a mai multor strzi. De exemplu, dac o strad iese din

134

5. Teoria grafurilor

localitate, sau este un drum nfundat (adic nu are ieire dect la un capt), se consider c acea strad se termin cu o intersecie imaginar. Interseciile se numeroteaz
cu primele numere naturale. O strad se noteaz prin numerele de ordine ale celor
dou intersecii care o delimiteaz. ntre dou intersecii nu exist dect o strad care
le leag direct. Nu exist nici o strad care ncepe i se sfrete n aceeai intersecie.
Scriei un algoritm care ajut distribuitorul s determine dac exist un astfel de
traseu i dac exist, s indice unul.
Date de intrare
Pe prima linie a fiierului de intrare STRAZI.IN se afl dou numere ntregi n i m,
separate printr-un spaiu, reprezentnd numrul interseciilor din ora, respectiv numrul strzilor repartizate distribuitorului. Pe urmtoarele m linii se gsesc cte dou numere i i j, separate printr-un spaiu, reprezentnd strzile, adic numerele de ordine
ale celor dou intersecii care delimiteaz o strad.
Date de ieire
Fiierul de ieire STRAZI.OUT va conine pe prima linie cuvntul 'DA', sau 'NU', exprimnd rspunsul la ntrebarea dac exist un traseu care trece pe toate strzile o singur dat. Pe urmtoarea linie vor fi trecute numerele de ordine ale interseciilor care
delimiteaz cte o strad prin care trece distribuitorul, separate prin cte un spaiu.
Primul i ultimul numr trebuie s coincid deoarece distribuitorul trebuie s se ntoarc n punctul de plecare.
Restricii i precizri
1 n 10;
parcurgerea unei strzi ntr-un sens implic distribuirea fluturailor la toate casele
de pe strada respectiv (i pe o parte i pe alta a strzii) i nu este necesar parcurgerea strzii n ambele sensuri.
Exemple
STRAZI.IN
5 6
1 4
1 5
2 3
2 5
3 5
4 5

STRAZI.OUT
DA
1 4 5 2 3 5 1

1
2

4
3

5. Teoria grafurilor
STRAZI.IN
5 4
1 4
1 5
2 3
2 5

135
STRAZI.OUT
NU

1
2

4
3

5.4.5. Pregtirea mesei


Bubulina dorete s fac o surpriz prinilor ei i s pregteasc masa de prnz. S-a
narmat cu o carte de bucate, alimente i condimente, un or mare i e nedumerit de
ordinea n care trebuie s realizeze operaiile pentru a pregti o mas bun.
tie c anumite operaii se realizeaz naintea altora, de exemplu cartofii se spal
nainte de a-i fierbe i doar dup ce au fiert se prepar.
Cunoscnd numrul operaiilor pe care trebuie s le realizeze Bubulina i prioritile unor operaii fa de altele, realizai o ordonare liniar a operaiilor astfel nct masa
s fie pregtit foarte bine.
Date de intrare
Pe prima linie a fiierului de intrare PAPA.IN se gsete un numr n care reprezint
numrul de operaii pe care Bubulina trebuie s le realizeze. Pe urmtoarele linii se
gsesc cte dou numere x i y, separate printr-un spaiu, reprezentnd faptul c
operaia x trebuie realizat naintea operaiei y.
Date de ieire
Fiierul de ieire PAPA.OUT va conine pe o succesiune de n numere, separate prin
cte un spaiu, reprezentnd numerele de ordine ale operaiilor culinare n ordinea n
care pot fi realizate, astfel nct masa s fie bine pregtit.
Restricii i precizri
1 n 100;
Datele de intrare sunt corecte i nu exist operaii care s determine o preceden
circular de exemplu operaia 1 s fie realizat naintea operaiei 2, 2 naintea lui
3 i 3 naintea lui 1.

136

5. Teoria grafurilor

Exemplu
PAPA.IN
7
2 1
2 4
1 7
4 7
6 7
5 6
3 6
5 3
1 4
PAPA.OUT
2 5 1 3 4 6 7

3: Condimenteaz carnea

5:Taie carnea
6: Frige carnea
2: Spal legume

2: Spal legume

7: Spal vase
1: Taie
legume

4: Amestec salata

5: Taie carnea 1: Taie legume

3: Condimenteaz 4: Amestec
carnea
salata

6: Frige carnea 7: Spal vase

5.4.6. Expoziia de roboi


n cadrul unei expoziii se organizeaz un sector pentru prezentarea realizrilor unor
studeni pasionai de construirea roboilor. Fiecare exponat are nevoie de alimentare la
reeaua de curent electric pentru a putea demonstra publicului aplicabilitatea sa. n sectorul aferent exist o surs de curent i se cunosc anumite distane dintre exponate i
distanele dintre unele exponate i surs.
Deoarece expoziia este temporar se dorete ca reeaua de curent s fie realizat
astfel nct s coste ct mai puin i fiecare exponat s fie alimentat direct sau indirect
de la surs cu curent electric.
Cunoscnd numrul de exponate i anumite distane dintre ele, precum i distane
dintre exponate i surs, i tiind totodat c preul reelei este direct proporional cu
lungimea firelor electrice folosite, s se determine o reea electric de cost minim.
Date de intrare
Pe prima linie a fiierului ROBOTI.IN se afl numrul natural n, reprezentnd numrul
exponatelor. Pe urmtoarele linii se afl cte trei numere separate prin cte un spaiu.
Primele dou reprezint numerele de ordine ale exponatelor sau 0 pentru sursa de
curent electric, iar al treilea reprezint distana n metri dintre cele dou exponate.
Date de ieire
Pe prima linie a fiierului ROBOTI.OUT se va afia lungimea total a reelei de curent
electric. Pe urmtoarele linii se vor scrie cte dou numere, reprezentnd numerele de
ordine a dou exponate legate ntre ele, sau 0 (zero) in situaia sursei de curent electric.

5. Teoria grafurilor

137

Restricii i precizri
1 n 100;
exponatele sigur pot fi conectate direct sau indirect la sursa de curent electric;
un exponat poate fi legat la sursa de curent electric i indirect, adic n serie cu un
alt exponat.
Exemplu
ROBOTI.IN
5
0 1 3
0 3 1
0 4 4
0 5 2
1 2 3
1 3 3
2 3 2
2 4 4
3 4 3
3 5 1
4 5 3
ROBOTI.OUT
10
0 3
1 2
2 3
3 4
3 5

Sursa 0

1
3

1
3

4
3

3
2

Sursa 0
1
1

3
3

3
4

5.4.7. Aliane
Pe o planet dintr-un sistem stelar se gsesc n triburi extraterestre. ntre unele dintre
ele exist acorduri de pace. Un astfel de acord presupune c un trib nu poate ataca, sau
nu se poate alia ntr-un atac mpotriva altuia cu care are un acord. n plus un acord are
aceast restricie i asupra unui trib aliat i asupra aliailor tribului aliat. Astfel triburile
aliate direct sau indirect formeaz o comunitate. n schimb triburile din comuniti diferite se pot ataca ntre ele.
Cunoscnd numrul triburilor i acordurile dintre ele, se cere s se afle numrul de
comuniti existente pe planet. Se cere, de asemenea, s se determine acele perechi de
triburi, care ar trebui s semneze acorduri de pace, pentru ca pe planet s se formeze
o singur comunitate.

138

5. Teoria grafurilor

Date de intrare
Pe prima linie a fiierului STEA.IN se afl un numr natural n, reprezentnd numrul
de triburi. Pe urmtoarele linii se afl cte dou numere separate prin cte un spaiu.
Acestea reprezint numerele de ordine ale triburilor ntre care exist acorduri de pace.
Date de ieire
Pe prima linie a fiierului de ieire STEA.OUT se va afia numrul k de comuniti de
pe planet. Pe urmtoarele k linii se vor afla numerele de ordine ale triburilor care fac
parte dintr-o comunitate. (Pe a i-a linie se va descrie a (i 1)-a comunitate.
Dac pe planet exist mai mult de o comunitate, pe linia urmtoare se va afia mesajul 'Acorduri necesare:' i pe urmtoarele linii se vor afia perechi de numere
de ordine ale triburilor care, prin semnarea unui acord vor determina unirea a cel puin
dou comuniti, astfel nct, n final, s fie unite toate comunitile.
Dac exist o singur comunitate nu se mai scrie nimic n fiier.
Restricii i precizri
1 n 100;
Datele de intrare sunt corecte i sunt date toate acordurile o singur dat.
Exemplu
STEA.IN
7
1 3
2 3
4 5
6 7

STEA.OUT
3
1 2 3
4 5
6 7
Acorduri necesare:
1 4
1 6

1
6

5.4.8. Pregtirea balului


Elevii clasei a X-a doresc s organizeze Balul Primverii i au format un nucleu de organizare care a decis s realizeze diferite surprize participanilor, s orneze sala de bal
i s pregteasc toate celelalte detalii. Ei doresc s repartizeze lucrrile astfel nct s
termine pregtirile n cel mai scurt timp. Se tie c operaiile trebuie s fie realizate
ntr-o anumit succesiune. De exemplu invitaiile nu pot fi mprite pn cnd nu au
fost tiprite, sau ghirlandele nu pot fi ntinse pn nu au fost confecionate.
Cunoscnd operaiile care trebuie efectuate, durata fiecrei astfel de operaii i succesiunile lor, determinai care sunt operaiile care nu trebuie ntrziate pentru ca balul
s poat ncepe la timp.

5. Teoria grafurilor

139

Date de intrare
Pe prima linie a fiierului BAL.IN se afl un numr natural n, reprezentnd numrul
evenimentelor care se vor realiza. Pe urmtoarele linii se afl triplete de numere x y d
care reprezint precedene ntre evenimente, adic operaia y nu poate fi executat
nainte ca operaia x s se termine i d durata activitii dintre aceste dou evenimente.
Date de ieire
Pe prima linie a fiierului de ieire BAL.OUT se va afia durata total a pregtirilor. Pe
urmtoarea linie se vor afla perechi de numere de ordine, reprezentnd evenimentele
care nu pot ntrzia, deoarece astfel s-ar ntrzia ntreaga pregtire a balului.
Restricii i precizri
1 n 100;
Datele de intrare sunt corecte.
Exemplu
BAL.IN
7
1 2 2
2 4 5
4 7 4
4 6 2
5 6 6
1 3 2
3 5 3
6 7 2

BAL.OUT
13
1 3
3 5
5 6
6 7

2
3

4
2

4
7

5.4.9. Pe drumuri de munte


Elevii clasei a X-a se afl n expediie ntr-o zon montan. Ei doresc s ajung la o
anumit peter pentru a o vizita. Au harta zonei i nu sunt decii pe care drum s porneasc innd cont c doresc s se bucure pe traseu de privelitile zonei.
Cunoscnd punctele de atracie turistic din zon i traseele marcate ntre aceste
puncte, determinai toate traseele posibile pe care se poate ajunge la peter pornind de
la caban, urmnd ca ei s aleag drumul pe care l vor urma.
Date de intrare
Pe prima linie a fiierului TRASEU.IN se afl un numr natural n, reprezentnd numrul punctelor de atracie legate prin trasee marcate. Pe cea de-a doua linie se gsesc
dou numere separate prin spaiu, primul fiind numrul de ordine al cabanei, iar al doilea numrul de ordine al peterii. Pe urmtoarele linii se afl cte dou numere separate prin cte un spaiu, reprezentnd puncte turistice din zon legate direct printr-un
drum marcat.

140

5. Teoria grafurilor

Date de ieire
Pe fiecare linie a fiierului de ieire TRASEU.OUT se va afia cte un traseu. Un traseu
ncepe la caban i se sfrete la peter. Numerele de ordine ale punctelor dintr-un
traseu sunt separate prin cte un spaiu. Dac nu exist nici un traseu, n fiierul e ieire se va scrie 'Nu exista traseu.'.
Restricii i precizri
1 n 10;
Datele de intrare sunt corecte i sunt date toate traseele marcate o singur dat.
Exemplu
TRASEU.IN
6
1 5
1 2
1 6
2 3
2 6
3 4
3 5
3 6
4 5
5 6

TRASEU.OUT
1 2 3 4 5
1 2 3 5
1 2 3 6 5
1 2 6 3 4 5
1 2 6 3 5
1 2 6 5
1 6 2 3 4 5
1 6 2 3 5
1 6 3 4 5
1 6 3 5
1 6 5

2
1

4
6

5.4.10. Mesaj telefonic


Dintr-un grup de colegi unii i cunosc numerele de telefon i pot schimba mesaje. Din
pcate nu oricare doi colegi i cunosc numerele de telefon. La un moment dat Ionel
dorete s l anune pe Gigel despre noul film care ruleaz n ora. Dac Ionel nu
cunoate numrul de telefon al lui Gigel, va anuna un alt coleg al crui numr l
cunoate, acesta pe altul, pn cnd mesajul ajunge la Gigel.
Cunoscnd numrul de colegi, precum i perechile de colegi care pot comunica direct, determinai succesiunea de lungime minim de telefoane care vor fi folosite pentru ca Gigel s fie anunat despre film.
Date de intrare
Pe prima linie a fiierului MESAJ.IN se afl un numr natural n, reprezentnd numrul
total de prieteni. Pe cea de-a doua linie se gsesc numerele corespunztoare lui Ionel,
respectiv al lui Gigel. Pe urmtoarele linii se afl cte dou numere separate prin cte
un spaiu. Acestea reprezint numerele de ordine ale copiilor care i cunosc reciproc
numerele de telefon i pot comunica direct.

5. Teoria grafurilor

141

Date de ieire
Pe prima linie a fiierului de ieire MESAJ.OUT se va afia numrul k de telefoane care
se vor folosi, astfel nct Gigel s afle mesajul printr-un numr minim de intermediari.
Pe urmtoarea linie se vor afia numerele de ordine ale colegilor care trebuie s telefoneze, n ordinea n care, la rndul lor, primesc mesajul, primul fiind numrul de ordine
al lui Ionel, iar ultimul al lui Gigel. Dac nu exist soluie, n fiierul de ieire se va
scrie mesajul 'Nu se poate transmite mesajul.'.
Restricii i precizri
1 n 100;
dac exist mai multe posibiliti de a comunica mesajul, se va afia una dintre ele;
datele de intrare sunt corecte.
Exemplu

MESAJ.IN
6
1 4
1 2
1 6
2 6
3 6
3 4
5 4

MESAJ.OUT
3
1 6 3 4

Explicaie
1 telefoneaz lui 6;
6 telefoneaz lui 3;
3 l anun pe 4.

5.4.11. Distane rutiere


O companie de transport persoane cu autobuzul a introdus n rutele sale o destinaie
nou i vrea s stabileasc preul cltoriei. Preul este direct proporional cu distana
parcurs ntre dou localiti pe cel mai scurt drum posibil.
Cunoscnd numrul de destinaii pentru care exist transporturi i distanele dintre
localitile care sunt legate de cte un drum direct pe care exist transport, determinai
cel mai scurt drum ntre localitatea din care pornete autobuzul i localitatea nou introdus.
Date de intrare
Pe prima linie a fiierului AUTO.IN se afl un numr natural n, reprezentnd numrul
de localiti n care autobuzul are staii. Pe linia a doua se afl dou numere reprezentnd numerele de ordine ale localitilor ntre care se cere determinarea drumului de
lungime minim. Pe urmtoarele linii se afl cte trei numere separate prin cte un
spaiu. Acestea reprezint numerele de ordine ale localitilor direct legate printr-un
drum, iar al treilea reprezint distana dintre cele dou localiti.

142

5. Teoria grafurilor

Date de ieire
Pe prima linie a fiierului de ieire AUTO.OUT se va afia distana minim dintre cele
dou localiti. Pe urmtoarea linie se vor afla numerele de ordine ale localitilor prin
care se va cltori ntre cele dou localiti date n fiierul de intrare.
Restricii i precizri
1 n 100;
datele de intrare sunt corecte.
Exemplu
AUTO.IN
5
1 3
1 2 20
1 4 7
2 4 3
2 3 5
4 3 10
4 5 3
3 5 6

AUTO.OUT
15
1 4 2 3

5.5. Soluiile problemelor propuse


5.5.1. Campanie electoral
Se observ c putem asocia hrii oraelor un graf neorientat cu n vrfuri, reprezentnd
oraele. Drumurile dintre acestea sunt muchiile grafului. ntre fiecare dou orae exist
drum direct, deci graful este complet. n plus se asociaz muchiilor grafului un cost
strict pozitiv, reprezentnd lungimea drumului dintre cele dou orae. Graful (harta)
va fi reprezentat n memorie cu ajutorul matricei costurilor, dat n fiierul de intrare.
Rezolvarea problemei revine la a gsi n graful asociat un ciclu hamiltonian de lungime minim. Reamintim c un ciclu hamiltonian trece prin toate vrfurile grafului o
singur dat.
Dac se va folosi o rezolvare bazat pe metoda backtracking, se pot obine toate ciclurile grafului i dintre ele se poate determina ciclul de lungime minim. Acest algoritm ns are nevoie de un timp de rezolvare de ordin exponenial, deoarece ntr-un
graf complet cu n vrfuri exist (n 1)!/2 cicluri hamiltoniene.
Pentru a rezolva problema ntr-un timp rezonabil se poate folosi un algoritm bazat
pe metoda greedy (metoda optimului local), dar care nu va furniza pentru orice date de
intrare rezultat optim. Conform principiului metodei greedy, n fiecare moment vom
alege oraul cel mai apropiat de cel n care se afl candidatul.

5. Teoria grafurilor

143

Vom nota soluia corect ca fiind o succesiune de noduri (orae) ale grafului parcurse ntr-un traseu de lungime minim [c1, c2, , cn, c1]. Pentru a determina o astfel
de soluie, s considerm c la un moment dat al construirii ciclului sunt determinate
primele k orae n succesiunea de parcurgere a lor ([c1, c2, , ck]) i trebuie s determinm al (k + 1)-lea nod. Acesta se va alege dintre vrfurile adiacente lui ck, vrfuri
care nu au fost deja alese ntre primele k. Dintre nodurile avnd aceast proprietate
vom alege pe acela care este cel mai aproape de nodul ck. Deci l alegem pe x {1,
2, , n}, astfel nct x {c1, c2, , ck} i (ck, x) are lungime minim.
Exemplu
1

4
3
3
5

1
3

Figura 1

Figura 2

1
2

2
4

3
5

1
3

3
3
4

Figura 3

1
3

3
4

Figura 4

n graful din exemplu avem n = 5. Dac primul ora din traseu este 1, atunci conform principiului enunat, vom alege muchia de lungime minim dintre cele incidente
cu vrful 1. Aceasta este (1, 2) de lungime 2. Apoi cutm muchia avnd cel mai mic
cost (lungime de drum) printre muchiile incidente cu oraul (vrful) 2. Alegem muchia
(2, 3) avnd costul 1. Muchia avnd cel mai mic cost printre cele incidente cu vrful 3
este (3, 1), dar oraul 1 a fost deja vizitat. Astfel continum drumul prin nodul 4, apoi
5, dup care ne ntoarcem n oraul 1.
Din pcate acest traseu nu este de lungime minim. Avnd n vedere c prin fiecare
ora trebuie s trecem exact o singur dat, putem privi ciclul cutat ca pe un cerc care
poate (temporar) s nceap din oricare alt nod. Astfel, dac se schimb oraul de
pornire i se aplic aceeai strategie greedy, obinem soluii mai bune, dup cum se
poate vedea n figura 3, respectiv figura 4, unde s-au obinut lungimile 13 respectiv 12
ale ciclurilor hamiltoniene.

144

5. Teoria grafurilor

Subalgoritm CicluHam(costmin,trmin):
costmin
pentru i=1,n execut:

{ se determin cte un traseu pentru fiecare ora ca punct de plecare }


cost tur(i)

{ se calculeaz costul minim pentru traseul care pleac din oraul i }


dac cost < costmin atunci
costmin cost
trmin traseui
sfrit dac
sfrit pentru
sfrit subalgoritm

{ se reine traseul de cost minim }

n secvena de mai sus am folosit notaiile:

costmin reprezint valoarea costului traseului de lungime minim;


cost este costul unui traseu;
trmin este traseul de lungime minim.
Subalgoritmul tur(i,co) (apelat n subalgoritmul CicluHam(costmin)) determin costul i traseul care pornete din oraul i. Pentru a ti n fiecare clip dac un
ora a fost vizitat sau nu, se va folosi un vector de valori booleene viz. Dac oraul i a
fost vizitat, vizi este adevrat n caz contrar este fals.
Subalgoritm tur(i,co):
co 0
pentru k=1,n excut:
viz[k] fals
sfrit pentru
viz[i] adevrat
tr[1] i
pentru t=1,n-1 execut:
y tr[t]
min

{ iniial costul traseului este zero }


{ la nceput nici un ora nu a fost vizitat }
{ se viziteaz oraul i }
{ n traseu primul ora este i }

{ se caut oraul vecin nevizitat, aflat la distan minim }


pentru j=1,n execut:

{ se caut oraul cel mai apropiat care nu a fost nc vizitat }


dac (nu viz[j]) i (cost[y,j] < min) atunci
min cost[y,j]
nod j
sfrit dac
sfrit pentru

5. Teoria grafurilor

145

{ oraul care se afl la distan minim este marcat ca vizitat }


viz[nod] adevrat
{ i este trecut n traseu }
tr[t+1] nod
co co + min
{ se calculeaz costul n acest moment }

sfrit pentru
tr[n+1] i
co co + cost[tr[n],i]
sfrit subalgoritm

{ cltorul se ntoarce de unde a plecat }


{ se calculeaz costul total al traseului }

Ordinul de mrime a timpului de execuie este polinomial n cazul aplicrii acestui


algoritm, dar reamintim faptul c nu ntotdeauna furnizeaz rezultatul optim.

5.5.2. Parcul colorat


Se observ c se poate asocia hrii csuelor un graf neorientat cu n vrfuri. Csuele
sunt reprezentate prin vrfurile grafului i faptul c ele se vd se reprezint prin muchiile grafului. Dou csue care se vd sunt legate printr-o muchie. Problema revine
astfel la a asocia vrfurilor grafului culori (coduri de culoare) astfel nct dou noduri
adiacente s fie colorate diferit.
Pentru problema de fa reprezentarea cu ajutorul matricei de adiacen a grafului
este bine venit, astfel se poate verifica uor dac dou csue se vd sau nu.
Construirea matricei de adiacen se realizeaz n paralel cu citirea datelor. Matricea de adiacen iniial conine doar elemente nule. Cu fiecare citire a cte dou numere i i j att aij ct i aji devin 1, deoarece, dac din i se vede j, atunci i din j se vede i.
Se poate observa c dac graful este complet, sunt necesare n culori, iar dac graful
conine doar vrfuri izolate se poate folosi o singur culoare. Un caz particular l
reprezint graful planar (cel care admite o reprezentare grafic astfel nct muchiile
sale nu se intersecteaz), n cazul crora teorema celor patru culori afirm c orice graf
planar poate fi colorat doar cu patru culori.
Dac se va folosi o rezolvare bazat pe metoda backtracking, se pot obine toate
posibilitile de colorare a csuelor i apoi se poate alege varianta cu numr de culori
minim. Acest algoritm este bun pentru valori mici ale lui n, ns, deoarece are nevoie
de un timp de rezolvare de ordin exponenial, pentru valori mari ale lui n este inacceptabil.
Pentru a rezolva problema se va folosi un algoritm bazat pe metoda greedy, astfel
nct vrfurile se coloreaz pe rnd cu cel mai mic cod de culoare posibil. Acest algoritm nu furnizeaz soluia optim pentru orice date de intrare, dar l prezentm, deoarece, fa de rezolvarea cu metoda backtracking are un timp de execuie incomparabil
mai bun.
Prima csu se coloreaz ntotdeauna cu culoarea avnd codul 1. Culoarea cu care
se coloreaz csua i o vom nota cu culi.

146

5. Teoria grafurilor

S presupunem c avem colorate primele k 1 csue cu cul1, cul2, , culk-1, n


care intervin nrcul culori i se pune problema colorrii csuei k. Aceasta va fi colorat
cu culoarea c, unde c {1, 2, , nrcul}, dac pentru j {1, 2, , k 1} avnd
proprietatea c dac akj = 1, atunci culj c, iar c este valoarea cea mai mic avnd
aceast proprietate. Dac nu exist o astfel de culoare c, atunci csua va fi colorat cu
culoarea nrcul + 1.
Subalgoritm Colorare(n,a,culmin,cul):
{ prima csu se coloreaz cu culoarea 1 }
c 1
pentru k=2,n execut:
{ se coloreaz i celelalte n 1 csue }
c 1
{ se ncearc colorarea cu prima culoare }
repet
{ se repet ncercarea de a colora }
ok adevrat
{ presupunem c se poate colora cu culoarea c }
pentru j=1,k-1 execut:

{ dac o csu care se vede a fost colorat cu aceeai culoare }


dac (aj,k 0) i (culj = c) atunci
ok fals
sfrit dac
sfrit pentru
dac nu ok atunci
{ verificm dac culoarea c este bun sau nu }
c c + 1
{ dac nu, se ncearc culoarea urmtoare }
sfrit dac
pn cnd ok
{ se coloreaz csua k cu culoarea c }
cul[k] c
dac cul[k] > culmin atunci
{ se memoreaz codul culorilor folosite }
culmin cul[k]
sfrit dac
sfrit pentru
sfrit subalgoritm

5.5.3. Cluburi maritime


Vom asocia hrii porturilor un graf neorientat cu n vrfuri, n care vrfurile reprezint
porturi. Legturile directe ntre porturi vor fi muchiile grafului. Memorm graful cu
ajutorul matricei de adiacen pe care o construim odat cu citirea datelor. Matricea de
adiacen iniial conine doar elemente nule. Corespunztor fiecrei perechi de numere
i i j, aij i aji devin egale cu 1.
Observm c dac graful este conex, toate porturile fac parte din acelai club maritim, iar dac graful conine doar vrfuri izolate, fiecare port este parte din clubul su
exclusivist i probabil c turitii folosesc alte mijloace de transport.
Problema revine la a determina componentele conexe ale grafului. O component
conex este un subgraf conex maximal.

5. Teoria grafurilor

147

Pentru a determina componentele conexe ale grafului se pot utiliza dou metode.
I. Parcurgerea n lime.
Folosind aceast metod se vor asocia porturilor numere care reprezint clubul din
care fac parte.
Prin parcurgerea n lime se obine o list de vrfuri care sunt legate direct sau
indirect de un anumit nod al grafului.
Pentru nceput se pornete de la un vrf (port) oarecare, de exemplu 1, i se determin toate vrfurile la care se poate ajunge de la el. Toate aceste noduri fac parte din
componenta conex numrul 1.
Apoi, se determin dac mai exist vrfuri care nu au fost parcurse. Dac exist
astfel de vrfuri se repet o parcurgere ca cea descris mai sus pentru unul dintre aceste noduri ca fcnd parte dintr-o alt component conex. Aceti ultimi pai se repet
ct timp exist vrfuri neparcurse.
Subalgoritm ComponenteConexe(n,a,ncc,club)
ncc 0
pentru j=1,n execut:
viz[j] fals { la nceput nici un port nu a fost adugat n vreo component }
sfrit pentru
i 1
repet
ncc ncc + 1
{ o nou component conex }
{ portul i face parte din aceast component }
club[i] ncc
c[1] i

{ determinm toi vecinii lui i i i trecem n c i memorm }


{ componenta conex curent }
Parcurgere(i,c,club)
i 0
{ verificm dac mai exist noduri neparcurse }
pentru j=1,n execut:
dac nu viz[j] atunci
{ dac mai exist vrfuri nevizitate }
i j
{ se reine unul dintre ele n variabila i urmnd s se }

{ reia construcia pentru i cu o nou valoare }


sfrit dac
sfrit pentru
pn cnd i=0
sfrit subalgoritm

{ repetiia se oprete cnd nu exist vrfuri neparcurse }

Parcurgerea n lime se realizeaz reinnd ntr-un ir valorile vrfurilor parcurse


i pentru fiecare dintre ele adugnd la sfritul irului vrfurile adiacente care nu au
fost trecute deja.

148

5. Teoria grafurilor

De exemplu, avnd graful din figura alturat i


1
2
pornind de la vrful 1, prin parcurgerea n lime se
6
obine succesiunea de vizitare a vrfurilor grafului:
1, 2, 4, 3, 6, 5.
3
Vom reine n irul c etichetele vrfurilor grafului.
5
Pe prima poziie se reine primul vrf parcurs i
anume 1. Apoi se adaug toate nodurile adiacente cu
4
el. Astfel irul devine: 1, 2, 4. Urmeaz s se viziteze
nodurile adiacente cu 2, care nu au fost trecute deja n ir. irul devine 1, 2, 4, 3. Se
trateaz apoi nodurile adiacente lui 4 i se obine: 1, 2, 4, 3, 6. Urmeaz vrfurile
adiacente cu 3, dar vrful 2 i vrful 6 sunt deja vizitate, deci nu vor fi trecute n ir.
La sfrit se parcurg vrfurile adiacente lui 6 i nevizitate nc, adic vrful 5 i cele
adiacente lui 5 (care nu mai are vecini nevizitai). Se obine irul final: 1, 2, 4, 3, 6, 5.
Subalgoritm Parcurgere(i,c,club):
{ k este lungimea curent a irului c }
k 1
{ cu z parcurgem irul nodurilor memorate n c }
z 1
ct timp z k execut:
{ se iau toate vrfurile din irul c }
t c[z]
{ se caut vecinii nodului de pe poziia z n ir }
viz[t] adevrat
{ se marcheaz faptul c acest nod a fost parcurs }
pentru j=1,n execut:

{ dac exist noduri adiacente i neparcurse }


dac (a[t,j] = 1) i (nu viz[j]) atunci
viz[j] adevrat
{ se mrete lungimea lui c }
k k + 1
c[k] j
{ se adaug n c i vrful j }
{ se adaug la componenta conex ncc }
club[j] ncc
sfrit dac
sfrit pentru
z z + 1
{ trecem la urmtorul vrf din c i i cutm vecinii nevizitai }
sfrit ct timp
sfrit subalgoritm

n graful din figura precedent, toate vrfurile au fcut parte din aceeai component conex. Dac este vorba ns de un graf neconex
ca n figura alturat, afiarea componentelor
conexe este ceva mai dificil.
Pentru graful din aceast figur irul club va
conine valorile 1, 2, 2, 1, 1.

1
2
5

Afiarea vrfurilor pe componente conexe se poate realiza astfel:

3
4

5. Teoria grafurilor
Subalgoritm Scrie(club,n):
pentru i=1,ncc execut:
pentru j=1,n execut:
dac club[j] = i atunci
scrie j
sfrit dac
sfrit pentru

149
{ pentru fiecare component conex }
{ se verific toate vrfurile }
{ dac face parte din a i-a component }
{ se afieaz eticheta vrfului respectiv }

trecem la linie nou


sfrit pentru
sfrit subalgoritm

II. Parcurgerea n adncime


Prin parcurgerea n adncime a unui graf se obine tot o succesiune de vrfuri memorate ntr-un ir.
Astfel pentru graful din figura alturat succe1
2
siunea de vrfuri va fi 1, 2, 3, 6, 5, 4.
6
n irul c se rein etichetele vrfurilor grafului.
Pe prima poziie se reine primul vrf parcurs i
3
anume 1. Apoi se adaug un nod adiacent cu el, n
5
cazul de fa 2, dup care se caut un nod adiacent cu 2 i care nu a fost trecut deja n ir. Astfel
4
irul devine: 1, 2, 3. Urmeaz s se viziteze nodul
adiacent cu 3 i care nu a fost trecute deja n ir. irul devine 1, 2, 3, 6. Se introduce n
ir nodul 5 (adiacente cu 6). Apoi ar trebui parcurs un vrf adiacent cu 5, dar nu mai
exist un astfel de nod care s nu fi fost trecut n ir. n situaia dat se caut un alt
vrf adiacent cu 6 i se obine vrful cu eticheta 4. Dac nu mai sunt vrfuri adiacente
cu un anumit vrf se caut vecini pentru vrfuri anterior memorate n ir.
Pentru o astfel de parcurgere este recomandat memorarea grafului sub form de
liste ale vrfurilor adiacente. n cazul grafului din prima figur listele de adiacen
sunt: (2, 4); (1, 3); (2, 6); (1, 6); (6); (3, 4, 5).
Construirea listelor vrfurilor adiacente se realizeaz concomitent cu citirea datelor:
Subalgoritm ListaVrfurilorAdiacente(n,a,nvec):
citete n
ct timp nu urmeaz marca de sfrit de fiier execut:
citete i,j
nveci nveci + 1
nvecj nvecj + 1
a[i,nveci] j
a[j,nvecj] i
sfrit ct timp
sfrit subalgoritm

150

5. Teoria grafurilor

Determinarea componentelor conexe poate folosi o structur recursiv pentru a


putea parcurge elegant toate vrfurile grafului.
Subalgoritm Compcon(i,c):
{ vrful i face parte din componenta conex c }
club[i] c
viz[i] adevrat
{ se marcheaz vrful i ca fiind vizitat }
pentru j=1,nveci execut:
{ pentru toate vrfurile adiacente lui i }
dac nu viz[a[i,j]] atunci
{ dac nu au fost vizitate }
Compcon(a[i,j],c)
{ cutm vecinii vecinului lui i }
sfrit dac
sfrit pentru
sfrit subalgoritm

Aceast secven se apeleaz din programul principal atta timp ct mai exist vrfuri nevizitate.
Algoritm Club:
pentru i=1,n execut:
viz[i] fals
nvec[i] 0
sfrit pentru
citire(n,a)
ncc 0

{ la nceput nici un nod nu a fost vizitat }


{ naintea citirii toate nodurile au 0 vecini }
{ subalgoritm de citire }

pentru i=1,n execut:


dac nu viz[i] atunci
{ dac exist un vrf nevizitat }
ncc ncc+1
{ trecem la urmtoarea component conex }
Compcon(i,ncc) { determinm elementele care fac parte din component }
sfrit dac
sfrit pentru
{ subalgoritm de afiare }
scrie(ncc,cc)
sfrit algoritm

Afiarea componentelor conexe se realizeaz ca n programul prezentat n cazul


parcurgerii n lime, avnd acelai tip de memorare a rezultatului.

5.5.4. mprirea fluturailor


Se observ c se poate asocia hrii strzilor un graf neorientat cu n vrfuri i m
muchii, unde vrfurilor li se asociaz interseciile i muchiilor strzile.
Memorarea grafului se realizeaz cu ajutorul matricei de adiacen. Construirea
matricei de adiacen se realizeaz odat cu citirea datelor. Astfel matricea de adiacen iniial conine doar elemente nule. Cu fiecare citire a cte dou numere i i j se ada-

5. Teoria grafurilor

151

ug matricei cte dou elemente avnd valorile egale cu 1. i i j reprezint numerele de


ordine a dou intersecii ntre care exist strad.
Distribuitorul trebuie s parcurg toate strzile care i-au fost repartizate i dac se
poate n mod optim. Prin optim nelegem c el nu dorete s treac de dou ori pe
aceeai strad, de asemenea, nu va parcurge inutil alte strzi, dar trebuie s parcurg
toate strzile care i s-au repartizat i trebuie s se ntoarc de unde a plecat.
Problema revine la a determina dac graful este eulerian i dac este, la a determina
un ciclu eulerian al grafului.
Un graf este eulerian dac este conex i dac are gradul vrfurilor par.
Pentru nceput trebuie s rspundem la ntrebarea dac poate fi gsit un traseu cu
proprietile cerute (toate strzile s fie parcurse o singur dat i s se revin la locul
de plecare). Pentru aceast verificare vom folosi o funcie n care la nceput presupunem c graful asociat strzilor este eulerian. Pentru orice condiie nendeplinit (conex
sau grade pare) valoarea de adevr a funciei de verificare devine fals.
Gradul unui vrf se calculeaz simplu, dac graful este memorat cu ajutorul matricei de adiacen, prin nsumarea elementelor de pe linia corespunztoare vrfului.
Subalgoritm verificare(n,m,a):
verificare adevrat
pentru i=1,n execut:
s 0
pentru j=1,n execut:
s s + a[i,j]
dac s este numr impar atunci
verificare fals

{ presupunem c graful este eulerian }


{ calculul gradului vrfului i }

{ graful nu este eulerian }

ieire forat din subalgoritm

altfel
gr[i] s
sfrit dac
sfrit pentru
sfrit pentru
...

{ se memoreaz gradele vrfurilor }

Graful este conex dac pentru oricare dou vrfuri ale sale exist un lan care le
leag. Astfel, pornind de la un vrf oarecare din graf i parcurgnd graful (de exemplu
n lime) ar trebui s putem ajunge n toate vrfurile sale. Dac nu se ajunge ntr-un
vrf, atunci graful sigur nu este conex, iar dac se ajunge n toate, graful este conex.
Pentru a parcurge graful n lime vom pstra ntr-un ir dr vrfurile care se parcurg. La nceput trecem n ir un vrf, de exemplu vrful 1, apoi i trecem pe toi vecinii si (vrfurile adiacente cu el), apoi ajungem la vecinii vecinilor i aa mai departe.
n consecin, dac subalgoritmul nu s-a ntrerupt din cauza c graful nu avea suma
gradelor vrfurilor numr par, urmeaz s verificm dac acesta este conex:

152

5. Teoria grafurilor

...
pentru i=1,n execut:
viz[i] 0
{ la nceput toate vrfurile sunt nevizitate }
sfrit pentru
k 1
{ k este numrul de vrfuri vizitate, iar p este numrul }
p 1
{ de ordine al vrfului cruia i se caut vecinii }
dr[1] 1
{ se pornete din vrful 1 }
viz[1] 1
{ se marcheaz faptul c vrful 1 a fost vizitat }
ct timp p k execut: { ct vreme mai sunt vrfuri care au fost vizitate }
pentru j=1,n execut:
{ li se caut vecinii }
dac (a[dr[p],j] = 1) i (viz[j] = 0) atunci
{ dac aceti vecini nu au fost vizitai, se viziteaz }
k k+1
dr[k] j
viz[j] 1
{ i se reine faptul c au fost parcurse }
sfrit dac
sfrit pentru
p p + 1
{ se trece la urmtorul vrf dintre cele vizitate deja }
sfrit ct timp
dac k < n atunci
verif fals
{ dac nu s-au vizitat toate vrfurile, graful nu este conex }
sfrit dac
sfrit subalgoritm

Subalgoritmul descris determin rspunsul la prima ntrebare din problem.


Cea de-a doua cerin a fost aceea de a determina un traseu pentru distribuitorul de
fluturai. Aceast cerin revine la a determina un ciclu eulerian. Se va determina un
ciclu eulerian prin construirea acestuia.
Se pornete dintr-un vrf al grafului i se ncearc construirea unui ciclu C1.
Construirea este posibil datorit faptului c gradul fiecrui vrf este par. Astfel dac
un vrf are gradul 2 k, un ciclu care trece prin acest nod parcurge dou dintre muchii
i rmn alte 2 (k 1) muchii care trebuie parcurse. n construirea ciclului C1 ajungndu-se ntr-un nod, de acolo se poate continua traseul spre un alt nod printr-o muchie neparcurs.
Dac ciclul C1 este de lungime maxim, atunci el cuprinde toate muchiile grafului,
deci este ciclu eulerian. Dac nu este de lungime maxim, atunci exist muchii neparcurse i n plus, cel puin una dintre ele este adiacent cu un vrf x din ciclul determinat C1. Pornind pe aceast muchie se ajunge n alte noduri care la rndul lor au gradul
par i deci se poate continua drumul. n plus, acest nod x mai are cel puin o muchie
incident cu el i nepacurs, deci n x se va nchide un alt ciclu C2. Aceste dou cicluri
pot fi concatenate ntr-unul singur. Astfel se poate construi orice alt ciclu n graf, pn
cnd prin concatenri succesive se obine un ciclu eulerian. Programul care rezolv
problema ine seama de aceast construcie.

5. Teoria grafurilor

153

Subalgoritm construire(n,m,a,ce):
{ se construiete ciclul C1 n graf pornind de la vrful 1 }
ce[1] 1
k 1
repet
pentru i=1,n execut:
{ se caut o strad n graf }
dac a[ce[k],i] = 1 atunci
a[ce[k],i] 0
{ se marcheaz n matricea de adiacen faptul }
a[i,ce[k]] 0
{ c aceast strad a fost parcurs }

{ se scade gradul vrfurilor incidente strzii }


gr[ce[k]] gr[ce[k]] - 1
gr[i] gr[i] -1
k k + 1
{ se adaug vrful gsit n irul vrfurilor ciclului }
ce[k] i

{ eulerian care se construiete }


ieire forat din pentru

sfrit dac
sfrit pentru

{ se repet gsirea unui nou vrf pn cnd ciclul este complet }


pn cnd ce[k] = ce[1]
ct timp k < m+1 execut:
{ dac nu au fost parcurse toate strzile }
pentru i=1,k execut: { se trece la construirea ciclului C2 care pornete }
dac gr[ce[i]] > 0 atunci { dintr-un vrf v al crui grad este nenul }
v i
ce1[1] ce[i]
k1 1
ieire forat din pentru
sfrit dac
sfrit pentru

se repet construirea unui ciclu C2 analog cu construirea lui C1


{ ciclul nou gsit este concatenat cu primul }
pentru i=k,v+1,-1 execut:
ce[i+k1-1] ce[i]
sfrit pentru
pentru i=2,k1 execut:
ce[v+i-1] ce1[i]
sfrit pentru
k k + k1 - 1
sfrit ct timp
sfrit subalgoritm

154

5. Teoria grafurilor

5.5.5. Pregtirea mesei


Din enunul problemei rezult clar c Bubulina trebuie s execute anumite operaii
naintea altora, astfel nct preparatele pe care le realizeaz s fie bine pregtite.
Ordinea de executare a operaiilor este impus astfel nct o anume operaie nu
poate s fie realizat naintea ei nsi. innd cont de aceste considerente datele problemei se pot reprezenta cu ajutorul unui graf orientat fr cicluri. Proprietatea de aciclicitate impune ca activitile gospodinei s nu fie posibil s se realizeze naintea lor
nsele.
Operaiile culinare le vom asocia vrfurilor grafului, iar precedenele lor le vom
nota cu ajutorul arcelor (ca n figura din enun).
Ordonarea operaiilor trebuie realizat astfel nct vrfurile grafului s fie ordonate
de-a lungul unei linii imaginare n aa fel nct pentru orice arc (x, y) al grafului, vrful
x s se afle naintea lui y pe aceast ax. O astfel de ordonare se numete ordonare topologic i poate fi realizat doar ntr-un graf aciclic.
Rezolvarea problemei se realizeaz cutnd acele vrfuri care nu au predecesor,
adic aciunile care pot fi realizate fr a fi nevoie de alte aciuni preliminare de
exemplu, spal legumele sau taie carnea care nu au evenimente anterioare. Aceste
vrfuri se terg din list i se trec pe linia imaginar. n continuare, dintre celelalte
vrfuri se aleg cele care nu mai au predecesor n lista de vrfuri.
Pentru a realiza algoritmul i a regsi uor elementele care nu au predecesor n list
la un moment dat, vom folosi n liste liniare i fiecare va conine succesorii unui vrf.
n plus, pentru fiecare vrf, se va memora numrul predecesorilor proprii i de fiecare
dat, cnd se adaug un vrf pe ax, toi succesorii si vor avea cu un predecesor
mai puin.
n subalgoritm p conine irul listelor, irul np reine lungimile fiecrei astfel de
liste. Lista ordonat o construim n l.
Subalgoritm Ordonare(n,np,l,p):
pentru i=1,n execut:
viz[i] fals
sfrit pentru
k 0
ct timp k < n execut:
{ ct timp mai sunt elemente neordonate }
pentru i=1,n execut: { caut elementele fr predecesori i neordonate }
dac (npi = 0) i (nu vizi) atunci
k k + 1
{ le adugm listei ordonate }
lk i
vizi adevrat
{ marcm faptul c s-au ordonat }
pentru j=1,n execut:
{ l tergem pe i din fiecare list }
q 1

5. Teoria grafurilor

155

ct timp (q np[j]) i (p[j][q] i) execut:


q q + 1
sfrit ct timp
dac q np[j] atunci
{ dac l-am gsit, l tergem }
pentru z=q,np[j]-1 execut:
{ suprascriindu-l }
p[j][z] p[j][z+1]
sfrit pentru
np[j] np[j] - 1
{ scade lungimea listei }
sfrit dac
sfrit pentru
sfrit dac
sfrit pentru
sfrit ct timp
sfrit subalgoritm.

5.5.6. Expoziia de roboi


Roboii sunt aezai ntr-o sal de expoziie i trebuie legai la sursa de curent electric
direct sau indirect. Reprezentm datele cu un graf cruia i asociem o funcie de cost
care va fi distana ntre cele dou exponate sau distana ntre un exponat i sursa de
curent electric. Rezolvarea problemei revine la a lega exponatele i sursa ntre ele
astfel nct s existe un lan ntre sursa de curent electric i fiecare robot.
Graful trebuie s fie conex deoarece fiecare exponat trebuie s fie legat de sursa de
curent. ntr-un graf conex ntre oricare dou vrfuri exist un lan. Astfel fie x i y
dou vrfuri din graf unde exist lanul [0, vl1, , x] care leag nodul 0 (sursa de
curent electric) de nodul x i lanul [0, vk1, , y] care leag vrful 0 de vrful y. Se
poate deduce c prin concatenarea celor dou lanuri, x i y sunt legate prin lanul [x,
, vl1, 0 , vk1, , y].
Problema cere determinarea modului de conectare a exponatelor cu cost minim.
tim c un arbore este un graf conex i minimal cu aceast proprietate adic dac se
elimin orice muchie el nu mai este conex. Astfel problema revine la a determina un
arbore care are costul total minim.
Determinarea unui arbore parial de cost minim se poate realiza folosind doi algoritmi: algoritmul lui Kruskal i algoritmul lui Prim. n cele ce urmeaz prezentm
aceti doi algoritmi.
I. Algoritmul lui Kruskal
Pornim de la graful n care considerm c toate vrfurile au gradul 0 (zero). Pe parcursul algoritmului vom selecta cte o muchie pe care o adugm grafului pn cnd
acesta devine conex. n procesul de selectare lum n considerare muchiile pe rnd, ordonate cresctor dup cost, i le selectm dac prin adugarea lor nu se formeaz ciclu. Strategia de baz n algoritmul lui Kruskal este de tip greedy.

156

5. Teoria grafurilor

Vom asocia fiecrui nod un numr de ordine care reprezint numrul componentei
conexe din care face parte. Iniial fiecare nod k face parte din componenta conex
avnd numrul de ordine k. n momentul n care dorim s stabilim dac o muchie poate fi selectat sau nu, vom verifica dac extremitile lor fac parte din componente conexe diferite sau nu. n caz afirmativ muchia nu poate fi selectat, deoarece astfel s-ar
forma un ciclu. Dac extremitile aparin unor componente conexe diferite, prin selectarea muchiei, acetia se unesc. Reamintim c un arbore are exact n 1 muchii,
deci algoritmul se oprete cnd s-au selectat n 1 muchii.
Memorm graful prin lista muchiilor, i pentru fiecare muchie reinem extremitile
sale (i i j) i costul su (c).
Subalgoritm ArborePartialMinimKruskal(n,a,ct):
much 0
pentru i=0,n execut
cc[i] i
{ fiecare nod este ntr-o component conex separat }
sfrit pentru
k 1
ct timp much < n - 1 execut:
{ ct timp nu am selectat n 1 muchii }
dac cc[a[k].i]cc[a[k].j] atunci { dac muchia nu formeaz ciclu }
a[k].d adevrat
{ o selectm }
dac cc[a[k].i] < cc[a[k].j] atunci
min cc[a[k].i]
max cc[a[k].j]
altfel
min cc[a[k].i]
max cc[a[k].j]
sfrit dac
pentru i=1,n execut:
{ unim cele dou componente conexe }
dac cc[i] = max atunci
cc[i] min
sfrit dac
sfrit pentru
much much + 1
{ numrul muchiilor selectate crete }
ct ct+a[k].c
{ calculm costul total parial }
sfrit dac
k k + 1
{ avansm n irul muchiilor ordonate }
sfrit ct timp
sfrit subalgoritm

II. Algoritmul lui Prim


Acest algoritm, asemntor celui gndit de Kruskal folosete metoda greedy. Pornim
cu nodul 1 i la fiecare pas alegem muchia de cost minim dintre muchiile adiacente

5. Teoria grafurilor

157

vrfului n care suntem. Deoarece vrfurile neselectate sunt considerate vrfuri izolate,
n acest algoritm nu este necesar s verificm dac muchia care urmeaz s fie adugat formeaz ciclu sau nu.
De data aceasta reprezentarea avantajoas este prin matricea costurilor, n care corespunztor muchiilor inexistente valoarea va fi, nu 0, ci infinit, astfel facilitnd selectarea muchiei de cost minim. Aceast iniializare o realizm anterior citirii matricei
costurilor.
Subalgoritm ArborePartialMinimPrim():
ct 0
pentru i=1,n execut:
{ nc nu am selectat nici un vrf }
sel[i] fals
sel[1] adevrat
{ selectm primul vrf }
e1[1] 1
{ extremitatea 1 a muchiei selectate }
pentru i=1,n execut:
{ distana dintre vrful 1 i i }
d[i] a[1,i]
e[i] 1
{ vrful de plecare este 1 }
sfrit pentru
k 1
{ trebuie s selectm n 1 muchii }
pentru i=1,n-1 execut:
min inf
pentru j=2,n execut:

{ dac vrful j nu este selectat i distana la el este mai mic dect min }
dac nu sel[j] i (d[j] < min) atunci
{ cutm distana minim }
min d[j]
care j
{ extremitatea de sosire a muchiei de cost minim }
sfrit dac
sfrit pentru
sel[care] adevrat
{ selectam vrful care }
{ i muchia corespunztoare }
e1[i] e[care]
e2[i] care
{ adunm costul muchiei selectate la costul total }
ct ct + min

{ actualizm irul distanelor minime }


pentru j=2,n execut:
dac nu sel[j] i (d[j]>a[care,j]) atunci

{ dac gsim distana mai scurt ntre care i un vrf }

d[j] a[care,j]
e[j] care
sfrit dac
sfrit pentru
sfrit pentru
sfrit subalgoritm

{ o schimbm i reinem vrful de pornire }

158

5. Teoria grafurilor

5.5.7. Aliane
Din nou, reprezentarea datelor sub forma unui graf neorientat este binevenit, astfel
triburile le asociem vrfurilor, iar acordurile dintre triburi, muchiilor grafului.
Dac ntre dou triburi exist un acord, nseamn c cele dou vrfuri corespunztoare fac parte din aceeai component conex. Deci, dac ar exista acorduri ntre triburi astfel nct toate vrfurile s fac parte din aceeai component conex, am putea
considera c triburile i-au atins scopul.
Vom porni de la graful n care toate vrfurile sunt de grad zero. Acestui graf i vom
aduga muchii, una dup alta, unind componentele conexe existente la un moment dat.
Iniial exist n componente conexe, corespunztoare celor n vrfuri izolate.
Pentru fiecare vrf vom memora n irul cc numrul de ordine al componentei conexe din care face parte. Iniial, vrful k face parte din componenta conex avnd numrul de ordine k. Numrul de ordine al componentei conexe creia i aparine un anumit vrf se modific dac vrful este unit printr-o muchie de o alt component conex.
Reprezentarea datelor se va realiza sub forma listei muchiilor.
Subalgoritm DeterminareaComponentelorConexe(n,m,a,ncc,cc):
k 1
ncc n
pentru i=1,n execut:
{ fiecare nod este izolat }
cc[i] i
sfrit pentru
{ se adaug toate muchiile }
ct timp k m execut:
dac cc[a[k].i] cc[a[k].j] atunci
{ dac extremitile unei }
min cc[a[k].i]
{ muchii fac parte din componente diferite }
max cc[a[k].j]
ncc ncc-1
sfrit dac
pentru i=1,n execut:
{ unim cele dou componente conexe }
dac cc[i] = max atunci
cc[i] min
sfrit dac
sfrit pentru
k k + 1
sfrit ct timp
sfrit subalgoritm

Dup determinarea componentelor conexe acestea trebuie afiate cte una pe o linie. Numrul componentelor conexe este memorat n variabila ncc.

5. Teoria grafurilor

159

Subalgoritm Afiare(n,ncc,cc):
scrie ncc
{ afieaz numrul de comuniti }
pentru i=1,n execut:
dac cc[i] > 0 atunci
scrie i
pentru j=i+1,n execut:
dac cc[j] = cc[i] atunci { se afieaz membrii unei comuniti }
scrie j
cc[j] 0
{ marcm vrfurile afiate }
sfrit dac
sfrit pentru
sfrit dac
sfrit pentru
...

O a doua problem ridicat este posibilitatea de a aduce pace pe ntreaga planet


prin semnarea de acorduri acolo unde este nevoie. Altfel spus, ar fi bine ca pe ntreaga
planet s fie o singur comunitate. Acest lucru se realizeaz prin transformarea grafului ntr-un graf conex.
Pentru a obine un graf conex din cel existent, o posibilitate ar fi aceea de a lega
primul vrf de cte un vrf din fiecare component conex diferit de cea a primului
vrf. Rspundem la ntrebarea din enun, afind n continuare aceste muchii.
...
dac ncc > 1 atunci
{ se afieaz muchiile posibile pentru }
scrie 'Acorduri necesare:'
pentru i=2,n execut:
{ a transforma graful ntr-unul conex }
dac (cc[i] > 0) i (cc[i] cc[1]) atunci
scrie 1, i
sfrit dac
sfrit pentru
sfrit dac
sfrit subalgoritm

5.5.8. Pregtirea balului


Pentru a putea rezolva problema propus se vor prezenta cteva considerente teoretice.
n cazul unei probleme care propune tratarea unei lucrri complexe care presupune
desfurarea unor evenimente, vom construi un graf orientat numit graf de activiti.
n acest graf vrfurile sunt evenimente obiective pariale ale lucrrii, iar arcele
sunt activiti crora li se asociaz lungimile lor timpul de execuie.
O regul important n realizarea unui graf de activiti este aceea c dac (x, y)
este o activitate n graf, atunci aceast activitate se poate desfura doar dup ce toate
activitile care au extremitatea final n x s-au terminat.

160

5. Teoria grafurilor

n orice graf de activiti exist un vrf care reprezint nceperea lucrrii i nu este
extremitate final a nici unui arc. De asemenea, exist un vrf care reprezint ncheierea lucrrii i nu este extremitate iniial a nici unui arc. Cu alte cuvinte, din primul
vrf pleac arce i n cel de-al doilea sosesc arce. n plus, graful nu are circuite.
2

4
7

n graful din figura de mai sus vrful 1 reprezint nceperea activitii, iar vrful 7
reprezint ncheierea activitii. n cazul unei lucrri executantul i pune problema necesarului de timp pentru ca ntreaga lucrare s poat fi realizat. Din exemplu reiese c
lucrarea respectiv se poate executa n 13 uniti de timp. Acest numr este dat de lungimea celui mai lung drum din graf (de la vrful 1 la vrful 7). Practic, pot exista anumite activiti care dispun de mai mult timp dect au nevoie. n exemplul de mai sus
exist trei drumuri de la vrful 1 la vrful 6. Lungimile lor sunt 9, 11 respectiv 10. Activitatea (6, 7) nu se poate realiza dect dup ce activitile (4, 6) i (5, 6) au fost ncheiate i evident, cele care le preced pe acestea. Din acest punct de vedere activitile
(1, 2) sau (2, 4) sau (4, 6) au o posibilitate ca pe ansamblu s ntrzie cte 2 uniti fa
de durata lor prestabilit, deoarece n aceste condiii nu ntrzie terminarea ntregii lucrri. Ct despre activitile (1, 3), (3, 5) i (5, 6), dac acestea ntrzie, determin ntrzierea ntregii lucrri. Cu alte cuvinte aceste muchii se numesc critice. Activitile
critice ntr-un graf de activiti determin un drum care leag primul vrf de ultimul
care se numete drum critic.
n problema dat se cere determinarea lungimii drumului critic i a arcelor care l
compun, din graful de activiti asociat pregtirilor balului.
Pentru a determina drumul critic vom construi dou iruri lung i tr.
lung este pentru fiecare vrf vi lungimea celui mai lung drum de la primul vrf la vi;
tr reprezint pentru fiecare vrf vi diferena dintre lungimea total a drumului critic
i lungimea minim a drumului de la vi la ultimul vrf din graf.
diferena trk lungk reprezint rezerva de timp pe care o au evenimentele care nu
fac parte din drumul critic i ajung n vrful k.
pentru evenimentele (x, y) care fac parte din drumul critic avem:
trx = lungx i try = lungy i lungy = lungx + dx,y.
0 0
1
2
3
2 2

2 4

4
3

5
5 5

5
2

7 9
4
2

6
11 11

4
7

13 13

5. Teoria grafurilor

161

Subalgoritm DrumCritic(n,a,lung,tr):
pentru i=1,n execut:
{ iniializarea datelor de lucru }
lungi -1
lung1 0
viz1 adevrat
i 1
v[i] 1
{ parcurgem toate vrfurile }
pentru k=1,n execut:
{ arcele care pornesc din al k-lea vrf }
pentru j=1,n execut:
dac a[v[k],j] > 0 atunci

{ calculm lungimea maxim }


lungj max(lungj,lungv[k] + a[v[k],j])
dac nu viz[j] atunci
i i+1
v[i] j
sfrit dac
vizv[k] adevrat
sfrit pentru
sfrit pentru
sfrit pentru
v1 n
{ calculm lungimea drumului critic }
trn lungn
i 1
pentru k=1,n execut:
pentru j=1,n execut:
dac (a[j,v[k]] > 0) i vizj atunci
{ calculm timpul maxim de care }
trj trv[k] - a[j,v[k]]
i i + 1
{ poate dispune evenimentul j }
v[i] j
vizv[k] fals
sfrit dac
sfrit pentru
sfrit pentru
sfrit subalgoritm

5.5.9. Pe drumuri de munte


Reprezentm harta zonei cu un graf neorientat avnd n vrfuri, n care vrfurilor le
asociem punctele de pe traseu i muchiilor traseele marcate din zon.
Memorm graful cu ajutorul matricei de adiacen i o construim odat cu citirea
datelor. Matricea de adiacen iniial conine doar elemente nule. Cu fiecare citire a
cte dou vrfuri i i j adugm n matrice cte dou elemente egale cu unu.

162

5. Teoria grafurilor

Pentru a rspunde cerinelor problemei trebuie s folosim o metod care genereaz


toate soluiile posibile. Vom recurge la backtracking, cu toate c este o metod mare
consumatoare de timp.
n irul x vom pstra numerele de ordine ale punctelor vizitate pe traseu. Primul
punct este cel al cabanei punctul de plecare. n acest ir se vor aduga puncte care
sunt legate succesiv, pn cnd punctul curent este cel final (al peterii). La momentul
k exist n ir k 1 puncte care pot fi atinse succesiv pe un traseu. Trebuie ales pasul
urmtor i anume punctul de indice k. Punctul xk se alege din toate punctele posibile,
dac exist traseu marcat de la punctul xk 1 la acest punct i traseul nu a mai trecut
prin xk.
Subalgoritm Drum(k):
dac x[k-1] = s atunci

{ s-a gsit punctul de sosire }

afim traseul avnd k-1 puncte


altfel
pentru j=1,n execut
{ alegem un punct pentru continuarea traseului }
x[k] j
dac a(xk-1,xk)=1 i xk nu a fost n traseu pn acum atunci
Drum(k+1)
{ se continu drumul cu punctul urmtor }
sfrit dac
sfrit pentru
sfrit dac
sfrit subalgoritm

5.5.10. Mesaj telefonic


Vom construi un graf neorientat n care copii vor fi codificai prin vrfurile grafului,
iar faptul c i cunosc reciproc numerele de telefon se codific muchii.
Se poate observa c dac n graful asociat exist muchie ntre vrful corespondent
lui Ionu i cel corespondent lui Gigel, este suficient un singur apel telefonic pentru ca
acesta s afle mesajul. Dac ns ntre cele dou vrfuri corespunztoare celor doi
copii nu exist muchie, atunci este nevoie de intermediari. Este evident, c dac graful
nu este conex, transmiterea mesajului este imposibil.
Pentru a rezolva problema vom parcurge graful pornind de la vrful p asociat lui
Ionu care vrea s transmit mesajul i vom determina un lan de lungime minim ntre
p i s (unde s este vrful asociat lui Gigel care urmeaz s fie anunat). Lungimea
acestui lan este chiar numrul minim de telefoane care trebuie date pentru ca mesajul
s ajung la s.
Exist mai multe metode cu care un astfel de lan se poate determina: greedy, programare dinamic, traversarea grafului n lime etc. Noi vom rezolva problem cu cea
din urm metod.

5. Teoria grafurilor

163

Pornim din p i marcm toate vrfurile adiacente cu vrful p. Lungimea lanului


care pornete din p i se termin ntr-unul dintre vecinii si este 1. Dac vreunul dintre
aceste vrfuri este s atunci algoritmul se oprete. Dac nici unul dintre vecinii lui p nu
este s, se caut s printre vecinii vecinilor lui p. Dac este printre acetia lungimea
lanului este 2. Practic, printr-o parcurgere n lime a grafului se pot construi lanurile
de lungime minim, care pornesc din p i astfel se poate obine i lanul de lungime
minim de la p la s.
Fie graful din figura din stnga. Fcnd abstracie de p i s, construirea lanurilor de
lungime minim se realizeaz ca n figura din dreapta.
L2 = 1

L3 = 2

1
4
6

L1 = 0

L6 = 1

L5 = 2

4 L4 = 3

Memorm graful cu ajutorul listelor vecinilor. Construirea lor se realizeaz deodat


cu citirea datelor.
Subalgoritm Citire(n,p,s,nv,ve):
citete n
citete p,s
ct timp sunt muchii de citit execut:

{ numrul de copii }
{ p vrea s transmit mesaj lui s }

{ se citesc perechile care i cunosc numerele de telefon }


citete i,j
nvi nvi + 1
nvj nvj + 1
ve[i,nvi] j
ve[j,nvj] i
sfrit ct timp
sfrit subalgoritm

{ crete numrul de vecini ai lui i i ai lui j }

Pentru a rezolva problema este nevoie de memorarea predecesorilor fiecrui vrf n


lanul de lungime minim, dup ce a fost calculat lungimea sa. n subalgoritmul urmtor avem urmtoarele semnificaii ale variabilelor:
n: numrul copiilor;
s, p: p vrea s transmit lui s;
prec: lista predecesorilor fiecrui vrf n lan;
nv: numrul de vecini ai fiecrui vrf;
lung: distanele minime de la primul vrf la celelalte;
ve: listele vecinilor.

164

5. Teoria grafurilor

Subalgoritm LanMinim(n,p,s,nv,ve,prec,lung):
pentru i=1,n execut:
{ se iniializeaz distanele }
lung[i] -1
sfrit pentru
{ distana de la nodul p la el nsui este zero }
lung[p] 0
tel[1] p
k 1
u 1
{ toi copiii se vor vizita }
ct timp k u execut:

{ pentru fiecare din list se iau n considerare vecinii si }


pentru i=1,nv[tel[k]] execut:
x ve[tel[k],i]
{ un vecin }
dac lung[x] < 0 atunci { dac nu a fost prelucrat, se adaug n list }
lung[x] lung[tel[k]]+1 { se calculeaz distana fa de primul }
u u + 1
tel[u] x
prec[x] tel[k]
{ i se memoreaz predecesorul }
dac x = s atunci

ieire forat din subalgoritm


sfrit dac
sfrit dac
sfrit pentru
k k + 1
sfrit ct timp
sfrit subalgoritm

{ se trece la urmtorul element din list }

Afiarea se realizeaz cu ajutorul unui subalgoritm recursiv, deoarece dac am afia pur i simplu lista predecesorilor, am obine o secven invers de la s la p n loc s
fie de la p la s.
Subalgoritm Afiare(k):
dac k p atunci
Afiare(prec[k])
sfrit dac
scrie k
sfrit subalgoritm

5.5.11. Distane rutiere


Se poate asocia localitilor i drumurilor dintre ele un graf cu costuri.
Problema noastr cere s determinm lungimea minim a unui drum ntre dou localiti. tim c aceasta este egal cu lungimea lanului de lungime minim ntre cele
dou localiti.

5. Teoria grafurilor

165

Pentru a putea determina distana minim ntre dou localiti vom folosi algoritmul lui Dijkstra. Acesta determin lungimea minim a lanurilor care pornesc dintr-un
vrf al grafului i pleac spre celelalte vrfuri cu o strategie greedy.
Algoritmul se poate aplica att n cazul unor grafuri orientate ct i neorientate.
Memorarea grafurilor se va realiza cu ajutorul matricei costurilor. Memorarea predecesorilor fiecrui vrf va fi util n afiarea lanurilor (drumurilor).
Fiecrui vrf din graf i se va asocia o lungime fa de vrful x0 care iniial este considerat foarte mare (infinit). Vrful x0 are asociat lungimea 0 (zero). Acest vrf se
trece n mulimea vrfurilor vizitate. n mulimea vrfurilor vizitate se adaug pe rnd
vrfurile care sunt adiacente lui x0 determinnd lungimea minim a drumului ctre ele.
n figura urmtoare exemplificm modalitatea de construire a drumurilor pentru
graful:
L2 =
2

20
1

L1 = 0

10

L3 =

L4 =

L5 =

Pornind de la x0 = 1 se construiesc succesiv lanurile:


L2 = 20
2

20
1

L1 = 0

7
4

L4 = 7

L2 = 10

L3 = 17

L2 = 10

20
L1 = 0

10

7
4

L4 = 7

1
5

L5 = 10

L1 = 0

L4 = 7

L3 = 15
3

10

L5 = 10

Se poate observa c o muchie direct ntre dou vrfuri nu este neaprat cel mai
scurt drum ntre cele dou localiti. Astfel la calculul distanelor vom ine cont de valoarea minim a tuturor drumurilor ntre cele dou localiti.
La fiecare moment alegem un vrf neparcurs, care se situeaz la distan minim
fa de x0, lund n considerare toate drumurile care l leag pe acesta de x0. Pentru toi
succesorii si (vrfurile adiacente) se recalculeaz lungimile drumurilor.
Subalgorim Dijkstra(n,a,lung):
{ W este iniial mulimea tuturor vrfurilor }
W V
pentru i=1,n execut:
lungi infinit
sfrit pentru
{ se calculeaz distanele pornind de la vrful p }
lungp 0

166

5. Teoria grafurilor

ct timp W execut:
{ ct timp exist noduri nevizitate }
vm vrful din W pentru care lungvm este minim
W W \ {vm}
{ vrful se marcheaz ca fiind vizitat }
pentru j=1,n execut:
dac a[vm,j] 0 atunci

{ se calculeaz distanele minime la care se afl vecinii si }


lungj min(lungj,lungvm+a[vm,j])
sfrit dac
sfrit pentru
sfrit ct timp
sfrit subalgoritm