Sunteți pe pagina 1din 158

Sergiu CORLAT

Anatol Gremalschi

GRAFURI
metodologia predrii n cadrul instruirii
de performan la disciplinele
Matematic & Informatic

Chiinu, 2013

Aprobat pentru editare de Senatul Universitii de Stat Tiraspol

Lucrarea este destinat cadrelor didactice, activitatea crora ine de instruirea de


performan la disciplinile Informatica i Matematica, dar i studenilor facultilor de
matematic i informatic a instituiilor de nvmnt superior din ar, care studiaz
cursul de teorie a grafurilor. Este de asemenea util elevilor pentru pregtirea ctre
concursurile naionale i internaionale de programare.
Autori:
Sergiu Corlat, lector superior universitar, UST
Anatol Gremalschi, dr. hab., profesor universitar, UTM
Recenzeni:
Ilie Lupu, dr. hab., profesor universitar, UST
Andrei Braicov, dr. confereniar universitar, UST

Corlat, Sergiu.
Grafuri : Metodologia predrii n cadrul instruirii de performanta la disciplinile
Matematic & Informatic : [pentru uzul studenilor] /
Sergiu Corlat, Anatol Gremalschi;
Acad. de tiinte a Moldovei, Univ. de Stat din Tiraspol. Chiinu.
Universitatea de Stat din Tiraspol, 2014. - 158 p. - (informatica)
100 ex.
ISBN 978-9975-76-122-2.
519.17+004.421.2(075.8)
C71

S. Corlat, A. Gremalschi, 2013

Cuprins

Introducere............................................................................................................7
Capitolul 1. Noiuni generale.................................................................................9
1.1 Definiii ........................................................................................................9
1.2 Structuri de date pentru reprezentarea unui graf ....................................15
Exerciii: ...........................................................................................................18
Capitolul 2. Parcurgeri. Conexitate......................................................................19
2.1 Parcurgerea grafului ..................................................................................19
2.2 Grafuri tare conexe....................................................................................23
Algoritmul Kosaraju .........................................................................................24
2.3 Probleme rezolvate ...................................................................................26
Exerciii: ...........................................................................................................32
Capitolul 3. Mulimi independente .....................................................................33
3.1 Mulimi independente...............................................................................33
3.2 Generarea tuturor mulimilor maximal independente .............................34
Exerciii ............................................................................................................39
Capitolul 4. Colorri .............................................................................................40
4.1 Numrul cromatic......................................................................................40
4.2. Algoritmul exact de colorare ....................................................................41
4.3. Algoritmi euristici de colorare ..................................................................42
Exerciii: ...........................................................................................................44
Capitolul 5. Drumuri minime n graf ....................................................................45
Preliminarii ......................................................................................................45

5.1 Distana minim ntre dou vrfuri. Algoritmul Dijkstra ...........................46


5.2 Distana minim ntre toate vrfurile. Algoritmul Floyd ...........................50
5.3 Probleme rezolvate ...................................................................................52
Exerciii ............................................................................................................57
Capitolul 6. Centre n graf ...................................................................................58
6.1 Divizri .......................................................................................................58
6.2 Centrul i raza grafului...............................................................................60
6.3 P-centre .....................................................................................................61
6.4 Probleme rezolvate ...................................................................................64
Exerciii: ...........................................................................................................68
Capitolul 7. Mediane ...........................................................................................69
7.1 Mediane.....................................................................................................69
7.3 P-mediane .................................................................................................70
7.4 Algoritmi pentru determinarea p-medianei ..............................................71
7.5 Probleme rezolvate ...................................................................................74
Exerciii: ...........................................................................................................76
Capitolul 8. Arbori ...............................................................................................78
8.1 Arbori de acoperire ...................................................................................78
8.2 Arbori de acoperire de cost minim ............................................................82
8.3 Probleme rezolvate ...................................................................................86
Exerciii ............................................................................................................91
Capitolul 9. Cicluri................................................................................................92
9.1 Numrul ciclomatic i mulimea fundamental de cicluri .........................92
9.2 Cicluri Euler................................................................................................94
9.3 Algoritmul de construcie a ciclului eulerian .............................................95
9.4 Cicluri i lanuri hamiltoniene..................................................................100
9.5 Algoritmul pentru determinarea ciclurilor (lanurilor) hamiltoniene .....101

Exerciii ..........................................................................................................104
Capitolul 10. Fluxuri n reea .............................................................................105
10.1 Preliminarii ............................................................................................105
10.2.Algoritm .................................................................................................106
10.3 Flux maxim cu surse i stocuri multiple ................................................113
10.4 Flux maxim pe grafuri bipartite ............................................................114
10.5 Flux maxim pe grafuri cu capaciti restricionate ale vrfurilor i
muchiilor........................................................................................................115
Exerciii ..........................................................................................................121
Capitolul 11. Cuplaje .........................................................................................122
11.1 Cuplaje ...................................................................................................122
11.2 Graful asociat.........................................................................................123
11.3 Funcia de generare a grafului asociat ..................................................124
11.4 Generarea tuturor cuplajelor maxime ..................................................125
11.5 Probleme rezolvate ...............................................................................127
Exerciii ..........................................................................................................131
Capitolul 12. Probleme propuse pentru rezolvare ............................................132
14.1 Cratere pe Lun .....................................................................................132
12.2 Translatori .............................................................................................133
12.3 Problema celor cinci dame ....................................................................134
12.4 mprirea administrativ-teritorial ......................................................134
12.5 Safeuri....................................................................................................135
14.7 Plicuri i felicitri ...................................................................................137
12.7 Agenii ...................................................................................................138
12.8 Interogri ...............................................................................................139
12.9 Import galactic.......................................................................................140
12.10 Incendiator ..........................................................................................142

12.11 Reconstrucia arborilor.......................................................................144


12.12 Relaii romantice .................................................................................145
12.13 UP ........................................................................................................146
12.14 Alchimistul ...........................................................................................148
12.15 Paza prezidenial ...............................................................................149
12.16 Metroul................................................................................................150
12.17 Multimicroprocesoare .........................................................................152
12.18 Roboii 2 ..............................................................................................154
Bibliografie ........................................................................................................156
Abrevieri i notaii .............................................................................................158

vbcb

Introducere
Aprute din necesitatea de a modela diverse situaii, relaii sau
fenomene n form grafic, grafurile i-au gsit o multitudine de
aplicaii n cele mai diverse sfere ale activitii umane: construcii i
sociologie, electrotehnic i politologie, chimie i geografie acest ir
poate fi continuat la nesfrit.
Teoria grafurilor a luat natere de la problema podurilor din
Konigsberg, cercetat de Euler i s-a dezvoltat ca un compartiment al
matematicii clasice pn la momentul apariiei sistemelor electronice de
calcul i a teoriei algoritmilor. n contextul rezolvrii problemelor de
calcul automat, grafurile s-au dovedit a fi un instrument universal i
extrem de flexibil, devenind un compartiment al matematicii aplicate.
O adevrat revoluie a cunoscut-o teoria grafurilor n anii 60
80 ai secolului trecut, cnd a fost stabilit posibilitatea de utilizare a lor
pentru rezolvarea problemelor de optimizare. Algoritmii pentru
determinarea drumului minim, punctelor mediane, centrelor, de
maximizare a fluxurilor, dar i multe altele au devenit componente
vitale ale cercetrilor operaionale i a metodelor de optimizare.
n aspect informatic grafurile apar i n calitate de structuri
eficiente de date, n special arborii, care permit realizarea optim a
algoritmilor de sortare i cutare.
Numrul de lucrri, care studiaz aspectele algoritmice ale
teoriei grafurilor este unul impuntor. Printre primele apariii se
numr Applied graph theory de Wai-Kai Chen; Graph Theory. An
Algorithmic approach de Nicos Christofides; urmate de Algorithmic
ghaph theory de Alan Gibbons, Algorithms in C de Thomas Sedgewick i
multe alte ediii. Totui, majoritatea ediiilor se axeaz doar pe
descrierea matematic a algoritmilor, fr a le suplini prin
implementri ntr-un limbaj de programare sau altul, or, tocmai
implementarea algoritmic este pentru programatorii practicieni o
component de importan maxim.
n prezenta lucrare se ncearc abordarea vertical a
algoritmilor clasici ai teoriei grafurilor: de la noiuni teoretice, definiii
7|P age

i teoreme, ctre descrieri matematice a algoritmilor, urmate de


implementri integrale sau pariale (fr prezentarea subprogramelor
auxiliare) n limbajele de programare C sau Pascal, nsoite de
prezentarea i analiza rezultatelor.
Un motiv al prezentrii pariale a implementrilor algoritmilor
este concepia de manual a lucrrii: restabilirea prilor lips a
programelor devine un exerciiu practic pentru toi cei care studiaz
cursul de Teorie a grafurilor n instituiile de nvmnt superior din
ar.
Ediia este destinat nu doar studenilor facultilor de profil,
dar i elevilor pasionai de informatic, precum i profesorilor, care au
n grija lor pregtirea de performan n domeniul Informaticii teoria
grafurilor este inclus n calitate de compartiment obligatoriu n
curriculumul internaional de performan pentru Computer Science.
Exerciiile, cu care se finalizeaz fiecare capitol, pot fi folosite n calitate
de lucrri de laborator rezolvarea lor presupune prezena
cunotinelor teoretice dar i a competenelor practice de programare.
Venim i cu o recomandare pentru instrumentele informatice,
care pot fi utilizate pentru rezolvarea exerciiilor propuse la finele
fiecrui capitol: cele mai prietenoase medii de programare s-au
dovedit a fi compilatoarele Dev C++, MinGW Developer Studio, Free
pascal toate produsele fiind n distribuie liber.
Sperm c ediia va deveni nu doar un suport teoretic eficient,
dar i unul aplicativ pentru toi cei care studiaz elementele de
programare i cursurile de teorie a grafurilor.
Autorii

8|P age

Capitolul 1. Noiuni generale


n acest capitol:

Grafuri. Vrfuri, muchii.


Grad al vrfului, vecini
Ci, cicluri
Subgrafuri
Grafuri orientate, planare, conexe
Metode de reprezentare a grafurilor: matricea de adiacen, matricea de
inciden, lista de muchii, lista de vecini

1.1 Definiii
Def. Graf neorientat (graf) o pereche arbitrar G (V , E ) E {u, v}: u, v V & u v
Def. Graf orientat (graf) o pereche arbitrar
G (V , E ) , n care E V V
V
formeaz mulimea vrfurilor
grafului, E mulimea muchiilor. De obicei
vrfurile grafului sunt reprezentate n plan
prin puncte sau cercuri iar muchiile prin
segmente care unesc vrfurile.
Pentru
graful
din
desenul
1.1

V 1, 2,3, 4 , E {1, 2},{2,3},{3, 4},{1, 4},{2, 4}

2
1

Des 1.1. Graf neorientat

2
1

Des 1.2 Graf orientat

9|P age

ntr-un graf orientat muchiile1 se reprezint prin sgei, care


indic direcia de deplasare pe muchie. Pentru graful orientat din
desenul 1.2 V 1, 2,3, 4 , E (1, 4),(2,1),(3, 2),(3, 4),(4, 2) .
Muchia (u, v) este incident vrfurilor

u, v ,

iar acestea sunt

adiacente muchiei.

Grade
Def.

Gradul vrfului
acestuia2.

v, d (v) este numrul de muchii, incidente

Un vrf este izolat, dac gradul lui este 0.

Mulimea de vecini ai vrfului vi , (vi ) este format din vrfurile


adiacente la vi . ntr-un graf orientat mulimea vecinilor este format
din dou componente distincte: (vi ) (vi )

(vi ) .

(vi ) este format din vrfurile arcelor cu originea n vi . (vi )


este format din vrfurile-origine ale arcelor care se termin n

vi .

Pentru

vrful

din

graful

reprezentat

pe

desenul

1.2

(4) 2 , (4) 1,3 .


Ci i cicluri
Def.

Cale n graf este o consecutivitate de vrfuri v1 , v2 ,...vk astfel nct

i 1,..., k 1 vrfurile vi , vi 1 sunt adiacente3. Dac toate vrfurile


v1 , v2 ,...vk sunt distincte, calea se numete elementar. Dac
v1 vk atunci v1 , v2 ,...vk formeaz un ciclu n G . Ciclul este
elementar, dac v1 , v2 ,...vk 1 sunt distincte.
1

Muchia n graful orientat se numete i arc.


Pentru vrfurile din grafuri orientate se definesc semigrade de intrare (numrul de muchii,
care intr n vrf) i semigrade de ieire (numrul de muchii cu originea n vrful dat)
3
Exist muchia (vi , vi 1 )
2

10 | P a g e

Pe desenul 1.1 secvena de vrfuri 1,2,4 formeaz o cale;


secvena 1,2,4,1 un ciclu elementar.
n grafurile orientate noiunea de cale este substituit prin lan.
Def.

Lanul este o consecutivitate de muchii (arce) luate astfel, nct


vrful arcului (i) coincide cu originea arcului (i+1).

Pe desenul 1.2 secvena de arce (3,4)(4,2)(2,1) formeaz un lan;


secvena (1,4)(4,2)(2,1) un ciclu elementar.

Subgrafuri
Def. Subgraf al grafului G (V , E ) se numete orice graf G (V , E)
astfel nct V V , E E .
Subgrafurile se obin din graful iniial fie prin excluderea
muchiilor, fie prin excluderea muchiilor i vrfurilor din graful iniial.
n cazul cnd din graful iniial se exclude vrful vi , odat cu el se
exclud i toate muchiile incidente acestuia. Excluderea muchiei (u, v)
nu presupune i excluderea din graf a vrfurilor u, v.
Dac n subgraful G (V , E) are loc relaia V V , subgraful
este unul bazic (desenul 1.3 B). Subgraful

GS' (VS , ES )

VS V , ES E

dac pentru orice

se numete

vi VS , (vi ) (vi )

subgraf

generat

n care

X S (desenul 1.3 C). Cu alte cuvinte, GS' este

format dintr-o submulime VS a vrfurilor din G mpreun cu muchiile,


care au ambele extremiti n VS .
2

2
1

2
1

Des 1.3 Graful iniial (A), subgraf bazic (B), subgraf generat (C).

11 | P a g e

Tipologia grafurilor
Def.

Graful G (V , E ) se numete complet dac ntre oricare pereche


de vrfuri vi , v j V exist cel puin o muchie, care le unete. Un
graf complet cu n vrfuri se noteaz K n . (desenul 1.4 A)

Def. Graful neorientat G (V , E ) este bipartit, dac mulimea V a


vrfurilor lui poate fi divizat n dou submulimi distincte V A
i V B , astfel nct orice muchie din E are nceputul n V A , iar
B
sfritul n V . (desenul 1.4 B) Graful orientat G (V , E ) este

bipartit, dac mulimea V a vrfurilor lui poate fi divizat n


dou submulimi distincte V A i V B , astfel nct orice arc din E
A
B
are originea n V , iar sfritul n V .

Def.

Des 1.4
Graf complet K5 (A),
graf bipartit (B).

Graful bipartit este numit complet dac

v V A , v V B (v, v) E
Graful bipartit complet cu pri formate din n i m vrfuri se
noteaz K n ,m (desenul 1.5)
Def.

Graful G (V , E ) este conex, dac pentru orice dou vrfuri

vi , v j V n G exist cel puin o cale, care le unete (desenul 1.6


12 | P a g e

A). n cazul n care graful este format din cteva subgrafuri


conexe separate el este neconex (desenul 1.6 B ).

Des. 1.5
Graful bipartit complet K3,3

Def.

A
B
Des. 1.6 Graf conex (A), graf neconex (B)

Graful G (V , E ) este numit arbore, dac este conex i nu


conine cicluri.

Def. Graful G (V , E ) este numit graf planar, dac poate fi reprezentat


n plan fr intersecii ale muchiilor.
Def.

O fa a grafului este o regiune a planului, delimitat de


muchiile acestuia, care nu conine n interior muchii sau vrfuri
ale grafului.

Pentru un graf amplasat pe o suprafa exist relaie ntre


numrul de vrfuri, muchii i fee. Relaia se numete caracteristic
Euler a suprafeei.
Teorema 1. (formula Euler) ntr-un graf planar conex are loc
urmtoarea relaie:

nmr 2
unde: n numrul de vrfuri ale grafului, m numrul de muchii, r
numrul de fee.

Demonstraie. Prin inducie dup numrul de muchii m.

m 0. n 1& r 1. 1 0 1 2.
Fie teorema este adevrat pentru m k.
Se adaug nc o muchie

n k r 2.

m k 1.
13 | P a g e

Dac

muchia

unete

dou

vrfuri

existente,

atunci

r r 1.

n (k 1) (r 1) n k r 1 1 n k r 2.
Dac muchia unete un vrf existent cu unul nou, atunci n n 1.

(n 1) (k 1) r n k r 1 1 n k r 2.

Corolar. ntr-un graf planar (n > 3), conex, m 3n 6 .

Fiecare fa este delimitat de cel puin 3 muchii, iar fiecare muchie


delimiteaz cel mult dou fee. Prin urmare 3r 2m . nlocuind n
formula precedent, se obine:

2 nmr nm

2m
6 3n 3m 2m m 3n 6
3

Corolar. Un graf este planar atunci i numai atunci cnd nu conine


subgrafurile K 5 i K 3,3
Demonstraie: [4, pag. 284]

Ponderi
n unele cazuri muchiile grafului posed caracteristici numerice
suplimentare, numite ponderi. Muchiei (arcului) (vi , v j ) i se pune n
coresponden valoarea ci , j - ponderea (costul, lungimea etc.). Graful,
muchiilor cruia -i sunt asociate ponderi se numete graf cu muchii
ponderate. Pentru rezolvarea unor probleme este necesar i aplicarea
ponderilor la vrfurile grafului. Vrfului vi i se pune n coresponden
caracteristica numeric ci - ponderea (costul). Graful, vrfurilor cruia i sunt asociate ponderi se numete graf cu vrfuri ponderate.
Dac graful G (V , E ) este unul ponderat, atunci pentru cile
din graf se introduce caracteristica numeric l - cost (lungime) egal cu
suma ponderilor muchiilor din care este format o cale C .

l (C )

( vi ,v j )C

14 | P a g e

ci , j

1.2 Structuri de date pentru reprezentarea unui graf


Pentru rezolvarea problemelor pe grafuri cu ajutorul
calculatorului, reprezentarea lor natural n form de puncte (pentru
noduri) i linii care le unesc (muchii) nu este nc cea mai optim.
Selectarea i utilizarea corect a structurilor de date care modeleaz un
graf poate influena ordinul complexitii algoritmului, prin urmare i
eficiena lui.
Structurile de date, prezentate n paragraful dat sunt cel mai
des utilizate n rezolvarea problemelor standard pe grafuri. Ele pot fi
folosite att pentru grafurile neorientate, ct i pentru cele orientate.
Structura de date clasic pentru reprezentarea unui graf
G (V , E ) este considerat matricea de inciden. Este realizat prin
un tablou bidimensional cu N linii (N numrul de vrfuri n graf,

N V ) i M coloane (M numrul de muchii, M E ). Fiecare


muchie (u, v) este descris ntr-o coloan a tabloului. Elementele
coloanei sunt egale cu 1 pentru liniile care corespund vrfurilor u i v , 0
pentru celelalte. n cazul grafului orientat vrful din care ncepe
arcul este marcat cu -1, vrful final cu +1.
Pentru grafurile din des. 1.1,1.2 matricele de inciden vor fi

0
0
1
1

1
2
3
4

(3,4)

0
1
0
1

(2,4)

(3,4)

0
1
1
0

(3,2)

(2,4)

1
0
0
1

(1,4)

( ,3)

1
1
0
0

(2,1)

(1,4)

1
2
3
4

Des. 1.2

(1,2)

Des.1.1

+1
-1
0
0

-1
0
0
+1

0
+1
-1
0

0
+1
0
-1

0
0
-1
+1

Matricea de inciden pentru un graf cu N noduri va avea N linii,


numrul de coloane fiind proporional cu N2. Numrul total de elemente
n structura de date este proporional cu N3. Utilizarea memoriei este n
15 | P a g e

acest caz ineficient, deoarece doar cte dou elemente din fiecare linie
vor conine date real utilizabile.

G (V , E ) este

O alt reprezentare matriceal a grafului

matricea de adiacen. Matricea de adiacen este i ea realizat


prin un tablou bidimensional, cu N linii i N coloane, n care elementul
cu indicii (i, j ) este egal cu 1 dac exist muchia care unete vrful vi cu
vrful v j i 0 n caz contrar. Datele despre muchia (vi , v j ) se dubleaz
n elementele tabloului cu indicii (i, j ) i ( j, i) n grafurile orientate,
pentru arcul (vi , v j ) primete valoarea 1 doar elementul

(i, j ) al

tabloului.
Pentru grafurile din des. 1.1,1.2 matricele de adiacen vor fi
Des. 1.1
1
0
1
2
1
0
3
1
4

2
1
0
1
1

3
0
1
0
1

4
1
1
1
0

Des. 1.2
1
0
1
1
2
0
3
0
4

2
0
0
1
0

3
0
0
0
0

4
1
1
1
0

Matricea de adiacen pentru un graf cu N vrfuri are N linii i


N coloane. Numrul total de elemente n structura de date este N2.
O alt categorie de reprezentri ale grafului o formeaz
reprezentrile prin liste. Cea mai simpl pentru implementare list este
lista de muchii. Lista de muchii conine M perechi de forma (vi , v j ) ,
fiecare pereche reprezentnd o muchie din graf, descris prin vrfurile
care o formeaz. ntr-un graf orientat perechea descrie un arc, nceputul
lui fiind determinat de primul indice din pereche.
Pentru grafurile din des. 1.1,1.2 listele de muchii vor fi
Des.1.1

Des. 1.2

(1,2)(1,4)(2,3)(2,4)(3,4)

(1,4)(2,1)(2,4)(3,2)(3,4)

16 | P a g e

Lista de muchii este format din M perechi de elemente. M


numrul de muchii. Cu toate c structura este mai compact dect
matricea de inciden sau matricea de adiacen, majoritatea
operaiilor standard pe graful reprezentat n acest mod necesit
parcurgerea ntregii liste, ceea ce scade din eficiena structurii. n
grafurile orientate, primul element al perechii care descrie arcul va fi
vrful surs, al doilea vrful destinaie. n cazul n care muchiile
(arcele) au ponderi asociate, fiecare muchie (arc) va fi descris de un
triplet: indicii vrfurilor care o formeaz i ponderea acesteia.
nc o structur eficient este lista de inciden. Pentru
fiecare nod v V ea va conine o list unidirecional alocat dinamic,
cu toate vrfurile u : (v, u) E . Indicatorii ctre nceputul fiecrei liste
pot fi pstrai ntr-un tablou unidimensional. Elementul cu indicele i
din tablou va conine indicatorul ctre lista de vrfuri incidente vrfului

vi din graf. Pentru grafurile neorientate descrierea fiecrei muchii se


dubleaz, iar operaiile de adugare (lichidare) a muchiilor presupun
prelucrarea a dou liste.
Pentru grafurile din des. 1.1,1.2 listele de vrfuri vor fi:
1

17 | P a g e

Exerciii:
1. Pentru grafurile din imagini construii:

a)
b)
c)
d)

matricea de inciden;
matricea de adiacen;
lista de muchii;
lista de vecini.

2. Elaborai un program pentru citirea dintr-un fiier text a


matricei de adiacen a grafului ( V 20 )

i afiarea ei pe

ecran. Prima linie a fiierului de intrare va conine un numr


ntreg n dimensiunea matricei. Urmtoarele n linii vor conine
cte n numere ntregi, separate prin spaiu elementele matricei
de adiacen a grafului.

18 | P a g e

Capitolul 2. Parcurgeri. Conexitate


n acest capitol:

Parcurgerea grafului n lime


Parcurgerea grafului n adncime
Grafuri tare conexe
Determinarea componentelor tare conexe

2.1 Parcurgerea grafului


Cele mai multe din problemele formulate pe grafuri necesit o
cercetare a legturii ntre vrfurile acestora. Evident, un algoritm
eficient va accesa muchia (vrful) o singur dat, sau de un numr
constant de ori. De aici rezult necesitatea unor metode eficiente pentru
parcurgerea vrfurilor unui graf.
n caz general problema parcurgerii se formuleaz n felul
urmtor: Fie dat graful G (V , E ) . Pentru un vrf dat v V s se
determine mulimea U V : u U exist cel puin o cale ntre v i

u.
Una dintre cele mai eficiente metode de parcurgere n graf este
parcurgerea n adncime4. La baza metodei st principiul de
selectare recursiv a vrfurilor i etichetare a lor. Iniial toate vrfurile
se consider neatinse. Fie v0 vrful de la care ncepe parcurgerea. v0 se
eticheteaz ca fiind atins. Se alege un vrf u , adiacent v0 i se repet
procesul, pornind de la u . n general, fie v vrful curent. Dac exist
un vrf u , nou (neatins), adiacent v ( (v, u) E ), atunci procesul se
repet pornind de la u. Dac pentru vrful curent v nu mai exist
vrfuri vecine neatinse, el se eticheteaz ca fiind cercetat, iar procesul
de parcurgere revine n vrful precedent (din care s-a ajuns n v ). Dac
4

Depth first search (eng.)


19 | P a g e

v v0 parcurgerea a luat sfrit. Pentru realizarea algoritmului se vor


folosi marcaje aplicate vrfurilor grafului (0 nod nou, 1 atins, 2
cercetat).
Exemplu:
pentru
graful
din
imaginea
alturat
se
va
simula
parcurgerea n adncime din vrful 1, n
conformitate cu algoritmul descris anterior:
Pas 1
Pas 2
Pas 3
Pas 4
Pas 5
Pas 6

vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare

1
1
1
1
1
1
1
1
1
1
1
1

2
0
2
0
2
0
2
0
2
0
2
0

3
0
3
0
3
1
3
1
3
1
3
1

4
0
4
0
4
0
4
1
4
2
4
2

5
0
5
0
5
0
5
0
5
0
5
1

6
0
6
1
6
1
6
1
6
1
6
1

Pas 7
Pas 8
Pas 9
Pas 10
Pas 11
Pas 12

vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare
vrf
stare

1
1
1
1
1
1
1
1
1
1
1
2

2
1
2
2
2
2
2
2
2
2
2
2

3
1
3
1
3
1
3
2
3
2
3
2

4
2
4
2
4
2
4
2
4
2
4
2

5
1
5
1
5
2
5
2
5
2
5
2

6
1
6
1
6
1
6
1
6
2
6
2

Un exemplu simplu de realizare a procedurii de parcurgere n


adncime pentru un graf cu N vrfuri, descris prin matricea de
adiacen, l constituie funcia DFS de mai jos. Matricea de adiacen a
grafului este stocat n tabloul A. Marcajele vrfurilor se pstreaz n
tabloul liniar B (B[i] starea vrfului i). Iniial toate marcajele
vrfurilor sunt nule. Vrful din care este lansat parcurgerea s.
int DFS (int s)
{
int i;
b[s]=1;
for(i=1;i<=n;i++)
if(a[s][i] !=0 && b[i]==0) DFS(i);
printf("%d ", s);
return 0;
}
20 | P a g e

Complexitatea funciei DFS n acest caz este

O( N 2 ) . Odat

marcat, nodul v nu mai permite relansarea parcurgerii DFS(v), iar


numrul maxim de apeluri ale funciei este N. Numrul de operaii n
corpul funciei este de asemenea proporional cu N.
Funcia propus lucreaz corect att pe grafuri neorientate, ct
i pe grafuri orientate.
n procesul de parcurgere, cu ct mai trziu este atins un vrf, cu
att mai repede el va fi cercetat (modelarea prin structuri tip LIFO).
Exist ns i probleme n care este important ca vrfurile s fie
cercetate n ordinea atingerii (modelarea procesului prin structuri de
date FIFO). Pentru rezolvarea lor se poate utiliza o alt metod de
cercetare a grafului parcurgerea n lime5.
La fel ca metoda precedent, parcurgerea n lime ncepe de la
un nod dat v0 , plasat n ntr-o structur tip coada (iniial vid). Se
folosete principiul de etichetare a vrfurilor, identic celui folosit n
parcurgerea n adncime. n caz general, se extrage din coad nodul v
(la prima iteraie v v0 ), se determin toate vrfurile u noi (care nc
nu au fost plasate n coad, neatinse), adiacente v ( (v, u) E ), i se
adaug consecutiv n coad. La adugarea n coad vrfurile se
eticheteaz ca fiind atinse. Dup adugarea vrfurilor adiacente n
coad, nodul v este marcat cercetat. Dac coada devine vid parcurgerea a luat sfrit. Pentru realizarea algoritmului se vor folosi
aceleai marcaje aplicate vrfurilor ca i n cazul parcurgerii n
adncime.
Exemplu:
pentru
graful
din
imaginea
alturat
se
va
simula
parcurgerea n lime din vrful 1, n
conformitate cu algoritmul descris anterior:

Breadth first search (eng.)


21 | P a g e

Pas 1

atins
cercetat
atins
cercetat
atins
cercetat
atins
cercetat

Pas 2
Pas 3
Pas 4

Pas 5

6
1
2
1
3
1

Pas 6
3
6
5
6 2

Pas 7

atins
cercetat
atins
cercetat
atins
cercetat

5 4
1 6 2 3
4
1 6 2 3 5
1 6 2 3 5 4

n funcia BFS de mai jos coada este implementat printr-un


tablou unidimensional B, nceputul ei fiind elementul cu indicele st, iar
sfritul elementul cu indicele dr. Elementele cu indicii 1,...,st-1
formeaz mulimea nodurilor cercetate la moment. Structurile de date
A, B, n au aceleai semnificaie ca i n funcia DFS. Tabloul C
modeleaz strile curente ale vrfurilor. Funcia BFS realizeaz
parcurgerea n lime, ncepnd de la vrful cu indicele s.
int BFS (int s)
{
int i, st, dr;
c[s]=1; b[1]=s; st=1;dr=1;
while (st<=dr)
{ for(i=1;i<=n;i++)
if(a[b[st]][i] !=0 && c[i]==0)
{ dr++; b[dr]=i; c[i]=1; }
printf("%d ", b[st]);
st++;
}
return 0;
}

Funcia BFS este implementat nerecursiv cu o complexitate

O( N ) . Numrul de operaii n corpul funciei este determinat de dou


2

instruciuni ciclice incluse, ambele avnd maxim N repetri.


O realizare practic a parcurgerii n lime este metoda undei
numerice, care se dovedete a fi foarte eficient n cazul problemelor de
optimizare pe tablouri bi- i tridimensionale.

22 | P a g e

2.2 Grafuri tare conexe


Def. Un graf orientat G (V , E ) se numete tare conex dac pentru
orice dou vrfuri vi , v j V exist cel puin cte un lan care
unete vi cu v j ( vi

v j ) i v j cu vi ( v j

vi ). ntr-un graf tare

conex orice dou vrfuri sunt reciproc accesibile.


Def. Component tare conex a unui graf orientat G (V , E ) se
numete mulimea maximal de vrfuri V V : vi , v j V
exist cel puin cte un lan vi

v j i v j

vi .

Determinarea componentelor tare conexe


Pentru determinarea componentelor tare conexe va fi folosit
graful transpus lui G. Pentru un graf orientat G (V , E ) , graful
transpus

este

GT (V , ET ) unde

ET (vi , v j ) : (v j , vi ) E . Graful

transpus are aceleai componente tare conexe ca i graful iniial.


Obinerea grafului transpus GT (V , ET ) cere un timp liniar
dup numrul de arce n graf (sau ptratic fa de numrul de vrfuri).
Procesul se realizeaz n mod diferit n dependen de modul de
reprezentare a grafului.
Fie graful G (V , E ) reprezentat prin
matricea de adiacen A(n n) . Matricea de adiacen a grafului

GT (V , ET ) se obine conform urmtoarei formule:

1 dac Aj ,i 1
AiT, j
i, j 1,..., n
0 n caz contrar
Exemplu: desenul 2.1: Graful iniial G (V , E ) i graful transpus
GT (V , ET ) , reprezentate grafic.

23 | P a g e

Des. 2.1 Graful iniial (A) i graful transpus (B).

Algoritmul pentru determinarea componentelor tare conexe are


la baz observaia, c componentele tare conexe rmn aceleai att n
graful iniial ct i n cel transpus. Se vor folosi dou parcurgeri n
adncime pe grafurile GT i G .

Algoritmul Kosaraju
Pseudocod
Pas 1. Se construiete graful GT (V , ET ) .
Pas 2. Se lanseaz cutarea n adncime pornind de la fiecare vrf
T
necercetat din G . Pentru fiecare parcurgere se memoreaz

cumulativ ordinea de cercetare a vrfurilor n vectorul f .


Pas 3. Se lanseaz cutarea n adncime pe graful iniial G ,
consecutiv, pornind de la ultimul vrf inclus n f ctre primul,
dup vrfurile necercetate.
Pas 4. La fiecare cutare n adncime realizat n pasul 3, se afieaz
vrfurile cercetate acestea formeaz o component tare
conex.

24 | P a g e

Exemplu de implementare:
Se folosete matricea de adiacen a pentru reprezentarea
grafului iniial, at pentru reprezentarea grafului transpus, vectorul b
pentru descrierea strii vrfurilor, vectorul black pentru ordinea de
cercetare.
Input: Graful G (V , E ) .
Output: componentele tare conexe ale grafului, separate pe linii.
int DFS_DIR (int s) { // . . . descrisa anterior - DFS }
int DFS_TRANS (int s)
{ int i;
b[s]=1;
for(i=1;i<=n;i++)
if( at[s][i] !=0 && b[i]==0) DFS_TRANS(i);
//amplasarea in stiva ordinii de cercetare
k++; black[k]=s;
return 0;
}
int main()
{ // . . .citirea datelor initiale
// transpunerea grafului
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
if (a[i][j]==1) at[j][i]=1;
// Cautarea in adancime pe graful transpus
for(i=1;i<=n; i++) if (b[i]==0) DFS_TRANS(i);
// resetarea starii varfurilor
for(i=1;i<=n;i++) b[i]=0; printf("\n");
// parcurgerea in adancime pe graful initial
for(i=n;i>=1;i--) //Afisarea componentelor tare conexe
if (b[black[i]]==0) {DFS_DIR(black[i]); printf("\n");}
return 0;
}

Reprezentarea grafic a rezultatelor:

Des. 2.2. Graful iniial (A),


Componentele tare conexe ale
grafului (fiecare component e
colorat aparte) (B)

25 | P a g e

Algoritmul are o complexitate ptratic fa de numrul de


vrfuri n graf. Pasul 1 al algoritmului necesit un numr de operaii
proporional cu n n . Paii 2 i 3 repet cutri n adncime, fiecare cu
o

complexitate

O( N 2 ) .

Prin

urmare,

complexitatea

total

algoritmului este O( N ) .
2

2.3 Probleme rezolvate


Roboii
Se consider un cmp
dreptunghiular de lucru, divizat
n ptrele (vezi desenul).
Ptrelele libere sunt de
culoare alb, iar cele cu
obstacole de culoare nchis.
Pe cmpul de lucru, n ptrele
libere, se afl mai muli roboi.
Fiecare robot se poate deplasa
din
ptrelul
curent
n
ptrelul vecin doar prin latura comun a acestora. Evident, roboii se
pot deplasa doar prin ptrelele libere.
Iniial, toi roboii sunt n starea de repaus. Dup sosirea comenzii
START, roboii ncep s se deplaseze, viteza de deplasare fiind de un
ptrel n fiecare unitate de timp. Fiecare robot se poate opri ori de
cte ori el consider c acest lucru este necesar. Numrul de roboi, care
concomitent se pot afla ntr-un ptrel liber, nu este limitat.
Sarcin. Scriei un program, care calculeaz timpul minim,
necesar pentru ca toi roboii se adune n unul din ptrelele libere ale
cmpului de lucru.
Date de intrare. n memoria calculatorului cmpul de lucru este
reprezentat printr-un tablou format din numere ntregi, cu n linii i m
coloane. Fiecare din elementele tabloului poate lua una din urmtoarele
valori: 0 ptrel liber; 1 ptrel ce conine un obstacol; 2
ptrel liber n care se afl un robot.
26 | P a g e

Fiierul text ROBOT.IN conine pe prima linie numerele ntregi n,


m separate prin spaiu. Fiecare din urmtoarele n linii ale fiierului de
intrare conine cte m numere ntregi separate prin spaiu, care
reprezint ptrelele respective ale cmpului de lucru.
Date de ieire. Fiierul text ROBOT.OUT va conine pe o singur
linie un numr ntreg timpul minim, necesar pentru ca toi roboii se
adune n unul din ptrelele libere ale cmpului de lucru.
Restricii.
. Pe cmpul de lucru se pot afla cel mult
10 roboi. Se garanteaz c toi roboii se pot aduna n unul din
ptrelele libere ale cmpului de lucru. Timpul de execuie nu va
depi o secund. Programul va folosi cel mult 32 Megaoctei de
memorie operativ. Fiierul surs va avea denumirea ROBOT.PAS,
ROBOT.C sau ROBOT.CPP.
Exemplu. Pentru desenul din enunul problemei, fiierele de
intrare i ieire sunt:
ROBOT.IN
7
0
2
0
0
1
0
0

8
0
0
0
0
1
0
0

ROBOT.OUT
12

0
1
0
0
1
2
0

0
1
0
0
1
1
0

0
1
0
0
0
0
0

0
1
0
0
0
0
0

0
0
1
1
1
1
1

0
0
0
0
0
0
2

Timpul minim
se obine n cazul n care toi roboii se
adun n ptrelul aflat la intersecia rndului 1 i a coloanei 2. Pe
desenul de mai sus acest ptrel este marcat printr-un punct.
Rezolvare
Pentru a rezolva problema, vom simula deplasarea fiecrui robot
cu ajutorul unei unde numerice. Pentru a nu confunda undele numerice
ale fiecruia din roboi, vom crea cte un cmp de lucru pentru fiecare
din ei.
Presupunem c se dorete simularea undei numerice a unuia din
roboi. Vom nota prin k valoarea undei numerice. Evident, n cazul
ptrelului n care se afl robotul,
. Pentru a propaga unda
numeric, nscriem n toate ptrelele libere, care sunt vecine cu
27 | P a g e

ptrelul n care se afl robotul, valoarea


. n continuare,
parcurgem cmpul de lucru i nscriem
n toate ptrelele libere, vecine cu cele
ce conin valoarea curent k, valoarea
Repetm acest proces pentru
.a.m.d. pn cnd unda
numeric nu mai avanseaz. Pentru
exemplificare, pe desenele de mai jos
sunt reprezentate rezultatele propagrii
undelor numerice pentru fiecare din roboii din enunul problemei. Din
modul de propagare a undei numerice rezult c valorile nscrise n
ptrelele cmpului de lucru reprezint
lungimea celui mai scurt drum, mai
exact numrul de ptrele minus doi,
pe care trebuie s le parcurg robotul
pentru a ajunge din poziia iniial n
fiecare din ptrelele respective.
De exemplu, pentru a ajunge n
ptrelul cu coordonatele
, adic n
ptrelul de la intersecia rndului 1 cu
coloana 1, primul robot trebuie s
parcurg
ptrel, robotul al
doilea trebuie s parcurg
ptrele, iar robotul al treilea
ptrele. Prin urmare, dac toi cei
trei roboi s-ar aduna n ptrelul cu
coordonatele
, timpul necesar ar fi egal cu 13. ntr-un mod similar,
ne convingem, c dac roboii s-ar aduna n ptrelul
, timpul
necesar ar fi egal cu 18; n ptrelul
cu 25 .a.m.d.
Evident, timpul cerut n enunul problemei poate fi gsit prin
parcurgerea cmpurilor n care sunt nscrise valorile undelor numerice
ale fiecruia din roboi, selectarea pentru fiecare din ptrelele
omonime a valorilor maximale i alegerea din valorile astfel calculate a
valorii minimale.

28 | P a g e

n cazul exemplului de mai sus, valoarea minimal este obinut


n cazul ptrelului
, pentru care valorile undelor numerice sunt
4, 14 i 14, timpul respectiv fiind egal cu 12.
n programul ce urmeaz, pentru a evita verificrile de la margini,
cmpul de lucru al fiecrui robot este ncadrat ntr-un chenar format
din obstacole.
Program Robotii;
{ Clasele 10-12 }
const nmax=40; mmax=40; rmax=10;
type CampDeLucru = array[0..nmax+1, 0..mmax+1] of integer;
var C : array[1..rmax] of CampDeLucru;
n, m, r : integer;
t : longint;
procedure Citeste;
var i, j : integer;
Intrare : text;
begin
assign(Intrare, 'ROBOT.IN');
reset(Intrare);
readln(Intrare, n, m);
for i:=1 to n do
begin
for j:=1 to m-1 do read(Intrare, C[1][i, j]);
readln(Intrare, C[1][i, m]);
end;
close(Intrare);
{ incadram campul intr-un chenar din obstacole }
for j:=0 to m+1 do C[1][0, j]:=1;
for j:=0 to m+1 do C[1][n+1, j]:=1;
for i:=0 to n+1 do C[1][i, 0]:=1;
for i:=0 to n+1 do C[1][i, m+1]:=1;
end; { Citeste }
procedure Scrie;
var Iesire : text;
begin
assign(Iesire, 'ROBOT.OUT');
rewrite(Iesire);
writeln(Iesire, t);
close(Iesire);
end; { Scrie }

29 | P a g e

procedure NumaraRobotii;
{ Inscrie in r numarul de roboti }
var i, j : integer;
begin
r:=0;
for i:=1 to n do
for j:=1 to m do
if C[1][i, j]=2 then r:=r+1;
end; { NumaraRobotii }
procedure InitializeazaCampurile;
var i, j, p, q : integer;
begin
{ cream r exemplare ale campului de lucru }
for p:=2 to r do C[p]:=C[1];
{ lasam pe fiecare camp cate un singur robot }
for p:=1 to r do
begin
q:=0;
for i:=1 to n do
for j:=1 to m do
if (C[p][i, j]=2) then
begin
q:=q+1;
if (p<>q) then C[p][i, j]:=0;
end;
end;
end; { InitializeazaCampurile }
procedure PropagaUndaNumerica(var A : CampDeLucru);
{ Propaga unda numerica in campul A }
var i, j : integer;
k : integer;
{ valoarea curenta a undei numerice }
Ind : boolean; { indicator }
begin
k:=1;
repeat
k:=k+1;
Ind:=true;
for i:=1 to n do
for j:=1 to m do
if A[i, j]=k then
begin
if A[i-1, j]=0 then
begin A[i-1, j]:=k+1; Ind:=false; end;
if A[i+1, j]=0 then
begin A[i+1, j]:=k+1; Ind:=false; end;
30 | P a g e

if A[i, j-1]=0 then


begin A[i, j-1]:=k+1; Ind:=false; end;
if A[i, j+1]=0 then
begin A[i, j+1]:=k+1; Ind:=false; end;
end;
until Ind;
end; { PropagaUndaNumerica }
procedure CalculeazaTimpulMinim;
{ Calculeaza timpul minim }
var i, j, p, k : integer;
Ind : boolean; { indicator }
begin
for p:=1 to r do
PropagaUndaNumerica(C[p]);
t:=MaxInt;
for i:=1 to n do
for j:=1 to m do
if C[1][i, j]>1 then
begin
k:=2;
for p:=1 to r do
if C[p][i, j]>k then k:=C[p][i, j];
if k<t then t:=k;
end;
t:=t-2;
end; { CalculeazaTimpulMinim }
begin
Citeste;
NumaraRobotii;
InitializeazaCampurile;
CalculeazaTimpulMinim;
Scrie;
end.

Din analiza textelor procedurilor din programul de mai sus rezult


c cel mai mare numr de operaii se efectueaz n cazul propagrii
undei numerice. Astfel, procedura PropagaUndaNumerica conine trei
cicluri imbricate: repeat ... for ... for ... . Instruciunile if din
componena acestor cicluri vor fi efectuate de cel mult
ori, unde k
este lungimea celui mai lung drum de pe cmpul de lucru. ntruct
, timpul cerut de aceast procedur va fi proporional cu
.
n procedura CalculeazaTimpulMinim se efectueaz r apeluri ale
31 | P a g e

procedurii PropagaUndaNumerica. Prin urmare, timpul cerut de


program va fi proporional cu
. Conform restriciilor problemei,
, iar
. Evident, timpul cerut de programul Robotii va fi
proporional cu
, mrime mai mic dect
capacitatea de prelucrare a calculatoarelor personale.

Exerciii:
1. Simulai, pe pai, pentru graful
din imagine, parcurgerea n lime,
pornind de la vrful 1.
2. Simulai, pe pai, pentru graful
din imagine, parcurgerea n
adncime, pornind de la vrful 1.

3. Elaborai un program pentru parcurgerea n adncime a unui


graf ( V 20 ) (abordare recursiv).
4. Elaborai un program pentru parcurgerea n adncime a unui
graf ( V 20 ) (abordare iterativ).
5. Elaborai un program pentru parcurgerea n lime a unui graf
( V 20 ).
6. Elaborai un program pentru determinarea componentelor tare
conexe ale grafului ( V 20 ).

32 | P a g e

Capitolul 3. Mulimi independente


n acest capitol

Noiunea de mulime independent


Mulimi maximal independente.
Generarea mulimilor maximal independente

3.1 Mulimi independente


Fie dat un graf neorientat G (V , E ) .
Def.

Mulime independent se numete o mulime de vrfuri ale


grafului, astfel nct oricare dou vrfuri din ea nu sunt unite
direct prin muchie.
Formulat matematic, mulimea independent

mulime, care satisface relaia: S V : S


Def.

este o

(S ) .

Mulimea S se numete maximal independent, dac nu exist o


alt mulime independent S , pentru care se ndeplinete
condiia: S S .

Des. 3.1. {1, 3,7} {2,8,7,4} {4,6}


mulimi independente.
Mulimile {2,8,7,4} , {2, 4, 6} sunt
maximal independente, iar {1,3},
{2,4} nu.

33 | P a g e

Nu toate mulimile maximal independente au acelai numr de


vrfuri. Prin urmare modul de selecie a celei mai bune mulimi
maximal independente va depinde de condiiile iniiale ale problemei
concrete: n unele cazuri aceasta va fi mulimea maximal independent
cu un numr maxim de vrfuri, n altele - mulimea maximal
independent cu un numr minim de vrfuri, etc.
Def.

Fie Q mulimea tuturor mulimilor independente a grafului

G (V , E ) . Numrul G max Q
SQ

se va numi numr de

independen a grafului G , iar mulimea S * , pentru care el se


obine mulime maxim independent.
Exemplu: pentru graful din desenul 3.1 setul de mulimi maximale
independente este {1, 3, 7}, {1, 6}, {1, 7, 8}, {2, 4, 6}, {2, 4, 7, 8}, {3, 4, 7},
{3, 5}, {5, 6}. Cea mai mare putere a mulimilor este 4, deci [G] = 4.
Mulimea maxim independent este {2, 4, 7, 8}

3.2 Generarea tuturor mulimilor maximal independente


Fie G (V , E ) . Prin graf complementar se nelege graful

G (V , E ) unde E {(u, v) : u, v V ; (u, v) E}


Problema mulimilor maximal independente se reduce direct la
problema generrii subgrafurilor complete, rezolvat pe graful
complementar G (V , E ) . Aceasta din urm este o problem de
complexitate exponenial. De aici rezult i complexitatea
exponenial a algoritmului pentru determinarea tuturor mulimilor
maximal independente. Tehnica general se bazeaz pe metoda relurii,
care poate fi parial optimizat prin ordonarea vrfurilor dup
micorarea puterii acestora. Algoritmul de parcurgere sistematic a
fost propus de Bron i Carbosh. n acest algoritm generarea repetat a
mulimilor este evitat prin mbuntirea mulimilor existente.

34 | P a g e

Motivarea algoritmului
Algoritmul se bazeaz pe arborele de cutare. Prin urmare, este
eficient realizarea lui recursiv.
n general, la pasul k mulimea independent S k se extinde prin
adugarea unui vrf nou, pentru a obine la pasul k 1 mulimea Sk 1 .
Procesul se repet att timp, ct este posibil adugarea vrfurilor noi.
La momentul, n care nu mai putem aduga vrfuri, avem obinut o
mulime maximal independent.
Fie Qk - mulimea maximal de vrfuri, pentru care la pasul k
avem ( Sk )

Qk . Prin adugarea unui vrf din Qk n S k se obine

Sk 1 . n general, Qk este format din dou componente: Qk vrfurile


deja folosite n procesul de cutare pentru extinderea S k i Qk
vrfurile care nc nu au fost folosite n cutare. Pentru adugarea n

S k se vor folosi doar vrfurile din Qk . Astfel, procedura de adugare a


vrfului nou e urmtoarea:

a) selectarea unui nod xik Qk

b) construirea mulimii Sk 1 Sk
c) formarea

Qk1 Qk ( xik )

(*)

x
ik

Qk1 Qk ( xik ) ( xik )

Pasul de ntoarcere presupune eliminarea vrfului xik din Sk 1


pentru revenirea la mulimea S k cu mutarea lui xik din Qk n Qk .
Soluia (mulimea maximal independent) se va obine n cazul
n care Qk i Qk . Dac Qk , rezult c mulimea S k a fost
extins la o etap precedent din contul adugrii unui vrf din Qk , de
aceea nu este o mulime maximal independent nou.
35 | P a g e

Qk a unui vrf x Qk : ( x) Qk

Prezena n

(**)

este un indicator pentru a efectua pasul de ntoarcere, deoarece n acest


caz Qk nu va deveni vid, indiferent de modul de selecie a vrfurilor.

Optimizarea algoritmului
Optimizarea poate fi obinut din contul apariiei ct mai rapide
a pasului de ntoarcere. Prin urmare, se va ncerca ndeplinirea ct mai
grabnic a condiiei (**). O metod sigur (n special pentru grafuri
mari) este de a alege mai nti n Qk un vrf x , pentru care valoarea

( x) ( x) Qk

va fi minimal, apoi, la fiecare pas urmtor n

alegerea unui xik din Qk

: xik ( x) . Aceasta asigur apropierea cu

o unitate de situaia care genereaz pasul de ntoarcere.

Pseudocod
Pas 1.

S0 Q0 , Q0 V , k 0.

Adugarea vrfurilor
Pas 2. Este selectat un vrf

xik Qk , dup principiul formulat

anterior. Se formeaz Sk 1 , Qk1 , Qk1 fr a modifica Qk , Qk .

k
Verificarea posibilitii de continuare
Pas 3. Dac exist x Qk

: ( x) Qk

se trece la pasul 5,

altfel - la pasul 4.
Pas 4.
a)

Dac Qk i Qk se afieaz (memoreaz)


mulimea maximal independent S k i se trece la pasul 5.

b)

Dac Qk , dar Qk se trece direct la pasul 5

c)

Dac Qk , i Qk se revine la pasul 2

36 | P a g e

Micarea napoi
Pas 5. k
a)

xik se exclude din Sk 1 , pentru a reveni la S k .

b)

Se reconstruiesc Qk , Qk : Qk Qk xik

c)

Dac k 0 i Qk , atunci SFRIT (au fost afiate

Qk xik

[memorate] toate mulimile independente maximale). n


caz contrar se revine la pasul 3.

Implementare. n urmtorul exemplu este realizat o implementare


simplificat a algoritmului, fr optimizarea prin reordonarea
vrfurilor. Generarea repetat a mulimilor maximal independente este
evitat prin selectarea vrfurilor pentru includere n ordine
lexicografic. Mulimile Qk , Qk , Sk se formeaz i se gestioneaz prin
intermediul

apelurilor

recursive.

Restriciile

de

dimensiune

V num_el . Structurile de date: a matricea de adiacen a grafului,


s tabloul etichetelor vrfurilor, incluse n soluia curent (s[i]=1), q
tabloul etichetelor vrfurilor care pot fi adugate la soluie (q[i]=1),
rest tabloul etichetelor pentru restabilirea Qk .
int fillc(int *x, int z, int num)
{ // elementele cu tabloului x primesc valoarea z}
int readdata()
{ // citirea matricei de adiacen a grafului A}
int print()
{ // funcia pentru afiarea mulimii maximal independente
curente}
int mind(int *s, int *q)
{ int i,j,k=0,r, rest[num_el];
for (i=1;i<=n;i++) if(q[i]!=0) k=1;
if (k==0) {print();} // afiarea soluiei
else { j=n;
while (s[j]==0 && j>=1) j--;
37 | P a g e

r=j+1;
for (i=r;i<=n;i++)
if (q[i]==1)
{ fillc(rest,0,n);
s[i]=1; q[i]=0;
for (j=1;j<=n;j++)
if (a[i][j] != 0 && q[j]==1)
{q[j]=0; rest[j]=1;}
mind (s,q);
// micarea inainte
s[i]=0;q[i]=1; //micarea napoi
for (j=1;j<=n;j++)
if(rest[j]==1) q[j]=1;
}
}
return 0;
}
int main()
{
readdata();
fillc(s,0,n); fillc(q,1,n);
mind(s,q); return 0;
}

Pentru graful reprezentat pe desenul 3.2, programul determin


urmtoarele mulimi maximal independente
1
1
1
1
2
2
2
2
2
3
4
6
8
Des. 3.2 Graful iniial i mulimile independente identificate.

38 | P a g e

5 10
7 8
8 10
9 10
3 7 8 11
3 9 11
4 6 9
4 7
6 9 11
5
6 9 10
9 10 11
10 11

Exerciii
1. Pentru graful din imagine, determinai:
a) mulimea maxim
independent de putere
minim;
b) mulimea maxim
independent de putere
maxim.
2. Completai implementarea prezentat mai sus cu subprogramele
lips i structurile de date necesare pentru a avea un program
funcional, ce va realiza algoritmul pentru grafuri cu |V| < 30.
3. Realizai o modificare a programului elaborat n exerciiul 2,
care va verifica i toate optimizrile indicate n descrierea
algoritmului (3.2).
4. Elaborai o funcie pentru generarea aleatorie de grafuri i
estimai statistic timpul mediu de lucru al algoritmilor elaborai
n exerciiile de mai sus n funcie de numrul de vrfuri i
muchii ale grafului.

39 | P a g e

Capitolul 4. Colorri
n acest capitol:

Numrul cromatic al grafului


Algoritmi exaci de colorare a grafurilor
Algoritmi euristici de colorare

4.1 Numrul cromatic


Colorarea grafului procesul de atribuire unor caracteristici
coloristice vrfurilor acestuia.
Graful se numete r-cromatic, dac vrfurile lui pot fi colorate,
folosind r culori diferite, astfel nct s nu existe dou vrfuri adiacente,
colorate la fel. Valoarea minim a lui r, pentru care o asemenea colorare
este posibil se numete numr cromatic al grafului G (V , E ) i se
noteaz (G) .
Nu exist o formul general pentru determinarea (G) reieind
din numrul de vrfuri (n) i muchii (m) ale grafului. Este evident
k
posibilitatea
de
a
colora
graful
n
culori
( (G) k n ). Totui, reieind din faptul c vrfurile colorate
formeaz mulimi independente, pot fi stabilite anumite numere
cromatice:

( K n ) 1, ( Kn ) n , ( Kn ,n ) 2 , (T ) 2 , etc.
1

ntr-un graf colorat, mulimea vrfurilor, crora le este atribuit


una i aceeai culoare se numete clas monocrom.
Teorema 1. (G) 1 (G). 6
Demonstraie: [12, pag. 39]
Teorema 2. Fie (G), (G) . Atunci sunt adevrate relaiile:
6

(G) - puterea maxim a vrfurilor din G.

40 | P a g e

2 n n 1
n 1
n

Fr demonstraie
Teorema 3. n orice graf planar exist un vrf de grad nu mai mare
dect cinci. (corolar din formula Euler)
[12, pag. 40]
Teorema 4. (celor 5 culori). Pentru orice graf planar (G) 5 .
[4, pag. 285]
Ipoteza (celor 4 culori). Orice graf planar poate fi colorat cu patru
culori.

4.2. Algoritmul exact de colorare


Abordare recursiv, pseudocod.
Input: Graful G .
Output: Toate colorrile posibile ale grafului G .
Pas 0. k 0 (indicele culorii curente).
Pas 1. n graful G se alege o careva mulime maximal independent S .
Pas 2. k . Mulimea S se coloreaz n culoarea k .
Pas 3. G G S . Dac G se revine la pasul 1.
Algoritmul genereaz toate posibilitile de formare a mulimilor
independente disjuncte pe vrfurile grafului G . Prin urmare, va fi
generat i o colorare optim cu numr minim de culori. Complexitatea
algoritmului este una exponenial pasul 1 are o asemenea
complexitate, deoarece genereaz mulimi maximal independente.
Suplimentar, se formeaz i un arbore de soluii, numrul de noduri n
care, n general, este proporional cu 2 .
Cele expuse denot ineficiena algoritmului exact pentru
grafurile cu un numr de vrfuri mai mare dect 20.
n

41 | P a g e

4.3. Algoritmi euristici de colorare


Algoritmul exact, descris anterior nu poate fi utilizat pentru a
obine o colorare eficient ntr-un timp rezonabil. Problema poate fi
rezolvat cu ajutorul unor algoritmi euristici, care vor furniza soluii ce
pot diferi de cea optim, fiind totui, destul de apropiate de ea.

Algoritmul de colorare consecutiv


Input: Graful G .
Output: O colorare posibil a grafului G .
Pas 1. Se sorteaz vrfurile din G n ordinea descreterii gradelor d .
Pas 2.

Iniializare V {1,..., n} C [ ] 0,
se

Pas 3.

iniializeaz

cu

0.

k 1 . Vectorul culorilor

Culoarea

activ

Ct V se repet
Pentru fiecare v V
Pentru fiecare u (v)
Dac C [u ] k , se trece la urmtorul v

C[v] k ; V V v

k
Implementare
Input: Graful G : matricea de adiacen a, structura vrfurilor v.
Output: O colorare posibil a grafului G , n vectorul culorilor c.
int sort ()
{ // sorteaz vrfurile n descreterea gradelor }
int readdata()
{ // citete graful G. matricea de adiacen }

42 | P a g e

1.

int printcc()
{ // afieaz o colorare a grafului G }
int nocolor()
{ verific prezena vrfurilor necolorate }
int main(int argc, char *argv[])
{ int j,i,r;
readdata();
// initializare
for (i=1;i<=n;i++)
{v[i].ind=i;
for (j=1; j<=n;j++) v[i].grad+=a[i][j];
}
// sortare
sort();
// colorare
k=1;
fillc(c,0,n);
while (nocolor())
{ for( i=1;i<=n;i++)
{ if (c[v[i].ind]==0)
{ r=0;
for (j=1;j<=n;j++)
if (a[v[i].ind][j] != 0 && c[j]==k) r++;
if (r==0) c[v[i].ind]=k;
}
}
k++;
}
printcc();
return 0;
}

43 | P a g e

Exerciii:
1. Pentru grafurile din imaginile de mai jos determinai (G) :

2. Elaborai un program care va determina colorarea cu un numr


minim de culori pentru grafuri cu

V 10 . Implementai

algoritmul exact de colorare.


3. Elaborai

un

program

care

va

determina

colorarea

aproximativ pentru grafuri cu V 100 , folosind algoritmul


euristic de colorare.
4. Identificai grafuri, pentru care algoritmul euristic, descris
anterior, va construi soluii ce difer de cele optime.

44 | P a g e

Capitolul 5. Drumuri minime n graf


n acest capitol:

Drumul minim ntre dou vrfuri ale grafului


Drumul minim de la un vrf la toate vrfurile grafului (algoritmul Dijkstra)
Drumul minim ntre toate perechile de vrfuri (algoritmul Floyd)

Preliminarii
Ponderea unei muchii (u, v)

n graf este o caracteristic

numeric a relaiei ntre vrfurile u i v . Ea poate specifica distana


dintre vrfuri, sau capacitatea unui canal de transmitere a datelor, a
unei conducte, magistrale auto etc. Atribuirea de ponderi muchiilor
unui graf permite formularea unei serii noi de probleme, inclusiv a
problemelor de optimizare. Una din astfel de probleme este problema
drumurilor minime.
Problema drumurilor minime ntr-un graf arbitrar G (V , E ) ,
muchiile cruia au ponderi nenegative, descrise de matricea costurilor
C C[i, j ] , const n gsirea unui drum de lungime minim ce leag
vrfurile date s i t ale grafului, cu condiia c un astfel de drum exist.
Pentru problema dat exist mai multe formulri. Iat doar cteva din
ele:
s se determine distana minim ntre dou vrfuri ale
grafului (dac ntre ele exist un drum);
s se determine distana minim de la un vrf al grafului la
toate celelalte vrfuri;
s se determine distanele minimale ntre toate perechile de
vrfuri.

45 | P a g e

5.1 Distana minim ntre dou vrfuri. Algoritmul Dijkstra


Algoritmul Dijkstra se bazeaz pe aplicarea marcajelor
pentru vrfurile n care se poate ajunge dintr-un vrf dat. Iniial
marcajele au valori temporare suficient de mari, care pe parcursul
repetrii iteraiilor se micoreaz, pn la atingerea valorilor
minime. La fiecare iteraie a algoritmului, exact un dintre
marcaje devine permanent, adic indic drumul minim pn la
unul dintre vrfuri. Prin urmare algoritmul va conine cel mult n
iteraii.
Fie s vrful de la care se calculeaz distanele minime, t
vrful pn la care se calculeaz distana. Marcajul vrfului vi va
fi notat prin l vi . Se va folosi un marcaj cu dou componente
(spre deosebire de algoritmul clasic Dijkstra). Componentele vor
conine a) valoarea distanei curente de la s la vi i b) indicele
vrfului v j din care se ajunge n vi .
Pseudocod
Pas 1. Se consider l s (0, s) marcaj temporar pentru vrful s.
Pentru toate vrfurile vi V , vi s se consider marcajele
nedefinite. Vrful activ p s .
Pas 2. (Recalcularea marcajelor)
Pentru

toate

vrfurile

vi ( p)

care

nu

permanente, se recalculeaz componentele


marcajelor n corespundere cu formula:

l vi .dist min l vi .dist , l p .dist c p vi .


46 | P a g e

au

marcaje

distan

ale

Dac

l vi .dist l p .dist c p vi atunci

se

modific

componenta marcajului, care indic sursa l vi .sursa p .


Vrfului p i se atribuie marcaj permanent.
Pas 3. (Determinarea vrfului pentru cercetare)
ntre toate vrfurile cu marcaje temporare se determin cel cu
marcaj minim pentru componenta distan:

l vi* .dist min l vi .dist

Se consider p vi*
Pas 4. (Repetarea iteraiei)
Dac p = t atunci

marcajul l t .dist indic costul minim a

drumului di s n t. Pentru restabilirea drumului minim se trece


la pasul 5. n caz contrar p t se revine la pasul 2.
Pas 5. Pentru restabilirea traiectoriei se folosete a doua component
a marcajului: se consider x t .
Se include n traiectorie muchia

x, l x .sursa .

Se consider

x l x .sursa Procesul se repet ct timp x s .


Exemplu:
Se consider graful G (V , E )
de pe desenul 5.2.

Des. 5.2

Se cere s se determine distana minim de la vrful 1 la vrful 10.

47 | P a g e

Iniializarea
Vrf
distana
sursa
marcaj

1
0
1
p

10

Iteraia 1
Vrf
distana
sursa
marcaj

1
0
1
p

2
10
1
t

4
5
1
t*

7
6
1
t

10

Iteraia 2
Vrf
distana
sursa

1
0
1

2
10

4
5

5
10

7
6

8
10

10

marcaj

1
t
*
7
6
1
p

8
10
4
t

10

10

10
30
5
t

Iteraia 3
Vrf
distana
sursa
marcaj

1
0
1
p

2
10
1
t*

4
5
1
p

Iteraia 4
Vrf
distana
sursa
marcaj

1
0
1
p

2
10

3
30

4
5

5
10

6
18

7
6

8
10

1
p

2
t

1
p

4
t*

2
t

1
p

4
t

Iteraia 5
Vrf
distana
sursa
marcaj

1
0
1
p

2
10

3
30

4
5

5
10

6
18

7
6

8
10

1
p

2
t

1
p

4
p

2
t

1
p

4
t*

Iteraia 6
Vrf
distana
sursa
marcaj

1
0
1
p

2
10

3
30

4
5

5
10

6
18

7
6

8
10

9
30

10
30

1
p

2
t

1
p

4
p

2
t*

1
p

4
p

8
t

5
t

Iteraia 7
48 | P a g e

5
10
4
t

Vrf
distana
sursa
marcaj

1
0
1
p

2
10

3
30

4
5

5
10

6
18

7
6

8
10

9
30

10
24

1
p

2
t

1
p

4
p

2
p

1
p

4
p

8
t

6
t*

Lungimea drumului minim din vrful 1 n 10 este 24. Traseul va


fi determinat de calea: 10, 6, 2, 1
Pentru a determina distanele minime de la un vrf dat pn la
toate celelalte vrfuri ale grafului (a componentei conexe) algoritmul va
fi oprit n cazul cnd toate vrfurile au marcaje permanente.

Implementare
Graful este descris prin matricea de adiacen a. Marcajele se pstreaz
n tabloul liniar vert cu elemente tip articol, avnd componentele
distana, sursa, stare.
int find()
{ // fuctia returneaza indicele varfului cu marcaj temporar
//de valoare minima. Daca nu exista, returneaza 0.
}
int tipar()
{ // functia afiseaza tabloul de marcaje
}
int main()
{ // citire date
// formare marcaje
for (i=1;i<=n;i++)
for (j=i+1; j<=n; j++) k+=a[i][j];
k++;
for (i=1;i<=n;i++)
{vert[i].dist=k; vert[i].sursa=i; vert[i].stare=0;}
vert[s].stare=1; vert[s].dist=0;
// repetare iteratii
while (find ())
{ p=find();
49 | P a g e

for(i=1;i<=n;i++)
if (a[p][i] !=0 && vert[i].stare !=2 )
{ dc= vert[p].dist+a[p][i];
if(dc<vert[i].dist){vert[i].dist=dc; vert[i].sursa=p;}
vert[i].stare=1;
}
vert[p].stare=2;
}
// afisare rezultate
tipar();
return 0;
}

5.2 Distana minim ntre toate vrfurile. Algoritmul Floyd


Din paragraful precedent rezult o soluie evident a problemei
determinrii tuturor drumurilor minime ntre vrfurile grafului:
algoritmul Dijkstra se lanseaz avnd n calitate de surs, consecutiv,
toate vrfurile grafului. Eist i un algoritm mai eficient, propus de
Floyd [7, p. 480]. La baza algoritmului este ideea unei secvene din n
transformri consecutive ale matricei distanelor C. La transformarea
cu indicele k matricea conine lungimea drumului minim ntre orice
pereche de vrfuri, cu restricia c pentru orice dou vrfuri vi , v j
drumul minim dintre ele trece doar prin vrfurile mulimii {v1 , v2 ,..., vk }

Pseudocod
Pas 0. (Preprocesare). Fie dat matricea distanelor C, n care

i j
0,

C[i ][ j ] di , j , (i, j ) E
,
(i, j ) E

Pas 1. (Iniializare) k 0
Pas 2

50 | P a g e

Pas 3

Pentru toi i k : C[i][k ] , i pentru toi j k : C[k ][ j ]


se calculeaz C[i][ j ] min C[i][ j ], C[i][k ] C[k ][ j ]

Pas 4

dac k n sfrit, n caz contrar se revene la pasul 2.

Dac problema rezolvat necesit i restabilirea traseelor care


formeaz drumurile minime, este format o matrice auxiliar T, care
iniial are elementele liniei i egale cu i.
Mai apoi, la transformarea elementului C[i][ j ] din matricea
distanelor se transform i elementul respectiv din matricea T:

T [i][ j ] T [k ][ j ] dac C[i][ j ] C[i][k ] C[k ][ j ] .


Traseul ce corespunde drumului minim ntre vrfurile vi , v j va
fi format din secvena vi , v1 , v2 ,..., vr , vr 1 , v j , unde

vr 1 T [i][ j ], vr T [i][vr 1 ], vr 1 T [i][vr ],...

Implementare
Graful este descris prin matricea de adiacen a, care ulterior
este transformat n matricea distanelor.
int main()
{
// citire date iniiale
// modelare infinit
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
p+=a[i][j];
p++;
// creare matrice costuri
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
if (a[i][j]==0 && i != j) a[i][j]=p;
// calculare drumuri minime
for (k=1;k<=n;k++)
for (i=1;i<=n;i++)
if (i!=k && a[i][k]!=p)
51 | P a g e

for (j=1;j<=n;j++)
if (j!=k && a[k][j] !=p)
if (a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
// afisare rezultate
return 0;
}

5.3 Probleme rezolvate


Reele de calculatoare7
Enun
:
Se consider n calculatoare C1, C2, ,...,
Cn, reunite ntr-o reea de topologie
distribuit (Fig. 5.3).
Structura de comunicaie a reelei
este format din linii bidirecionale de
transmisie a informaiei. Fiecare linie
asigur comunicarea direct ntre
perechile de calculatoare adiacente.
Fig. 5.3
n absena unei linii directe ntre
calculatoarele Ca, Cb (a 1, 2, ..., n ; b 1, 2, ..., n ; a b) , schimbul de
informaii ntre ele se realizeaz prin intermediul altor calculatoare, cu
ajutorul crora se formeaz canale de comunicare. Mai exact, un canal
de comunicare ntre calculatoarele Ca, Cb reprezint o succesiune de
calculatoare distincte (Ca, Ck, Cl, ..., Cm, Cb), cu proprietatea c ntre
calculatoarele vecine (Ca, Ck), (Ck, Cl), ..., (Cm, Cb) exist cte o linie
direct de transmisie a informaiei.
Prin definiie, lungimea canalului de comunicare (Ca, Ck, Cl, ...,
Cm, Cb) este egal cu numrul liniilor directe de transmisie a informaiei
(Ca, Ck), (Ck, Cl), ..., (Cm, Cb) ce formeaz canalul respectiv.
n cazul topologiilor distribuite, ntre calculatoarele Ca, Cb pot
exista mai multe canale de comunicare. Elaborai un program care

Olimpiada Republican la Informatic, 2006


52 | P a g e

determin lungimea celui mai scurt canal de comunicare ntre


calculatoarele Ca, Cb.
Input:
Fiierul text RETELE.IN conine pe prima linie numrul ntreg n.
Fiecare din urmtoarele n linii ale fiierului de intrare conine numere
ntregi separate prin spaiu. Linia i+1 a fiierului de intrare conine
numerele ntregi ce reprezint calculatoarele care snt legate prin linii
directe cu calculatorul Ci. Ultima linie a fiierului de intrare conine
numerele naturale Ca, Cb separate prin spaiu.
Output:
Fiierul text RETELE.OUT va conine pe o singur linie numrul ntreg
q lungimea celui mai scurt canal de comunicare ntre calculatoarele
Ca, Cb.
Exemplu:
RETELE.IN
6
3 4 2
1 5 6
1 4
1 3 5 6
2 4 6
4 2 5
1 6

RETELE.OUT
2

Restricii:

2 n 100 ; 1 Ca , Cb n ; C a Cb . Timpul de execuie nu va depi

0,5 secunde. Fiierul surs va avea denumirea RETELE.PAS,


RETELE.C sau RETELE.CPP.
Rezolvare
Pentru a determina lungimea celui mai scurt canal de comunicare
ntre calculatoarele Ca, Cb
vom folosi metoda propagrii undei
numerice, cunoscut n literatura de specialitate ca algoritmul lui Lee.
Introducem n studiu tabloul Z z i , unde zi reprezint lungimea celui
mai scurt canal de comunicare de la calculatorul Ca la calculatorul Ci.
Iniial, calculatoarele la care nc nu a ajuns unda numeric, vor fi
53 | P a g e

marcate n tabloul Z printr-o valoare negativ, de exemplu, 1.


Evident, z a 0.
n continuare propagm prin liniile de transmisie a informaiei o
und numeric L, unde L ia consecutiv valorile 0, 1, 2, 3 .a.m.d. Pentru
aceasta parcurgem iterativ tabloul Z i atribuim valoarea L+1
elementelor z i ce corespund calculatoarelor, vecine cu calculatorul n
care a ajuns unda numeric L. Procesul iterativ se termin n momentul
cnd unda numeric ajunge la calculatorul Cb. Pentru exemplificare, n
Fig. 2 snt prezentate valorile tabloului Z pentru reeaua din enunul
problemei.

Tabloul
iniial

L=1

L=2

L=0

Fig. 5.4

programul

ce

urmeaz

reprezentat prin tabloul R rij

nn

reeaua

de

calculatoare

este

. Elementul rij al acestui tablou are

valoarea 1 dac ntre calculatoarele Ci, Cj exist o linie direct de


transmisie a informaiei i 0 n caz contrar.
Program Retele;
const nmax = 100;
var n, a, b, q : integer;
R : array[1..nmax, 1..nmax] of integer;
Z : array[1..nmax] of integer;
Intrare, Iesire : text;

54 | P a g e

procedure Citeste;
var I, j : integer;
begin
assign(Intrare, 'RETELE.IN');
reset(Intrare);
readln(Intrare, n);
for i:=1 to n do
for j:=1 to n do R[i, j]:=0;
for i:=1 to n do
begin
while not eoln(Intrare) do
begin read(Intrare, j); R[i, j]:=1; end;
readln(Intrare);
end; { for }
readln(Intrare, a, b);
end; { Citeste }
procedure Scrie;
{ Scrierea datelor in fisierul de iesire }
begin
assign(Iesire, 'RETELE.OUT');
rewrite(Iesire);
writeln(Iesire, Z[b]);
close(Iesire);
end; { Scrie }
procedure UndaNumerica;
{ Propagarea undei numerice }
var i, j, L : integer;
begin
for i:=1 to n do Z[i]:=-1;
Z[a]:=0;
L:=0;
while Z[b]=-1 do
begin
for i:=1 to n do
if Z[i]=L then
for j:=1 to n do
if (R[i, j]=1) and (Z[j]=-1) then
Z[j]:=L+1;
L:=L+1;
end; { while }
end; { UndaNumerica }
begin
Citeste;
UndaNumerica;
Scrie;
end.
55 | P a g e

Din analiza textului procedurii UndaNumerica se observ c


instruciunea if din componena ciclurilor imbricate for va fi executat
de cel mult n 2 ori. Corpul ciclului while va fi executat de cel mult q ori,
unde q este lungimea celui mai scurt canal de comunicare de la
calculatorul Ca la calculatorul Cb. Evident, lungimea acestui canal de
comunicare nu poate depi valoarea n 1 , deci q n . Prin urmare, n
cel mai nefavorabil caz, numrul de execuii a instruciunii if va fi de
ordinul n 3 .
Conform restriciilor din enunul problemei, n 100 . Prin urmare,
numrul necesar de operaii este de ordinul 106, mrime cu mult mai
mic dect capacitatea de prelucrare a calculatoarelor personale.

56 | P a g e

Exerciii
1. Determinai distana minim ntre vrfurile indicate pe grafurile
de mai jos:
39
14

2. Pentru implementarea algoritmului Dijkstra, propus n


paragraful 5.1, elaborai o funcie pentru restabilirea lanului ce
corespunde drumului minim de la vrful dat s ctre destinaia t.
3. Realizai o implementare a algoritmului Floyd (paragraful 5.2)
fr matricea auxiliar pentru restabilirea lanurilor care
corespund drumurilor minime.
4. Extindei implementarea din exerciiul 2, adugnd opiunea de
restabilire a lanurilor ce corespund drumurilor minime.
5. Estimai complexitatea algoritmului Dijkstra.
6. Estimai complexitatea algoritmului Floyd.

57 | P a g e

Capitolul 6. Centre n graf


n acest capitol:

Centre n graf
Centre interioare i exterioare
Raza grafului
Algoritmi exaci pentru determinarea centrului

n aplicaiile practice foarte des se ntlnesc problemele legate


de amplasare optim a unor puncte de deservire (staii, puncte de
control, utilaje) ntr-o reea de localiti, ncperi etc. Punctele pot fi
unul sau cteva, n dependen de condiiile problemei. Formulat n
termeni uzuali, problema este de a gsi un punct, care ar minimiza
suma distanelor de la oricare alt punct al reelei pn la el, sau n
termenii teoriei grafurilor - de a determina vrful grafului sau punctul
geometric, care aparine unei muchii, astfel nct acesta va minimiza
suma distanelor pn la toate celelalte vrfuri ale grafului. Se va
considera suplimentar, c drumurile pentru localitile (vrfurile)
situate pe acelai lan sunt distincte.

6.1 Divizri
0
Pentru orice vrf vi al grafului G (V , E ) prin R (vi ) se va nota

mulimea de vrfuri v j ale grafului G care pot fi atinse din vi prin ci,
t
ce nu depesc mrimea . Prin R (vi ) se va nota mulimea de vrfuri

v j ale grafului G din care vi poate fi atins prin ci ce nu depesc


mrimea . Astfel, pentru orice vrf vi al grafului G se noteaz:

R (v ) v : d v , v , v V
R0 (vi ) v j : d vi , v j , v j V
t

58 | P a g e

Pentru fiecare din vrfurile vi vor fi definite 2 mrimi:

s0 (vi ) max d vi , v j
v j V

st (vi ) max d v j , vi
v j V

Valorile s0 (vi ) i st (vi ) se numesc indici de separare exterior i,


respectiv, interior ai vrfului vi .
Exemplu:

Des. 6.1 Graf tare conex i matricea


distanelor lui.

v1

v2

v3

v4

v5

v6

v7

v8

s0

v1

v2

v3

v4

v5

2
*

v6

v7

v8

st

3
*

3
*

Este evident, c pentru vrful vi , s0 (vi ) va fi determinat de


valoarea maxim din rndul i al matricei distanelor, iar st (vi ) - de
valoarea maxim din coloana i. Tot de aici rezult c valorile s0 (vi ) i

st (vi ) au valori finite pentru orice i numai dac graful este tare conex.

59 | P a g e

6.2 Centrul i raza grafului


Def.

Vrful v0* pentru care are loc relaia s0 (v0 ) min s0 (vi ) se
*

vi V

numete centru exterior al grafului G. Vrful vt* pentru care are


loc relaia st (vt ) min st (vi ) se numete centru interior al
*

vi V

grafului G.
Centrul exterior este vrful (sau vrfurile) care minimizeaz cea
mai lung distan de la el spre oricare alt vrf al grafului. Din
matricea distanelor el poate fi determinat ca minimul valorilor maxime
de pe fiecare linie. Pentru graful de pe desenul 6.1 centrul exterior este
vrful 5. Centrul interior este vrful (sau vrfurile) care minimizeaz
cea mai lung distan spre el de la oricare alt vrf al grafului. Din
matricea distanelor el poate fi determinat ca minimul valorilor maxime
de pe fiecare coloan. Pentru graful de pe desenul 6.1 centre exterioare
sunt vrfurile 4 i 8. ntr-un graf neorientat centrul interior i cel
exterior coincid.
Def.

Valoarea s0 (v0 ) min s0 (vi ) se numete raza exterioar a


*

vi V

grafului G. Valoarea st (vt ) min st (vi ) se numete raza


*

vi V

interioar a grafului G.
Pentru graful de pe desenul 6.1 raza exterioar are valoarea 2, n
timp ce raza interioar are valoarea 3.
Pentru un graf neorientat raza interioar i raza exterioar sunt
egale, iar centrele exterioare coincid cu cele interioare.
Def.

Valoarea s(v0 ) min s(vi ) se numete raza grafului neorientat


*

vi V

G. Valoarea st (vt ) min st (vi ) se numete raza interioar a


*

vi V

grafului G.
60 | P a g e

Def.

Vrful v0* pentru care are loc relaia s(v0 ) min s(vi ) se
*

vi V

numete centru al grafului neorientat G.

6.3 P-centre
Vom porni de la o situaie frecvent ntlnit. Fie c ntr-un ora
sunt amplasate mai multe (P) centre de asisten medical urgent, cu
echipe mobile de medici. n cazul recepionrii unei cereri de asisten
la centrul comun de apel, ctre solicitant se deplaseaz echipajul de
medici de la cel mai apropiat centru de asisten.
n acest caz amplasarea iniial a celor P centre de asisten
medical urgent este organizat ntr-un mod, care asigur minimul de
ateptare a pacientului, indiferent de locaia acestuia.

Fie V p o submulime din V . Vp p . Prin d Vp , vi se va nota


distana de la cel mai apropiat vrf din V p pn la vrful vi :

d Vp , vi min d v j , vi .
v j V p

La fel, prin d vi ,Vp se va nota distana de la vrful vi pn la

cel mai apropiat vrf din V p : d vi ,Vp min d vi , v j .


v j V p

Indicii de separare pentru mulimea V p se calculeaz la fel ca i pentru


vrfurile solitare:

s0 (V p ) max d V p , v j
v j V

st (V p ) max d v j , V p
v j V

61 | P a g e

Def.

Mulimea

de

vrfuri

V p*,0

pentru

care

are

loc

relaia

s0 (Vp*,0 ) min s0 (Vp ) se numete p-centru exterior al grafului G.


V p G

Mulimea

de

vrfuri

V p*,t

pentru

care

are

loc

relaia

st (Vp*,t ) min st (Vp ) se numete p-centru interior al grafului G.


V p G

Def.

*
Valoarea s0 (Vp ,0 ) min s0 (Vp ) se numete p-raza exterioar a
V p G

*
grafului G. Valoarea st (Vp ,t ) min st (Vp ) se numete p-raza
V p G

interioar a grafului G.

Algoritmul euristic pentru determinarea p-centrelor


Algoritmul face parte din clasa algoritmilor de optimizare local,
care se bazeaz pe ideea optimizrii pe grafuri.
Fie graful neorientat G (V , E ) . O mulime de vrfuri S V ,

S p se numete optim p pentru problema Q, dac nlocuirea


oricror vrfuri din S cu vrfuri din V S nu va mbunti
soluia problemei Q, obinut pe mulimea S . Algoritmul descris este
unul general i poate fi folosit pentru diverse probleme formulate pe
grafuri.
Iniial n calitate de soluie este selectat o mulime arbitrar de
vrfuri C, care aproximeaz p centrul. Apoi se verific, dac un careva
vrf v j V C poate nlocui vrful vi C . Pentru aceasta se formeaz

mulimea C C v j vi dup care se compar s(C ) i s(C ) .


Ulterior C este cercetat n acelai mod , pentru a obine C . Procesul
se repet pn la obinerea unei mulimi C , pentru care nu mai pot fi
efectuate mbuntiri prin procedeul descris. Mulimea de vrfuri C
este considerat p-centrul cutat.

62 | P a g e

Pseudocod
Pas 0. Se formeaz matricea distanelor minime (algoritmul Floyd).
Pas 1. Se alege n calitate de aproximare iniial a p-centrului o
mulime arbitrar de vrfuri C. Vrfurile v j V C vor fi
considerate avnd marcajul strii egal cu 0 (neverificate).
Pas 2. Se alege un vrf arbitrar de stare 0 v j V C i pentru fiecare
vrf vi C se calculeaz valorile i , j s(C ) s(C {vi } {v j }) .
Pas 3. Se determin i0 , j max i , j .
vi C

i.

Dac i0 , j 0 vrful v j este marcat verificat (i se aplic


marcajul de stare - 1) i se revine la pasul 2.

ii.

Dac i0 , j 0 , C C {vi } {v j } vrful v j este marcat


verificat (i se aplic marcajul de stare - 1) i se revine la
pasul 2.

Pas 4. Paii 2 3 se repet att timp ct exist vrfuri cu marcaj de


stare 0. Dac la ultima repetare a pailor 2 3 nu au fost
efectuate nlocuiri (3.ii) se trece la pasul 5. n caz contrar
tuturor vrfurilor din V C li se atribuie marcajul de stare 0,
apoi se revine la pasul 2.
Pas 5. STOP. Mulimea de vrfuri curent C este o aproximare a pcentrului cutat.

63 | P a g e

6.4

Probleme rezolvate

Megacoli8
Enun Pe insula Tortuga sunt N localiti(numerotate de la 1 la N).
Guvernatorul insulei, fostul corsar Ion Vrabie, a hotrt s construiasc
dou megacoli moderne, la care vor merge copii din toate localitile.
Copiii din fiecare localitate urmeaz s mearg la cea mai apropiat
dintre megacoli.
Guvernatorul dorete s selecteze localitile n care vor fi
construite megacolile astfel, nct timpul necesar pentru a ajunge la
megacoal din cea mai ndeprtat localitate s fie ct mai mic posibil.
Funcionarii au ntocmit o hart a insulei, pe care sunt indicate
localitile i segmentele de drumuri care unesc unele perechi de
localiti. Pentru fiecare segment de drum care unete dou localiti
este cunoscut timpul necesar pentru ca copiii s ajung dintr-o
localitate n cealalt. Pentru oricare dou localiti de pe insul exist
cel puin o secven de segmente de drum, care le unete.
Note:
a. un segment de drum ncepe la ieirea dintr-o localitate i se termin
la intrarea n alta. El nu trece prin careva localiti intermediare.
b. Pentru a asigura securitatea copiilor, interseciile segmentelor de
drum sunt denivelate nu poi trece de pe un segment de drum pe
altul n afara localitilor.
c. Timpul de deplasare n interiorul localitii se neglijeaz (se
consider 0)
d. Timpul de deplasare pe o secven de segmente de drum este egal cu
suma timpilor de deplasare pe fiecare segment de drum, inclus n
secven.

Concursul: Punct Campion, 2011


64 | P a g e

Fiind dat harta drumurilor ntre localitile insulei, i lungimea (n


timp) a fiecrui segment de drum, s se scrie un program care s
determine indicii localitilor, n care se vor construi megacolile.
Input: Fiierul de intrare schl.in conine pe prima linie numrul N. Pe
fiecare dintre urmtoarele N linii se afl cte N numere naturale
separate prin spaii, reprezentnd elementele unui tablou A de
dimensiune N x N.
Elementul A[i,j] al tabloului specific:
A[i,j]0 : exist segmentul de drum, ntre localitile cu indicii i i j.
Timpul de deplasare ntre localiti este A[i,j].
A[i,j]=0, ij : ntre localitile i i j nu exist un segment de drum,
care s le uneasc direct. Drumul din i spre j trece prin careva
localiti intermediare.
A[i,j]=0, i=j: conform notei b., n interiorul localitii timpul de
deplasare e 0.
Output: fiierul de ieire schl.out va conine n prima linie trei
numere, separate prin spaiu indicii localitilor n care vor fi
amplasate megacolile ordonai lexicografic i timpul maxim necesar
pentru a ajunge la coal. Dac exist mai multe posibiliti de alegere
a localitilor, se va indica perechea lexicografic minim.
Restricii 2N100, 0A[i,j]32000.
Exemplu:
school.in
4
0 3 4 2
3 0 2 5
4 2 0 3
2 5 3 0

school.out
1 2 2

Explicaii

(1,2) din localitatea 3 pleaca in 2 (timpul 2), din localitatea 4 n 1 (timpul


2). Maxim din (2,2)=2.
Acelai rezultat se obine pentru (1,3) i (3,4), dar soluiile sunt lexicografic
mai mari.
Pentru perechile (1,4) (2,3) (2,4) se obine timpul minim 3.

Rezolvare
Problema se rezolv n dou etape.
1. Determinarea timpului minim, necesar pentru a ajunge din
localitatea cu indicele i n localitatea cu indicele j (pentru toi i,j de la 1
la N.)
65 | P a g e

Se rezolv prin aplicarea algoritmului Floyd asupra matricei de


adiacen a grafului, vrfurile cruia reprezint localitile, iar
muchiile drumurile ntre localiti.
2. Este dat matricea cu timpii minimi necesari pentru deplasarea ntre
orice dou localiti. Se cere s se determine 2 loaliti, care
minimizeaz cel mai mare timp de deplasare pn la ele.
Este problema clasic a 2-centrului pe un graf neorientat. 2centrul se determin prin selectarea consecutiv a celei mai bune
soluii din mulimea tuturor perechilor de vrfuri (i,j). i de la 1 la
N-1, ,j de la i+1 la N.

Implementare (C)
#include <stdio.h>
#include <stdlib.h>
int n,i,j,l,k,p=0,a[101][101],b[101],c[101],bestsol,
currentsol;
struct pereche{int v1;int v2;} best, current;
FILE *f, *g;
int tipar()
{ int i,j;
for (i=1; i<=n; i++)
{
for (j=1;j<=n; j++)
printf("%5d", a[i][j]);
printf("\n"); }
return 0; }
int readdata()
{ int i,j;
f=fopen("00-schl.in", "r");
fscanf(f, "%d", &n);
for (i=1;i<=n;i++)
for (j=1;j<=n; j++)
fscanf(f, "%d", &a[i][j]);
fclose(f);
return 0; }
int floyd()
{ int i,j,k;
// modelare infinit
for (i=1;i<=n;i++)
for (j=i+1; j<=n; j++) p+=a[i][j];
p++;
// matrice cost
66 | P a g e

for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
if (a[i][j]==0 && i != j) a[i][j]=p;
// floyd
for (k=1;k<=n;k++)
for (i=1;i<=n;i++)
if (i!=k && a[i][k]!=p)
for (j=1;j<=n;j++)
if (j!=k && a[k][j] !=p)
if (a[i][j]>a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j];
return 0;
}
int min(int x, int y)
{if (x<y) return x; else return y; }
int main()
{ readdata();
floyd();
tipar();
g=fopen("00-schl.cor", "w+");
bestsol=p;
for (i=1;i<n;i++)
for (j=i+1;j<=n;j++)
{ current.v1=i; current.v2=j;
for (k=1;k<=n;k++)
{
for (l=1;l<=n;l++)
b[l]=min(a[l][i],a[l][j]);
c[k]=0;
for (l=1;l<=n;l++) if (c[k]<b[l]) c[k]=b[l];
}
currentsol=c[1];
for (l=1;l<=n;l++)
if (c[l]<currentsol) currentsol=c[l];
if (bestsol>currentsol)
{bestsol=currentsol; best=current;}
}
fprintf(g, "%d %d %d\n", best.v1, best.v2, bestsol);
fclose(g);
return 0;
}

67 | P a g e

Exerciii:

Des. 6.2.

1. Determinai vrfurile centru pentru grafurile de pe desenul 6.2.


2. Elaborai un program pentru determinarea centrelor relative
exterioare i interioare ale unui graf orientat, descris prin
matricea sa de adiacen( |V| < 50).
3. Elaborai un program pentru determinarea centrelor relative ale
unui graf neorientat (|V| < 50).
4. Determinai 2-centrul pentru grafurile de pe desenul 6.2.

68 | P a g e

Capitolul 7. Mediane
n acest capitol:

Mediane n graf
Mediane interioare i exterioare
Algoritmi exaci pentru determinarea medianei

7.1 Mediane
Mai multe probleme de amplasare a punctelor de deservire presupun minimizarea sumei distanelor de la o serie de puncte terminale
pn la un punct central (de colectare, comutare, depozite etc.)
Punctele care corespund soluiei optime ale problemei se numesc
puncte mediane ale grafului.
Fie graful G (V , E ) . Pentru fiecare vrf vi se definesc dou
valori, care se numesc indici de transmitere:

0 (vi )
t (vi )

d v , v

v j V

d v , v

v j V

Aici d (vi , v j ) distana minim dintre vrfurile v j i vi . Valorile

0 vi i t vi se numesc indice interior i exterior de transmitere a


vrfului vi . Indicii de transmitere pot fi calculai din matricea
distanelor D(G): 0 vi ca suma elementelor din linia i a matricei D,
iar t vi ca suma elementelor din coloana i.
Def.

Vrful

v0

pentru care

0 v0 min 0 vi
vi V

median exterioar a grafului G. Vrful

vt

se numete
pentru care

t vt min t vi se numete median interioar.


vi V

69 | P a g e

v2

v3

v4

v5

v6

v7

v8

v1

15

v2

22

v3

16

v4

15

v5

10

v6

18

v7

21

v8

20

15

15

14

19

21

12

16

v1

25

Exemplu: Fie graful din desenul ce urmeaz:

Pentru exemplul prezentat mediana exterioar este vrful v5 cu


indicele de transmitere 10, mediana interioar vrful v8 cu indicele de
transmitere 12.
Algoritmul general pentru determinarea medianelor presupune
calculul distanelor minime ntre vrfurile grafului, ulterior calcularea
sumelor elementelor matricei pe linii (coloane) i selectarea minimului
din sumele calculate (minimul sumelor pe linii pentru mediana
exterioar, pe coloane pentru mediana interioar ).

7.3 P-mediane
Noiunea de p-median se introduce prin analogie cu noiunea de
p-centru.

Fie V p o submulime din V . Vp p . Prin d Vp , vi se va nota


distana de la cel mai apropiat vrf din V p pn la vrful vi :
70 | P a g e

d Vp , vi min d v j , vi

(*)

v j Vp

La fel, prin d vi ,Vp se va nota distana de la vrful vi pn la

cel mai apropiat vrf din V p : d vi ,Vp min d vi , v j


v j V p

(**)

Dac vj este vrful din V p , pentru care se obine valoarea minim a (*)
sau (**), se spune c vi este arondat la vj .
Indicii de transmitere pentru mulimea V p se calculeaz la fel ca i
pentru vrfurile solitare:

0 (Vp )
Def.

Mulimea

d V , v ,

v j V

de

vrfuri

V p ,0

t (Vp )

d v ,V

v j V

pentru

care

are

loc

relaia

0 (Vp ,0 ) min 0 (Vp ) se numete p-median exterioar a


V p V

grafului G. Mulimea de vrfuri V p ,t pentru care are loc relaia

t (Vp ,t ) min t (Vp ) se


V p V

numete

p-median

interioar

grafului G.
Pentru un graf neorientat p-mediana exterioar i cea interioar
coincid, prin urmare se cerceteaz doar noiunea de p-median, ca
mulime de vrfuri, care minimizeaz suma distanelor pn la toate
celelalte vrfuri ale grafului.

7.4 Algoritmi pentru determinarea p-medianei


Algoritmul direct
Algoritmul direct presupune generarea tuturor submulimilor
din p vrfuri ale grafului G i selectarea mulimii V p pentru care

(Vp ) min (Vp ) . O asemenea abordare presupune cercetarea a Cnp


V p V

mulimi, ceea ce necesit resurse exponeniale de timp pentru valori


71 | P a g e

mari ale n sau valori ale p apropiate de n/2. n particular, pentru valori
ale lui n, p, ce nu depesc 20, poate fi folosit un algoritm clasic de
generare a submulimilor unei mulimi, descris n [9, p. 32]. O
modificare elementar va permite generarea doar a mulimilor din p
elemente, ceea ca va reduce considerabil timpul de lucru al
algoritmului. O alt component a soluiei este calcularea matricei D a
distanelor minime, care va servi n calitate de surs de date pentru
determinarea p-medianei.

Algoritmul euristic
Pentru valori mari ale lui n i p poate fi folosit un algoritm
euristic, similar algoritmului pentru determinarea p-centrului.
Pas 0. Se formeaz matricea distanelor minime (algoritmul Floyd).
Pas 1. Se alege n calitate de aproximare iniial a p-medianei o
mulime arbitrar de vrfuri C. Vrfurile v j V C vor fi
considerate avnd marcajul strii egal cu 0 (neverificate).
Pas 2. Se alege un vrf arbitrar de stare 0 v j V C i pentru fiecare
vrf vi C se calculeaz valorile i , j (C ) (C {vi } {v j })
Pas 3. Se determin i0 , j max i , j .
vi C

i.

Dac i0 , j 0 vrful

v j este marcat verificat (i se aplic

marcajul de stare - 1) i se revine la pasul 2.


ii.

Dac i0 , j 0 , C C {vi } {v j }

vrful

v j este marcat

verificat (i se aplic marcajul de stare - 1) i se revine la pasul


2.
Pas 4. Paii 2 3 se repet att timp ct exist vrfuri cu marcaj de
stare 0. Dac la ultima repetare a pailor 2 3 nu au fost
efectuate nlocuiri (3.ii) se trece la pasul 5. n caz contrar
tuturor vrfurilor din V
apoi se revine la pasul 2.

72 | P a g e

C li se atribuie marcajul de stare 0,

Pas 5. STOP. Mulimea de vrfuri curent C este o aproximare a pmedianei cutate.

Implementare
Input: Graful

G : matricea de adiacen d, ulterior matricea

distanelor; vectorul p-medianei pmed, vectorul stare st.


Output: O p-median posibil a G , n vectorul pmed.
int tipar()
{// afieaz mediana curent }
int calcmed()
{ // calculeaz valoarea p-medianei curente }
int main()
{ // citire date
// modelare valoare infinit - p
// algoritmul Floyd. D matricea distanelor
// initializare p-mediana
for(i=1;i<=n; i++) st[i]=0;
for(i=1;i<=pmed; i++) {st[i]=2; med[i]=i;}
do {
for (i=1;i<=n; i++) if (st[i]==1) st[i]=0;
// reinitializare stare varfuri
for (i=1;i<=n;i++)
if (st[i]==0)
{delta=0; sumtot=calcmed();
for (j=1;j<=pmed; j++)
{ tmp=med[j]; med[j]=i;
st[i]=2; st[tmp]=0; // i se introduce in poz j
medcurent=calcmed();
if (delta<sumtot - medcurent)
{delta=sumtot-medcurent; sw1=j;sw2=i;}
// micsorare indice de transmtere
med[j]=tmp; st[tmp]=2; // restabilire j
}
if (delta>0 ) // a fost detectata o mbuntire
{ tmp=med[sw1]; med[sw1]=sw2;
st[tmp]=1; st[sw2]=2;}
// inlocuire
else st[i]=1;
73 | P a g e

}
} while (delta>0);
tipar(); printf(" %d ", calcmed());
return 0; }

7.5 Probleme rezolvate


Fabrica9
Enun: Pe insula Tortuga sunt N localiti (numerotate de la 1 la N).
Guvernatorul insulei, fostul corsar Ion Vrabie, a hotrt s construiasc
o fabric modern de prelucrare a laptelui, care va prelucra materia
prim colectat din toate localitile. Colectarea este efectuat cu o
autospecial, care face cte o curs separat pentru fiecare localitate.
Localitatea n care va fi construit fabrica se va selecta astfel, nct
distana parcurs de autospecial pentru a colecta laptele din toate
localitile fie ct mai mic posibil.
Fiind date distanele ntre toate localitile insulei, s se scrie un
program care s determine indiciele localitii, n care se va construi
fabrica de prelucrare a laptelui.
Input Fiierul de intrare fabrik.in conine pe prima linie numrul N. Pe
fiecare dintre urmtoarele n linii se afl cte n numere naturale
separate prin cte un spaiu, reprezentnd elementele unui tablou A de
dimensiune N x N. Elementul A[i,j] indic distana dintre localitile cu
indicii i i j.
Output fiierul de ieire fabrik.out va conine n prima linie un numr
natural indiciele localitii n care va fi amplasat fabrica. Dac exist
mai multe posibiliti de alegere a localitii, se va indica cea cu indicele
minim.
Restricii 2 < N < 50, Elementele matricei numere naturale 32000.
9

Concursul zonal ntre colegii, zona Centru-Sud, 2012


74 | P a g e

Exemplu:
x.in

X.out

4
0
3
4
2

1
3
0
2
5

4
2
0
3

2
5
3
0

Explicaii
Pentru vrful 1 distana total este 18
Pentru vrful 2 distana total este 20
Pentru vrful 3 distana total este 18
Pentru vrful 4 distana total este 20
Distana total minim este 18, se obine pentru localitile 1 i 3. Indicele
minim 1.

Rezolvare:
Este o problem-tip, unde se cere s se determine mediana ntr-un graf
neorientat. Datele iniiale corespund matricei distanelor n graful, care
descrie schema de comunicaii ntre toate localitile. Astfel, rmne
doar de calculat sumele elementelor din fiecare linie a tabelului, dup
care s se determine suma minim i indicele primei linii, n care
aceasta se obine.
Implementare:
#include <stdio.h>
#include <stdlib.h>
int n,i,j,a[101][101],b[101], bestsol;
FILE *f, *g;
int readdata()
{ int i,j;
f=fopen("fabrik.in", "r");
fscanf(f, "%d", &n);
for (i=1;i<=n;i++)
for (j=1;j<=n; j++)
fscanf(f, "%d", &a[i][j]);
fclose(f);
return 0;
}
int main()
{
readdata();
75 | P a g e

g=fopen("fabrik.out", "w+");
for (i=1;i<=n;i++)
{ b[i]=a[i][1];
for (j=2;j<=n;j++)
b[i]+=a[i][j];
}
bestsol=1;
for (i=2;i<=n;i++) if (b[i]<b[bestsol]) bestsol=i;
fprintf(g, "%d %d", bestsol, b[bestsol]*2);
fclose(g);
}

Exerciii:

Des 7.1

1. Determinai medianele pentru grafurile de pe desenul 7.1.


2. Elaborai

un

program

pentru

determinarea

interioare i exterioare ale unui graf G (V , E ),

medianelor

V 200 .

3. Determinai 2-medianele pentru grafurile de pe desenul 7.2.


4. Elaborai un program pentru determinarea exact a 2medianelor
interioare
i
exterioare
ale
unui
graf

G (V , E ),

V 20 .

5. Elaborai un program pentru determinarea exact a pmedianelor ale unui graf G (V , E ),

76 | P a g e

V 20 .

6. Elaborai un program pentru determinarea aproximativ,


folosind algoritmul euristic ( 1) , a p-medianelor ale unui graf

G (V , E ),

V 100 .

7. Elaborai un program pentru determinarea aproximativ,


folosind algoritmul euristic ( 2) , a p-medianelor ale unui graf

G (V , E ),

V 100 .

77 | P a g e

Capitolul 8. Arbori
n acest capitol:

Definiii ale arborilor


Generarea tuturor arborilor pariali ai unui graf
Arbori pariali de cost minim
Algoritmul Kruskal pentru determinarea arborelui de cost minim.
Algoritmul Prim pentru determinarea arborelui de cost minim

8.1 Arbori de acoperire


Carcase
Un graf neorientat
este numit arbore dac este
conex i nu conine cicluri.
G (V , E )
Pentru graful
fiecare

2
1

este

numit carcas sau arbore


parial
de
acoperire
a
grafului G. Muchiile din G,

arbore

G* (V , T ) T E

2
1

4
3

care apar n G sunt numite


*

ramuri, cele din E / T - corzi. Des. 8.1. Graful (stnga sus) i cteva dintre
Numrul carcaselor unui carcasele sale
graf este determinat de
structura acestuia.
Algoritmii de parcurgere a unui graf conex permit i construirea
concomitent a unei carcase. ntr-adevr, proprietatea de conexitate
asigur atingerea fiecrui nod u a grafului pe parcursul lucrului
algoritmului. Pentru nodul u, atins din v, algoritmii de parcurgere nu
78 | P a g e

mai permit atingerea repetat din alt nod. Prin urmare, apariia
ciclurilor n procesul parcurgerii este imposibil.
Urmtoarea modificare a funciei DFS, studiat n capitolele
precedente, afieaz lista muchiilor pentru carcasa ce corespunde
parcurgerii n adncime a grafului:
int DFS (int s)
{ int i;
b[s]=1;
for(i=1;i<=n;i++)
if(a[s][i] !=0 && b[i]==0)
{printf("\n %d - %d", s, i); DFS(i);}
return 0;
}

Generarea tuturor carcaselor unui graf


Mai multe probleme impun necesitatea de a genera nu doar o
carcas a grafului dat, ci toate carcasele posibile. De exemplu, trebuie
s fie selectat cea mai bun carcas dup un criteriu complex, care
nu permite aplicarea unor optimizri directe. n alte situaii, generarea
tuturor subarborilor n calitate de subproblem permite reducerea
complexitii la rezolvarea unor probleme de calcul economic.
Numrul posibil de carcase ale unui graf variaz n dependen
de numrul de muchii n graful iniial, dar i de structura conexiunilor.
Pentru un graf complet cu n vrfuri, de exemplu, numrul calculat al
n2
carcaselor este egal cu n . Prin urmare, problema generrii tuturor

carcaselor este una de complexitate exponenial (n caz general) .


Respectiv, algoritmul pentru generarea acestora va avea la origine
tehnica relurii. O posibil structur a algoritmului a fost dat de
Kristofides. Totui, algoritmul propus n [6, p. 154] este unul iterativ,
ceea ce face mai complicat implementarea lui. n cele ce urmeaz se
propune un algoritm recursiv, care formeaz carcasele n baza listei de
muchii ale grafului G.

79 | P a g e

Preprocesare: fie G (V , E ) . Se formeaz lista de muchii e1 , e2 ,..., em


ale grafului G.
Funcia recursiv CARCASE(k,c)
Pas A.
(i)

ik.
Muchia curent ei (v, v) . Pe graful T se lanseaz funcia

(ii)

modificat de cutare n adncime DFS (v, v) , pentru a


determina existena unei ci ntre v i v .
Dac funcia returneaz 1 (n T exist o cale ntre v i v )
STOP .
n caz contrar funcia returneaz 0 (nu exist o cale
ntre v i v )

(iii)

T T

ei , c c 1

Dac c n 1 ,se afieaz carcasa construit T, apoi se


trece la pasul 4.
n caz contrar pentru toi i de la k 1 la m CARCASE(i,c).
Pas B.
Excludere muchie T T ei c c 1
Sfrit funcie carcase.
n funcie se genereaz toate

carcasele, care

ncep

de

la muchia ek .

Algoritm
Pas 1.

k 0.

Pas 2

Indicele muchiei de la care continu construcia carcasei


k k 1 .
Se formeaz un graf T din vrfurile izolate ale lui G: T (V , )
Numrul

80 | P a g e

de

muchii

carcas

c 0.

Pas 3. CARCASE(k,0).
Pas 4

dac k m n 1 se revine la pasul 2, altfel STOP toate


carcasele au fost generate.

Implementare
Input: Graful G : matricea de adiacen a; lista de muchii v.
Output: Arborii pariali a grafului G , generai consecutiv n tabloul
arb.
int tipar()
{ .. //afieaz soluia curent matricea de adiacen a
arborelui parial}
int scoatemuchie(int ind)
{ // exclude muchia cu
construcie}
int punemuchie(int ind)
{ // include muchia
construcie}

cu

indicele

indicele

ind

ind

din

arborele

arborele

int DFS (int s,int tt)


{ // verific prezena unui drum ntre vrfurile s i tt}
int ciclu(int im)
{ // verific apariia unui ciclu la adugarea muchiei cu
indicele im }
int back(int indicemuchie, int numarmuchii)
{ int i;
if (ciclu(indicemuchie)) return 0;
else
{ punemuchie(indicemuchie);// se adaug muchia
numarmuchii++;
if (numarmuchii==n-1) // e detectat o soluie
{tipar(); scoatemuchie(indicemuchie); numarmuchii--;
return 0;}
else
{for (i=indicemuchie+1;i<=k;i++) back(i,numarmuchii);
81 | P a g e

// se adaug urmtoarele muchii


scoatemuchie(indicemuchie);numarmuchii--; return 0;
// se exclude muchia la pasul de ntoarcere
}
}
}
int main()
{ // citire date
// formarea lista muchii
for (i=1;i<=n;i++)
for (j=i+1; j<=n; j++)
if (a[i][j]==1) {k++; ed[k].vi=i; ed[k].vj=j;}
// cutare carcase
for (i=1;i<=k-n+1;i++)
back(i,0);
return 0; }

8.2 Arbori de acoperire de cost minim


Dup cum s-a menionat i n capitolele precedente, mai multe
probleme formulate pe grafuri presupun existena unei caracteristici
suplimentare, atribuite muchiilor grafului ponderea. Pentru muchia

(v, u ) ponderea se noteaz cv ,u . De


obicei, ponderea are o expresie
numeric, care indic distana
dintre noduri, capacitatea sau
timpul de transfer de-a lungul
muchiei etc.
Pentru stocarea ponderilor
muchiilor nu sunt necesare
modificri eseniale n structurile
de date utilizate pentru descrierea
grafurilor:
n
matricele
de
inciden sau adiacen valorile
unitare ce corespund muchiilor
sunt
nlocuite
prin
valorile
ponderilor (desenul 8.2); n listele
de muchii i de inciden fiecare
82 | P a g e

6
5

10

15

0
0

10

6
0

0
15

0 10
0 4
4 0
0 0
0
0
5
9

1
6

20

10

6 0
0 0
0 0
0 20

0 20 0
8 5 0
0 0 10
0 0 6

0 15 0
0 5 9
8 0 0

5 0 0
0 10 6

0 0 0
0 0 0

0 0 0

Des. 8.2. Graf ponderat i matricea lui


de adiacen

pereche (element) este suplinit de o component ce conine valoarea


ponderii.
Prin cost al arborelui G* (V , T ) se va nelege suma ponderilor
muchiilor, care l formeaz.

S (G* )

( v ,u )T

cv ,u

Pentru grafurile neponderate toi arborii de acoperire au acelai


cost. n cazul prezenei ponderilor n graf apare i problema selectrii
unui arbore de acoperire de cost minim. Exist mai muli algoritmi
eficieni pentru determi-narea arborelui de acoperire de cost minim, cei
mai cunoscui fiind:

Algoritmul Kruskal
Fie G (V , E ) un graf ponderat cu n vrfuri. Algoritmul Kruskal
folosete tehnica greedy i presupune crearea unui graf G* (V , T ) , n
care iniial T . Ulterior, muchiile din G se sorteaz dup creterea
ponderilor. La urmtoarea etap se efectueaz adugarea consecutiv
*
n G a muchiilor din irul sortat, cu condiia c la adugarea muchiei

n G nu se formeaz un ciclu. Lucrul algoritmului se sfrete cnd


numrul de muchii adugate devine n-1.
*

Pseudocod:
Pas 1. Se construiete G* (V , T ) , T .
Pas 2. Muchiile din G (V , E ) se sorteaz n ordinea creterii
ponderilor. Se obine irul m1 ,..., m E .
Pas 3.

k 0, i 1 .

Pas 4. While k V 1 do
*
a) if T mi nu formeaz un ciclu n G , then

T T mi , k ;
b)

i.
83 | P a g e

Implementare:
Input: Graful G : matricea de adiacen a; liata de muchii v; arborele
parial de cost minim arb, tabloul componentelor conexe c.
Output: Un arbore parial de cost minim a G , n tabloul arb.
int sort ()
{ // functia de sortare a listei de muchii }
int readdata()
{ // functa de citire a datelor initiale }
int printv()
{ // functia de tipar a rezultatelor}
int makeedgelist()
{ // functia pentru crearea listei de muchii }
int main(int argc, char *argv[])
{ int j,i,r;
readdata();
makeedgelist();
sort();
for (i=1;i<=n;i++) c[i]=i; // initializare componente conexe
i=0;
while(k<n-1)
{ i++;
if (c[v[i].vi] != c[v[i].vj])
// verificare posibilitate adaugare muchie
{k++; arb[k]=v[i];
for(j=1;j<=n;j++)
if (c[j] == c[v[i].vj] ) c[j]=c[v[i].vi];
}
}
printv(); // afisare rezultate
return 0;
}

Algoritmul Prim
Spre deosebire de algoritmul Kruskal, algoritmul Prim
genereaz arborele parial de cost minim prin extinderea unui singur
84 | P a g e

subgraf Ts , care iniial este format dintr-un vrf. Subarborele Ts se


extinde prin adugarea consecutiv a muchiilor (vi , v j ) , astfel nct

vi Ts , v j Ts ) , iar ponderea muchiei adugate s fie minim posibil.


Procesul continu pn la obinerea unui numr de n 1 muchii n Ts .

Pseudocod
Pas 1.

Se construiete G* (V , T ) , T .

Pas 2.

Muchiile din G (V , E ) se sorteaz n ordinea creterii


ponderilor. Se obine irul m1 ,..., m E . Toate muchiile se

Pas 3.

consider nefolosite.
k 0.

Pas 4.

Ct timp k V 1 :
a)

i 1.

b)

Dac muchia mi (v, v) este nefolosit i

v Ts & v Ts ) sau v Ts & v Ts ) , atunci mi se


adaug la Ts , mi se consider folosit i k , dup care
se revine la nceputul pasului 4. n caz contrar i i se
repet pas 4.b.

Implementare
Input: Graful G : matricea de adiacen a; lista de muchii v; arborele
parial de cost minim arb, tabloul c de stare a nodurilor (se folosete
pentru a modela starea muchiilor).
Output: Un arbore parial de cost minim a G , n tabloul arb.
int sort ()
{ // functia de sortare a listei de muchii }
int readdata()
{ // functa de citire a datelor initiale }
int printv()
85 | P a g e

{ // functia de tipar a reyultatelor}


int makeedgelist()
{ // functia pentru crearea listei de muchii }
int main(int argc, char *argv[])
{ int j,i;
readdata();
makeedgelist();
sort();
for (i=1;i<=n;i++) c[i]=0;
c[v[1].vi]=c[v[1].vj]=1; k=1;
arb[1]=v[1];
while(k<n-1) // cat arboreal nu e construit
{ i=1;
while (c[v[i].vi]+ c[v[i].vj] != 1 ) i++;
// se gaseste cea mai scurta muchie care poate fi adaugata
k++; arb[k]=v[i]; // se adauga muchia
c[v[i].vj]=c[v[i].vi]=1; // se modifica starea nodurilor
muchiei adaugate
}
printv();
return 0;
}

8.3 Probleme rezolvate


Reele
Se consider n calculatoare C1, C2, ,..., Cn ce trebuie reunite ntr-o
reea. ntr-o astfel de reea oricare dou calculatoare distincte Ci, Cj pot
comunica fie printr-o conexiune direct, dac exist, fie prin intermediul
altor calculatoare, legate ntre ele (Fig. 1). Conexiunile reelei se vor
realiza prin cablu. Din considerente tehnologice, cablul ce leag oricare
dou calculatoare nu poate avea ramificaii.
Elaborai un program care determin lungimea minimal Lmin a
cablului, necesar pentru realizarea reelei. Poziia fiecrui calculator Ci,
i=1,2,,n, este definit cu ajutorul coordonatelor carteziene xi, yi.
86 | P a g e

C1
C3

C2
C4
C5
C6
x

Fig. 1

Input: Fiierul text RETELE.IN conine pe prima linie numrul


natural n. Fiecare din urmtoarele n linii ale fiierului de intrare
conine cte dou numere reale separate prin spaiu. Linia i+1 a
fiierului de intrare conine coordonatele xi, yi ale calculatorului Ci.
Output: Fiierul text RETELE.OUT va conine pe o singur linie
numrul real Lmin scris fr specificatori de format.
Exemplu.
RETELE.IN
6
3 8
6 7.8
1.5 7
5 5
8 3
4.5 2

RETELE.OUT
1.442958120348338E+001

Restricii. 2 n 200; -10000 xi, yi 10000. Timpul de execuie nu


va depi o secund. Fiierul surs va avea denumirea RETELE.PAS,
RETELE.C sau RETELE.CPP.
Rezolvare
Reeaua ce necesit o cantitate minimal de cablu poate fi
construit cu ajutorul algoritmului lui Prim:
1.
Iniial mulimea B a calculatoarelor reunite n reea
conine doar calculatorul C1.
87 | P a g e

2.

n continuare, la fiecare pas al algoritmului:


a)
calculm distanele dintre calculatoarele din
mulimea B i calculatoarele rmase;
b)
includem n mulimea B calculatorul care se
afl la cea mai mic distan.
3.
Punctul 2 se repet pn ce toate calculatoarele vor fi
incluse n mulimea B.
Amintim c distana Dij dintre calculatoarele Ci, Cj se calculeaz
conform relaiei:

Dij ( xi x j ) 2 ( yi y j ) 2 .
Program Retele;
{ Clasele 7-9 }
var X, Y : array[1..200] of Real;
Total : Real;
n : Integer;
procedure Citire;
var f : Text;
var i : Integer;
begin
Assign(f,'RETELE.IN');
Reset(f);
readln(f, n);
for i:=1 to n do Readln(f, X[i], Y[i]);
Close(f);
end;
Procedure Scriere;
var f : Text;
begin
Assign(f, 'RETELE.OUT');
rewrite(f);
Writeln(f, Total);
close(f);
end;
function Dist(i, j : Integer) : Real;
begin
Dist:=sqrt(sqr(X[i]-X[j])+sqr(Y[i]-Y[j]));
end;
88 | P a g e

function Min(a, b : Real) : Real;


begin
if a<b then Min:=a else Min:=b;
end;
procedure Prim;
var i, j : Integer;
B : array[1..200] of Boolean;
{ B[k] indica daca calculatorul k a fost inclus deja in
retea }
D : array[1..200] of Real;
{ D[k] reprezinta distanta de la calculatorul k la retea
}
pmin : Integer;
k : Integer;
begin
B[1]:=true;
for i:=2 to n do B[i]:=false;
for i:=2 to n do
begin D[i]:=Dist(1, i); end;
for k:=2 to n do
begin
pmin:=0;
{ gaseste cel calculatorul cel mai apropiat de retea, }
{ dare care inca nu a fost inclus in ea }
for i:=1 to n do
begin
if B[i] then continue;
if pmin=0 then pmin:=i
else if D[pmin]>D[i] then pmin:=i;
end;
{ adauga calculatorul cu indicele pmin la retea }
Total := Total + D[pmin];
B[pmin]:=true;
{ actualizarea distantele de la restul calculatoarelor
la retea }
for i:=1 to n do
begin
if B[i] then continue;
D[i]:=min(D[i], Dist(i, pmin));
end;
end;
end; { Prim }

89 | P a g e

begin
Citire;
Prim;
Scriere;
end.

Din analiza textului programului prezentat mai sus se observ, c


complexitatea temporar a algoritmului respectiv este de ordinul
O(n2). Prin urmare, n cazul restriciilor din enunul problemei,
timpul de calcul nu va depi o secund.

90 | P a g e

Exerciii

Des. 8.3

1. Determinai arborii pariali de cost minim pentru grafurile de pe


desenul 8.3.
2. Elaborai un program pentru determinarea tuturor carcaselor
unui graf G (V , E ),

V 20 .

3. Folosind algoritmul Kruskal, elaborai un program pentru


determinarea arborelui parial de cost minim a unui graf

G (V , E ),

V 20 .().

4. Folosind algoritmul Prim, elaborai un program pentru


determinarea arborelui parial de cost minim a unui graf

G (V , E ),

V 20 .

5. Estimai complexitatea temporal a algoritmului Kruskal.


6. Estimai complexitatea temporal a algoritmului Prim.
7. Estimai complexitatea temporal a algoritmului de generare a
tuturor carcaselor unui graf G (V , E ) .

91 | P a g e

Capitolul 9. Cicluri
n acest capitol:

Numrul ciclomatic al grafului


Mulimea fundamental de cicluri
Problema Euler, Ciclul eulerian
Teorema de existen a ciclului (lanului) eulerian
Algoritmi pentru construirea ciclului (lanului) eulerian
Ciclul i lanul hamiltonian
Algoritmi exaci pentru determinarea ciclului (lanului) hamiltonian

9.1 Numrul ciclomatic i mulimea fundamental de cicluri


Fie dat graful G (V , E ) cu n vrfuri, m muchii i p componente
conexe.
Valoarea (G) n p stabilete numrul total de muchii, n
fiecare din arborii pariali ai grafului G pe toate componentele de
conexitate ale acestuia. n particular, dac graful este conex, numrul
de muchii n oricare arbore parial va fi egal cu n 1 .
Valoarea

v(G) m n p m (G) se

numete

numrul

ciclomatic al grafului G. Valoarea (G) se numete numr cociclomatic.


Caracteristica ciclomatic a grafului stabilete numrul maximal de
cicluri independente10, care pot fi construite concomitent pe graf.
Astfel, dac se construiete un arbore parial T al grafului, apoi
se formeaz cicluri prin adugarea a cte o muchie a grafului, care nu
aparine arborelui T, n final se va obine o mulime de cicluri

C1 , C2 ,..., Cv (G ) , independente ntre ele.

De remarcat c ciclul Ci se

Cicluri independente dac conin cel puin cte o muchie, care aparine
doar unuia din ele
92 | P a g e
10

formeaz prin adugarea unei muchii (v j , vk ) la lanul care unete


vrfurile v j , vk n arborele T.
Fie dat un arbore parial T. Mulimea de cicluri ale grafului G,
fiecare dintre care este format prin adugarea la T a unei muchii din
G / T formeaz mulimea ciclurilor fundamentale, asociate arborelui T.
Oricare dou dintre ciclurile fundamentale sunt independente ntre ele
i orice alt ciclu, care nu face parte din mulimea ciclurilor
fundamentale poate fi reprezentat ca o combinaie liniar a acestora.
Exemplu. Fie dat graful G (V , E ) i unul din arborii lui
pariali T. (desenul 9.1).

a
b
c
Desenul 9.1 Graful G (a), un arbore parial T (b), ciclurile fundamentale (c)

Pentru

graful

G : n 6, m 9, p 1 .

Numrul

ciclomatic

v(G) 9 6 1 4 . Ciclurile fundamentale sunt: C1 , C2 , C3 , C4


De menionat c ciclurile fundamentale se
dependen de arborele parial construit (desenul 9.2)

modific

Desenul 9.2 modificarea mulimii de cicluri fundamentale a grafului din exemplul


precedent la selecia unui alt arbore parial.

93 | P a g e

9.2 Cicluri Euler


Problema podurilor din Knigsberg
Oraul Konigsberg (n prezent, Kaliningrad) este traversat de
rul Pregel. Zonele oraului, situate pe ambele maluri ale rului, dar i
pe dou insule, erau unite prin apte poduri, dup schema din desenul
9.3. n anul 1736 locuitorii oraului i-au trimis celebrului matematician
Euler o scrisoare, rugndu-l s rezolve urmtoarea problem: poate fi
gsit un traseu, care pornind dintr-un punct dat, s parcurg toate cele
apte poduri cte o singur dat i s revin n punctul de pornire?

Des. 9.3 Schema amplasrii podurilor n Konigsberg i graful asociat.

Euler a demonstrat imposibilitatea existenei unui asemenea


traseu, iar demonstraia respectiv a pus nceputul teoriei grafurilor.

Cicluri Euler
Def.

Fie G (V , E ) un graf neorientat. Ciclu eulerian se numete


ciclul care trece pe fiecare muchie a grafului G o singur dat.
Lan eulerian se numete lanul, care trece exact cte o dat pe
fiecare muchie a grafului.

94 | P a g e

Des. 9.4 Graf fr ciclu i lan eulerian (a), cu ciclu eulerian (b), cu lan eulerian (c).

n procesul cercetrii problemei despre podurile din Konigsberg a


fost formulat urmtoarea teorem:
Teorema 1. Un graf conex, neorientat G conine un ciclu (lan) eulerian
atunci i numai atunci cnd numrul vrfurilor de grad impar este 0 (0
sau 2 pentru lan).

Teorema 2. Un graf conex, orientat G conine un ciclu (lan cu


nceputul n p i sfritul n q) eulerian atunci i numai atunci cnd:
(i)

vi V , (vi ) (vi ) - pentru ciclul eulerian

(ii)

vi V , vi p, q (vi ) (vi ) ; ( p) ( p) 1; (q) (q) 1


- pentru lanul eulerian.

9.3 Algoritmul de construcie a ciclului eulerian


Input. Graful G (V , E ) dat prin matricea de adiacen a.
Output: Lista ordonat de parcurgere a vrfurilor L pentru obinerea
lanului eulerian.

95 | P a g e

Pas 0.

L .

Pas 1. Este selectat un vrf arbitrar v0 . L v0 . vrful curent v v0 .


Pas 2. Din vrful v se parcurge o muchie, care nu divizeaz graful n
componente conexe separate. Fie aceasta (v, v) . Muchia (v, v)
se exclude din G. L v v v .
Pas 3. Ct timp n G mai exist muchii se revine la pasul 2.
Pas 4. Se afieaz lista L.

Implementare (cazul lanului Euler)


Input. Graful G (V , E ) dat prin matricea de adiacen a.
Output: Lista ordonat de parcurgere a vrfurilor S pentru obinerea
lanului eulerian
Structuri de date auxiliare: transa - matricea de adiacen a grafului
curent lant - ciclul de cretere curent, d marcajele vrfurilor la
crearea ciiclului
int readdata()
{ // subprogramul de citire a datelor initiale din fisier }
int print( int m)
{ // subprogramul de afisare a lantului curent }
int verif()
// subprogramul de verificare dac graful este unul eulerian
// se stabilesc i vrfurile ntre care se va construi lanul
{ int i,j, k;
for (i=1;i<=n;i++)
{
k=0;
for (j=1;j<=n; j++)
if (a[i][j] !=0 ) k++;
if (k%2==1 && s1==0) s1=i; else
if (k%2==1 && s1 !=0 && t==0) t=i; else
if (k%2==1 && s1 !=0 && t!=0) return 0;
}
if (s1==0 && t==0 ) {s1=1; t=2; return 1;}
if (s1 != 0 && t==0 ) {return 0;}
return 1;
}
96 | P a g e

int lan () // subprogramul de construcie a primului lan


{ int i, x;
for (i=1;i<=n;i++) d[i].st=0;
d[s1].st=1; x=s1;
do
{ for(i=1;i<=n;i++)
if(a[x][i] !=0 && d[i].st==0)
{
d[i].st=1; d[i].sursa=x;}
d[x].st=2;
k=1; while (d[k].st !=1) k++;
x=k;
} while (x!=t);
l=1; k=1;
s[l]=lant[k]=t;
while (x !=s1)
{
x=d[x].sursa;
l++; k++;
s[l]=lant[k]=x;
}
return 1;
}
int grad(int x)
// subprogram pentru determinarea gradului vrfului n graf
{ int s=0,i;
for (i=1;i<=n; i++)
if (transa[x][i]!=0) s++;
return s;
}
int exclude_cic()
// subprogram pentru excluderea ciclului curent din graf
{ int i;
transa[s[1]][s[l]]=transa[s[l]][s[1]]=0;
for (i=1;i<l;i++)
transa[s[i]][s[i+1]]= transa[s[i+1]][s[i]]=0;
return 1;
}
int exist()
// verificare a existenei vrfurilor pentru adugare
{ int i;
for (i=1;i<=n;i++) if (grad(i)>0) return i;
return 0;
}
97 | P a g e

int insert(int x) // subprogram pentru inserarea ciclului


curent n lan
{ int i,j, news[???];
for (i=1;i<=x; i++) news[i]=s[i]; i--;
for (j=1;j<=k; j++) news[i+j]=lant[j];j--;
for (i=x+1;i<=l;i++) news[i+j]=s[i];
l+=k;
for (i=1;i<=l;i++) s[i]=news[i];
return 1;
}
int primul()
// determinarea primului vrf de cretere a lanului
{ int i;
for (i=1;i<=l;i++)
if (grad(s[i])>0) {pr=i; return s[i];}
return 0;
}
int ciclu () // determinarea ciclului de cretere a lanului
{ int i, x;
s1=primul();
for (i=1;i<=n;i++) if (transa[s1][i] > 0) {t=i; break;}
for (i=1;i<=n;i++) d[i].st=0;
d[s1].st=1; x=s1;
transa[s1][t]=transa[t][s1]=0;
do
{ for(i=1;i<=n;i++)
if(transa[x][i] !=0 && d[i].st==0)
{
d[i].st=1; d[i].sursa=x;}
d[x].st=2;
k=1; while (d[k].st !=1) k++;
x=k;
} while (x!=t);
k=1; lant[k]=t;
while (x !=s1)
{
x=d[x].sursa;
k++; lant[k]=x;
}
return 1;
}

98 | P a g e

int main()
{ readdata();
if (verif()==0) {printf ("/n Graful nu este eulerian /n ");
return 0;}
lan();
do {
exclude_cic();
if (exist()!=0)
{ ciclu();
insert(pr);
print(l);
}
} while (exist()>0);
return 0;
}

Des. 9.5 Ilustrarea rezultatelor generate de program. Lanul iniial 6-3 (a). Cicluri
de cretere 6-4-3-5-6 (b), 6-7-8-6 (c), 7-1-4-7 (d), 1-2-3-1 (e).

99 | P a g e

9.4 Cicluri i lanuri hamiltoniene


S examinm mai nti o situaie frecvent ntlnit n viaa
real. Mai multe procese industriale presupun prelucrarea unui numr
de piese cu ajutorul unei singure instalaii. Timpul total i cheltuielile
depind doar de numrul operaiilor de calibrare (ajustare, curare etc.)
a instalaiei ntre prelucrarea a oricare dou piese pi , p j . Mai mult,
exist perechi de piese, prelucrarea consecutiv a crora permite
funcionarea continu a instalaiei, fr calibrare. Prin urmare, att
timpul total de prelucrare, ct i cheltuielile pot fi minimizate prin
selectarea unei consecutiviti de prelucrare a pieselor cre va necesita
un numr minim (sau nul) de operaii de calibrare.
Dac reprezentm piesele prelucrate p1 , p2 ,..., pn prin vrfurile
unui graf, iar perechile de piese compatibile ( pi , p j ) prin muchiile
lui, atunci determinarea unui ciclu, care trece exact cte o singur dat
prin fiecare vrf al grafului este echivalent cu determinarea unei
consecutiviti de prelucrare a pieselor care nu necesit nici o operaie
de calibrare. Problema rmne aceeai, indiferent de faptul dac graful
este unul orientat sau nu.
Ciclul, care trece exact cte o dat prin fiecare vrf al grafului se
numete ciclu hamiltonian.
Exist cteva formulri ale problemei, n dependen de tipurile
de grafuri i restricii. n continuare vor fi studiate dou probleme
distincte:
a. Este dat un graf (ne)orientat . Se cere s se determine unul
sau toate ciclurile hamiltoniene, dac acestea exist.
b. Este dat un graf complet cu muchii ponderate (ponderea
muchiei

i, j

ci , j ). Se cere s se determine un ciclu

(lan) hamiltonian de cost minim.

100 | P a g e

Spre deosebire de cazul ciclului eulerian, pentru ciclul


hamiltonian nu exist un criteriu exact de determinare a existenei
acestuia ntr-un graf arbitrar.

9.5 Algoritmul pentru determinarea ciclurilor (lanurilor)


hamiltoniene
Pentru problema determinrii ciclurilor (lanurilor) hamiltoniene
nu exist algoritmi eficieni de complexitate polinomial. Problema este
una din clasa NP [11, p. 378]. Prin urmare, un algoritm recursiv, bazat
pe tehnica relurii reprezint o abordare rezonabil. Iniial, algoritmul
propus de Roberts i Flores [6, p. 249] presupunea abordarea iterativ:

Pseudocod (Roberts-Flores)
Pas 1. Se formeaz tabloul M [mi , j ] de dimensiuni

k n ,

n care

elementul mi , j este cel de al i ulea vrf (fie vq ), pentru care n

G (V , E ) exist arcul v j , vq . Numrul de linii n matrice va


fi determinat de cel mai mare semigrad de ieire a vrfurilor
din G . S mulimea vrfurilor incluse n soluie, n ordinea
parcurgerii lor. S .
Pas 2. Se alege un vrf arbitrar (fie vi ), de la care ncepe construcia
ciclului (lanului). Se include n S S

vi

v vi .

Pas 3. Se alege primul vrf nefolosit din coloana v . Fie acesta v j Se


ncearc adugarea acestuia la S . Exist dou cazuri, cnd un
vrf nu poate fi adugat la mul-imea S :
a. n coloana v nu exist vrfuri nefolosite.
b. Numrul de elemente n S este n . Secvena de vrfuri din S
formeaz un lan hamiltonian. n acest caz, dac exist un arc
(muchie) de la ultimul element din S la primul a fost

101 | P a g e

identificat un ciclu hamiltonian. n caz contrar


lanul hamiltonian.

exist doar

n cazurile (a),(b) se trece la pasul 5, altfel S S

v j i v v j

.
Pas 4. Se repet pasul 3 pn la apariia uneia din situaiile descrise
n 3(a) sau 3(b).
Pas 5. Fie S (v1 , v2 , vk 1 , vk ) . S S vk . Dac S , v vk 1
apoi se trece la pasul 3, altfel STOP toate secvenele posibile
au fost cercetate.

Implementare (recursiv)
Urmtorul program determin lanuriler hamiltoniene. Matricea
de adiacen este stocat n tabloul a, soluiile se formeaz n tabloul s.
Programul permite urmrirea dinamicii construciei lanurilor
hamiltoniene. Tehnica de implementare reluarea.
#include <conio.h>
#include <stdio.h>
int a[30][30], m[30][30], s[30], n,i,j,k,ne;
FILE *f;
int readdata()
{ int i,j;
f=fopen("dataham.in", "r");
fscanf(f, "%d", &n);
for (i=1;i<=n;i++)
for (j=1; j<=n; j++)
fscanf(f, "%d", &a[i][j] );
fclose(f);
return 0;
}
int make_m()
{ int i,j,k;
for (i=1;i<=n;i++)
{ k=0;
for (j=1;j<=n;j++)
if ( a[i][j] != 0)
{ k++;
102 | P a g e

m[k][i]=j;
}
}
}
int print_s(int q)
{ int i;
printf("\n");
for (i=1; i<=q; i++) printf("%d ", s[i]);
getch();
return 0;
}
int exist (int a,int pos)
{ int i,k=0;
for (i=1;i<=pos;i++)
if (s[i] == a) k=1;
return k;
}
int hamilton(int element, int index)
{ int i,j;
if (exist (element, index-1)) return 0;
s[index]=element;
if (index==n) { printf("\n solutie "); print_s(index);
index--; return 0;}
else { index++;
j=1;
do
{ hamilton(m[j][element], index); j++; }
while (m[j][element] !=0);
index--;
}
return 0;
}
int main()
{ readdata();
make_m();
hamilton(1,1);
return 0;
}

103 | P a g e

Exemplu

Matricea M pentru graful din imagine


este

Exerciii
1. Elaborai un program pentru verificarea existenei unui ciclu
Euler ntr-un graf G (V , E ),

V 20 .

2. Elaborai un program pentru verificarea existenei unui lan


Euler ntr-un graf G (V , E ),

V 20 .

3. Elaborai un program pentru verificarea existenei unui ciclu


hamiltonian ntr-un graf G (V , E ),

104 | P a g e

V 20 .

Capitolul 10. Fluxuri n reea


n acest capitol

Noiune de reea pe graf. Elemente ale fluxului


Teorema despre tietura minim
Algoritmul Ford-Fulkerson
Fluxul maxim pentru surse i destinaii multiple
Fluxul maxim pe grafuri bipartite
Aplicaii ale problemei de flux maxim

10.1 Preliminarii
Problema fluxului maxim, la fel
ca multe alte probleme formulate pe
grafuri, i are rdcinile n economia
modern, mai exact n optimizarea
economic. Mai recente sunt aplicaiile
n domeniul reelelor i fluxurilor
informaionale. Dac este cercetat o Des. 10.1.
reea de transportare a unui material Reea de transport cu sursa n vrful
din un punct n care acesta este produs 1 i stocul n vrful 10.
(surs) ntr-un punct de depozitare sau
prelucrare (stoc) prin canale de transport cu anumite capaciti,
inevitabil apare problema determinrii capacitii de transportare a
materialului de la surs ctre stoc pentru toat reeaua. Materialul i
canalele de transport pot avea cea mai divers natur: produse
petroliere i conducte; piese i transportoare; pachete de date i canale
informaionale, etc.
Pe grafuri problema se formuleaz astfel: Este dat un graf
orientat G (V , E ) , cu ponderi anexate arcelor: pentru arcul (i, j )
ponderea este ci , j . Pentru dou vrfuri date s, t V se cere s se

105 | P a g e

determine fluxul maxim care poate fi deplasat din sursa s n stocul t


(Des. 10.1).

10.2.Algoritm
Descriere general
Algoritmul se bazeaz pe determinarea iterativ a unor drumuri
de cretere a fluxului i acumularea acestora ntr-un flux total, pn la
apariia n reea a unei tieturi11, care separ sursa de stoc.
Se cerceteaz graful G (V , E ) cu capacitile arcurilor ci , j ,
sursa s i stocul t ( s, t V ). Pe arcuri se definesc marcajele ei , j , care
vor indica valoarea curent a fluxului de-a lungul arcului (i, j ) . Pentru
marcajele arcurilor se va respecta urmtoarea condiie:

w vi s

ei , j ek ,i w vi t

1
v j ( vi )
vk ( vi )
0 v s , t
i
Prin alte alte cuvinte, sursa s produce un flux de mrime w.
Pentru orice vrf intermediar fluxul de intrare este egal cu fluxul de
ieire. n stocul t intr un flux de mrime w.
Problema fluxului maxim se reduce la determinarea unui w:

v j ( s )

ei ,s

vk ( t )

ek ,t max .

Legtura ntre fluxul maxim i tietura minim n graf este dat


de urmtoarea teorem:
Teorem: ntr-un graf orientat G (V , E ) valoarea w a fluxului maxim
din s n t este egal cu mrimea tieturii minime (Vm Vm ) , care
separ s de t.

11

Tietura n graf const dintr-un set de muchii (arcuri), lichidarea crora divide graful n
dou componente conexe.
106 | P a g e

Tietura (V0 V0 ) separ s de t dac s V0 , t V0 . Mrimea


tieturii este suma ponderilor arcurilor din G (V , E ) , cu nceputul n

V0 i sfritul n V0 , sau w V0 V0
Tietura

w Vm Vm

minim

(Vm Vm )

ci , j .

este

tietura

vi ,v j V0 V0

pentru

care

min
ci, j
V0 V0 vi ,v j V0 V0

Notaii:
Pentru implementarea algoritmului vor fi folosite att marcaje
pentru arcuri ct i marcaje pentru vrfurile grafului. Marcajul unui
vrf v este format din trei componente: precedent, flux, stare, care au
semnificaia:
precedent vrful care l precede pe v n drumul de cretere
curent
flux mrimea fluxului, care ajunge n vrful v pe drumul de
cretere curent
stare starea curent a vrfului v (vrful poate fi n una din trei
stri: necercetat [marcaj nul, valoarea - 0], atins[vecin al unui vrf
cercetat, valoarea - 1], cercetat[toi vecinii atini, valoarea - 2]).
Vecinii vrfului x

( x) : V V : z V , ( x, z) E (mulimea vrfurilor
n care se poate ajunge direct din vrful x).

( x) : V V : z V , ( z, x) E (mulimea

vrfurilor

din care se poate ajunge direct n vrful x).

Pseudocod
Pas 0. Marcajele arcurilor se iniializeaz cu 0.
Pas 1. Marcajele vrfurilor se iniializeaz: precedent 0, stare 0,
flux . Marcajele muchiilor se pstreaz.

107 | P a g e

Pas 2. Iniializarea sursei s.


Marcajul sursei s : (+s, +, 1)12 Se consider vi s .
Pas 3. Cercetarea vrfului atins vi .
a. Pentru toate vrfurile necercetate v j (vi ) : ei , j ci , j se
aplic marcajul vi , ,1 , unde min(vi , ci , j ei , j ) .
b. Pentru toate vrfurile necercetate v j (vi ) : e j ,i 0 se aplic
marcajul

vi , ,1 , unde min(v , e j ,i ) .
i

c. Vrful vi este marcat cercetat. (Componenta stare primete


valoarea 2 ).
Pas 4.
a. Dac vrful t este atins, se trece la pasul 5;(drumul curent de
cretere a fost construit), altfel:
b. Dac exist vrfuri atinse, dar t nc nu este atins, este
selectat un vrf atins vi i se revine la pasul 3, altfel:
c. Fluxul maxim a fost obinut. SFRIT13.
Pas 5. Creterea fluxului. Modificarea marcajelor pe arcuri.
a. Se consider v t ; c t .
b. Dac vrful v are marcajul de forma z, ,* valoarea
fluxului de-a lungul arcului (z, v) este majorat cu c :

ez ,v ez ,v c ,
altfel, dac vrful v are marcajul de tip z, ,* valoarea
fluxului de-a lungul arcului (v, z) este micorat cu c :

ev, z ev, z c ;
c.

12

v z . Dac v s , se revine la pasul 5.b, altfel la pas 1.

Precedent se consider tot nodul surs s, valoarea fluxului n s se consider infinit, s se


consider atins.
13
Nu mai exist o cretere a fluxului, care ar ajunge la destinaia (stocul) t. Creterea
precedent a fluxului a determinat tietura minim, care separ s de t.
108 | P a g e

Exemplu
Graful 10.1. Sursa - vrful 1, stocul vrful 10.
ITERAIA 1
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare

1
2
3
4
5
7

:
:
:
:
:
:

2-(1,30,1); 3-(1,30,1);
5-(2,30,1);
4-(3,10,1); 9(3,10,1)
7-(4,10,1);
8-(5,25,1);
10 -(7,10,1);

nod
precedent

1
1

2
1

3
1

4
3

5
2

flux
stare

30 30 10 30
2 2 2 2 2

6
0

7
4

8
5

1-(1,,2 )
2-(1,30,2)
3-(1,30,2)
4-(3,10,2)
5-(2,30,2)
7-(4,10,2)

9
3

10
7

0 10 25 10
0 2 1 1

10
1

n stoc se ajunge cu un flux de


valoare 10. Marcajele arcurilor,
care formeaz drumul de
cretere a fluxului (7,10) (4,7)
(3,4) (1,3) se modific.

ITERAIA 2
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare

1
2
3
5
4
7

:
:
:
:
:
:

2-(1,30,1); 3-(1,20,1);
5-(2,30,1);
9(3,10,1)
4-(5,10,1); 8-(5,25,1);
7-(4,8,1);
10 -(7,8,1);
2
1

3
1

4
5

8
5

1-(1,,2 )
2-(1,30,2)
3-(1,20,2)
5-(2,30,2)
4-(5,10,2)
7-(4,8,2)

nod
precedent

1
1

5
2

6
0

7
4

9
3

10
7

flux
stare

30 20 10 30
2 2 2 2 2

0
0

8 25 10
2 1 1

8
1

n stoc se ajunge cu o cretere a


fluxului de valoare 8. Marcajele
arcurilor, care formeaz drumul
de cretere (7,10) (4,7) (5,4) (2,5)
(1,2) se modific.

ITERAIA 3
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare

1
2
3
5
4
8

:
:
:
:
:
:

2-(1,22,1); 3-(1,20,1);
5-(2,22,1);
9(3,10,1)
4-(5,2,1); 8-(5,22,1);

1-(1,,2 )
2-(1,22,2)
3-(1,20,2)
5-(2,22,2)
4-(5,2,2)
8-(5,22,2)

6-(8,5,1);10 -(8,22,1);

nod
precedent

1
1

2
1

3
1

flux
stare

22 20
2 2 2

4
5

5
2

6
8

7
0

8
5

9
3

10
8

2 22
2 2

5
1

0 22 10
0 2 1

22
1

Creterea fluxului: 22.


Marcajele arcurilor, care
formeaz drumul de cretere
(8,10) (5,8) (2,5) (1,2) se
modific.

109 | P a g e

ITERAIA 4
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare

1
3
9
4
2
5
7

:
:
:
:
:
:
:

3-(1,20,1);
9(3,10,1)
4-(9,5,1); 7-(9,10,1);
2-(4,5,1); 5-(-4,5,1)

1-(1,,2 )
3-(1,20,2)
9-(3,10,2)
4-(9,5,2)
2-(4,5,2)
5-(-4,5,2)
7-(9,10,2)

8-(5,3,1)
10-(7,7,1)

nod
precedent

1
1

2
4

3
1

flux
stare

5 20
2 2

4 5
9 -4

6
0

5
2

0 10
0 2

5
2

7
9

8
5

9
3

10
7

3 10
1 2

7
1

Creterea fluxului: 7. Marcajele


arcurilor, care formeaz drumul
de cretere (7,10) (9,7) (3,9) (1,3)
se modific.

ITERAIA 5
iniializare sursa 1: 1-(1, ,1 )
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare
cercetare

1
3
9
4
2
5
7
8

:
:
:
:
:
:
:
:

3-(1,13,1);
9(3,3,1)
4-(9,3,1); 7-(9,3,1);
2-(4,3,1); 5-(-4,3,1)
8-(5,3,1)
10-(8,3,1)

nod
precedent

1
1

2
4

flux
stare

3 13
2 2

110 | P a g e

1-(1,,2 )
3-(1,13,2)
9-(3,3,2)
4-(9,3,2)
2-(4,3,2)
5-(-4,3,2)
7-(9,3,2)
8-(5,3,2)

3
1

4 5
9 -4

6
8

7
9

8
5

9
3

10
8

3
2

3
1

3
2

3
2

3
2

3
1

3
2

Creterea fluxului: 3. Marcajele


arcurilor, care formeaz drumul
de cretere (8,10) (5,8) (5,4) (9,4)
(3,9) (1,3) se modific. Se
observ micorarea fluxului pe
arcul (5,4) cu compensarea pe
arcurile (3,9)(9,4).
Tot odat poate fi observat i
tietura, format de
flux(5,8)(7,10). Prin urmare
fluxul maxim ntre nodurile 1 i
10 are valoarea 50. Urmtoarea
iteraie nu va mai realiza o
cretere a fluxului.

Implementarea algoritmului
Urmtorul fragment de cod realizeaz o variant didactic a
algoritmului pentru determinarea fluxului maxim n reea. Reeaua din
N vrfuri este descris prin matricea de adiacen A[NN], marcajele
arcurilor (fluxul generat) se pstreaz n tabloul E[NN], marcajele
vrfurilor n tabloul VERT[N].
#include <conio.h>
#include <stdio.h>
int a[30][30], e[30][30],i,j,n,s,t, delta, big=0;
struct vertex{int flux; int sursa; int stare;} vert[30];
FILE *f;
int readdata()
{ int i,j;
f=fopen("flux.in", "r");
fscanf(f, "%d", &n);
fscanf(f, "%d %d", &s, &t);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{fscanf(f, "%d", &a[i][j]); big+=a[i][j];}
fclose(f);
return 0;
}
int init_vert()
{ int i;
for (i=1;i<=n;i++)
{vert[i].flux=big; vert[i].sursa=vert[i].stare=0;}
vert[s].stare=1; vert[s].sursa=+s;
return 0;
}
int activ()
{
int i;
for (i=1;i<=n;i++)
if (vert[i].stare ==1) return i;
return 0;
}
111 | P a g e

int fluxtotal()
{ int i,ft=0;
for (i=1;i<=n;i++) ft+=e[s][i];
return ft;
}
int abs(int x)
{ if (x<0) return x*-1; else return x;
}
int flux()
{ int x,i,d,q;
// miscarea inainte, constructie lant
do
{ x=activ();
//dupa G+
for (i=1;i<=n;i++)
if (vert[i].stare==0 && a[x][i]>0 && e[x][i]<a[x][i])
{ d=a[x][i]-e[x][i];
if ( d<vert[x].flux) vert[i].flux=d;
else vert[i].flux=vert[x].flux;
vert[i].stare=1; vert[i].sursa=+x;
};
// dupa Gfor (i=1;i<=n;i++)
if (vert[i].stare==0 && e[i][x]>0)
{ d=e[i][x];
if (d<vert[x].flux) vert[i].flux=d;
else vert[i].flux=vert[x].flux;
vert[i].stare=1; vert[i].sursa=-x;
}
vert[x].stare=2;
}
while (vert[t].stare !=1 && activ() !=0 );
// miscarea inapoi, extinderea fluxului
delta=0;
if (vert[t].stare==1 )
{ x=t;
delta=vert[t].flux;
do
{ q=abs(vert[x].sursa);
if (vert[x].sursa>0) e[q][x]=e[q][x]+delta;
if (vert[x].sursa<0) e[x][q]=e[x][q]-delta;
x=q;
}
112 | P a g e

while (x!=s);
}
int main()
{ readdata();
do
{ init_vert();
flux();
} while (delta !=0);
printf("\n%d", fluxtotal());
return 0;
}

10.3 Flux maxim cu surse i stocuri multiple


Fie

dat

un

graf

G (V , E )

cu

surse

( ns )

stocuri

( nt )multiple. Se presupune c fluxul poate fi direcionat de la orice


surs la orice stoc. Problema determinrii unui flux de mrime maxim
de la toate sursele la toate stocurile se reduce la problema clasic a
fluxului maxim prin adugarea unei surse virtuale i a unui stoc
virtual, conectate prin arce la celelalte surse, respectiv, stocuri (desenul
10.2).

c( s, si ) c si , v j
k

j 1

c(ti , t ) c v j , ti
r

j 1

Des. 10.2 Adugarea sursei i stocului virtual

Pentru fiecare arc ( s, si ) ponderea acestuia,

c s, si c( si , v j ) se
j 1

calculeaz ca fiind suma ponderilor arcelor cu originea n si .


113 | P a g e

Pentru fiecare arc (ti , t ) ponderea acestuia,

c(ti , t ) c v j , ti se
r

j 1

calculeaz ca fiind suma ponderilor arcelor cu vrful n ti .

10.4 Flux maxim pe grafuri bipartite


Algoritmul pentru determinarea fluxului maxim poate fi utilizat
eficient i pentru rezolvarea altor probleme pe anumite clase de grafuri.
Astfel, problema cuplajului maxim pe grafuri bipartite se rezolv
eficient prin adugarea unei surse virtuale la o parte a grafului i a
unui stoc virtual la cealalt parte.
G (V , E )
V V V , V V i
Fie
bipartit:

e (u, v) E

u V , v V sau v V , u V , neorientat, neponderat.

Transformarea grauluif
Pas 1. Se adaug dou vrfuri s, t iniial izolate. V V

s , t .

Pas 2. Toate muchiile se transform n arce, orientate de la V ctre V


Pas 3.
a) Pentru fiecare vrf v V se formeaz arcul c, ponderea
cruia este cs ,v v .
b) Pentru fiecare vrf u V se formeaz arcul (u, t ) , ponderea
cruia este cu ,t u .
Pas 4. Pe graful astfel format se lanseaz algoritmul determinrii
fluxului maxim din s n t .
Pas 5 Rezultat:
Arcele de forma i e (u, v) E u V , v V sau v V , u V
incluse n fluxul maxim vor forma cuplajul maxim pe muchiile
grafului iniial G.

114 | P a g e

10.5 Flux maxim pe grafuri cu capaciti restricionate ale


vrfurilor i muchiilor
Mai multe probleme, rezolvarea crora implic utilizarea
algoritmilor de flux maxim conin restricii (caracteristici) asociate nu
doar arcurilor grafului ( ci , j ), dar i vrfurilor acestuia ( z j ).
Fie

graful

ci , j (i 1,..., n; j 1,..., n)

G (V , E )
i

capacitile

cu

ponderile
vrfurilor

arcelor

z j ( j 1,..., n) .

Restricia impus de capacitile vrfurilor determin valoarea fluxului


total ei , j (i 1,..., n) , la intrare n vrful v j ca

e
i 1

i, j

zj

( j 1,..., n) .

Se cere determinarea pe graful G (V , E ) a unui flux maxim de


la vrful s la vrful t.
Rezolvarea presupune transformarea grafului iniial G (V , E )
ntr-un alt graf G0 (V0 , E0 ) , care va conine doar restricii la
capacitile arcelor. Pe graful G0 (V0 , E0 ) se va aplica un algoritm
clasic pentru determinarea fluxului maxim, care va genera i soluia
problemei iniiale.
Modelul de transformare este urmtorul: fiecare vrf v j al
grafului iniial este nlocuit cu o pereche de vrfuri v j , v j i un arc

, v j

care le unete. Capacitatea arcului este egal cu capacitatea

vrfului v j : c v j , v j z j (desenul 11.3).

Des. 10.3 Transformarea vrfurilor grafului G.

Arcele

v , v
i

v , v din
i

graful iniial se transform n G0 n arce

cu aceeai capacitate. La fel se transform arcele care i au


115 | P a g e

originea n vrful v j :

v , v
j

trec n

v , v .

Un exemplu de

transformare este prezentat pe desenul 11.4.

Des. 10.4 Transformarea grafului G

Dup transformrile efectuate, fluxul maxim pe graful G0 va


corespunde fluxului maxim pe graful G . Este important de menionat,
c n cazul n care tietura determinat de fluxul maxim pe G0 nu
conine nici unul din arcele formate la transformarea grafului G ,
restriciile de capacitate ale vrfurilor nu sunt semnificative.

10.5 Probleme rezolvate


Universitate14
Enun
Pe parcursul anilor n universitatea T&P au fost procurate mai multe
echipamente periferice externe, care se conecteaz la calculator prin
diferite porturi, identificate dup o valoare numeric (paralel - 1, serial
- 2, USB - 3, SCSI - 4, IEEE1394 - 5). Recent rectorul a decis nlocuirea
tuturor calculatoarelor din universitate. Calculatoarele noi nu au toate
porturile indicate mai sus, ntruct unele din ele au fost aleator excluse
pentru a micora costurile. n consecin, apare problema de
reconectare a echipamentelor. eful de gospodrie vrea s repartizeze
14

Concurs .campion, 2009


116 | P a g e

calculatoarele astfel, nct numrul echipamentelor care rmn


neconectate s fie ct mai mic (sau chiar s fie egal cu 0). El are lista
calculatoarelor primite, n care pentru fiecare calculator sunt indicate
porturile disponibile, i lista echipamentelor, n care pentru fiecare
dispozitiv sunt indicate porturile prin care se poate face conectarea la
calculator. Fiecare dispozitiv se conecteaz la un calculator distinct i
fiecare calculator are conectat nu mai mult de un singur dispozitiv
extern.
Scriei un program, care va ajuta eful de gospodrie s repartizeze
calculatoarele astfel, nct numrul echipamentelor rmase neconectate
s fie minim.
Restricii:
1< M < N < 100, 0<K5, unde M este numrul de dispozitive, N
numrul de calculatoare, iar K numrul de porturi distincte.
Input
Fiierul text univ.in va avea n prima linie trei numere ntregi, separate
prin spaiu: N, M, K. Urmtoarele N linii vor conine de la 0 la K
numere, separate prin spaiu: n linia cu indicele i+1 se vor regsi
numerele porturilor, existente n calculatorul cu numrul i. Urmeaz M
linii, care vor conine de la 1 la K numere ntregi, separate prin spaiu:
linia cu indicele N+1+i va descrie numerele porturilor prin care
echipamentul i poate fi conectat la calculator.
Output
Fiierul text univ.out va conine un singur numr ntreg numrul de
echipamente ce nu pot fi conectate la calculatoarele noi.
Exemple
Univ.in

Univ.out

Explicaie

3
1
2
1
1
2
3

Vom nota C calculator, E - echipament


Unul dintre modurile posibile de conectare ar fi
C1 E1,
C2 E3,
C3 E2.
Toate echipamentele sunt conectate.

3 5
3 5
4
2 3 4 5
4

117 | P a g e

Univ.in

Univ.out

Explicaie

4 3 2
1
1
2
1
2
2
1

E1 i E2 pot fi conectate numai la C3. Prin urmare,


unul dintre ele rmne neconectat.
E3 poate fi conectat la oricare dintre C1, C2, C4.

Rezolvare
Problema este de tip de flux maxim, care urmeaz s fie determinat pe
un graf tripartit. Prima component a grafului simbolizeaz
calculatoarele, a doua tipurile de conexiuni (porturi), iar a treia
echipamentele periferice. Calculatorul i se unete printr-un arc cu
portul j, dac dispune de un asemenea port. Portul j se unete printr-un
arc cu echipamentul k, dac echipamentul dispune de un asemenea
port. La urmtoarea etap o sursa virtual se conecteaz la grupul de
calculatoare, iar grupul de echipamente este conectat la o destinaie
virtual. Pe graful astfel obinut se lanseaz algoritmul standard de
flux maxim.
type t2=array[1..207, 1..207] of shortint;
nod=record
pr,del,st:integer;
end;
t3=array[1..207] of nod;
var e,a:^t2;
b:t3;
fmv,fm,nr,delta,s,t,k,n,m:integer;
procedure readdata;
var i,j: integer;
begin
assign(input,'universitate.in'); reset(input);
assign (output, 'universitate.out'); rewrite(output);
readln(n,m,k); nr:=n+m+k+2;
for i:=2 to n+1 do
begin
while not seekeoln do
begin
read(j);
a^[i,n+j+1]:=1; a^[1,i]:=1;
118 | P a g e

end;
readln;
end;
for i:=1 to m do
begin
while not eoln do
begin
read(j);
a^[n+1+j,n+k+1+i]:=1; a^[i+n+k+1,nr]:=1;
end;
readln;
end;
close(input);
end;
function sum(t: integer): integer;
var i,s : integer;
begin
s:=0;
for i:=1 to nr do s:=s+e^[i,t];
sum:=s;
end;
procedure init_b;
var i : integer;
begin
fillchar(b, sizeof(b),0);
for i:=1 to nr do
begin
b[i].del:= 100;
b[i].pr :=0;
end;
b[s].st:=1; b[s].pr:=+s;
end;
function activ : integer;
var i : integer;
begin
activ:=0;
for i:=nr downto 1 do if b[i].st=1 then
end;

activ:=i;

procedure ford;
var x,i,d1,q: integer;
begin {ford}
{miscarea inainte, construim lantul}
repeat
119 | P a g e

x:=activ;
{dupa G+}
for i:=1 to nr do
if (b[i].st=0) and (a^[x,i]>0) and (e^[x,i]<a^[x,i]) then
begin
d1:=a^[x,i]-e^[x,i];
if d1<b[x].del then b[i].del:=d1 else b[i].del:=b[x].del;
b[i].st:=1; b[i].pr:=+x;
end;
{dupa G-}
for i:=1 to nr do
if (b[i].st=0) and (e^[i,x]>0) then
begin
d1:=e^[i,x];
if d1<b[x].del then b[i].del:=d1 else b[i].del:=b[x].del;
b[i].st:=1; b[i].pr:=-x;
end;
b[x].st:=2;
until (b[t].st=1) or (activ=0);
{miscarea inapoi, extinderea fluxului}
delta:=0;
if b[t].st=1 then
begin
x:=t;
delta:=b[t].del;
repeat
q:=abs(b[x].pr);
if b[x].pr>0 then e^[q,x]:=e^[q,x]+delta;
if b[x].pr<0 then e^[x,q]:=e^[x,q]-delta;
x:=q;
until x=s;
end;
end; {ford}
begin
new(a); fillchar(a^, sizeof(a^), 0);
new(e); fillchar(e^, sizeof(e^), 0);
readdata;
s:=1; t:=nr; fm:=0;
repeat
init_b; ford; fmv:=fm; fm:=sum(t);
until (delta=0) or (fm-fmv=0);
writeln(m-fm);
close(output);
end.

120 | P a g e

Exerciii
1. Elaborai un program pentru separarea mulimii de vrfuri a
unei reele de transport n dou componente distincte: mulimea
de surse i mulimea de stocuri.
2. Elaborai un program pentru determinarea fluxului maxim pe
grafuri cu surse i destinaii multiple.
3. Elaborai un program pentru transformarea grafului cu restricii
aplicate pe vrfuri ntr-un graf cu restricii aplicate pe muchii.
4. Elaborai un program pentru determinarea fluxului maxim pe
grafuri cu restricii aplicate pe vrfuri.

121 | P a g e

Capitolul 11. Cuplaje


n acest capitol

Noiune de cuplaj, cuplaj maxim


Grafuri asociate
Legtura ntre problema cuplajului maxim i a mulimii maximal
independente
Algoritmi pentru determinarea tuturor cuplajelor maxime
Complexitatea algoritmului pentru determinarea tuturor cuplajelor maxime

11.1 Cuplaje
ntr-un graf neorientat G (V , E ) mulimea de muchii M se
numete cuplaj dac oricare dou muchii din M nu an vrfuri comune.

M se numete maxim, dac e E M , n mulimea


M {e} exist muchia e : e e v* ; v* V . La fel ca i mulimile

Cuplajul

independente maxime, cuplajele maxime pot fi formate din mulimi cu


numr diferit de elemente (vrfuri pentru mulimile maximal
independente, muchii pentru cuplaje). Un astfel de exemplu este
prezentat pe desenul 11.1.

Des. 11.1 Cuplaje maxime n graful (a). Cuplaj maxim pe patru muchii (1,4) (2,3)
(5,8) (6,7) (b). Cuplaj maxim pe trei muchii (1,5) (2,3) (6,8) (c)

122 | P a g e

Pe un graf arbitrar pot fi formulate mai multe probleme,


rezolvarea crora necesit determinarea unui cuplaj cu proprieti
prestabilite. Pentru unele categorii de grafuri, roblema cuplajului
maxim poate fi rezolvat eficient, de exemplu, n cazul grafurilor
bipartite, n care ea se reduce la problema fluxului maxim.. n cazul
grafurilor arbitrare se aplic aa nuimitul algoritmul maghiar [6, p.
396].
n continuare va fi studiat problema comun de generare a
tuturor cuplajelor unui graf neorientat arbitrar G (V , E ) .
Problema va fi rezolvat prin reducerea n timp ptratic la o alt
problem pe grafuri, rezolvarea creia este deja cunoscut problema
mulimii maximal independente, mai exact problema generrii tuturor
mulimilor maximal independente.

11.2 Graful asociat


Fie dat graful neorientat
construi

graful

GA (VA , EA ) ,

G (V , E ) E e1 ,..., eM . Se va
unde

VA e1 ,..., eM ,

iar

EA ei , e j : u V , u ei & u e j .
Exemplu. Se consider graful G (V , E ) din figura 11.2.a. Fiecare
muchie din graful iniial se transform ntr-un vrf al grafului asociat

GA (VA , EA ) , prezentat pe desenul 11.2.b.

Des. 11.2 Graful iniial (a) i asociat (b).


123 | P a g e

Oricare dou vrfuri

e , e din
i

GA (VA , EA ) sunt conectate prin

muchie, dac n graful iniial exist un vrf comun u al muchiilor ei , e j .


Teorem. Fiecrui cuplaj maxim n graful G (V , E ) i corespunde o
mulime maximal independent n GA (VA , EA ) i invers, fiecrei
mulimi maximal independente n GA (VA , EA ) i corespunde un cuplaj
maxim n G (V , E ) .

11.3 Funcia de generare a grafului asociat


Din cele expuse mai sus rezult c problema determinrii
tuturor cuplajelor maxime pe G (V , E ) este echivalent cu problema
determinrii tuturor mulimilor maxim independente pe GA (VA , EA ) .
Pentru a rezolva problema este necesar, mai nti, s se
construiasc graful asociat GA (VA , EA ) .

Algoritm:
Pas 1. Se creeaz lista muchiilor din G (V , E ) . L e1 ,...em .
Pas 2. Se creeaz tabloul bidimensional E matricea de adiacen a
grafului GA .
Pas 3. Pentru toi i de la 1 la m-1.
Pentru toi j de la i+1 la m
Dac n G (V , E ) ei

e j ; ei , e j E ,

atunci Ei, j Ej ,i 1 altfel Ei, j Ej ,i 0 .

Implementare
Intrare: graful G (V , E ) , descris n tabloul bidimensional a.
124 | P a g e

Ieire: matricea de adiacen a grafului GA (VA , EA ) . Matricea de


adiacen este localizat n tabloul bidimensional b.
int asociat ()
{ int i,j;
// modelare lista muchii
for (i=1;i<=n;i++)
for (j=1+i; j<=n; j++)
if (a[i][j]!=0 ){m++; list[m].v1=i;list[m].v2=j;}
// modelare matrice adiacenta
for (i=1;i<=m;i++)
for (j=1+i; j<=m; j++)
if (list[i].v1==list[j].v1 ||
list[i].v1==list[j].v2 || list[i].v2==list[j].v1
|| list[i].v2==list[j].v2 ) b[i][j]=b[j][i]=1;
}

11.4 Generarea tuturor cuplajelor maxime


Problema se rezolvat direct prin aplicarea consecutiv a doi
algoritmi descrii anterior. Mai nti se formeaz graful asociat

GA (VA , EA ) , apoi pentru acesta este aplicat algoritmul de generare a


mulimilor maxim independente. La generarea fiecrei soluii, vrfurile
din GA (VA , EA ) sunt transformate n muchiile corespunztoare din

G (V , E ) .
Exemplu: Program-prototip pentru generarea tuturor cuplajelor
maxime.
Intrare: graful G (V , E ) .
Ieire: toate cuplajele maxime ale grafului G (V , E ) .
#include <conio.h>
#include <stdio.h>
struct edge{int v1; int v2;} list[400];
int a[20][20],b[400][400], q[20], s[20], m=0,i,j,n,k;
FILE *f;
125 | P a g e

int asociat ()
{ int i,j;
for (i=1;i<=n;i++)
for (j=1+i; j<=n; j++)
if (a[i][j]!=0 ){m++; list[m].v1=i;list[m].v2=j;}
for (i=1;i<=m;i++)
for (j=1+i; j<=m; j++)
if (list[i].v1==list[j].v1 || list[i].v1==list[j].v2
|| list[i].v2==list[j].v1 || list[i].v2==list[j].v2
) b[i][j]=b[j][i]=1;
}
int fillc(int *x, int z, int num)
{ int i;
for (i=1;i<=num;i++) x[i]=z;
return 0;
}
int print()
{ int i;
printf("\n");
for (i=1;i<=m;i++)
if (s[i]==1) printf("(%d %d)", list[i].v1, list[i].v2);
printf("\n");
}
int mind(int *s, int *q)
{ int i,j,k=0,r, rest[20];
for (i=1;i<=m;i++) if(q[i]!=0) k=1;
if (k==0) {print();}
else { j=m;
while (s[j]==0 && j>=1) j--;
r=j+1;
for (i=r;i<=m;i++)
if (q[i]==1){ fillc(rest,0,m);
s[i]=1; q[i]=0;
for (j=1;j<=m;j++)
if (b[i][j] != 0 && q[j]==1)
{q[j]=0; rest[j]=1;}
mind (s,q);
s[i]=0;q[i]=1;
for (j=1;j<=m;j++)
if(rest[j]==1) q[j]=1;
}
126 | P a g e

}
return 0;
}
int main()
{
f=fopen("data.in", "r");
fscanf(f, "%d", &n);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
fscanf(f, "%d", &a[i][j]);
fclose(f);
asociat();
fillc(s,0,m);
fillc(q,1,m);
mind(s,q);
return 0;
}

Rezultate:
Pentru graful din desenul 11.2 (a) se
obin cuplajele:

11.5 Probleme rezolvate


Poliitii
Enun. Strzile din New Chiinu sunt deosebite ele sunt rectilinii i
se intersecteaz doar n punctele extreme. Astfel, o strad se extinde de
la o intersecie la alta. Aceasta tenteaz mai muli oferi s organizeze
curse la vitez pe strzi.
Recent Domnul Ghi a devenit comisar al poliiei municipale i a decis
s fac ordine n ora. El planific s amplaseze poliiti doar pe unele
strzi, astfel nct ei s poat monitoriza toate strzile din ora. Fiecare
poliist se poate deplasa pe strada sa de la intersecie la intersecie.
Aflndu-se n intersecie, poliistul poate controla i strzile adiacente,
fixnd nclcrile de pe aceste strzi cu ajutorul unui iPad. Dac doi
127 | P a g e

poliiti se ntlnesc ntr-o intersecie, ei ncep s discute i, cu regret,


cam uit de obligaiunile de serviciu. Comisarul Ghi dorete s
exclud posibilitatea apariiei unor asemenea situaii, dar, totodat, s
minimizeze numrul total de poliiti.
Cerin. Scriei un program care determine numrul minim de
poliiti, necesari pentru a controla toate strzile din ora, dar, totodat,
oricare doi poliiti s nu se poat ntlni.
Input. Fiierul de intrare police.in conine pe prima linie numrul N de
strzi din ora. Urmeaz N linii, care conin de la 1 la N-1 numere
naturale separate prin spaii, descriind strzile adiacente. Linia i+1 a
fiierului de intrare conine lista strzilor, care sunt adiacente strzii cu
numrul i.
Output. Fiierul de ieire police.out va conine un singur numr
numrul minim de poliiti, necesari pentru a monitoriza toate strzile
din ora.
Restricii 2<N<40.
Exemplu:
police.in
5
2 4 5
1 3 4
2 4 5
1 2 3 5
1 3 4
4
2 4
1 3
2 4
1 3

police.out
1

Explicaii

Rezolvare
Reeaua de drumuri i intersecii reprezint un graf planar. Soluia
problemei reprezint un cuplaj maxim de putere minim (format dintrun numr minim de muchii). Prin urmare, este suficient s se
construiasc graful asociat reelei de strzi, apoi, pe graful construit s
se determine mulimea maximal independent de putere minim.
128 | P a g e

Modul iniial de prezentare a datelor permite construcia direct a


matricei de adiacen a grafului asociat.

Implementare
var a:array[1..51,1..51] of shortint;
q,s: array[1..51] of shortint;
n:integer;
procedure readdata;
var f:text;
i,k: integer;
begin
assign(f,'police00.in'); reset(f);
readln(f,n);
for i:=1 to n do
begin
while not eoln(f) do
begin
read(f,k);
a[i,k]:=1;
end;
readln(f);
end;
end;
procedure print;
var i:integer;
begin
for i:=1 to n do
if s[i]=1 then write(i,' ');
writeln;
end;
procedure mind;
var i,j,k,r :integer;
rest: array[1..50] of shortint;
begin
k:=0;
for i:=1 to n do if q[i]<>0 then k:=1;
if k=0 then begin write('solutie :'); print; end
else begin
j:=n;
while (s[j]=0) and (j>=1) do dec(j);
r:=j+1;
for i:=r to n do
if (q[i]=1) then
129 | P a g e

begin
fillchar(rest, sizeof(rest),0);
s[i]:=1; q[i]:=0;
for j:=1 to n do
if (a[i,j]<>0) and (q[j]=1) then
begin
q[j]:=0; rest[j]:=1;
end;
mind;
s[i]:=0; q[i]:=1;
for j:=1 to n do
if rest[j]=1 then q[j]:=1;
end;
end;
end;
begin
readdata;
fillchar(s, sizeof(s),0);
fillchar(q, sizeof(q),1);
mind;
readln;
end.

130 | P a g e

Exerciii

Des. 11.3

1. Determinai cuplajele maxime de putere maximal n grafurile


de pe desenul 11.3.
2. Determinai cuplajele maxime de putere minimal n grafurile
de pe desenul 11.3 .
3. Elaborai un program pentru generarea tuturor cuplajelor unui
graf arbitrar G (V , E ), V 20 , fr a construi grafulasociat.
4. Elaborai un program pentru determinarea cuplajului cu un
numr minim de muchii al unui graf arbitrar G (V , E ), V 20 .
5. Elaborai un program pentru determinarea cuplajului cu un
numr maxim de muchii al unui graf arbitrar G (V , E ), V 20
.

131 | P a g e

Capitolul 12. Probleme propuse pentru rezolvare


14.1 Cratere pe Lun15
Enun
Ciocnirile asteroizilor cu Luna sunt destul de frecvente. n urma
ciocnirilor se formeaz cratere circulare.
Astronomul Tudor a nceput studierea hrii suprafeei selenare.
Observnd c unele cratere sunt incluse unul n altul, el a hotrt s
determine cea mai lung consecutivitate de cratere incluse. Pentru a
rezolva aceast problem el are nevoie de un program de calculator.
Intrare
Prima linie a fiierului de intrare conine numrul ntreg N numrul
de cratere de pe hart (1N500). Urmtoarele N linii conin descrierile
craterelor de la 1 la N. Fiecare crater e descris n o linie aparte,
descrierea fiind format din trei numere din intervalul [32768, 32767],
separate prin spaiu. Primele dou numere sunt coordonatele carteziene
ale centrului, al treilea raza.
Ieire
Prima linie a fiierului de ieire va conine lungimea celui mai lung ir
de cratere incluse, cea de a doua indicii craterelor din serie, ncepnd
cu cel mai mic, pn la cel mai mare (dup diametru). Numerele
craterelor se separ prin spaiu. Dac exist mai multe soluii, se
afieaz oricare din ele.
Exemplu
Crater.in
4
0 0 30
-15 15 20
15 10 5
10 10 10

15

Crater.out
3
3 4 1

Rusia, coala de var la Informatic, 1999


132 | P a g e

12.2 Translatori16
Enun
Pentru organizarea unui simpozion internaional o companie de Relaii
Publice are nevoie s angajeze translatori din limbile native ale
participanilor n limba englez. Baza de candidai este format din N
persoane, pentru fiecare din ei fiind cunoscute limbile n care el poate
efectua traducerea. Toi translatorii beneficiaz de salarii egale. Fiind
cunoscut setul S de limbi n care urmeaz s fie efectuate traduceri, s
se determine un numr minim de translatori, care vor asigura toate
traducerile.
Intrare
Prima linie a fiierului de intrare conine numrul ntreg N numrul
de translatori (1N100). Urmtoarele N linii ale fi;ierului de intrare
conin de la 1 la 200 numere ntregi pozitive indicii limbilor n care
translatorul poate efectua traducerea. Linia i+1 a fi;ierului d eintrare
conine infoaia despre limbile n care poate efectua traducerea
translatorul i. Urmeaz o linie cu cel mult 300 numere ntregi pozitive,
separate prin spaiu indicii limbilor utilizate la simpozion.
Ieire
Fiierul de ieire va conine n prima linie numrul ntreg K numrul
de translatori necesari. Cea de a doua linie va conine indicii
translatorilor selectai, n ordine lexicografic, separai prin spaiu.
Dac exist mai multe soluii, se afieaz oricare din ele.
Exemplu
Translate.in
5
1 2 4
2 3 6
1 5 6
1 4 7
6 7
1 2 3 4 5 6 7

16

Translate.out
3
2 3 4

[6, p 63.]
133 | P a g e

12.3 Problema celor cinci dame17


Enun
Pe o tabl de ah cu dimensiune standard s se amplaseze cinci dame
astfel nct ele s in sub lovitur toat suprafaa tablei de ah.
Scriei un program care va determina toate posibilitile de amplasare a
damelor.
Ieire
Fiierul de ieire va conine cte cinci linii pentru fiecare soluie
identificat. Fiecare linie va conine cte dou numere separate prin
spaiu: indicele liniei i coloanei la intersecia crora se amplaseaz
dama.

12.4 mprirea administrativ-teritorial18


Enun
Trecerea de la judee la raioane i invers impune necesitatea de a
tipri harta republicii la fiecare mprire teritorial nou. Pentru a
micora preul hrilor, la colorarea lor se utilizeaz un numr ct mai
mic de culori. Evident, la colorarea oricror dou uniti teritoriale
nvecinate (care au frontier comun) pot fi utilizate doar culori ce
difer. Fiind cunoscut mprirea teritorial-administrativ, s se
determine numrul minim de culori, necesare pentru a colora harta.
Intrare
Fiierul de intrare conine pe prima linie numrul ntreg n numrul
de uniti administrativ-teritoriale (n < 101). Fiecare din urmtoarele n
linii ale fiierului de intrare conine cte n numere ntregi (0 sau 1),
separate prin spaiu. Liniile resopective formeaz matricea de adiacen
a unitilor teritorial-administrativ.

17
18

[6, p 70.]
Republica Moldova, coala de var la Informatic, 2002

134 | P a g e

Ieire
Fiierul de ieire va conine pe o singur linie
culori, necesare pentru colorara hrii.

numrul minim de

Exemplu:
color.in
5
0 1 0 1 0
1 0 1 1 1
0 1 0 1 1
1 1 1 0 1

color.out
4
2

12.5 Safeuri19
Enun
ncperea securizat ce conine safeurile personale ale Bncii
Gringotts Ltd are forma unui dreptunghi cu laturile nm i este
divizat n n m platforme ptrate de dimensiunea 1 1 uniti de
lungime. Unica platform liber este cea din colul stnga sus. Ea
marcheaz ieirea din ncpere. Unele platforme sunt ocupate cu
echipamente de supraveghere, montate inamovibil, iar pe celelalte se
afl cte un safeu, dimensiunile cruia coincid cu cele ale platformei. n
unul din safeuri se pstreaz Piatra Filozofal. La cererea lui
Dumbledore, spiriduii trebuie s scoat din incpere safeul cu Piatra
Filozofal. Unicul tip de operaiii pe care le pot efectua spiriduii
const n deplasarea oricrui safeu de pe platforma pe care el se afl pe
o platform nvecinat, cu condiia c aceasta este liber. Sunt
considerate ca fiind nvecinate doar platformele ce au o latur comun.

19

F11, Ediia I, 2011, Iai, Romnia.


135 | P a g e

Cerin
Scriei un program, care determin numrul minim de operaii necesare
pentru a scoate safeul cu Piatra Filozofal din ncperea securizat.
Intrare
Prima linie a fiierului de intrare conine numerele ntregi n i m
dimensiunile ncperii (1 n, m 50). Urmeaz n linii a cte m
simboluri fiecare. Simbolul . marcheaz poziia liber. Unica poziie
liber este intrarea n depozit. Simboul # marcheaz o platform cu
echipament de supraveghere. Platformele cu echipamente de
supraveghere nu pot fi deplasate i pe ele nu se plaseaz safeuri.
Simbolul c semnific o platform cu safeu. Simbolul X platforma
pe care se afl safeul cu Piatra Filozofal. Safeul se consider scos din
ncpere, dac el este adus pe platforma ce reprezint intrarea n
depozit. Se garanteaz, c cel puin unul dintre numerele n, m este mai
mare dect 1, iar fiecare dintre simbolurile . i X apar doar cte o
singur dat. Simbolul . este ntotdeauna amplasat n colul stng sus
al ncperii securizate.
Ieire
Dac safeul nu poate fi scos din ncperea securizat, n fiierul de
ieire se va nscrie cuvntul Impossible.
n caz contrar unica linie a fiierului va conine un singur numr
numrul minim de operaii, necesar pentru scoaterea safeului cu Piatra
Filozofal din ncperea securizat.
Exemple
Safeu.in
3 3
.#X
ccc
c#c
2 3
.cX
ccc

136 | P a g e

Safeu.out
Impossible

14.7 Plicuri i felicitri20


Enun
Administraia unei instituii dorete s felicite conducerea rii cu Ziua
Independenei. Pentru aceasta au fost cumprate N felicitri i M
plicuri. Din pcate, att plicurile ct i felicitrile au dimensiuni diferite
i unele felicitri nu pot fi puse n oricare plic.
Scriei un program care determin o astfel de repartiie a felicitrilor n
plicuri, nct numrul de plicuri ce vor conine felicitri s fie maximal.
n fiecare plic se poate pune doar o singur felicitare.
Intrare
Prima linie a fiierului de intrare conine numerele ntregi M i N,
separate prin spaiu. M reprezint numrul de plicuri, iar N numruul
de felicitri, 0M, N100). Urmtoarea linie a fiierului de intrare
conine M perechi de numere ntregi, separate prin spaiu, ce reprezint
dimensiunile plicurilor (nlimea i limeaa). Urmeaz o linie ce
conine N perechi de numere ntregi separate prin spaiu, ce reprezint
n acelai format dimensiunile felicitrilor. Toate dimensiunile sunt
numere naturale ce nu depesc valoarea 32767.
Ieire
Prima linie a fiierului va conine numrul ntreg K numrul maxim
de felicitri, care pot fi trimise prin pot. Cea de a doua linie va conine
K perechi de numere, cu indicii felicitrii i a plicului n care felicitarea
respectiva va fi pus.
Exemplu
Input
4 4
3 3 141 282
3 1 140 280

20

Output
4
282 141
141 282

201 100
201 1

1 1

2 3

3 2

4 4

Rusia, coala de var la Informatic, 1999


137 | P a g e

12.7 Agenii21
Enun
Din cauza arestrii de ctre eventualul inamic a unui numr mare de
ageni ce activau n Mioritic Land, Very Intelligense Agency a hotrt
sa mbunteasc regulile de activitate a acestora. Cea mai mare
problem este asigurarea ntlnirilor sigure ale agenilor. Sigurana
urmeaz s fie asigurat pe o reea prestabilit de drumuri i pentru
anumite poziii iniiale ale agenilor. Pentru a organiza o ntlnire
sigur, agenii vor respecta urmtoarele reguli:
agenii se deplaseaz ziua, iar ntlnirile au loc seara;
agentul trebuie s-i schimbe locul de aflare n fiecare zi;
agenii circul doar dea lungul drumurilor indicate (unele din
aceste drumuri au o singur direcie de deplasare);
un agent nu poate s se deplaseze prin mai multe orae ntr-o
singur zi, (doar ntr-un ora vecin cu cel n care se afl
dimineaa);
distana ntre orice dou orae legate printr-un drum poate fi
parcurs timp de o zi (pn la venirea serii);
ntlnirea are loc doar atunci cnd ambii ageni se afl n acelai
ora n aceeai sear.
Scriei un program, care:
citete numrul de orae i descrierea reelei de drumuri din
fiierul AGE.IN;
verific dac exist posibilitatea unei ntlniri sigure i dac da
de cte zile este nevoie pentru a o organiza;
scrie rezultatul n fiierul AGE.OUT.
Intrare
Prima linie a fiierului de intrare AGE.IN, conine numerele ntregi n i
m, separate prin spaiu,l 1n250, 0mn(n-1).
Linia a doua a fiierului de intrare conine numerele ntregi a1 i a2,
separate prin spaiu, 1a1, a2n i a1a2. Numerile respective reprezint
poziiile agenilor Nr. 001 i Nr. 002.

Polonia, Olimpiada naional la Informatic, 2000


138 | P a g e
21

Fiecare din urmtoarele m linii ale fiierului de intrare conine cte


dou numere a i b separate prin spaiu 1a,bn i ab, numere ce
indic existena unui drum de la a la b.
Ieire
Fiierul de ieire AGE.OUT va conine pe o singur linie un singur
numr natural ce reprezint numrul de zile necesare pentru a
organiza ntlnirea agenilor. Dac o astfel de ntlnire este imposibil,
n fiierul de ieire se va scrie cuvntul NU.
Exemplu
AGE.IN:
6 7
1 5
1 2
4 5
2 3
3 4
4 1
5 4
5 6

AGE.OUT
3

12.8 Interogri22
Enun
Se consider un graf care iniial este format din P noduri izolate,
etichetate de la 1 la P. Se mai consider N intrri, unde intrare poate
nsemna:
comand o comand are forma 'I+J', cu semnificaia c n graf
se adaug muchia care unete nodurile I i J (dac I i J erau deja
unite n acel moment, nu se ntreprinde nici o aciune);
interogare o interogare este de forma 'I?J', adic se ntreab
dac n acel moment I i J sunt n aceeai component conex.
Se pleac de la un graf iniial format din noduri izolate, care pe
parcurs se unific. Pe parcurs se pun interogri dac anumite perechi
de noduri sunt sau nu n aceeai component conex.

22

Republica Moldova, coala de Var la Informatic, 2002


139 | P a g e

Intrare / Output
Fiierul ENTRIES.IN conine pe prima linie numrul N de
intrri. Pe urmtoarele N linii se gsesc intrrile, cte una pe linie. O
intrare este codificat prin trei numere separate prin cte un spaiu.
Primele dou numere reprezint nodurile I i J (numere ntregi,
cuprinse ntre 1 i P), iar al treilea este 1 dac intrarea este o
comand, respectiv 2 dac intrarea este o interogare.
La fiecare interogare, se scrie pe o linie separat n fiierul
ENTRIES.OUT numrul 1 dac nodurile referite sunt n acel moment
n aceeai component conex, respectiv numrul 0 n caz contrar.
Restricii
1 N 5 000; 1 P 10 000 000
n lista de intrri exist cel puin o interogare
Exemplu
ENTRIES.IN
9
1
1
3
2
1
2
1
3
1

2
2
7
3
3
4
4
4
7

2
1
2
1
2
2
1
2
2

ENTRIES.OUT
0
0
1
0
1
0

12.9 Import galactic23


Enun
Odat cu apariia unui nou motor spaial ThrustoZoom, compania de
import/export HyperCommodities a nceput comerul cu cele mai
ndeprtate galaxii din Univers. HyperCommodities dorete s importe
bunuri din unele galaxii ale sectorului Plural Z. Planetele din aceste
galaxii export materiale din clasa vacuuseal, transparent aluminum,
digraphite, i quantum steel. Rapoartele preliminare denot
urmtoarele fapte:
Fiecare galaxie conine cel puin una i cel mult 26 planete. Fiecare
planet din galaxie este identificat de o liter unic de la A la Z.

ACM, Mid-Central programming contest,1995


140 | P a g e
23

Fiecare planet e specializat n producia i exportul unui tip de


produs. Planete diferite din aceeai galaxie export diferite produse.
Unele perechi de planete sunt interconectate prin linii hiperspaiale
de livrare. Dac planetele A i B sunt interconectate, ele pot
comercializa produse fr restricii. Dac planeta C este conectat la
B dar nu i la A, atunci A i C pot de asemenea face comer prin
intermediul planetei B, dar B reine 5% din volumul tranzitat n
calitate de plat pentru tranzacie. (A va primi doar 95% din
volumul produsului, livrat de C i C primete doar 95% din produsul
livrat de A) n general, oricare dou planete pot face comer ntre
ele, dac exist o reea de linii de livrare, care le unete, dar fiecare
planet intermediar reine 5% din produsul tranzitat (care, de la
planet la planet poate varia).
Cel puin cte o planet din fiecare galaxie dorete s construiasc o
linie hiperspaial pentru ThrustoZoom , care va livra produse ctre
Pmnt. Liniile ThrustoZoom sunt concepute la fel ca i celelalte
linii comerciale n interiorul galaxiilor. De exemplu, dac planeta K
deschide o linie ThrustoZoom spre Pmnt, ea va deplasa produsele
gratis, n timp ce orice planet conectat la K, va tranzita produsele
sale cu o plat de tranzit obinuit.
HyperCommodities a asociat o valoare relativ (un numr real mai mic
dect 10) fiecrui produs exportat de planete. Valoarea numeric este
direct proporional cu importana produsului. Produsele mai valoroase
pot fi vndute cu un profit mai mare n magazine. Se cere s se
determine care planet este cea mai convenabil pentru export (va
asigura un profit maxim), dac se iau n considerare plile de tranzit.

Input
Fiierul de intrare conine descrierea uneia sau a mai multor galaxii.
Fiecare descriere ncepe cu o linie care conine un numr ntreg N care
specific numrul planetelor n galaxie. Urmtoarele N lini conin
descrierea fiecrei planete, care este format din:
1. Litera care corespunde planetei.
2. Spaiu.
3. Valoarea relativ a produsului exportat ctre Pmnt n
forma d.dd.
141 | P a g e

4. Spaiu.
5. Un ir de caractere i/sau caracterul '*': literele din ir indic
liniile de comer ctre aceste planete iar '*' indic acordul
planetei de a deschide o linie ThrustoZoomcte Pmnt.
Ieire
Pentru fiecare descriere a galaxiei fiierul deieire va conine o singur
linie citit ca "Import from P" unde P este litera ce corespunde planetei
cu cel mai valoros export, innd cont de pierderile cauzate de tranzit.
Dac mai multe planete pot oferi un export la fel de valoros, se va afia
indicele primei planete, n ordine lexicogafic.
Exemplu:
Input
1
F 0.81
5
E 0.01
D 0.01
C 0.01
A 1.00
B 0.01
10
S 2.23
A 9.76
K 5.88
E 7.54
M 5.01
G 7.43
I 6.09
C 8.42
O 4.55
Q 3.21

*
*A
A*
*A
EDCB
A*

Output
Import from F
Import from A
Import from A

Q*
C
MI
GC
OK
IE
KG
EA
QM
SO

12.10 Incendiator24
Enun:
Pe o reea rectangular cu distana
unitar ntre liniile vecine a fost introdus
un system de coordinate cartezian.
Originea sistemului se afl n unul din
punctele de intersecie a liniilor reelei,
axele lui sunt orientate paralel liniilor.

24

Finala .campion, 2007.


142 | P a g e

Pe reea a fost plasat o figur din chibrituri. Au fost folosite


chibrituri de 2 tipuri:
Chibritele de lungime 1 au fost plasate de-a lungul liniilor reelei.

Chibritele de lungime 2 au fost plasate pe diagonalele celulelor


reelei.
Ionu vrea s ard figura. El o poate aprinde doar ntr-un punct, cu
coordonate ntregi (de exemplu n punctul A de pe desen aprinderea este
interzis, iar n punctele B i C - permis).
Se tie c chibriturile ard uniform, dar fiecare chibrit are viteza sa
proprie de ardere. Chibritul poate arde concomitent n mai multe locuri
(de exemplu, cnd se aprinde de la vecinii si din ambele pri sau la
mijlocul unui chibrit diagonal focul trece la alt chibrit intersectat i se
extinde n ambele pri).
Secriei un program, care va deteremina, n ce punct trebuie aprins
figura, pentru ca s ard ntr-un timp minim.
Intrare
Prima linie a fiierului de intrare conine un numr natural N
numrul de chibrite. Urmeaz N linii, fiecare din ele coninnd cte 5
numere ntregi Xi1, Yi1, Xi2, Yi2, Ti, separate prin spaiu - coordonatele
capetelor chibritului cu indicele i i timpul de ardere a lui n condiia ca
e aprins doar din o singur parte. Lungimile corecte ale chibriturilor (1
sau 2 ), conexitatea figurii formate i lipsa
suprapun este garantat.

chibriturilor care se

Ieire
Fiierul de ieire va conine coordonatele punctului n care trebuie de
aprins figura pentru ca ea s ard ntr-un timp minim, apoi timpul de
ardere a figurii cu cel puin 2 semne dup virgul, separate prin spaiu.
Dac exist mai multe soluii, poate fi prezentat oricare dintre ele.
Restricii:
1 N 40;

- 200 Xi, Yi 200;

0 T 107.

143 | P a g e

Exemple
*.in
1
0
5
0
1
0
0
2
3
1
1
1

0 1 1 1
0
0
0
0
2

0
0
1
1
1

1
1
0
1
1

1
10
1
1
1

1 1 2 10
2 2 2 10
1 2 2 50

*.out
0 0
1.00
0 0
3.25

2 2
35.00

12.11 Reconstrucia arborilor25


Enun
Mihai i Sandu joac urmtorul joc.
Mihai deseneaz pe o foaie un arbore cu N vrfuri numerotate de la 1
la N. Apoi el lichideaz vrfurile dup cum urmeaz: caut, care frunz
(vrf de putere 1) este numerotat cu cel mai mic numr , lichideaz
aceast frunz i scrie numrul nodului de la care a rupt aceast
frunz. El repet operaia pn cnd rmne doar un nod n graf i o
list de (N-1) numere.
Apoi Sandu ncearc s reconstruiasc arborele utiliznd doar lista . n
caz de succes el ctig jocul.
Scriei un program, care l-ar ajuta pe Sandu s ctige.
Intrare
Prima linie a fiierului conine un numr ntreg N, 2 N 100.000,
numrul de vrfuri n arbore.
Linia a doua conine N-1 numere separate prin spaiu. Acestea sunt
numerele scrise de Mihai.
Ieire
Croaia, Olimpiada naional la Informatic, 2003
144 | P a g e
25

In N-1 linii ale fiierului de ieire vei nscrie muchiile arborelui n


ordine arbitrar. Fiecare muchie va fi descris de 2 vrfuri (n ordine
arbitrar) care o formeaz.
Exemple:
list.in
5
4 3 4 5

list.in
7
1 2 2 2 1 7

list.in
10
6 2 7 9 2 9 4 4 10

list.out
1 4
2 3
3 4
4 5

list.out
3 1
1 7
2 1
4 2
5 2
6 2

list.out
8 4
7 5
3 2
9 6
9 4
10 4
1 6
2 9
2 7

12.12 Relaii romantice


Enun
La anul II al universitii cineva a lansat un studiu al relaiilor
romantice ntre studeni. n scopuri didactice, o relaie romantic poate
exista ntre un biat i o fat. Scopul studiului const n determinarea
setul maximal de studeni, care nu sunt n relaii romantice. Rezultatul
numrul de studeni n acest set.
Scriei un program, care calculeaz setul maximal de studeni, care nu
sunt n relaii romantice.
Intrare
Fiierul de intrare conine un set de date text n forma urmtoare:
numarul de studeni
i descrierea fiecrui student, n formatul
student_id: (numrul_de_relaii) student_id1 student_id2 student_id3
sau student_id:(0)

145 | P a g e

Ieire
Fiierul de ieire va conine cte un numr pentru fiecare set de date
din fiierul input.
Restrictii : n 500 .
Exemplu
input
7
0:
1:
2:
3:
4:
5:
6:
3
0:
1:
2:

(3)
(2)
(0)
(0)
(2)
(1)
(2)

4 5 6
4 6

output
5
2

0 1
0
0 1

(2) 1 2
(1) 0
(1) 0

12.13 UP26
Enun:
Penru a susine cu succes testului de angajare n funcia de
programator la Compania Macrosoft, competitorul trebuie s poat
rezolva probleme din urmtoarele patru compartimente: programarea
dinamic,
Backtracking-ul,
Teoria
Grafurilor
i
Geometria
Computaional. Pregtirea cea mai bun este cea fcut n baza unui
ndrumar (culegere de probleme), editat de Compania Macrosoft.
Nivelul de pregtire al competitorului la fiecare din teme este
determinat de un indice notat prin UP, care ia valori de la 1 la L. n
procesul testrii, pentru fiecare problem e determinat valoarea
minim a indicelui UP al programatorului pentru fiecare din
compartimentele, necesare ca el s poat rezolva problema dat. Sunt
26

Rusia, Olimpiada Naional la Informatic, 2000


146 | P a g e

cuoscute i valorile indicelui UP, pe care programatorul le va obine


dup rezolvarea ei. Dac nainte de rezolvare, programatorul are un UP
mai nalt la unele compartimente, acest nivel nu va micorat. Pentru
rezolvarea unei probleme care mrete indicele UP la cel puin un
compartiment, programatorul cheltuie 2 ore, n caz contrar 1 or.
Trebuie s alctuii un plan de studii, care ar avea nu mai mult de T
ore, conform cruia un programator nceptor (UP=1 la toate
compartimentele) ar atinge nivelul L la toate compartimentele,
rezolvnd tot odat ct mai multe probleme.
Intrare
Prima linie a fiierului de intrare conine un ntreg T numrul de ore
rezervate pentru pregtire. A doua linie conine numrul L (2 L 16),
iar cea de a treia numrul problemelor M (1 M 500, 2 T M).
Fiecare din urmtoarele M linii conine cte 8 numere, care descriu o
problem. Primele patru numere determin UP necesare pentru
rezolvarea ei la fiecare din compartimente. Urmtoarele patru indic
UP, pn la care pot crete indicii UP la fiecare din compartimente
dup rezolvarea problemei.
Ieire
n cazul posibilitii atingerii nivelului L la toate compartimentele,
prima linie a fiierului de intrare va conine numrul maxim de
probleme rezolvate. Cea de a doua linie va conine consecutivitatea
problemelor rezolvate, n ordinea rezolvrii, fr repetri. Dac nivelul
L nu poat fi atins, va fi afiat un singur numr 0.
Exemplu
Intrare
7
5
6
2 1 1 1
1 1 1 1
3 3 3 3
1 3 1 1
2 2 2 2
1 2 3 4

Ieire
4
2 1 4 3
2
3
3
5
2
2

4
1
3
5
2
3

5
1
3
5
2
4

5
1
3
5
2
5
147 | P a g e

12.14 Alchimistul27
Alchimistul Ion a descoperit Piatra Filozofal, cu ajutorul creia pot fi
realizate mai multe reacii alchimice de transformare a unor substane
n altele. Masa fiecrui reagent la nceputul reaciei i masa fiecrei din
substanele obinute n rezultatul reaciei sunt egale cu cte 1 gram. (n
alchimie legea conservrii masei poate fi nclcat).
Iniial Ion are un gram de plumb. Cu ajutorul Petrei filozofale Ion
poate transforma substana sa n alte substane, care ulterior de
asemenea pot fi prelucrate cu ajutorul Petrei filozofale. Efectund
reaciile una dup alta, Ion vrea s obin ct mai mult aur.
Scriei un program, care, avnd o descriere a reaciilor posibile, l va
ajuta pe Ion s obin ct mai mult aur.
Intrare
Prima linie a fiierului de intrare conine numrul ntreg K numrul
de substane participante la reacii (1K6).
Cea de a doua linie conine lista substanelor (aurul i plumbul sunt
prezente n toate listele). Denumirea substanelor nu depete 10
simboluri.
A treia linie conine numrul ntreg L numrul de tipuri de reacii
realizate de Piatra Filozofal (1L100).
Urmeaz L descrieri ale reaciilor. Fiecare descriere e format din dou
linii:
Prima linie substanele care intr n reacie.
Linia doi substanele rezultante.
Output
Programul va scrie n fiierul de ieire un numr cantitatea obinut
de aur, sau, n cazurile n care Ion poate obine orice cantitate de aur
textul QUANTUM SATIS

Rusia, Olimpiada naional la Informatic, 1999


148 | P a g e
27

input
5
plumb aur sulf mercur cupru
5
plumb
aur sulf mercur
plumb
aur cupru mercur
mercur aur
sulf
mercur cupru
mercur sulf aur
sulf mercur
aur

output

explicaii

plumb

plumb
mercur
aur

sulf
mercur
aur

mercur

cupru

aur

mercur

cupru

sulf

sulf

mercu
r
mercur

sulf

aur

aur

12.15 Paza prezidenial28


Enun:
Odat demult era o republic a absurdului. Era acolo tot ce-i rebuie
unei republici, chiar i preedinte cu castel. Planul castelului este un
dreptunghi, mprit n M x N ptrate unitare. Unele ptrate sunt
perei, altele libere. Fiecar ptrat liber e numit odaie. Preedintele,
fiind paranoic, a pus n unele odi fntni ascunse (cu aligatori la fund).
Apoi a decis s se pun peste tot unde era posibil n castel gardieni.
Ceea ce nu era de loc simplu. Gardienii sunt antrenai s trag imediat
ce vd pe cineva. Preedintele trebuie s plaseze gardienii astfel, nct
ei s nu se vad altfel se mpuc reciproc! Suplimentar, ei nu pot fi
plasai n odile cu fntni. Fiecare odaie are nu mai mult de un
gardian. Doi gardieni din odi diferite se vd reciproc, dac odile sunt
n aceeai linie sau coloan i ntre ele nu sunt perei

28

CEOI, 2002
149 | P a g e

Determinai numrul maxim de grzi n castel i indicai o amplasare a


lor.
Intrare
Prima linie din input va conine numerele ntregi M i N dimensiunile
castelului (1 M, N 200). Linia i din urmtoarele M linin conine N
numere ntregi ai;1; ; ai;N , separate prin spaiu, unde:
ai;j = 0 ptratul [i; j] reprezint o odaie liber (fr fntn);
ai;j = 1 ptratul [i; j] reprezint o odaie cu fntn;
ai;j = 2 ptratul [i; j] reprezint un perete;
Indicele i denot liniei, iar indicele j coloana.
Ieire
Prima linie a fiierului de ieire va conine numrul maximal K de
gardieni, ce pot fi plasai n castel. Urmtoarele K linii vor conine o
posibil amplasare a grzilor, pe fiecare linie fiind scrise coordonatele
unui gardian.
Exemplu
input
3 4
2 0 0 0
2 2 2 1
0 1 0 2

output
2
1 2
3 3

Explicaie

12.16 Metroul29
Metroul din Londra reprezint un sistem complex, care transport zilnic
milioane de pasageri (fig. 1). Din punctul de vedere al pasagerului,
metroul poate fi tratat ca o mulime de linii de tren i o mulime de
staii. n scopuri didactice, vom nota liniile de tren prin literele mari A,

Olimpiada Republican la Informatic, 2003


150 | P a g e
29

B, C, D .a.m.d. ale alfabetului latin, n total n linii, iar staiile prin


numerele naturale 1, 2, 3, ..., n total m staii (fig. 2).

Fig. 1

Fig. 2

Liniile de tren i staiile respective au fost proiectate n aa fel, nct


pasagerul, care pleac din orice staie x, s poat ajunge n oricare alt
staie y. Evident, n cazurile n care staiile se afl pe linii diferite,
pasagerul este nevoit s fac una sau mai multe transbordri,
schimbnd trenul n staiile n care se ntlnesc dou sau mai multe linii
de tren.
De exemplu, pentru a ajunge din staia 1 n staia 8 (fig. 2), pasagerul
poate s fac o singur transbordare n staia 2 sau dou transbordri
prima n staia 4 i a doua n staia 6.
Elaborai un program, care, cunoscnd planul metroului, staia de
plecare x i staia de sosire y, calculeaz numrul minim de
transbordri.
Intrare Fiierul text METROU.IN conine pe prima linie numerele
naturale n, m, x, y separate prin spaiu. Fiecare din urmtoarele n linii
ale fiierului conine numere de staii separate prin spaiu. Linia a 2-a a
fiierului de intrare conine numerele de staii ale liniei de tren A, linia
a treia a fiierului de intrare conine numerele de staii ale liniei de tren
B .a.m.d.

151 | P a g e

Ieire
Fiierul text METROU.OUT va conine pe o singur linie numrul
minim de transbordri.
Exemplu.
METROU.IN

METROU.OUT

4
1
2
7
5

9
2
6
6
9

1 8
3 4 5
8
4

Restricii. 2 n 26, 3 m 250, x y. Timpul de execuie nu va


depi 5 secunde. Fiierul surs va avea denumirea METROU.PAS,
METROU.C sau METROU.CPP.

12.17 Multimicroprocesoare30
Este cunoscut faptul, c capacitatea de prelucrare a
calculatoarelor moderne poate fi mrit prin includerea n componena
acestora a mai multor microprocesoare. n astfel de calculatoare, un
microprocesor prelucreaz datele numerice, un alt microprocesor
prelucreaz informaia grafic, un al treilea procesor prelucreaz
informaia sonor .a.m.d. Pentru a face schimb de date ntre ele,
microprocesoarele sunt reunite prin conductoare.
Presupunem, c un calculator personal conine n microprocesoare,
notate prin m1, m2, ..., mn. Prin rij vom nota numrul de conductoare

r r

r 0

ij
ntre microprocesoarele mi i mj. Evident, ij
i ii
.
n interiorul calculatorului, microprocesoarele m1, m2, ..., mn pot fi
instalate n anumite poziii, notate prin p1, p2, ..., pn. Prin dkl vom nota

distana ntre poziiile pk i

d kk 0

pl (vezi desenul). Evident,

Olimpiada Republican la Informatic, 2009


152 | P a g e
30

d kl d lk

p1

p2

p1

p2

microprocesoarele

p3

p3
m

poziiile

1
o posibil
variant
de instalare

Elaborai un program care determin poziiile n care vor fi instalate


microprocesoarele, cu condiia ca lungimea sumar a conductorilor s
fie minimal.
Input. Fiierul text MULTI.IN conine pe prima lini numrul ntreg n.
Fiecare din urmtoarele n linii ale fiierului de intrare conine cte n
numere ntregi, separate prin spaiu. Linia (i 1) a fiierului de intrare
conine numerele ntregi ri1, ri2, ..., rin.
n continuare, n fiierul de intrare se conin n linii cu cte n
numere ntregi, separate prin spaiu. Linia (n k 1) a fiierului de
intrare conine numerele ntregi dk1, dk2, ..., dkn, separate prin spaiu.
Output. Fiierul text MULTI.OUT va conine pe prima linie numerele
ntregi q1, q2, ..., qn, separate prin spaiu. Aceste numere indic poziiile
n care sunt instalate microprocesoarele, respectiv, m1, m2, ..., mn, cu
condiia c lungimea sumar a conductorilor este minimal. Linia a
doua a fiierului de ieire va conine numrul ntreg Lmin lungimea
sumar minimal a conductorilor ce reunesc microprocesoarele. Dac
problema admite mai multe variante de instalare, n fiierul de ieire se
va indica doar una din ele.

153 | P a g e

Exemplu.
MULTI.IN
3
0 10 50
10 0 100
50 100 0
0 1 2
1 0 3
2 3 0

MULTI.OUT
3 2 1
230

0 r 1000 1 d 1000

ij
kl
Restricii. 3 n 9 ,
,
. Timpul de execuie
nu va depi 2,0 secunde. Programul va folosi cel mult 32 Megaoctei de
memorie operativ. Fiierul surs va avea denumirea MULTI.PAS.

12.18 Roboii 231


Pe un teren de dimensiunile n m, divizat n patrele identice cu
laturi de lungimea unu, lucreaz q roboti. Roboii se deplaseaz pe
teren prin srituri, exact la fel ca cele ale calului din jocul de ah.
Pentru o bun funcionare, o dat pe zi toi roboii trebuie concomitent
s se adune n ptrelul cu coordonatele (s, t), unde ei snt conectai la
o sursa de alimentare (vezi desenul). Menionm, c n unele cazuri, n
funcie de poziia iniial a roboilor, nu toi din ei ar putea s se adune
n ptrelul (s, t).

Prin lungimea drumului parcurs de un robot vom nelege


numrul de srituri efectuate de robot n procesul deplasrii din
ptrelul
curent
n
ptrelul
cu
coordonatele

Baraje pentru selectarea lotului naional la Informatic, 2004


154 | P a g e
31

(s, t). Evident, lungimea total a drumurilor parcurse de roboi se va


calcula prin nsumarea lungimilor de drumuri parcurse de fiecare robot.
Scriei un program care calculeaz minimul lungimii totale L a
drumurilor parcurse de roboi pentru a se aduna n ptrelul (s, t).
Date de intrare. Fiierul text ROBOTII.IN conine pe prima linie
numerele naturale n, m, s, t, q, separate prin spaiu. Urmtoarele q linii
ale fiierului de intrare conin cte dou numere naturale x, y separate
prin spaiu coordonatele fiecrui robot.
Date de ieire. Dac toi roboii se pot aduna n ptrelul (s, t), n
fiierul de ieire ROBOTII.OUT se va scrie pe o singur linie numrul
natural L minimul lungimii totale a drumurilor parcurse de roboi. n
caz contrar, dac cel puin unul din roboi nu poate s ajung n
ptrelul (s, t), n fiierul de ieire se va scrie pe o singur linie
valoarea -1.

Exemplul 1.
ROBOTII.IN
4 4 1 1 3
2 3
3 2
3 3

ROBOTII.OUT
6

Restricii. 2 n, m, s, t 250 ; 1 q 10 000 . Timpul de execuie


nu va depi 3 secunde. Fiierul surs va avea denumirea
ROBOTII.PAS, ROBOTII.C sau ROBOTII.CPP.

155 | P a g e

Bibliografie
1. Sedgewick Th, Algorithms in C, 2001, Addison Wesley
2. Gibbons Alan, Algorithmic ghaph theory, 1999, Addison Wesley
3. ., , 1988, ,

4. .., ,
2001, ,
5. ., ,1981,
,
6. ., . , 1978,
,
7. Cormen Th., Leiserson Ch., Rivest R., Introducere n algoritmi.
Agora, Cluj, 2001.
8. Cristian A.Giumale, Introducere n analiza algoritmilor. Teorie i
aplicaie. Polirom, Iai, 2004
9. Ptru Bogdan. Programarea calculatoarelor. Teora, Bucureti,
1998.
10. Cerchez Em., erban M. Programarea n limbajul C/C++ pentru
liceu. Vol III. Teoria Grafurilor. Polirom, Iai, 2006.
11. ., ., .
. , , 1985

156 | P a g e

12. Corlat S., Corlat A. Grafuri. Noiuni, algoritmi, implementri.


Chiinu, Biotehdesign, 2012
13. Gremalschi A. . a. Broura Olimpiadei Republicane la Informatic.
2003 2013.

157 | P a g e

Abrevieri i notaii

- disjuncia (operaia logic SAU [OR] )

- conjuncia (operaia logic I [AND] )

- negaia (operaia logic NU [NOT] )

A B

- din A rezult B.

A B

- A este echivalent cu B

x X, x X

- x aparine X (x nu aparine X)

x X : Q

- submulimea elementelor x din X, care satisfac condiia Q

A B

- A se conine n B (A este submulime a mulimii B)

( X )

- mulimea tuturor submulimilor mulimii X

- cardinalul mulimii X

a1 ,..., an

- secven din n elemente

(a, b)

- pereche ordonat

A B

- produs cartezian al mulimilor A i B; mulimea tuturor


perechilor posibile (a, b) : a A, b B

a b

- valoarea elementului

b este atribuit elementului a .

- valoarea elementului

i este incrementat cu 1.

- valoarea elementului

i este decrementat cu 1.

- valorile elementelor

(a b) (b a)

158 | P a g e

a i b sunt interschimbate