Documente Academic
Documente Profesional
Documente Cultură
Informatica Intensiv
Informatica Intensiv
Mariana Mllosescu
I W
norma lea
I I
In enslv c++
Filiera teoretica ,
profilul real,
specializarea
matematica • informatica,
intensiv informatica
004(075.35)
007(0 75 .35)
L im bu j u l C++
© [UP 2006. Toate drepturile asupra acestei edit ii sunt rezervate Edi tu rii Didactice si
Ped agogi cc R.A ., Bucuresti. Orice preluare, partialf sau integrala, a textului sau a materialu lui
gra fic din accasta lucrare se face nu ma i ell acordu l scris al edit uri i,
Eficienta unui algoritm este evaluate prin timpul necesar pentru executa rea
algoritmului.
Pentru a compara - din punct de vede re al eficientei - doi algoritmi ca re rezolva ace easi
problema, S8 foloseste aceeasi dimensiune a dat elor de intrare - n (acelasi nurna r de
valor! pentru date Ie de intrare) .
De exemp lu, daca - pentru algoritmul de sortare, prin metoda selectiei directe - timpul de
1
executie este T{n) = n X(~ - I) = n -~ '
ordinul de complexitate al algoritmului este
2
O{n \ deoarece in calcularea lui se ia in considerare numai factorul determinant din
timpul de executie.
in functie de ordinul de comp lex itate, exista urrnatoarele tipuri de algo ritmi:
Ordin de Tipul algoritmului
complexita te
O(n) Algoritm liniar.
m Algorit m po linomia l. Daca m=2, algoritmul este patratic , iar dat a
O{n )
m=3, alqoritrnul este cubi c.
A lgoritm exp onential. De exemplu: 2 , 3 etc. Algoritmul de tip O(n!)
O{k") este tot de tip exponential, deoarece:
, n- 1
1x2x 3x4x ...xn > 2x2x2x...x2 = 2 .
O(logn) Alqoritrn loqaritmic .
Otnloqn) Alqoritrn Iiniar loqarltmic.
De exemplu , algoritmul de sortare prin metoda selectiei directe este un algoritm patratic.
Ordinul de comp lexitate este determ inat de structur ile repetitive care se executa cu multi-
mea de valori pentru date le de intrar e. in cazul structurilor repetitive imbricate, ordinul de
complexitate este dat de produsul dintre nurnarul de repetitii ale fiecarei structuri repetitive.
- - Structura repetitiva Numarul de executf ale Tipul
corpului structurii algoritmul ui
fo r \ i=l ; i<=n ; i=::'H: ) { ... . } f(n)=n/k --) O(n)=n Liniar
fo r (i=l ;i < =n ;i =i ~kl { ... . } f(n)= log,n --) O(n)= logn Loqar itrnic
fo r (i=l1 ; i>=n ; i=i/l:) ( ... . ) f(n)= log,n --) O(n)= logn Logarilmic
fo r (i=n ; i <=n ;i=i +p) { .. .. } f(n)=(n/p)"{n/q) = n2/(p*q) - ) Polinomial
for (i =n ; l<=n ; i= j +q) { .. .. } O(n)= n2 patratic
fo r (i =:1 ; ' <=n ;i=i - +) { .... } f(n)=1 +2+3+ ... +n =(n*(n+1 ))/2 - ) Polinomial
fo r (; =i ; j <=n ;l=i"--"-) { .. .. } O(n)= n2 patrat ic
I Clase de probleme
¥ ...
Probleme de enumerare
prin care S8 gasesc toate
Probleme de decizie
prin care se precizeaza daca
""
Probleme de optimizare
prin care S 8 identifica solutia
solutiile posibile exista sau nu eel putin 0 optima din mulnmea de solutii
soluue posibile
Generarea tuturor pe rmutarilor unei multirni de numere este 0 problema de enumerare, cauta-
rea unei valori precizate intr-un sir de numere este 0 problema de decizie, iar qasirea modahtatii
de plata a unei sume s cu un numar minim de bancnote de valori date este 0 problema de
optimizare.
Pentru rezolvarea aceleiasi probleme S8 pot folosi mai multe metode de construire a
algoritmilor. Ali invata t deja ca - pentru rezolvarea aceleiasi probleme - puteti lolosi un:
-7 algo ritm iterativ ;
~ algoritm recursiv .
Solutiile recursive sunt mult mai clare, mai scurte ~i mal user de urmarit. Alegerea
algoritmului recursiv in locul celui iterativ este mai avantajoasa in cazul in care solutiile
problemei sunt definite recursiv sau daca cerintele problemei sunt formulate recursiv.
Timpul de executie a unui algoritm recursiv este dat de 0 0(1) pentru n- O
formula recursiva. De exemplu, pentru algoritmul de T(n) =
calculare a sumei primeior n numere naturale. functia 0 (1)+T (n.1) pentru n,.O
pentru timpul de executie este prezentata alaturat, unde
8( 1) reprezinta tirnpul de executie a unei ope ratii elementare de atribuire a unei valori
sumei . Rezulta ca T(n)=(n+1) x0 (1), iar ordin ul de complexitate a algor itmulu i este O(n) la
l ei ca si cel al algo ritmulu i iterativ, i n cazul irnplernen tarf recu rsive , lieca re apel al unui
subprogram recurent tnseamna inca 0 zona de memorie rezervat a pentru e xec utia sub-
programuiui (variabilele locale ~i instructiuniie). Din aceasta cauza , i n aleg erea intre un
algoritm iterativ ~i un algoritm recursiv trebuie tinut cant nu numai de ordinul de complexi-
tate, dar ~j de faptul ca , pentru 0 ada ncirn e mare a rocu rst v itatii , alqoritrnii recursivi nu
mai sunt eficienti , deoarece tirnpul de executie creste. din cauza timpilor necesari pentru
mecanismul de apel ~i pentru administrarea stivei de sistem .
Veti lnvata noi metode de construire a alqoritrnilor - care va ofera avantajul CEl prezinta
fiecare 0 metoda gencrala de rezolvare care S8 poate aplica unci clase de probleme:
-7 m etoda backtracking ;
-7 metoda divide et irnpera:
-7 metoda greedy;
-7 metoda proqrarnar!l dinamicc.
Fiecare dintre aceste metode de construire a atgoritmilor se poate folosi pentru anumite erase
de probleme , iar in cazul in care - pentru aceeasi clasa de probleme - se pot lolosi mai multe
metodede construire a algoritmilor, criteriul de alegere va fi efic ienta algoritmului.
6 Tehnici de programare
Seop : identificarea prob lemelor pentru care trebuie enumera te to at e s ol utii le, fiecare
solut ie fiind forrnata din n eleme nte Xi, care apa rtin fiec are unor rnultimi fin.te Ai ~ i care
trebuie sa resp ecte anu mite c onditii interne .
Enuntul prob lemei 1: Sa se ge ne rez e toate p etm utettte m ultimii {1, 2, 3}.
Cer inta este de a enume ra toate posibilitatile de gen erare a 3 nu mere naturale din
rnultirnea {1, 2, 3}, astfel i ncat numerele gen erate sa fie distincte (c on d itia in tern a a solu-
=
tiei). 0 solutie a aces tei pro bleme va fi un vector cu 3 eleme nte: S {X1 ,X2,X3}, in care
elementul Xi repre zinta nurn arul care se va qasi, i n permutare, pe pozit ia i, iar mul tirnea Ai
reprezinta rnultimea nume relor din care se va alege un nurnar pent ru pozitia i. In acest
exemp lu, rnultirnile Ai coincid. Ele au ace leasi 3 elemente, fiecare elem ent repreze ntand un
numar. = =
Ai {1, 2, 3} A
Daca s-ar rezolva c1 asic ac ea sta problema , ar in sem na sa se genereze toate elem entele
produsului cartezian A1 x A2 x A3 = A x A x A = A 3, adica rnultirnea :
{(1,1 ,1) , (1,1,2), (1,1,3) , (1,2 ,1), .. ., (3,3,2), (3,3 ,3)}
dup a care se va verifica fiec are elemen t al mu ltimii dac a este 0 solutie a prob lemei, adica
daca ce le trei numere dintr-o solutie sunt distincte . Soluti ile obt inute sunt:
{(1,2,3) , (1,3,2), (2,1,3) , (2,3,1), (3,1,2), (3,2 ,1)}
Enuntul prob leme i 2: Sa se gene roze toate erenjememele de 2 elemente ale mullill7ii {1, 2, 3}.
Cerint a este de a enum era toate pos ibilitatile de gene rare a 2 nu mere naturale din
multirnea {1, 2, 3}, astfel i ncat nume rele ge nerate sa fie distincte (c o nd it ia interna a solu-
tiel). 0 solutie a aces tei probl eme va fi un vector cu 2 elemente : S = {X1,X2}, In care
elementul Xi reprezinta nurnarul care se va gasi In aranjament pe pozi tia i, iar rnultimea Ai
reprezinta rnultimea nume relor din care se va alege un nurnar pe ntru pozitia i. ;;;i In ace st
exemp lu, multirnile A i coincid . Ele au aceleasi 3 elemen te, fieca re elemen t reprezentand un
numa r. = =
A i {1, 2, 3} A
Daca s-ar rezo lva clasic aceasta problem a, ar lnsemna sa se generez e toate elemente le
produsului cartezia n A 1 x A2 = A x A = A 2, adica rnultim ea:
{(1 ,1), (1, 2), (1,3), (2,1), ..., (3,2), (3,3)}
I II furill a ticii 7
dupa care se va verifica fiecare element a! multirnii, daca este 0 soiutie a problemei,
adlca dac a cele doua numere dintr-o sol utie sunt distincle. Solutiile obtinu te sunt:
((1,2), (1,3) , (2.1), (2.3), (3.1) , P,2)}
Enu nt ul problemei 3: Sa se gonereze toate combinarile de 2 elemente ale multiml! (l , 2, 3).
Cerinta este de a enumera toate posibilitatile de generare a 2 numere naturale din multi-
mea {1,2,3}, astlel tncat numerele generate sa fie distincte (c ond it ia interna a solutiei),
iar solutiile obtinute sa fie distincte. Doua solutii sunt considerate distincte daca nu cont in
ace leasi nurnere . 0 solutio a acestei problems va Ii un vector cu 2 elemente : S = {Xl ,X2},
in care elementul Xi reprezinta nurnarul care se va gasi in combinare pe pozitia i, iar multi-
mea Ai reprezint a mu ltimea numerelor din care se va alege un numar pentru pozitia i. Si in
acest exemplu, rnultirnile Ai coincid. Ele au aceleasi 3 elemente, fiecare element repre-
zentand un nurnar. A i = {1, 2, 3} = A
Daca s-ar rezolva ci asic aceasta problema , ar insemna sa se genereze toate elementele
produsu lui cartezian A1 x A2 = A x A = A 2, adica rnultirnea:
{(1.1 ), (1, 2). (1.3) , (2.1)• ...• (3.2) . (3.3)}
dupa care se va veri fic a fiecare element al m ultirnii da ca este 0 solu tie a problemei, ad ica
daca cele doua numere dintr-o sc lutie sunt distincte ~ i daca sol utia obunuta este distin cta
de solut iile obtinute anterior. Sol utiile obtinut e sunt: {(1.2), (1,3) . (2.3)}
Enuntu l problem ei 4: Sa se qenorez e toate petmuterlte multitnii {l,2,3,4} care indeplinesc
cond1ia ca 1 nu este vecin eu 3. §i 2 nu este veein eu 4.
Cerinta este de a enumera toate posibilitatile de gene rare a 4 numere naturale din multirnea
{1, 2, 3, 4}, astlel tncat numerele generate sa fie dlstincte, iar 1 sa nu se invecineze cu 3, si 2
sa nu se invecineze cu 4 (co ndltia interna a solutiel), 0 solutie a acestei probleme va fi un
vector cu 4 e!emente: S = {X1 ,X2,X3 ,X4} , in care elementul Xi repre zmta nu rnarul care se va
gasi in permutare pe pozitia i, iar multimea A i reprezinta multirnea numerelor din care se va
alege un nurnar pentru pozitia i. in acest exemplu, rnultirnile Ai coincid . Ele au aceteasi 4
elernente. fiecare eleme nt reprezentand un numar. Ai = {1 , 2. 3. 4} = A
Dac a s-ar rezolva clasic aceasta problema, ar insemna sa se genereze toate elementele
produsulu i cartezian A, x A2 x A3 x A4 = A x A x A x A = A 4, adica rnultirnea:
((1 .1.1,1). (1.1.1.2) . (1.1 .1.3). (1.1. 1,4), .. .,(4,4.4,3). (4.4.4.4)}
dupa care se va verifica fiecare element al multimii daca este 0 solutie a probtemei , adica
daca cele patru numere dintr-o soluti e sunt distincte si daca 1 nu se lnvecineaza cu 3. iar
2 cu 4. Solutiile obtinu te sunt:
((1 .2,3,4) , (1,4,3.2 ), (2,1,4 ,3), (2,3,4,1), (3.2.1,4), (3.4,1 ,2), (4,1 ,2,3) , (4,3,2,1)}
Enuntu l problem ei 5: Sa se aranje ze pe tabla de §ah opt dame care nu se ataca intre
ele (problema celor 8 dame) ,
Cerinta este de a enumera toate posibilitatile de aranjare a 8 dame pe 0 tabla de sah cu
dimensiunea 8x8 (8 linii ~ i 8 coloane), astfel i ncat toate cele 8 dame sa nu se atace i ntre ele
(conditia inter na a solutiei), Deoarece nu se pot aranja doua dame pe aceea si coloana (s-ar
ataca intre ere) . tns ea rnna ca pe fiecare colo ana a tablei de san se va pune a darna . 0 solutie
a acestei probleme va fi un vector cu 8 elemente, S = {X1 ,X2 .X3,X4,XS,X6,X7,Xa} . in care
eJementul Xi reprezinta numarul liniei pe care se va pune dama in calaana i, lar rnultimea Ai
reprezinta rnultirnea liniilor pe care se poate aranja dama din coloana i. $i in acest caz
multirnile Ai coincid. Ele au aceleasi opt elements. fiecare element reprezentand un nurnar de
linie: A i = {1, 2. 3.4.5.6.7, 8} = A
8 Tchnici de programarc
Daca soar rezolva clasic aceasta prob lema, ar i nsem na sa se genereze toate elem entele
produs ului cartezian A, x A 2 x A3 x '" x As = A x A x A x ". x A = AS, adica mult imea:
{(1,1, 1, 1, 1, 1, 1,1), (1, 1, 1,1, 1, 1, 1,2), (1, 1, 1, 1, 1, 1, 1,3), " ' , (8,8, 8,8,8,8,8, 7), (8,8, 8,8,8,8,8,8) }
dupa care S8 va verifica fiecare element al rnult imii, daca este 0 solutie a problemei, adi ca
daca cele opt nu mere dintr-o solutie pot reprezenta coloanele pe care pot fi aranjate
dame le pe fiecare linie, astfel tncat sa nu se atace intre ele. Solutiile obtinute sunt:
{(1,5 ,8,6 ,3,7,2,4), (1,6 ,8,3,7,4,2,5), (1,7,4 ,6,8,2,5,3), " ., (8,3,1,6,2 ,5,7,4) ,
(8,4,1,3,6,2,7,5)}
Ob serv ati e Metoda cia sica de rezolvare a acestui tip de probleme necesita loarte mulle
operatu din partea calculatorului, pentru a verifica fie care element al produsului cartezian .
Presupunand (pentru simplificare) ca fieca re mult irne A i are m elemente , atunci algoritmul de
generare a elementelor produsului cartezian are cornplexitatea O(card (A,) x ca rd(A2) x ... x
n)
card(A n)) = Q(m x m x m x " . x m) = O(m Considerand ca algoritmul prin care se verifica
daca un element al produsul ui cartezian este 0 solutie a problemei (respecta co n d it ia interne
a solutie i) are complexitatea O(p), atunci co mp lcx itato a algoritmulu i de rezolvare a
problemei va fi Otp xm" ). De exemplu, i n algoritmul de generare a permutarilor, complexitatea
algoritmului de verificare a conditiei interne este data de complexitatea algoritmu lui prin care S8
verifica da ca numerele dintr-un sir sunt distincte. in acest algoritm , S8 parcurge sirul de m
numere - !?i pentru fiecare nurnar din slr - se parcurge din nou sirul pentru a verifica ~
daca ace I nurna r mai exista in sir. Complexitatea algoritmului este data de cele doua-e ~ I>
2) 2
structuri for imbricate: O(m _ > p = m . .
Metoda rccomandata pentru acest gen de probleme este metoda backtracking sau meto-
da c au ta ri i cu rev enire - prin care se reduce volumul operatiilor de gasire a tuturor solutitlor.
Met od a backtracking const ruleste pro gres iv vect orul solutiei , p ornind de la
primul el ement sl ada uqand la vector urmatoarole elem ente, cu revenire la
elemc ntul anterior din vector, in caz de insucces. Elernentul ca re trebuie ad auq at se
cauta in multime, printr e elementele care respecta conditi lle intern e.
Prin metoda back track ing se obtin toatc solutute problcmci, da ca ele exista. Pentru
exe mplificarea modu lui in ca re sunt construite solut iile, cons ider arn problema generarii
perrnutar ilor rnult irnil {1, 2, 3, "" nJ (A, =A 2= '" =A n=A= {l, 2, 3, .. .. n} ).
PAS1 . Se alege primul element al solutiei ca fiind primu l element din rnultirn ea A. in
exem plu, x1=1 , adica primul nurnar din perm utare este 1.
PAS2. Se cauta al doilea element al solutiei (X2). Pentru a-l gasi, se parcurg pe rand ele-
mentele rnultirnii A .i, pentru fiecare element i al mul\imii, se verifica daca respecta
con dit iile interne . Cautarea continua pima cane 58 gase!?te primul element din
rnullimea A care Indephneste co ndtti a lnterna, dupa care se opreste. in exemplu, se
cauta nurnarul de pe a doua pozitie a perrnutarii, verificandu-se caca al doilea nurnar
din permutare este diterit de primul nurnar. Se parcurg prirnele doua elemente ale
rnultirnii A si se gase.te elementul x2=2, dupa care procesul de cautare se opreste.
PAS3 . Se cauta al treilea element al solu tiei (X3). Cautarea va lo losi acela si algoritm de
la Pasul 2. in exemplu, se cauta nurnarul din pozitia a treia din pe rmutare. Se
gase.te elementul x3=3
PA S4. Presupunand ca s-au ga sit primele k eleme nte ale solutiei, X1 , X2 , X3 , ... , Xk . se
trece la cautarea celui de al k+1-lea element al soluliei, Xk+1. Cautarea se va face
astfel: se atribuie pe rand lui Xk+1 elemente!e multirnii A , pa na se gase ~t e primul
element i care l ndeplineste co nditia interna. in exernplu , co nditia mterna este ca
Informatica 9
numarul din po zitia k+1 a perrnutarii sa nu fie ega l cu nici un ul dintre numerele
din pozitiile anter ioare lui k+1 . Pot sa apa ra dou a situatii:
a. Exista un eleme nt i i n rnultirnea A . astfel Incat Xk+1 = i sa fie element al solutie i
prob lemei . i n acest caz , se atribuie elementului Xk+1 al solut iei valoarea i, dupa
care se verifies dac a s-a gasit solutia problemei. in exempl u, presupunem ca pe
nivelul k+1 s-a gasit nurnarul 4. Se verifica dac a s-au generat toate cele n
elemente ale multi rnii S, adica daca s-au gasit num ere pent ru toate cele n pozitii
din permuta re (k=n). Dad! s-a qasit solutia problemei , atunci se afiseaza solutia :
altfel , se cauta urrnatorul element al solutiei. reluandu-se opera tiile de la Pasu l4 .
b. S-au parcurs toate elementele rnultirnii A ~ i nu s-a gasit nici un element i care sa fie
elementul Xk+1 al soluuei problemei. Insearnna ca trebuie sa revenim la elementul k
al solutiei - Xk . Asadar, se considera generate primele k-1 elemente ale solutiei: X1,
X2, . . ., Xk-1 si, pentru element ul Xk al solufiei, se reia cautarea , cu urrnatorul
element din multirnea A , adica se reiau operatiile de la Pasul 4 pentru elementul
Xk al solutiei, Insa nu cu primul element din multirnea A, ci cu elementul din multi-
mea A care se ga se~te imediat dupa eel care a fost atribuit anterior pentru elemen-
tul Xk al solutiei in exemplu, luand in considerare modul in care au fost generate
primele k numere ale permutarii, in poziua k+1 , orice num ar soar alege, el mai
exista pe una dintre cele k pozitii anterioare , ~i se revine la elementul k, care presu-
punem ca are valoarea 3. Se qenereaza in aceasta pozitie urmatorul nurnar din
rnultirnea A (4) si se verifica oaca el nu mai exists pe primele k-1 pozitii ale permu-
tarii, iar daca exista, se gene reaza urrnatorul element din rnultimea A (5) s.a.rn.d.
PASS . Algoritm ul se incheie dup a ce au fost par curs e toa te elemente le rnulti rnii A pentru
ele mentu l X1 al solut iei . in exemplu , algoritmul se incheie dupa ce s-au atribuit pe
rand valorile 1, 2. .. ., n, ele mentului de pe prima poz itie a per mu tar ii.
Generarea tuturor perrnutarilor rnultirnii {1, 2, 3}
Pentru simplificarea implernentarii, toate aeeste date ~i structur i de date sunt deelarate
globale . deoareee valoarea pentru varful stivei 5 8 va transmite mai use r, int re subpro-
grame - ca variabila globala.
bprograme
Algoritm ul va Ii implementat prin:
-7 un subprog ram - care va fi acelasi pentru to\i algoritmii de rezolvare prin metoda
backtr acking (parte fi xa) ~i care descrie strategia general a backtracking si
-7 subprogramele care au ac eeasi sernniti cat ie pentru toti algoritmii , dar al carer conti-
nut difera de la 0 problema la alta, depinzand de condltlile interne ale solutie i.
Sernni frcaua subprog ra melor folosite este (se va considera ea exemplu generare a
permut arilor rnultirnii { 1, 2, 3, ... , n}}:
-7 Subprogramul an i. t (tunctie proce curala). Se initializeaza elementul din varful stivei
(elementul k). in acest element se va imegistra urmatorul element al solutiei, Acest
element S8 initializeaz a cu a valoare care nu face parte din rnultime a Ak considerata,
urrnand ca in urrnatoru pasi ai atqcntmutui sa se atribuie ace stui element prima
12 T ch nici de progr umare
valoare din rnultirne a Ak. in exemp lu, nivelu l k al stivei S8 va initia liza cu valoarea 0
(s t [k] = 0). urmand ca la pasul urrnator sa i se atribuie ca valoare 1. ad icii primul
numii r din rnultimea (1. 2. 3• ...• n}.
void i n i t ()
{ s t[ k ] ~ O ; }
~ Subproqramul su cce s or (functie ope rand) . Verifica daca rna i exis ta in multirnea Ak
un element pent ru nive lul k al solutiei (un succesor). Daca mai exista un succesor, S8
trece la urmatorul element din rnuttirnea Ak . iar functia va returna valoare a 1 (tru e).
Dacii nu mai exist a un succes or. functia va returna valoarea a
(false). Valoarea
retu rnata de fun ctie S8 va atribui variabilei as . Initial , valoarea variabilei de memorie
as este 1 (true) - se presupu ne ca mai exista un succesor. in exemplu , subproqra rnul
succes or va verifi ca daca pentru pozitia k din permutare mai exists un nurnar. Dac a
nurnarul i de pe nive lul k este rnai mic dec at n , pozitiei k i S8 va atribui numarut
urrnat or , i+ 1. ~ i fun ctia va retu rna valoarea 1 (Irue). iar daca nurnarul de pe nivelul k
este n , lnsearrma ca pe aceasta pozitie din permutare nu mai poate fi pus nici un
a
nurnar - si functi a va returna valoarea (false).
i nt succesor ( )
{ i f r s t l k l c n) ( s t [ k ] + -; r e tu r n l; )
e l se r eturn 0 ; )
-7 Subproqrarnu l va L'i d (functie operan d). Ver ifica dac a valoarea atribuita elem entului
Xk al solutiei Indeptineste co n ditla d e cont in uare , adica poat e fi con siderate eel face
parte dm solutia prob lemei (daca succesorul ga sit este element al solutiei). Daca este
Indeplinita conditia ( S 8 eva luea za exp resi a prin care este des crisa cond itia), functia va
returna valoarea 1 (true); altfel , va return a valoarea a (false). Valoa rea ret urnata de
fun ctie S8 va atribui va riabilei ev . Initial , valoa rea va riabile i ev este 0 (fa lse ) - S8
presupune ca succe soru l gasit nu este elementu l k al solutiei , in exemplu, subpro-
gramul valid va verifi ca daca num arul din pozitia k nu mai exis ta in cel e k-1 pozitii
ant erioare. Daca num arul nu i ndeplines te aceasta conditie , functia va returna valoarea
a (falsa ).
int valid ()
(for int i -l ; i ~ k ; i ~ +
i f bt[l]=::. .,.,; t [ LJ) retu rn 0 ;
return 1 ; }
-7 Subprogramul sol u t.r e (Iunc tie opera nd). Verific a daca s-au obt inut toate elemen tele
solu tiei . i n exemp lu, subprogramul s olutie va verifica dace au fost gasite toate cere
n elemente ale soluliei , adica daca s-au gasit solutii de aranjare i n permutare pen tru
toat e cere n numere . Daca s-a gasit solutia , subprogramul intoarce valoa rea 1 (t ru e):
altfel , in toa rce valoarea 0 (falsa).
int solutie ()
{return ):= =:1 ; }
-7 Subprogramul tipar (functie proc ecurala). Afiseaz a elementele sol utiei, De obicei ,
afisarea solu tiei consta i n afis area valorilor din stiva.
void tipar ()
{for (int i=l ; i ~ =n ; i - + ) cout« s L [ i }« " " .
c o ut«endl ;}
Info rmatica 13
Num aru l de o rdi ne al Eteme nte le s o lut iei
ele mentelor s olut ie; I
•
n an1 an 2 Xn
2
8i1
a21
a i2
a22
sub programul s uc cesor
8ij
a 2j
aim
82m
I I
k=k+1
....
X;
X2
k= k-1
Im p lem enta re a rccu rslva - Prelu cranle care se fac pentru elementul k al solutiei se fac
si pentru elementul k+1 al solutiei ~i aceste prelucrari pot f apelate pentru elementul k+1
al solutiei , iar trecerea de la elementul k al solut iei la elementul k+1 al solutiei se face prin
apelul recursiv al acestor prelucrari. i n algoritmu l backtrac king implementat iterativ, reve-
nirea la nivelul k -1 trebuie sa se taca atunci cand pe nive lul k nu se gase ~te a valoa re
care sa l ndeplineasca co nd lt ll le i nte rn e. In caz ul implernentarii recursive. co nditia de
14 T ch nici de p rogra marc
b aza este ca pe nivelul k sa nu S8 gaseasca 0 valoare care sa ln depline asca co nd iti il e
i nte rn e. Cand S8 ajunge la con ditia de baza , lnce te aza ape lul recu rsiv ~ j S8 revine la
subprogram ul apel ant, adic a la subpro qrarnul i n ca re se pre lucreaz a elemen tul k-1 al
solu tiei, iar i n stiva S 8 vor reqasi valorile prel ucrate anteri or i n ace st subprogram.
Deoar ece apelu l recursiv S8 face in funct ie de valoarea varfulu i stive i (k) . aceasta valoare
S 8 va transmite, intr e subprograme, prin intermediul pararnetrilorde cornu nic atie.
c out«endl ;) c out«endl i }
vo i d bt; ( ) void bt (i n t k )
( k=l ; ( i n i t Ik ) ;
i n i t () ; while ( s u c c e s o r {k ) )
while (k> O) if (vali d I k i )
{ a s = 1; ev = O; if l s o l u t i e ( k ) ) tipar ( ) ;
while (a s && ! e v ) e l se D-c (k..,.l ) i }
( a s =s u c c e s 0 r ( ) ; v oid ma i n ()
i f {a s ) e v =val id() ; } {cou t «" n = n . cin» n;
i f ( a s) btl l) ; )
if (s olutie {} ) t i p a r () ;
e lse ( k ++; .i n i t () ; )
else k- - ; ) )
v oid main ()
(cou t«" n = " ; ci n» n;
bt . ) ; )
int s u c c e so r () i n t 3ucceso r( i n t k)
{if ( s t [ k ]< I ) {i f ( s t [l: ]< s t.[ k - l ]+ I )
( s t I k ] < s t [k] +1 ; retu rn I ; ) {s t [k ] <s t [ k ] + 1; return I ; }
el s e retur n O; l e l s e re t u r n O ; }
int valid () in t valid() { r etu r n l ; }
{r e t u r n t ; l i n t 301utie( i n t k}
in t solu:ie I.) { r eturn k== n ; }
{ retu r n ;:""-"'!1; } v oi d t i par')
v oid t i pe r () l i n t i , x=O ; c o ut« " { " ;
li n t i ,x=O ; cout« " { "; f or (i='1. ;i<=n ; i++)
for (i=l ;i< = n ; i++) if (str il ~~I)
if (st [ i]~ ~ l) {c ou t « i «" I "; x=l ; }
{c ou t c c i c c" t" ; x =l ; } if (x ) c out« ' \ b ';
i f ( x) cc u ccc ' \ b ' ; coo t .c-c'" ) " < ce n cn , }
o o u t c-c" I "«endl; } cout«end l ;}
v oid b t () v oid bt ( i n t ~:)
{ / I p d r t e u : ixa a alg8ritmu!ui } { / / p a r c. e a ~ixa a algor i tmelui }
void mc i r. \ v oi d main l)
(cout«" n = ". c i n o o -n : {cout«" n ="; c i n» n ; bt. r Lj r }
bl,) ; }
Ob s e r va t i e. Caracterul escape
' \ b ' es~e c a ract0rul Backspace
($ terae u ltimul caracte r di~ $~r\
111 fo 1"111 a t i eli 19
Scrieti urmatoarele programe, in care sa folositi metoda backtracking pentru
generarea produsului cartezian.
1. Se considers n rnultimi de cuvinte Ai, fiecare mult irne avand nj
cuvinte. Sa se genereze toate textele de n cuvinte care se pot forma cu cuvintele din aceste
rnultimi, cuvan tul i din text apartinand muttirnii Ai.
2. i ntr-un restaurant, un meniu este format din trei feluri de rnancare. Exista patru
preparate culinare pentru felul unu , cinci preparate culinare pentru felul doi ~i trei prepa-
rate culinare pent ru felul 3. Sa se gen ereze toate men iurile care se pot forma cu aceste
preparate cul inare .
3. fntr-un restaurant, un meniu este format din trei feluri de rnancare. Exista patru preparate
culinare pentru felul unu, cinci preparate culinare pentru felul doi :;;i trei preparate culinare
pentru felul 3. Fiecare preparat culinar are un pret :;;i un nurnar de calorii. Sa se genereze
toate meniurile pe care Ie poate comanda 0 persoana, care sa nu depase asca suma s :;;i
nurnarul de calorii c. Datele se citesc dintr-un fisier text, astfel: de pe primul rand suma s si
nurnarul de calorii, de pe randul urmator, in ordine, pretul fiecarui preparat culinar, :;;i de pe
ultimul rand, in aceeasi ordine, calariile fiecarui preparat culinar.
4. Pen ru 0 rnultim e oarecare A , cu n eiemente , sa se genere ze toate submu ltirnile care au
suma elementelor eqala cu s . Numarul de elemente ale rnultimii, elementele rnultimii A
si valoare a pentru suma s se citesc de la tastatura .
5. Sa se afiseze toate numerel e cu n cifre (1~ n~ 1 0) care au proprietatea ca sunt formate
numai din cifre pare, in ordine descrescatoare .
6. Sa se afiseze toate numerele format e din cifre distincte cu proprietatea ca suma
cifrelor este S. Valoarea variabilei S se citeste de la tastatu ra.
Sa se afiseze toate secvente le de n Iitere (n nurnar natural par , citit de la tastatura )
din rnultirnea {A ,B,C,D}, secvente care se con struiesc astfe l: nu se asa za dou a litere
identice una langa alta ~i trebuie sa se foloseasca exact n/2 litere A.
8. Se citesc de la tastatura un nurnar na ural n ( 0 < n ~ 1 0) ~ i apoi n numere naturale a"
a2, a3, ..., an. Sa se afise ze pe ecran toa e posibilitatile de a in ercala intre taa te cele n
numere opera orii + ~ i - astfe l l ncat, eva luand expresia obt inuta , de la stanqa la
dreapta, la fiecare pas , rezultatul obti nut sa fie strict pozi tiv.
9. Sa se rezalve - in rnultirnea numerelor naturale - ecuatia 4x+3y+2xy=48. lndlcatle.
Solutia are 2 elemente: x ~ i y. Ele pot lua valori in intervalul (0,16]. Limita inferioara a
intervalului este 0, pentru ca numere le sunt naturale. Limita superioara s-a deterrninat
considerand, pe rand, situatiile lirnita x=O si y=O. Consideram rnultirnea A={0,2,3,... ,16}.
Problema se reduce la generarea produsului cartezian cu conditi e A xA - solutia contine
o conditie intem a su plime ntar a: elementele ei trebuie sa verifice ecuatia.
O. Se citesc n cifre distincte ;:;i un nurnar natural x . Sa se generez e toate numerele care se
pot forma cu ace ste cifre ~ i sunt mai mici decal nurnarul x De exemplu, pentru cifrele 0,
1 ~ i 3 ~ i nurnarul x= 157, se genereaz a 1, 3,1 0,11 ,13,30 ,31 ,33,100,1 01,103, 110,
111, 113, 130, 131, 133. Indicalie. Se calcu leaza nurnarut de cifre male nurnarulu i x .
Pentru rnultirnea A fermata din ~el e n cifre, se qenereaza produs ele carte ziene A P, cu
t sp sm . Elementele produsul ui cartezian sunt cifrele nurnarului care se forrneaza.
Pentru ca un elem ent al produsulu i cartezian sa fie solutie, trebu ie ca primu l element sa
fie diferit de 0 (cifra cea mai sernnificativa din nurnar nu rebuie sa fie 0), iar numarul
format cu m cifre sa fie mai mic decat nurnarul x.
1.Sa se gene reze toate num erele naturale , cu cel mult n cifre ( n ~ 1 0), care sunt formate
numai din cifre pare, in ordine strict cresca toare.
20 Te h nici de programare
12.Sa se genereze toate numerele naturale , cu n cifre , care cont in p cifre k . Valorile pentru
n, p ~ i k se citesc de la tastatura.
13.Se citeste un nurnar natural n. Sa se genereze toate numerele naturale care, repre zen-
tate i n baza 2, au acelasi nurnar de cifre de 0 ~i acelasi nurnar de cifre de 1 ca ~ i
reprezentarea in baza 2 a nurnarulu i n.
14. Pe un bilet exista 12 pozitii care pot fi perforate. aranjate pe 4 linii si 3 coloan e. Sa se
generez e toate posibilitatile de perforare a celor 12 pozitii, astfel tncat sa nu existe doua
pozitii alaturate neperforate. lndicatie. Considerarn rnultirnea A , fermata din 12 elemente,
fiecare element reprezentand 0 pozitie care poate fi perforata, si multimea B={0.1}. Se
defineste Iunctia f :A-;B astfel: daca pozitia i este perforate , atunc i f(i)=1: altfel, f(i) =O.
Problema se reduce la generarea produ su lu i cartezian B 12 - solutia coni ine 0 conditie
interna supl irne ntara: pozitia k care se adauqa, nu trebuie sa fie neperforata (nu trebuie
sa aiba valoarea 0) daca pozitia k-1 sau pozitia k-3 este neperforata (are valoarea 0).
~
12
Se gene reaz a toate func tiile inje ctive f:A ~B , unde card(A)=m si
f{x) 12
card(B)=n . Pentru sim plifica rea algoritm ului vom consid era multi-
mile A ={1,2,3,.. .,m} :;;i B={ 1,2,3,.. ..n}. 0 solutie este ferma ta din m 13 ~ 12
elemente. Elementul k al solutiei reprezinta valoare a fun ctiei f(k) . f{x) 13
Deoarece valoarea functiei f (k) apartine rnult imii B, in stiva se vor
~
21
genera numere din multirnea {1,2,3,... .n}. Din defin itia funct iei
f {x) 2 1
injective . f (i);:f(j ). pentru or ice i;toj . Rezulta ca . pentru ca functia sa
fie injectiva, treb uie ca rnsn. Prob lema se reduce la generarea i n
stiva a uturor aran jamentelor de n elemente luate cate m . Solutiile
vor fi afisate sub forma ta be lului de v ariati e al fun ct iei . De
23
31
-ilH+
f{ x) 23
1 12
exernplu, daca A={1.2} :;;i B={1 ,2.3}. solutiile :;;i modul in care vor fi 31
afisate sunt prezentate ataturat .
Fa\a de pro gramul anterior. nu se va mod ifica deca t subprogramul
32 12
de afisare a solutiilor tipa r () . 32
v o id t i.pa r ( i
{in t . i; o ou ti-cc " x I ";
fo r (i = 1 ; i <= m; L++) c o u t « i «" "; cou t « end l;
f or ( .i=l ; i<=m ; i ++) cout«" - - - - - "; c ou t« e n dl« " [ (x ) I n •
f or ( i = 1 ; i <=m; i ++ ) cout« s t [ i ] «" "; cout«endl«e ndl ; }
void mai n ()
(cout«" n uma l:1... J de elemen te ale mu l t.Lru .i i l-.= "; c i. n>'>: ;
cou c-c-cvn ums r t.I ie e Le rne n t.e a e In'J t":'mii E= "; c in» n; b t:. ( ) ; }
c o u t « e n dl ; } cout«endl ; }
void btl } void b t (i n t .K.)
( I l p a r t e a f ix a a algori ~ffiului ) {/ / p a r t e a fi xa a algo~ i tmulu ~ }
voi d ma i n (l void main ()
{cout« " n = " ; cin» n; {cout.cc "n > " . cin » n ;
cou t« " m= c i n » m: b t () ; ) c c u t.c-cv n;-. ": c in» ~,~
· ~~~~
bt ( 1 ) ; ) __~
Informutica 23
Algoritmul de gen erare a combinarilor poate fi folosit i n problemele de gen erare a
tuturor posibilitatilor de a forma din n obiecte grupuri de m obiecte care sa aiba
anumite proprtotati , De exem plu, din n obiecte trebuie sa se distribu ie unei persoane m
obiecte, care sa contina obligatoriu obiectul p ~i sa nu cont ina obiectul q. Sa se genereze
toate posib ilitatile de a forma grupuri de m astfel de obiecte. Pentru simplifica re vom
considera rnultimea obiectelor ca fiind {1 , 2, 3, ..., n} . Valorile pentru nurnarul de obiecte
n, nurnarul de obiecte din grup . rn, ~i indicii obiectelor p ~ i q - se citesc de la tastatura.
Deoarece obiectul p face parte obligatoriu din grupul de obiecte, el va fi memorat ca prim
element al solutiei (s t [ 1 ] =p ), iar subprogramul bt () va genera numai urrnatoarele m-1
elemente ale solutiei. Se rnodifica ~ i conditia de continuare a construirii solutie: (subpro-
gramul va l i d () ), deoarece obiectele p si q nu pot fi elemente ale solutiel.
#incl u de < i o s t r e a m . h >
t ype d e f in t s t i va Ll Ou l .
i nt , m, p, \ , k , e v ,a s ;
s ti v a s ;
void Ln i r t ) { if ( k ==2 ;: [ k ] = Oi else s: l kJ =sl:[k-l~ i }
int s acce so r () {! 11 - tel ca :'n ex ernp Lu I a n e r i o r }
in t va lid ()
(re tu rn s t I k ] ! = p && st [ k] ! = q; )
in t sol u tle() ( l il a .e l c a in e x emp Lu L an t e r i.o r l
void : :'?a r ( ) { Ili a f e L c a :'!1 e xemp Lu I an te r ior }
voi d bt (I
{k = 2; a n i t . ;
wh i le (k > l .
IlIa :-e : ca ::1 e xe rnp Lu a n t e r i.o r }
vo i d mai n ()
{cout«" n = " ; c i n» n; cou t «" m=- " ; c in» :n;
cout«" p = " ; c in» pi c ou t « " q = " ; cin» q i
s t [ l ]=p ; bt(1 ; }
void bt () void bt : i n t k)
{/ / pa r t e a fi x~ 3 al goritmul ui } ( / Ipar t ea fix~ a al g o ritmul u i )
void ma i.n () void rna i n ( )
{cc u t.c«".n> "; c i. noc- n : bt() r I (cout«" n =!l i c i. ncc- n , bt (l j ; }
A!go ritmul de generare a tuturo r partiti ilor unui nurnar natural poa te fi folosit 'Ii in alte
probleme. De exemplu , gc nerarea t utu ror post bitl ta ti lor de p lata a unei sume cu
ba nc no te de va lori date.
Problema se reduce la gene rarea tuturo r partitiilor unui nu- 25 = 5+5+5+5+5 (01=5)
mar natural nenul s u m a, a partitie fiind 0 descompunere a 25 = 5+5+5+10 (01=4)
numarului suma in surna de m numere naturale, nenule , cu 25 = 5+10 +10 (01=3)
valari apartinand rnultim ii A={a1,a2, _.., an}. Alaturat, sunt
prezenta te toate partitiile sume i 25 pentru bancnate cu valori apartinand rnultimii A={5, 1OJ.
Fala de problema anterioara , apar urrnatoarele modificari:
-7 Deoarece suma suma se descompune in valori precizate , apartinand rnultimii A ,
aces te valori se memoreaza in vectorul a, care are lungimea loqica n (numarul de
valori ale banenotelor) .
-7 Un elem ent al solutiei este indicele valori i bancnotei din vectorul a, adica un element
din multimea {1 ,2, , n} .
-7 0 solutie a problemei va fi fermata din m elemente , alese astfel l ncat suma valorilor
bancnotelor corespunzatoare lor sa fie eqala cu nurnarul suma. Altfel spus: solutia se
obtine atunei cane surna s=a[st[1]] +a[st[2]]+ .-. + a[st[k-1]]+ a[st[k]] are valoarea suma .
26 Tehnici de progra ma r e
~ Co n dit ia de co ntinuare este ca suma valorilor termenilor qenerati, 5 , sa fie mai mica
sau eqa la cu surna (sss u rna). 0 sclutie cornpleta obtinandu -se atunci cane s=suma .
Atun ci cand S8 urea In stiva , S 8 adu na la surna valoarea bancnotei cLJ indicele k :
s t e e Est [k ) ] , iar cand S8 coboara i n stiva, 58 scade din surna valo area bancnote i
cu indicele k : s - =a [s t [ k] ] si valoarea bancnotei cu indicele k-1 : 5+ = a [s t [ k -1] ] .
-7 Deoarece este pos ibil ca - pentru anumite valori ale sumei suma ~i ale valorilor
bancnot elor - sa nu existe nici 0 solutie, 5 8 folos este variabila de tip logic est e, care
are valoa rea 1 (true), daca exista cel putin 0 solutie , ~ i 0 (false), In ca z contr ar
# includ e <l o s t r e a m . h >
t ype d e f int s t iv a [ lOO ] ;
int n , k , ev , as / s= O ,su ma ,e sLe~O ,a[ lOJ ;
stiva st;
vo id .i n i.t; (i
{ i f ( k ~~l) s t [k J ~ D ;
e l se s t[k] =s t[k -l] -l ; }
i nt s u c c e so r- ()
{ i f \s t[k]<n) { s t [ k] = s t [ k ] + 1; r e t urn I ; }
else { s- = n [st [ k- l ] ]; retu r n Oi l }
int va l i d ()
{ if ( s l'a [s t [ k ]] < = s u ma ) { s + = a [ s t [ k ] ]; r etu r n I ; }
e l se re t urn O; }
int s ol ut i e ( )
{retu rn s==suma ; }
void t Lpe r L)
{int i , j ,p ,es:e=i ;
fo r ( i=l ;i<=c: n ;i+l· )
(for ( J ~ ], p ~ C; j < ~ k ; j ++ ) if (i~~ s tl j J ) P++ ;
if (p != O) co u t «p«" "'''« a [ i J«'' + ";}
cout« ' \ b ' « ' \ b '« " " «endl; s -:- =a [st [k] ] ; }
void bt( ) { l l p b c t e a fi x ~ a al g o r i trnu l ui }
void mai n ( )
{cou t « " n = " ; ci n» n;
for (i nt i=l ;i<=n ;i'~ + )
{cou t .c-c vv c Ioc r c benc not a "<c i c-c'": II . cin» a [ i ];}
coun-ce " suma« " ; cin» s u ma; b t () ;
i f ( !este) oou t-c-c vI mp o s i.b iL'" : }
.---- -.../."0 Scrieti urmatoarele programe, in care sa tolositi metoda backtracking pentru
T CIJ1l1 generarea tuturor partitiior unui numar natural.
1. Sa se genereze toate descompuneri le unui numar natural n in
nume re naturale distincte.
2. Sa se genereze toate des compunerile unui nurnar natural n in numere prime .
3. Sa se genereze toate descompunerile unui nurnar natural n in surna de 3 si 5
4. 0 bara are lungimea L. Se considera n repere de lungimi diferite . Sa se genereze toate
posibilitatile de a tara bara dupa reperele existente , fara sa rarnana rest ta taiere , un
reper putand fi folosit de mai rnulte mi. Se poate ca unele reper e sa nu fie folosite Se
citesc dintr-un fisie r text, de pe primul rand , lungi mea barei - L si numarul de repere - n.
iar de pe urrnatorul rand, reperele . Numere le de pe un rand sunt separate prin spatiu.
Informat icii 27
5. Pentru realizarea unu i chestionar exists n Intrebari , fieca re int rebare avanc un punctaj .
Nurnarul de i ntrebari lli pun ctajul fiecarei Intrebari S8 cttesc dintr-un fisier tex t. Sa S8
genereze toate chestiona rele care au i ntre a ~ i b Intrebari distlncte ~ i un punctaj total
intre p si q puncte. Valo rile pentru a, b , p ~i q se citesc de la tastatura.
6. Sa S8 gas easca mo dalitatea de plata a une i sume cu un numar minim de ban cnote cu valo ri
date.
Pentru simplificarea algoritmului vom considera rnulnrnea A={1,2,3, " " n}. 0 partitie va fi
fermata din m rnultimi, cu t srnsn . Solutia va fi rnernorata i n stiva ~i va avea n eleme nte,
fiecare element k al solutiei reprezentand rnultirnea i (1,;i'; n) careia ii apartine elementul k din
multirnea care se partifioneaza : sl[k]=i In searnna eli elementul k din rnu ltirnea A face parte
din rnultim ea i a part itiei . in c adrul un ei pa rtitii nu intereseaza ordinea in care apa r elementele
rnultimii A . Cel ma i mare nurnar care va fi generat i n stiva reprezinta nurnarul de rnultirni m in
care a fast descornpus a rnultirnea A . i n plus, numerele generate i n stiva trebuie sa apartina
unei multimi de numere consecutive care incepe eu 1, deoarece
partitia nu conune rnultim i vide. Ala turat , sunt prezentate toate Parti!iile Sliva
partitnle mu ltim ii ( 1,2,3) si con tinu tul stivei pentru fiecare dintre ere. i n (1, 2, 3} 111
exemplu, nu exista solutia 1 3 3 deoa rece aceste valori nu apartin (1,2}{3) 1 12
unei multirni de numere consecutive (nu se poate ca un element din (1,3}{2) 1 2 1
. {1}{2, 3) 122
multimea A sa apart ina rnultirnii A 1, ~i alte doua elemente rnu ltirni
I _(1 ) (?H3 ) 123
A3, deoarece ar insemna ca rnultimea A2 este vida).
Conditi a de conti nua rc este asiqurat a pr in modul in care es te ales succesor ul s t [ k]:S;k ,
ceea ce Ins earnn a ca elementul k din multirnea A nu poate apartine dec at unei partitii a! carer
numar este mai mic sau cel mult egal cu numarul de ordine al elementulu i. Altfel spus, daca
pana la nivelul k numarul maxim atribuit pentru 0 partitie este i, acest nurnar reprezentand
nurnarul de rnultimi ale partitiei care exista i n solutia partiala , pe nivelul k+1 elementul poate
avea una dintre urrnatoare le val ori:
-7 Orice valoare de la 1 la i , ceea ce tns ea rnn a ca elementul k+1 din rnultirnea A se
adauqa la una dintre multirnile care exis ta deja .
-7 Valoa rea i+1, ceea ce insearnna ca elementul k+ 1 din rnultirnea A va gen era 0 noua
rnultirn e i n partitie.
Imolcmentarca iteratlva lmnlornentarea recurs iva
#incl ude < i o s t r e a m. h > #incl ude <i o s c =e a m. h >
typede f i nt s:iva[lOO] ; t ype d ef in t sc iva[ lOO] ;
in t n ,k ,e'l ,as ; i nt n,
sLivd st ; s tiv a s c ;
v o i d Ln i tt j { s t l k l = ();} v oi d .i n .i t. ( i n t k ) { s t [ k. l ~ O ; }
int s u c c e s o r () in t su c c esor ( i n t k )
( if (st[ <]<3t[k -1J+ll (i f (st[k]<s:[ J:-l] +l)
{ s : [k]=-st[ k) +l ; r eturn :. ; } { s ~ [ k l ~ sL [ k ] + l; r etur n I ; }
e lse re tu rn Oi l el s e re t ur n O; }
28 Te hnic i de progrumare
in t v a Li, () {re tu r n 1; l int v a l i d ( ) {return : ; )
i n t s oLu t i.e r ) in t solut~e l i n t k )
(retu r n :: ==:l ; ) {retu r n k==n ; )
voi d ::i;:;ar { \ v o id t i pa r ( )
lint i ,j ,l.a~:=st [l]; {i nt i ,j ,max~st [l] ;
for ( 1 = 2; ~ < = n; i l . j for (1 =2 ; i <= n ; i 4 1 )
if (s t [ ~ ]> llla ~:) m x "-s t [ : j ; i f Is [i l>max) rnaz=st ~i. ] ;
fo r 'i=l ;i<=max ;iTT ) fo r (i =l ; i <=m x ;i++)
{cout« " { " ; {co ut« " [ " ;
f or (j = l ; j<=n ;j l+) f o r I j = l ; j <=n ; j 1 +)
i f (s t l. j j==i) co u t« j« " , " ; if I st [ j] == i) cou t« j « ", ";
cout« ' \ b '« " ) " ;l c ou t -c-c' \b ' «" l "; )
cou t«e n d l; ) c o ut«en d l; )
void bt ( ) v o id bt ( i n t k )
{! ~ 6 1t e fi x5 a a ! go r i : rnul u i l I I / p a r t e a f i x a a a~g oritmul 'i l
void .na i n I; void ma in ()
{cou t « " :1 ~ "; cin» n; bt:. ( ;) {cou t«" n = "; cin» n; bt l: ) ; )
Scrieti urrnatoarele programe . in care sa folosif metoda backtracking pentru
generarea tuturor partitiilor unei rnultirni . Se cons idera rnultirnea A . cu n
numere i ntregi. Valorile pentru n ~i m ~ i pentru elemen tele rnultirnii A se
citesc de la tastatura .
1. Sa se genereze toate partitiile rnultirnii A form ate din doua subrnultirni care au suma
eleme ntelor egale.
2. Sa se genereze toate pa rtitiile rnultirnii A formate din m sub rnultirni.
3. Sa se gene reze toate partitiile rnuttimii A formate din subrn ultirni care au ace lasi nu rnar
de elemente.
Conditia de continuare este asiqurata prin modul in care este ales 21 2 ~(~)- 11~;-
succesorul ca element din m ultirnea B , singurul caz special fiind al
elementului care se adauq a pe ultimul nivel din stiva (m) . Prin adau- 221 x /1 23
garea acestui element, trebuie ca in stiva sa existe toate eleme ntele f(x) 2 2 1
Informatica 29
rnultirnii B. Aceast a conditie este verificata prin functia surjectiva () care furnizeaza un
rezultat logic: 1 (tru e) , daca i n stlva exista toate cele n elemente ale rnultimii B , ~i 0 (false), in
caz contrar.
Implementarea iterativa Implementarea rocursiva
- -----_.-'----_.~-------- --...-,
# inc l u d e < i o s t r e a m , h > #in c lud e < i o s t r e a m. h >
typedef int s t i va [100] ; t yp e d e f i nt s tiva [100 ] ;
in t n ,Hl ,k , e v , as i i nt D,m ;
s tL ve s t ; s t i va e z ,
i n t 2u r jec t iva() i n t su r jectiva( )
lint l ,j , x ; {int l ,j , x ;
for (j= l ;j<=n ; j+ + l for ( j =l ; j < = n ; j + + l
(for (i = l ,x=O ;.i< =m && ! x; i+ + l (for (i = l , ;~ =O ; i< = m &f, I >: ; l++)
if ( s; [ .i J == j ) x > 1; if (st [ i J~= j) x=l ;
if (! x ) return O; } if ( ! x) r e t urn 0 ; )
return 1 ; } r e t ur n l ; }
vo i d Ln i c t ) { s L [ k ] = O;} v o i d in Lt ( i n t k) { s t [ k ) = O; }
i n t succ e sc r ( ) i n t 3uccesorl i n t k )
j if (st[k]<st[k - lJ +1) (if (sL[ kJ<SL[ k- l J +l)
( s ;: [ k ] = s t [ k ] + 1; return 1 ; ) { s t [ k ] = s t [ k ] + I ;return I; }
e l se r eturn O; } el s e r eturn O; }
i n t v a lLd t ) int va lid( i n t k )
( if (k~=' m) (if (k = =n:)
i f ( !su rject i va()) return 0 ; i f ( !su rjecti v a () ) re t urn 0 ;
r eturn :.. ; ) r etu r n 1 ; )
i n t s o Lu t i.et ) in t soluti~( i n t k )
( re t urn f~==H\ ; ) ( r e tur n k = = n ; )
voi d ti pa r t ) vo i d t i. car ()
( int .i : c out« " }: I "; (i nt i: co u t«" x I ";
f or (i=l ;i<=m ;i-I·~) cou t« i« " " ; fo r (i=l; i.<-m ;i++ ) cou t.c-cLc -c" " ;
cout«endl ; c o ut« e n d l ;
for (i=J ; i<==rll ; i -H ) cou t« "- - - - - " ; f or (i =:: ;i.<"'ll' ;i..I;) c o ut«" -- - - -" ;
cout«endl «" l (x) I "; c o u t-c-cend.l c-c " f (x ) i " ;
for (1=1 ; i<.=m ; i++) cout« s t l i l« " II ; for (i=1; i<=m ;l++) = u t« s t [i ]« " " ;
cout«endl«endl; ) c o u t « e n dl « endl ; }
void bt () v o i d b t (i n t k )
( / / p a r t e et fL-:5 a oLq o r i t mu Lu i. } ( / / p a r t e a fixa a a l g or it m u l. u ~ )
void main () v oi d rna in ()
{co ut«" e l e me r. t e mu l.c.L me a 7\= "; (cout« " c l e me n -_e mu L ti me a 7\= ";
c i n .» m; ci n » m;
co ut«" e l e mc n t c mul t i me a B= " ; c ou t-cc e Lernen t e mu I t.Lrue a 5""
v " ;
cin » n; o.t; (i ; ) ci n » n; bt ( 1) ; )
int succesor ~
{i f Is,- :::~<-n { s c , ~ . = s c : ~ ] · :'; return :. ; }
else r e t urn .: ; }
int v a Li.d M.
{for (i n t i= . ;i<k ; 'H)
i f (s c[ k]==ac[i] II a b s ( s t l k ] - s c [ i ] ) = = k - i ) return 0 ;
re turn I ; }
i n t so l u tie i<l {r e turn I:==n ; }
vo i d t.Lpar ( )
{for (i nt i=1; i <=, n ; .i + ) c ou t .c-cs t l i l c-c" " ; c o u t « e ndl; }
v o i d bt (( {1 / p a r c e 3 ~i xa a algo~itmulu i }
v oid ma i n () {co u t«" n = "; c i n » n ; be ,:1\' ; }
Stiva va avea dimensiunea nxn , coresp unzatoare parcurge rii intregii table de san
(kmax=nx n) , ~ i va cont ine. in ordine. coordo natele tuturor patratelor de pe trase ul de
parcurge re: s t [ 1] . x ~ i s t [1] . Y corespund primei pozitii de pe tabla , s t [2] . x ~ i
st[2]. y corespund celei de a doua poz itii de pe tabla, ... , s t [ n * n ] .x ~i s t [ n *n ] . y
corespund ultimei pozitil de pe tabla.
32 Te h u ici de programarc
De exemp lu, pent ru n=5 - ~ i ea poz itie de pornire patratul de pe linia 1 ~ i eoloana 1 - 0
solutie va ave a 25 de elemente. Prima dint re solutiile obt inute este prezentata mai jos :
Sol utia 1 1 16 21 10 25
1,1 3,2 5,1 4 ,3 5,5 2 20 11 24 22
15
3,4 4,2 5,4 3,5 1,4
2,2 4,1 5,3 4 ,5 2,4 3 17 2 19 6 9
1,2 3,1 5,2 3,3 2,1
4 12 7 4 23 14
1,3 2,5 4,4 2,3 1,5
5 3 18 13 8 5
1 2 3 4 5
Vanabila log iea es te se Iolose ste pentr u a sti daca s-a gasit eel put in 0 solutie (de
exernptu, pentru 11=4 problema nu are solutii) . Este initializata eu va loarea 0 (nu s-a gasi t
i nca nici 0 solu tie), Va Iua val oarea 1 (s-a qasi t 0 solutie) i n subproq ramul tipar () care
S8 ex ecuta numai daca S-3 gasit 0 soluti e a problemei .
for {i n t i= l ; i < k ;i + +)
if l s t Lk l . x = = s t [ i J . x && s t j k ] . y === s t [ i J . y ) return 0 ;
return l ; }
int solu t i e :l {return k= =n·n ; }
v o id tipar ()
{ in t i ; e s t e '<L :
for ( i = l ; i< = n""' n ; iH) cou t cc s t Lt ] . :·:«", "« s t [ i ] . y«" " .
cou t«endl; }
void bt ()
{ k ~ 2; Lni t t j •
while ( k> i )
{a s = l; cv=O ;
while ( a s && l e v )
{e s e s u c ce s o r I ) ;
i f ( a s l ev = val id ( ) ; }
34 Te h nici d e p rog ra ma re
i f (.:i s )
i f (solutie ()) t i pa r () ;
else ( .: - T; initr) ; }
el se k - - ; } }
void main ( )
lint i ,j ; cout« " n = " ; c in» n ;
cout« " l i .,i a de : o r n i r e "; c i n » i ; s [::'j . x =i ;
cout« " c o l o a na de parnire "; cin» j ; st[l] . y=1; bt(l ;
if ( !es~e) cout« " Nu e x is t a solucii " ; }
Observatie. Daca se dore ste numai afisarea primei solutii, cautarea solutie: se face
pana cand variabila es te trece de la valoarea 0 (nu s-a gasit solutie) la valoarea 1 (s-a
gasit solutie), rnoditicandu-se in subprogra mul btO conditia de terminare a cautarii tuturor
solutiilor trn loc de wru Le (k>1 1 sevascrie whi l e ( k > l && ! e stel ) .
~ J \ :~tra
prezenta ta alaturat valoarea ete-
mentului care i se asociaza in rna-
tricea L. Sirul de patru cilre binare prima afra
a doua cifra a treia citra
tormeaza un nurnar binar, care va fi
transformat intr-un nurnar zecimal.
[ Sm.dJJiu de caz I
Seop: identificarea probleme lor care pot fidescompuse in subprobleme s imil are care
folo sesc rnultimi de date d e intrare d is juncte.
Enuntul problcmei 1: Sa se caJculeze suma elemente/o r dintr-un vector v cafe cotuine
num ere intregi.
Multimea datelor de intrare 0 repre zinta cele n elemente ale vectorulu i v . Ele pot fi diviza te
i n cate doua submultimi disjuncte, prin divizare a multimii indicilor i n do ua subrnuttimi,
Mul\imea iniliala a indic ilar este determinata de prim ul indice (s) ~i de ultimul indice (d) , iar
intervalul indicilo r care S8 divizeaza este [s ,d]. EI se divizeaza in doua subrnultirni disjuncte ,
[s,m] ~i [m+1 ,d] . unde m este indicele din miilocullntervalulut m=(s+d)/2 . Astlel , problema
initiala este descornpu sa in doua subprob leme, fiecare dintre ere con stanc i n calcularea
surnei numer elor dintr-o subrnultime de elernente (care corespunde unui subinterval al
indicilor). Desco mpunere a continua pana cane fiecare subrnultime cont ine un singur
element - ~ i se poate calcula suma , obtinandu-se solutia subproblemei .
Enuntut problemei 2: Sa se cetcotoze suma 1x2+2 x3 + ... +n x(n+1).
Multirnea datelor de intrare a reprezi nta primele n numer e naturale. Mul ~ lme a inifiala este
determmata de primul numa r (s =1) ~i de ultirnul nurnar (d=n), iar interv alul care se divi-
zeaza este [s,d] . EI se divizeaza i n doua submultimi disjuncte, [s ,m] ~i [m+1 ,d] , unde m
este nurnarul din mijlacul intervalu lui: m=(s+ d)/2. Astle l, proble ma initiala esle descornp usa
i n doua subprobleme, fiecare dintre ele constand in calcularea sumei produselor dintre
doua nume re consecutive dintr-o subrnultime de elemente (care cores punde unui subinter-
val al numerelor). Desco mpunerea continua pana cand fiecare subrnuttime contine un
singur element - ~i se poate calcu la produsul , care se va adauq a la surna, pentru a obtine
solutia subproblemei.
Enuntul probl em ei 3: Sa 58 genereze termenuf n al suului lui Fib onacci.
Sirul lui Fibonac ci este definit recursiv: 1,=1, 12=1 ~i I n= I n-2+ I n.1, pent ru n;,3 . Problema
determina rii termenului n al sirului lui Fibonacci se poate de scompu ne Tn doua subpro -
bleme : determinarea termenului n-1 si determinarea termenului n-2. Descompu- *.
nerea continua pana cand trebu ie deterrninati terme nii f1 si Iz. a carer valoare este ~~
cunoscuta.
Exemplul 1. Sa 5 8 calculeze suma clementelor pare dintr-un vector v care contine nurne-
re intregi. Nurnarul de elemente ale vectorului (n) ~i elementele lui se citesc de la tastatura.
s=1 1 2 3 4 5 d=5
5 10 1 15 I 20 25
m- (1+5)/2-3
z=z12345= z123+ z45=10+20=30
./ <,
1 2 3 4 5
s=11 5 I 10 1 15 I
d=3 s=41 20 I
25 Id=5
m-( 1+3)/2-2 m-(4+5)/2- 4
z123 = z 12+ z45= z4+ z5=20+0=20
..------"" z3=10+0=10, »~
1 2 3 4 5
s=1 1 5 1 10 I d=2 1 15 1 1 20 25 I
m=(1+2)/2- 1 s=d=3 s-d=4 s=d-5
z12= z1+ z2=0+1 0=10 z3=0 z4=20 z5=0
» ~
1 2
s=d=1 1 5 1 10 Is=d=2
z1-0 z2- 10
Implementarea mel odei divide et impera in acest exemplu se face astfel:
-7 Subprogramul divizeaza() - Nurnarul de subprobleme in care se descompune problema
este 2 (k=2). Multimea datelor de intrare esle divizata in dou a sub rnultirni disjuncte, prin
divizarea multimii indicilor in doua submultirni disjuncte de indici, adica rnultimea indicilor
[s,d] (unde 5 este primul indice, jar d ultimul indice) este divizata in coua submu ltirni disj une-
Ie [s,m] si [m+1,d] , unde m este indicele din mijlocul intervalului: m=( s+d ) / 2. in subpro-
gram, procesul de divizare consta in determinarea mijloGului intervalului - m
~ Subp roqram ul comb ina ( ) - Combinar ea solutiei insearnn a adun area celar do ua sume
obtin ute prin rezolvarea celor o ou a subproblerne. in subpro gram sunt comb inate cele
d oua valori obtin ute din prelucrarea celor d oua intervale , ad ic a S8 aduna cele d ou a
valo ri x si y , obtinandu-se solu tia z .
-7 Subprogramul dei ( )- 0 subproblerna corespunde cazului de baza atunci cane sub-
multimea contine un singur element (se peate calcula suma, oblinand u-s e solutia sub pro-
blemei). Daca s-a terminat procesul recursiv (prin procesul de divizare, cele coua capete
ale intervatului au ajuns sa fie identice), atunci se prelucreaza cazul de baza (se calcu -
leaza sum a in variabila z , co respunzatoare solutiei, astfel: oaca numarul v [s] este par,
atu nci suma va fi chiar nu rnarul: altfe l, are valoarea 0); altfe l, se apeleaz a subproramul
pentru divizarea intervalului, se ap ele aza subprogramul dei () pentru primul interval, se
apel eaza subprogramul de i () pentru al doilea interval ~i se combina cele dou a rezultale.
#inclu de < l o s t r e am. h >
int v[lOO] ,n ;
void divizeaza { i n t s , i nt d , i n t &m) {m= ( s +d l / 2 ;}
void combina ( i n t x , i n t Y, i n t &z ) { z ~ x + y ; }
v o i d dei ( i n t s , i n t d, i n t &z )
tint m,xl ,x 2;
i f I d==s)
I nfo r ma tica 43
if (v[s ]% 2 :; =;:O) zev l s l , e lse z .:;;.O ;
else
{d i v i z e a z a ( s, d, m) ; d e i(s, m,xl); ;d e i (m+l ,d, x2); cOmbina (xl , K2, z ) ;} }
vo id ma i n()
{i n t i,z ; cout c cvne ";cin»n;
for {i = l ; i < =n; i + + ) ( c ou t. c cv v Lv-c -c i c cv j e v: c Ln c- c- v l Ll c }
dei (l , n , z ) ; cout«" s u ma = "<:< z; }
s=l l I 2 1 1 4 1 5 1
m=(1 +5 )/2= 3
z=z12345= z123+ z45=20+50=70
/" "-
s =11-----;---'-
1 1---=--1 I :
m= (1+3 )/2=2 m=( 4+5)/2=4
z123 = z12+ z3=8+12 =20 z45= z4+ z5=2 0+30=50
..------"" "- ;t ~
s=l l- 1: - - 1 I ~ r--'--::-----,
5
m=(l +2 )/2= 1 s=d=3 s=d=4 s=d=5
z12= zl+ z2=2+6= 8 z3=3 x4=12 z4=4 x5=20 z5= 5x6=30
;t ~
s=d=l l 1 1 1---~
2---l s=d=2
zl -1 x2-2 z2-2 x3- 6
Implementarea metodei divide et impera i n acest exemp!u S8 face astfel:
-7 Subprogramul divizeaza() - Nurnarul de subprobleme in care S 8 descompune pro -
blema este 2 (k=2). Mul\imea date lor de intrare este divizata in doua subrnultirni disjune-
te , prin divizarea rnultim ii primelor n nume re natu rale in dOU3 subrnultirni disjunc te, adi-
ca multirnea [s.d] (unde s este primul numar din multime, iar d ultimul nurnar din
rnu ttirne ) este divizata i n doua subrnultirni disjuncte, [s ,m] si [m+1 ,d] , unde rn este nu-
marul din mijlocul intervalul ui: me (s+d ) /2 . in subprogram , procesu l de diviza re consta
i n determina rea mijlocu lui intervalului, In.
~ Subprogramul combina ( ) - Combinarea solutiei lnseamna aduna rea celor doua sume
obtinute prin rezolvarea celor doua subprobleme . i n SUbprogram sunt comb inate cele
doua valori obtinute din cele doua intervale (se aduna cere doua valori , x si v ) obtinan-
du-se solutla z
-7 Subprogramul dei ( ) - 0 subproblems corespunde caz ulul de b aza atune; cane sub-
muttirnea contine un singur element (se poate calcula termenul sumei - produsul celor
doua numere consec utive - obtinandu-se solut.a subproblemei). Dac a s-a terminat
procesul recursiv (prin procesul de divizare, cele cou a capete ale intervalului au ajuns
sa fie identice), atunci se prelucre aza cazul de baza (se calculeaza produsul i n variabila
z, corespunzatoa re solutiei): altfel , se ape leaza subprogramul pentru diviza rea inter-
valului, se apeleaza subprog ramul d ei () pentru primul interval, se apeleaza subp ro-
gramu l de i () pentru al doilea interval si se cornbina cele doua rezultate.
#ioclud e <i o s t r e am . h >
i nt n ;
v o i d divi zeaza {i n t s, i n t d, i n t &m} {m= ( s +d ) / 2 ; }
v oid combina (int X, int y , i n t &z) {z e xty r )
44 Tchnici de p rogramarc
voi d dei ( i n t s, i n t d , int &z)
( l o t m,xl , x2 ;
if «(1":::= 8) ;:.=s " {s + l);
el se ( diviz e a z a{s,d,m) ; d ei ( s , m, xl ) ; dei (m+l , d , x2 ) j combina (x l , x2 , z ) ; } }
void ma i ne}
(iot z ; cou c c c vn e " c c Lno xn : dei (1 , n ,z ) ; c out « " s uma e ve c a : }
Exemplul 3: Sa se calculeze termenul n al sl ru lui lui Fibo nac ci.
f 2 =1
/1 1(3) 1/
__ / [Il~LJ z=1+1=2 '-",. O ULJ =1
[l(~}] \ z=2+1=3 '-",. 0 (2) 1=1
z=3+2=5
......... 12 =1
c::::illD
z= 1+1=2 '-",. I 1(1 ) 1=1
1f [2['] =1
0z=5+63=8 /
C 1(3)
- -j
----..... LJillJ z=1+1=2 D GLJ= l
z=2+1=3 '-",. I 2 =1
~
i n acest exemplu , prob lema a l ost descornpusa in probleme care nu
Atcntie s unt independente unele de alle le ~i, i n apelu rile recursive,
aceeasi subproblerna este rezolvata de mai multe ori : 1(4), 1(3), 1(2),
1(1). Pentru acest tip de problem a nu se recomandii metoda divide et impera deoare ce
nu este eficle nta
Informaticii 45
Exemplul 4: Sa S8 determine simultan va loarea minima 9i valoarea maxima dintr -un
vec tor v ca re contine nume re intregi . Nurnarul de elemente ale vectorului (n) ~i elementele
lui se citesc de la tastatura.
lmplementarea metodei di vi d e et im pe ra i n acest exemplu S8 face astfe l:
~ Subprogramul divizeaza ()- Nurnarul de subprobleme in care S8 descompune pro-
blema este 2 (k=2). Div iza rea rnultim ii datelor de intrare se face la fel ca la exemp lul
pentru calcularea sum ei elemen telor unui vector ;;i subprogramele sun t identice.
-7 Subprogramul combina ( )- Combinarea solutiei l nsearnna determinarea minimului [ z L)
~ i a maximulu i (z z} dintre cele doua valori minime (x l ~ i y l ), respectiv maxime (x2 si y2 ),
obtinu te prin rezo lva rea celor doua subprobleme. in subproqram sunt ·combinate cele
doua perech i de valor i obtinute din cele doua intervale . Daca x 1>y1 , atunci minimu l (z r.)
este y L, altfel , este x l. Daca x2>y 2, atu nci maximu J(z 2) este x 2; altfel, este y 2.
-7 Subprogramul dei ()- 0 subproblems corespunde cazului de baza atunci cand
subrnult irnea cont ine un singur element (se pot calcula min imul ~ i maximu l; atat minimul
cat ~ i maximul vor ave a valoarea elemen tului) . Daca s-a terminat procesul recursiv (prin
procesul de divizare cele doua capete ale intervalulu i au ajuns sa fie ide ntice) , atunci se
pre lucreaza cazul de baza (se calc uleaza minimul ~i maximul In variabileJe z l si z 2
corespunzatoare solut iel): altfel , se ape leaza subproqrarnul pentru diviz are a interva-
lulu i, se apeleaza subproqrarnul d e i () pentru primul interva l, se ape leaza subpro-
gramuJ dei () pentru al doi lea interval si se cornbina ce le doua rezu ltate.
#i n clu d e <i o s t r e am . h >
i n t v [lOO ] , no
void d i v i c ea a c {i n t s ( i n t d , int &m) { rn> (s I·d ) 12 ; }
v o id c ombi n a( i n t xl , i rit yl , i n t &z l ,int x2, i n t y2 , i n t &z 2)
{ i f (x l >y l ) z1 c:;yl ; el s e z l =x l ;
if (x2>y2) z2;::x2 ; el s e z2 =y2 ; }
voi d dei Ci n t s , i n t d , i n t &z 1, int &z 2 ) II z 1 - mi nim, z2 - maxi m
{int m,xl ,x2 ,y1 ,y2;
i f (d-:: ::.s) z Le.z Z v-v l.sl :
e lse {d.i.v La e az e ts , a ,m);
d ei ( ~; , m , x l , x 2 ) ; Ilxl - min i m, x2 - max im
d ei (m l-l , d , y l , y 2 ) ; Ilyl - mini m, y 2 ~ ma xim
c ombina (x l , y l , z l , x 2 , y 2 , z 2 ) ; } }
vo id ma i n C)
{int i , 7.1 ~, z2 ; c o u t. x -cvne "; c i n »n ;
f o r ( i ;:: l;i < =n;i + + ) {cout « "v [ " « i « " ] = " ; c i.nc-o-v l i j : }
d ei ( 1 , n , z l , z 2 ) ;
c ou t « ":ni n i mu l = " «z l « e n d l «"maximu l = " « z 2 « e n d l ; }
Exemplul 5: Sa se calculeze sum a a doua polinoame. Gradele celo r doua polinoame , n
~i m , si coeficientii celor do ua polinoame se citesc de la tastatura. Coeficientii ce lor doua
polinoame se mernoreaza In vectorii p si q , iar coeficien tii polinomului surna se memoreaza
In vectorul r.
lmplementarea metodei divide at im pera In aces t exemplu se face astfel:
-7 Subprogramul divizeaza () - Nurna rul de sub problems i n care se cescornpune pro-
blema este 2 (k=2). Deo arece exist a doua mul tirni de date de intrare (vectorii P ~i q ca re
mernoreaza coeficientii ce lor doua polincarne), se va lua ca reper mul tirnea cu cele mai
multe elemente. Multirnea datelor de intrare este divizata In doua sub rnultimi disjuncte ,
46 Tc h nici de progra ma rc
prin divizarea rnultimii indicilor in doua submultimi disjuncte de indici, adica rnultimea
indic ilor [s,d) (unde s este primul indice, iar d este ultimul indice - d=maxim( n,m) +1)
este divizata in doua subrnultirni disjuncte [s ,m ij l) si [m ijl+1 ,d) , unde mijl este indicele
din rnijlocul intervalul ui: mi jl = ( s +d) / 2. Procesu l de divizare este identic cu eel de la
exemp lele anterioare.
-7 SUbprogramul cornbina ( ) - Deoarece i n cazu t de baza S 8 determina unul dintre coe-
ficie ntii polinom ului surna care S8 scrie direct in vectorul r , acest subpro gram nu mai
este necesar.
-7 Subprogra mul dei () - 0 subproblem a corespunde cazului de ba za atunci ca nd submul-
\imea contine un singur element (se poate calcula coeficie ntul polinomulu i surna). Oaca
s-a terminat procesul recursiv (prin procesul de divizare , cete doua capete ale intervalului
au ajuns sa fie identice), atunci S8 prelucreaza cazul de baza , prin care S8 calculeaza
coeficientul polinomulu i surna pentru acel indice (daca termenul care se calcuteaza are
indicele rnai mic decat gradul minim al polinoamelor, atunci el este egal cu suma coefi-
cientilor cetor doua palinoame ; altfe l , daca polinamul p are gradul mai mic decat al polino-
mului q , atunci el este egal cu coeficientul polinomului q ; allfel, el este egal cu coeficientul
polinomu lui p ); allfel , se apelea za subprogramul pentru divizarea intervalului, se apelea-
za subprogram ul d ei ( ) pentru primul interval ~i apoi pentru al doilea interval.
#inclu de <i o s tream. h >
int p [l OJ,q [lOJ,r[l OI,n, m;
i o t ma~im( i n t x, i n t yl {if ( x >y ) r eturn X; e lse r e t u r n y; }
iot ~inim ( i nt x, i o t y ) {if (x >y) r e turo y; el s e r e t u r n x; }
vo id diviz e a z a {i n t ~ , i n t d , i n t &mi j l ) {mi j l = ( s +d } / 2 ; }
vo i d de i ( i n t s, i n t d)
{int mi j l ;
i f (d , = s)
i f (d< =mi n im(n,m)) r[d]~p[dJ+q [ dJ ;
e l s e if (Il<m) r l d l=q ld J ;
e lse r l dl e p Ldl :
els e {d i v i z e a z a ( s , d , mi j l } ; d e i {s , mi j l l ; dei (mijl+l,d); } }
voi d mai n ( )
{iot i ; cou t« "n = "; c i n »n; cout«" m= "; c i n »m ;
f or ( i =1 ; i <=n + l ; i ++ ) {cou t c c vp t v c c L-L c c "}» " . cin» p [ i ] ; }
fo r l i =l ; i <=m1l; i f +l {cout« "q ( "« i - l « " ) = It ; c i o» q [ i J; }
d e i.Ll.v maxi. rn I ni m) I-I } ;
fo r ( i ~ ma x i m ( n , m ) + l ; i > = l ; i - - )
if rr l i l ' =0 1
{i f (r[iJ ! = l) t couu c c r Lil : if (i l=l) cou t.c c vvvr j
if ( i>2 ) c o u t.c cvx r vc c i c l : e l s e if ( i = = 2) oou c c cvxv,
if (i !=l} c out;-cc " t " ; } }
I X, x, x, I X;., X; I X;. , I I X, ., I X,
-7 Primul element din vector, numit pivot. este mutat in cadrul vectorului pe pozitia pe
care trebuie sa se gaseasc a in vectorul sortat.
-? Toate elementele mai rnici decat el vor fi mutate in vector in tata sa.
-7 Toate elemen tele mai mari decat el vor fi mutate in vector dupa el.
I<:: X, I X,., I X, ., I
""V"
Su bvc ct o ru l d in stan qa pi votulu i
(clemente mai mici dccat pivotul)
Obs erv atie . i n ambe le cazur i algoritmu l continua cu divizare a vectoru lui i n subvecto rii eu
mdicii [1,2] ~i [4,5] ~ i rearanjarea elementelor i n eei doi subveetori .
Complexitatea algoritmului de sorta re rapida Pentru divizarea problemei in subpro-
bleme se calcuteaza mijloeul intervalului de indiei ~ i 0 (D( n))~0(1 ) . Pentru comb inarea
solutiilor se pareurg e vec torul cu ajut orul celor doi indici, de la primul elem ent pana la
ultimul element, ~ i 0 (D(n))=0(n x0(1 ))=O(n) Timpul de executi e este T( n)~ 2xT( n/2)+n .
k
Considerand ca n=2 , rezulta :
Informatica 53
k k k-1 k· 1 k k-1 k k
T(n)=T( 2 '\+2 = 2x(T (2 )+ 2 ) +2 = 2xT(2 ) +2 +2 = .., =
x-z k· i, k k 2 k·2 k·2 k k k k
2 x2 x(T(2 )+ 2 ) +2 +2 = 2 x(T(2 )+ 2 ) +2 +2 +2 = kx2 = log2n xn .
Ordinul de comp lexitate al algoritmulu i este 0(n xlog2n) .
c> c:L~_-J
~A
2
3 ...... : • • •
6. _._ _Mi'
,~~ cI
~ I c
r-L -3=J
B
II
ir~ q~ ~ C 6 •
6 ~ I
\ - 1- 1
la ell edo .
diseurij>(lij5' .·
...
.....di>!!!lnalie
,~ ~~
-L
Folosind metoda divide el impe ra problema initiala va fi descornpusa in subprobleme astfel:
PAS1. Se mul a primele n -1 diseuri de pe tiia sursa pe l iia de rnanevra.
PAS2. Se mula diseul eu diametrul eel rnai mare de pe tija sursa pe liia destinatie.
PAS3. Se mula eele n-1 discu ri de pe tiia de rnanevra pe Iiia destinatie.
~ 6
initiator generator nucleu
(n= O) (n=1)
i
i
Pentru desenarea seqrnentului se foloseste functia Lf.ne ( ) _ " " .
irnplernentata in biblioteca graphics .h: line (xl , y L , x2, y2) .
Desenarea poligonului lnsearnna desenarea fiecarei laturi , care este determinata de coor-
donatele X1 ;;i Y1, lungimea segmen tului L ;;i unghiul a. Problema se reduce la generarea
datelor care caracterizeaza fiecare latura ;;i la desenarea unei linii folosind aeeste date.
Generarea laturilor poligonului este un proces recursiv i n care initiatorul care are lungimea
L este inlocuit cu generatoru!. Generatoru l este format din patru segmente, fiecare segment
avand lungimea L/3. Acest proces poate fi descompus in patru procese .
Folosind metoda di vid e et impera pentru a genera curba lui Koch de ordinul n , problema
ini\iala va fi descompusa Tn patru subprobleme, astfel (subprogramul Koc h ( »):
PAS1. Se genereaza prirnul segment, care este un segment cu lungimea L/3 si eu aceeasi
orientare cu a initiatorului. El devine initiatcrul curbei lui Koch de ordinul n-t .
PAS2. Se qenereaza al 'doilea segment, prin rotirea segmentului obtinut cu 60° spre stan-
ga (subprogramul stanga ( »). Ei devine initiatorul curbei lui Koch de ordinul n-1 .
0
PAS3. Se qenereaza al treilea segment, prin rotirea segmentului obtinut cu 120 spre dreap-
ta (subprogramul dreapta (»). El devine initiatorul curbei lui Koeh de ordinul n-1 .
PAS4 . Se genereaza al patrulea segment, prin rotirea segmentului obtinut eu 60° spre
stanqa (subprogramul stanga ( i) . EI devine initiatorul curbei lui Koch de ordinul n-1 .
Proeesul de descompunere se termina cand se ajunge la ordinul 0 si S8 obtine initiatorul, care
se va desena (subprogramu l deseneaza ( i) .
Pentru desenarea pol igonului, se construieste nucleu l (se genereaza cele trei laturi ale
triunghiului echitateral de lung ime L) si pentru fiecare latura se construieste curba lui
Koch de ordinul n (subprogramul n u cle u _ Ko c h (») .
# inc l ude <.i o s Lr e a m. h >
# inc lude <mut h.h>
# include< gruphi c s. h>
int x, y;
fl o a t a lf a ;
v o id s r.e n o e ( f l o a t u nq h i )
{a l [<:1-1 <uraqh i. -J.: t,CP I I 18 0 . ; }
58 Tehnici de programare
voi d dre~p ta( f l o a t unghi)
( a l f a - =u ng h i'M_ PI / 18 0 . ; )
v oid de seneaza( f l o a t L )
{x l =x; y l =y; x +=( i n t) (L * c o s(alfal; y+=( i n t) (L* s i n( a lfal ;
line i x , y , x l , y l ) ; }
v o i d Koch (i n t D , float L)
{if (n==O) dc sonoaa a t t. j •
else
( Koch (n - l , L / 3 ) ; stang a(60) ;
Ko ch (n - l , L / 3 ) ; d reapta(120) ;
Koc h ( n - l , L / 3 ) ; stanga(60);
Koc h (n - l , : ,I3 ) ; }}
vo i d nu c l eu_Ko ch ( i n t (1 , float L)
(Ko c h (n , L ) ; d r eapLa(120) ;
Koch (n , L I; dr eap ta (1 20) ;
Koch (n , L I ; dreapta(120 ) ; }
v o i d main ( )
{int n.L;
CQu t« "n = " ; cin» n ; cout« "L= " ; cin» L ;
nucleu_ Ko ch (n . L l ; }
1. Desenati praful lui Cantor, care este generat astfel : un segment de
lungime a L, care este paralel cu axa Ox , este Irnpartit in cinci
segmente egale, din care se elimina segmentul din mijoc - ~ i se
repeta aces t proces de n ori pentru fiecare segment rarnas.
2. Desenati curba lu i Koch , definita prin urrnatoarele trei elemente , i n care fiecare
segm ent al generatorului are lungimea L/4 , unde L este lungimea segme ntului initiator.
initiator
(n=O) generator
(n =1)
D nucleu
3. Desenat i c urba dragonului , definite prin urmatoarele trei eJemente, in care fiecare seg-
ment al generatorului are lungimea Usqrt(2), unde L este lungimea segmentului initiator.
initiator
(n=O)
<:
generator
u- D
curba de nucleu
(n =1) ordinul n= 2
4. Sase deseneze figura geometrica obtinuta astfel : se deseneaza un patrat cu latura L,
se deseneaza un patrat care uneste mijloacele laturilor patratulu i initial ~ i se repeta
acest proces de n ori pentru fiecare patrat obtinut.
5. Sa se deseneze covoru l lui Si erpin s ki , astfel : se deseneaza un patrat cu latura L, S8
i mparte acest patrat i n 9 patr ate egale , se hasureaza patra tul din mijloc si se repeta
acest proces de n ori pentru fiec are patrat neh asurat.
In fo rm a l ieu 59
I. 5. Metoda greedy
1.5.1. Dcscricrea mctodei greedy
Metoda greedy se poate folosi pentru problemele in care, dandu-se a multi me finita A
trebuie deterrninata a multime ScA care sa in deplineasca anumite conditi;'Metoda furni-
zeaza a sinqura solutio reprezentata prin elemen tele rnultirnii S. Ca ~i in cazul metodei
backtracking, solutia problemei este data de un vecl or S = {X" X2, .. ., xn} ale caru i element e
apartin Insa unei singure multim i A . Spre deoseb ire de metoda backtracking , metoda Greedy
nu gaS8!?te decal 0 sinqura solutie si, i n general, aceasta solutie este solutia optima.
I StumllJl. de C!llZ I
Scop ident ificarea problemelo r in care solutia optima este a s ubm ultirne inclusa i nt r-o
multim e data, care trebuie sa i ndeplineasca anum ite conditii,
Enuntul problemei 1: Sa se repartizeze optim 0 res ursa (de exemp/u, a sa/a de spe cta-
cole, a set« de contetinte, a sa/a de sport) mai multor activita!i (spectacole, ptezentiui de
produse, respectiv me ciuri) care Gancuraaza pe ntru a ouine resursa respective.
Mul\imea A este forrn ata din cele n activitati. Fiecare activitate i (1'; i,; n) are un limp de
incepere t i ~i un t imp de terminare ti l unde t i < f j ~ i ocupa resursa in interval ul de limp
[1;,1;]. Dou a activit ati i si j sunt camp atibile da ca interv alele lor de acupare [1;,1;] si [lj.fj] sunt
disjuncte, adica daca I; ,; ~ sau daca Ij '; I;. Cerinta problemei este de a selecta a multime
rnaxirnala de activitati campatibile. in acest caz, rnultirnea S este fermata din activitatile
care vor folos i resursa, iar conditia pe care trebuie sa 0 Indeplineasca elementele rnultirnii S
este ca ele sa fie act ivitati comp atibile. in plus , pentru ca repart izarea resursei sa fie optima,
tre buie ca mu ltimea S sa cant ina maximul de elemente car e i nde plinesc aceasta conditie .
Enuntu l prob lemei 2: Sa se ocupe optim un mijloc de transport (de exemp lu, UIJ ruc-
sac, lin auto cam ion) care are a capacitate maxima de ocupare (ca re poale Iran sporta a
grell/ate maxima G) Cll n obiec te, fieeare obiec t avand qreutete e 9 j §i lin profit obtinut in
urma transport ului ct. ier din fiecare objec t plltand sa se ia a ttectiune XjE[G, IJ .
Mul\imea A este fermata din cele n obiecte . Fiecare obiect i (t s isn) are a efic ienta a tr an s-
portu lu i e; care reprezinta profitul pentru a unitatea de greutate. Ce rinta prob lemei este de a
selecta a rnultirne de obiecte astlel inca t eficienta transportului sa fie maxi ma Mul\imea S
este ferm ata din obiectele care vor ocupa mijlocul de transport, iar conditia pe care trebuie sa
o Indeplineasca elementele multirnii S este ca, prin contributia adusa de fiecare obiect la
eficienta transportului , sa se obtina 0 eficienta maxima, iar greutatea obiectelor selectate sa
fie eqa la cu greutat ea maxima a transportulu i.
Enuntul prob lem ei 3: Pentru aou« tnuttkn! de numere intregi nonute : C cu n e/emente,
C = lci.c: .. ., cn} §i A cu m eiem ente , A = {a l,a 2, ... , arnJ, §i nsm, sa se sele eteze a
submuttime de n num ere din tnununee A. astfel inca t expresie :
E = C1 x x 1 + C2 x X2 + ... + Cn x Xn
in care xj EA , sa aiba valoarea maxima .
in acest caz , multirnea S = {X 1 ,X2,
. . . , x- }, i n car e x.eA. trebuie sa i ndeplin easca conditia:
E = C1 x x 1 + C2 x X2 + ... + c n x xn = E max
Criteriul de alegere a elementel or Xi este urrnatorul: daca in rnultimea A ma i exista eleme nte
care au acelasi sem n cu coeficientul c i, se va alege elementu l aj pentru care termenul Cj x Xj
60 Teh nici d e programarc
are valoarea maxima (deoarece acest termen S8 aduna fa valoarea expresiei), iar daca in
mu ltim ea A nu mai exista elemente care au acelasi semn cu coeficientul Ci, S8 va alege
elementul aj pentru care termenu! C j x Xj are valoarea mini ma (deoarece acest termen S8
scade din valoarea exp res iei) ,
Enu ntul problem ci 4: Sa S8 plateasc a 0 suma 5 cu un numar minim de bancnote cu
valori date . Se conski ers cil din fiecare tip de bencnote 58 paate totosi un numar nelimitat
de boncnote , iar pentru ca problema sa aiNi solutie, varn considera ca exist« §i bancnote
ell veioeree 1.
Multirnea A este fermata din cete n valori distincte ale bancnotelo r. Cerinta prob lemei este
de a selecta 0 multirne minima de bancnote pentru plata sumei s. in acest caz , rnultirnea S
este torrnata din valorile cu care se va face plata, iar con ditia pe care trebu ie sa 0 inde-
phneasca elementele rnu ltirnii S este ca, prin adunarea sumelor partiale platite cu
bancnotele cu valorile alese , sa se obt ina suma de plata s. Pentru ca nurnarul de _
bancnote sa fie cat rnai mic, trebuie sa se caute ca plata sa se faca in bancnote CU <l t>
valori cat rna i mario
Meto da greedy co ns t ruiosto solutia prin se lectarea, di nt r-a m ul time de elem ente,
a elementelor care indepli nesc 0 an urnita conditio. Pentru ca clementele
care s e se lecteaza sa apart ina solutiei optime , la pasul k s e alege candidatul
optim pentru elementul Xk al s o luti ei.
Spre deaseblre de metoda backt racking , la met oda greedy, alegerea elementului Xk al
solutiei este l revoca bi la (nu se mai paate reveni asupra alegerii Iacute).
Metoda greedy paate duce la obtinerea solutiei optirne i n cazul problemelar care au pro-
prictatca de optim local , adica solutia optima a problemei cu dimensiunea n a date lor de
intrare co nti no solut ii!e optime ale sub problemelo r similare cu problema initiala, dar de
dim ensiune mai mica. Metoda greedy se mai nurn este ~i metoda optimului local .
Algaritmul greedy este un algoritm iterativ , care determina solutla optima a problemei in
urma unor succesiuni de alegeri care reduc dimensiunea problemei respective: se alege
elemen tul x, al solutiei, apo i element ul x, al solutiei , s.a.m.d. Altfel spus , elementul X k al
so lutie i este determinat prin alegerea, din elementele rarnase in rnu ttirne a A, a candidatului
opt irn pentru elementul x , al solutiei, iar determinarea urmatoarel e n -k elemente ale solu tiei
(rezalvarea subprobleme i) se face numai dupa ce a fast determinat elem entul Xk al sotutiei.
Alegerea tacuta pentru elementul x, al solutiei paate depinde de alegerile facute pentru
determinarea pr irnelor k-1 elemente ale sol utiei , dar nu depinde de alegerile ulterioare.
Pentru ca alga ritmul greedy sa conduce la obtinerea solutiei aptime, trebu ie sa fie i ndepli-
nite doua cond itii:
I n for mat icii 61
1. Alegerea op tirnulu i local pentru fiecare element al solutie i duce la alegerea solutiei
optime globa le.
2. Solutia optima a prob leme i contin e solutiile optirne ale subproblemelor.
Aceas ta lnseamna ca , pen tru a fi siquri ca algoritmul greedy con struieste solutia opt ima a
problemei , trebuie sa S8 demonstreze ca sunt i ndeplinite cele doua conditii .
i n rezolvarea multor probleme folosind strategia greedy , pentru a alege optimul local care
sa duca la alegerea solutiei opt ime globa le, rnu ltim ea A es te o rd onata d u pa c rite riu l
ca nd idat ului opt im. Ordonarea multimii dupa criteriul candi datului optim inseamna rearan-
jarea elementelor rnultim ii A astfe l lncat, dupa extragerea un ui element, urrnatorul element
din multimea A sa reprezinte elementul care este eel mai indreptatit sa fie ales ca elemen t
al multimi i S. De exemplu:
~ In cazu l re part lzarii o ptime a unei res urse , 0 act ivitate nu poate Incepe cecat daca se
term ina cea anterioara. A repartiza optirn resursa i nsearnna a or ganiza cat mai mu lte
act.vitati. Din multirnea activitatilor se alege Tntotdeauna activitatea care are tirnpu l de
terminare ca t mai mic . in acest caz , candidatu l optim este activ itatea care are timpu l de
termi nare cel mai mic , iar ordonarea activitatito r dupa criteriul eand idatulu i optim
inseamn a ordonarea crescatcare dupa timpul de termin are.
-7 in cazul o cuparil o ptima a mi jl oeulu i de tr a ns p o rt , trebuie ea eficienta transportului sa
fie max ima. Din mu ltimea obiectelor, se aleg obieetele care au eficienta de tra nsport cat
mai mare . i n acest caz . cand idatul optim este obiectul care are eflcien ta transportului
cea mai mare , iar ordonarea obiectelor cup a crite riul can didatului opt im lnsearnna ordo-
narea descrescatoare dupa eficienta transportu lui.
-7 in cazul pla l ii un e i s ume eu un nu mar min im de banenotc ell va loarc da ta, ca sa se
Ioloseasca cat ma i putine bancnote, trebuie ea plata sa se faca i n cat ma i multe
bancnote eu valcare foarte mare. in aces t caz . candidatul optim este bancnota cu va loa-
rea cea mai mare , iar ordonarea dupa criteriul candid atului optim Inseamna ordonarea
descrescatoare dupa valoa rea bancnotelor .
Acti vi t atea 3 1 4 2 6 5 8 7
Ora de incepe re 8 9 10 12 14 16 19 ~
Ora de termi nare 10 11 12 13 16 18 21 22
So lu tia problemei
Ac tivitatea 3 4 2 6 5 8
Ora de in cepere 8 10 12 14 16 19
Ora de terminare 10 12 13 16 18 21
Pr ogramul este:
#i nclude < [ s t r e a m . h >
st ruc t a c ti v i t a t e {int x, y , ki }i
activitat e a[ 20j ;
int n ,m , s[201 ;
fstream f ( g r e e dyl. t x t" , ios: : in ) ;
II
vo id cites te()
{int i ; f » n;
fo r l i :::; l ; i < =n ; i + I' ) { f» a [ i J . x» a [ i j .y ; a l i ] . k :::; i ;} f. c l o s e () ; }
void so rt ( )
{i nt i ,j ; act i vitdte au x ;
for (j:::;l ;i<n ;i++)
f or ( j:::;il·l; j < ::n; j I I)
i f (a [i ] . y > a [ i ] . y ) { a u x =a [ i ] ; a[ i] = a[ i] ; a l j l e aux j j j
Informatica 63
void greedy ( )
l i n t i, j ; 3 [ 1] = 1 ; j e L:
for {i =2 ; i< =n ; i+ +}
if la [ i].x> =a [s [ j] ] .y) ( j ++; s lj le t i j
m=j ; )
vo id c f i s eaz c ( )
{cou t.c c " Plan i fic a r ea acti vi t a r i j.or- : " « e n d l ;
for (i n t i =l;i< =m;i ++ )
cout«" Ac t i vi t a t e a ''c a [s[ i]] . k«" 'i n c ep e la ora " ;
couti c c a I s L'i l j x <c" s i se termina l a o r a "« a [ s [ i ] ] . y«endl ;}
c
void main( )
{ci t e s t e ( ) ; sart() ; greedy( ) ; af i sea z a () ; }
------.--.. i ntr-o sala de spectacole trebuie planificate n spectacole care au lee In
aceeasi zi, fiecare spectacol avand 0 ora la care trebuie sa tnceapa ~i 0
durata de desfasurare. Scrieti un program care sa planifice optim OCUw
parea salii de spectacol e.
(Swoon de CalZ I
Scop : identificarea probl emelor care po l fi descompuse ill subprobl erno similare care
nu s unl i ndepen dente ~i ca re resp ecta pr incipiul optirnalitati l, solu tiilo r putand sa Ii se
asocieze 0 va loare, iar solutia optima deterrnin andu -se prin calcul area valorii optime .
Enuntul problem ei 1: Se conskiere un triunghi de numere naturale '
a11
8 ijell n tinii. Pomind de to numerut din linia 1, mergfmd in j os pana fa
finia n. sa se determine a setectie de etemonte astrel incat suma a21 a 22
e/ementelor sa fie maxima . Trecerea to Iinia urmatoare se poate I ..
face nume! mergfmd in jos, direct sau pe diagonala, la dreapta . a n1 a n2 ann
Metoda clas ica de rezolvare a acestei probleme este de a calcula toate sume le care se pot
forma respectand restrictia de deplasare in triunghi si de a alege, dintre sumele gasite , suma
care are valoarea eea rnai mare .
Mul\imea datelor de intrare 0 reprezinta rnultirnea A fermata din elemente le aij ale triungh iului.
Valoa rea asociata unei solutii este su ma elemc ntelor. Valoarea solutiei optime este valoa-
rea maxima (s uma elementelo r tr ebui e sa fi e m axim a). Sol ut ia problemei este data de un
vector S :::: {X1 , X2, ' .' , xn}, unde xjEA. Pentru canstruirea solutiei S8 porneste de la elementul
a1 1 ~ i se merge in jos , pana la linia n. Trecerea la linia urrnatoare nu se poate face decat
direct, in jos sau pe diaqonala, la dreapta, astfel lncat succes orul elementului aij nu poate fi
decat elementul ai+1 ,j sau eleme ntul ai+1,j+1. Problema poate fi descompusa in subprobleme:
subproblem a i este alegerea elementului Xi al solutiei de pe linia i a triunghiu lui. Res trictia
impusa pentru sol utie este ca elementu l Xi al solutie i sa se obtina , prin deplasarea in triunghi,
numai pe doua direcni, de la elementu l anterior, limita nd rnultirnea elementelor din care se
alege elementul Xi al solutiei numai la elementele din triunghi care se gasesc lntr-o anurnita
pozitie fata de elementul anterior al solutiei. Pentru a respecta princi piul op nrna titat ii. suma
elementelor alese anterior trebuie sa fie maxima. Subproblemele nu s unt independ ente
deoa rece i n subprob lema i alegerea elementului Xi al solutiei se bazeaz a pe alegerile Iacute
in subprobleme le anterioare .
Enuntul p ro ble me i 2: Df111du-se un §ir de num ere sa se determine subsirul crescator
de lungime maxima .
Fiind dat un sir de numere a- , a2, .. _, an, se defineste ca subsir crescator , sirul aj1, ai2, ..., aik,
cu ai1 ~ aj2 :S:; .. . :s:; aik ;;i 1 s i1 < iz < ... :s:;i k. De exernplu . i n sirul de nume re 1, -2, 3, 2, 4 , 4 ,
un subsir crescator este 1,3 , 4, 4 .
Motoda clas ic a de rezolvare a acestei probleme este de a genera fiecare subsir al multimii A
~ i de a verifica daca este subsir crescator. Dintre subsirunle crescatcare gasite se alege apoi
subsirul care are lungimea cea mai mare.
M u l~ i me a
datelor de intrare a reprezinta rnultirnea fermata din elementele sirului: A={a1, a2,
.. ., an} . Val oarea asocia ta unei solutii este lungimea subslrulul cres cat or. Valoarea
solutiei optime este valoarea maxima (Iun gim ca su bsiru tui tre buie sa fie ma xim a).
Solut ia prob lemei este data de un v ector S = {X1 , X2, .. ., xm}, unde XiEA . Prob lema poate
fi descornpu sa in subprobleme: subprob lema i este de a gasi subsirul crescator de lungime
maxima care i ncepe cu elementul ar. Restrictia impusa pentru solutie este ca elementul aj
cu care incepe subslrul sa alba valoarea rnai mica sau eel mult eqala cu cea a succe-
sorului sau in subsir (aj), iar in rnultimea A nurnarul lui ordine (i) trebu ie Sa fie mai mic c ecat
numarul de ord ine al succesorului (j) , tirnitand rnultirnea elementelor din care se alege
succesorul aj . Metoda cea mai sirnpla de a gasi subsirul de lungime max ima care i ncepe cu
72 Tc h nici d e p r ogramarc
elementul aj este de a cauta printre subsirurile de lungime maxima descoperite in
subproblemele rezolvate anterior, eel mai lung subsir care ince pe cu un element a] ce
poate fi succesor in subsir al elementului a r, obtinandu-se un nou subsir, de lungime mai
mare, care i ncepe cu elementul a.. Pentru a respecta principiul optimatitatii, lungimea
subsirurilor descoperite anterior trebu ie sa fie max ima. Subproblemele nu su nt in depen-
dcnte deoarece i n subproblerna i alegerea subsirului care i ncepe cu elementul ai al
solutiei se bazeaza pe alegerile tacute in subproblemele anterioare.
Enu nt u l pro bl emei 3: 0 (eava Cll Iungimea L trebuie sa se contectione ze din n bucet! do
(eava. tiecere ouest» avand lungim ea ai. 0 bucot« de (eava nu poate Ii tiiiata. Sa sa
gase asca. aoc« exisla , soil/ ria de a obtine teev« de lungime L prin sudarea unor bucet) de
!eava cu tunqimee e,
Metod a clasica de rezolvare a acestei probleme este de a genera toate tevile care se pot
forma cu cele n bucati de teava cu lungimile date si de a verifica daca lungimea tevii obtinute
este eqala cu L.
Mullimea dale lor de intrare 0 reprezinta rnultirnea A fermata din lungimile bucatilor de teava
a.. Valoarea asociata unei solutii este lung imea tevii . Valoare a solutiei optime este L
(Iungimea !evii co nstruite trebuie sa fie L). Solu t ia problemei este data de un vec to r S
= {x, . X 2• •• •• xm}, unde x;EA . Problema poate fi descornpusa in subprobleme: subpro-
blema i este de a gasi toate tevile care se pot confections adauqand bucata de teava cu
lungimea a: la tevile care au fost construite in subproblema anterioara. Restrictia impusa
pentru tevile care 58 constr uiesc este ca ere sa nu depasea sca lungimea L. Aceasta
restrictie lirniteaza rnultirnea tevllor construite anterior. Pentru a respecta pri nc ipi ul opti-
malitatil, constructia tevilor eu ajutorul bucatii de teava eu lungimea ai se bazeaza numai
pe tevile construite in subproblema anterioara, iar subproblemele nu sun t independente.
En untu l pro btemai 4: lntr-un rucsac S 8 poate transporta a greutate maxima G $i exista n
obiectc, fieeare obiect avand qreuuitee g; § i un profit obtinut in urma trenspottutu! c; iar
obioctete nu pot fi fractionate. Sa se setecteze obiectote care vot fi trenspotteto in mesne,
astfel incat sa se obtine profitul maxim (problema discrotii a rucsecutui y.
Metoda clas ica de rezolvare a acestei probleme este de a genera toate posibilitatile de a
incarca rucsacul aieqa nd obiecte din cele n obiecte ~i de a verifica daca greutatea obiectelor
nu depaseste greutatea de incarcare a rucsacului G. Dintre variantele de incarcare a rucsa-
cului se alege cea care are profitul eel mai mare.
Multirnea datelor de intrare a reprezinta rnultirnea A fermata din cele n obiecte ai care pot fi
transportate in rucsac. Valoarea asociata unei solutii este pr ofit ul t ran sportului. Valoarea
solutiei optirne este valoarea maxima (prof itul t rebui e sa fie maxim ). Solut ia problemei
reprezinta lncarcatura optima a rucsacului si este data de un vec tor S = {X1. X2•.. .• x m},
unde xkEA ~ i 1skSm. Problema poate fi descornpusa in subprobleme: subproblema i este
de a verifica daca obiectul a: poate fi element al solutiei, Restriqia irnpusa pentru solutia
care se construieste este ca obiectul a: sa nu aiba a greutate mai mare decat greutatea
disponibila a rucsacului ~i profitul lui sa fie mai mare sau egal cu profitul utimului obiect
adauq at in rucsac 3i.1. Aceasta restrictie lirrnteaza multimea elementelor din care se alege
elementul Xk al solutiei. Pentru a respecta princ ipi ul opt irnalitati i. elementu l Xk al solutiei
S8 determine prin alegerea dintre doua obiecte a celui care are profitul mai mare.
Subproblemele nu sunt inde pend ente dc oarece rezolvarea subproblem ei i se ~
bazeaza pe rezolvarea subproblemei i-1 (elementul Xi al solutiei este determinat in ~
functie de elementul X i-1 al solutiei).
lnfu r mu t icii 73
Metod a proqramar it dinami ce so bazoaza pc descompunerea unci pro bleme in
sub pro ble me s imilar e problcmci initiale, care nu sunt in de pc n dc n tc , ~i
c on st ru iosto so lutia rozolvand fie care subprobtorna, prin selecta rea, dint r-o
m ultirne d e c lemente, a el em entel o r ca re indep linesc 0 anurnita co nd it ie. .Pen tru
ca elementele care se selec teaza sa apartina sotutiet optima, la pasul k alegerea
se face in f un cti e de valoarea op tima a unci functii asociate solutlei ~ i se baze aza
pe ale ge rile care s -au facut pana atu nc i (pe elementele solutl ei care au fost
desc operite anterio r).
Etapcle de rezol var e a un ci p ro b lem a p ri n metoda p roq ra rna r!i d ina m ice s u nt:
PAS1. Se dernonstreaza ca problema are 0 substructure optima (prin reducere la absurd).
PAS 2. Se caracterizeaza structura unci solutii optime (descompune rea problemei in sub-
probleme).
PAS3. Se defineste re cursiv va loarea so lut iol opt ime.
PAS4. Se calculeaza valoarea solutiei optirne intr-o rnaniera "de jos i n sus" ("bottom-up·') .
PASS. Se con struieste solutia optima din inforrnatiile obtin ute prin calcu larea valorii solu-
tie i optime.
Obso rv atio. Valoarea solutiei optime este definite recursiv in functie de valorile optime ale
subproblemelor. Daca pentru calcularea functiei recursive s-ar folosi un algoritm recursiv,
ordinul de complexitate ar fi 0 (2"), la fel ca si in cazul metodei clasice de rezolvare. Din
aceasta cauzn, ca!cularea functiei recursive S8 face "de j os in sus " obtina ndu-se un
algo ritm itorativ :
PAS 1. Se rezolva subproblema obtinuta din descompunerea problemei initia te care are
cea mai mica dimensiune ~i S8 mernoreaza soluti a ei.
PAS 2. Cat t imp nu s·a ajuns la rezolvarea proble mei cu dimensiunea n , exec uta : S8
rezo lva 0 subproblems de dimensiunea i folo sind solutiile obtinute in subproble -
mete cu dimensiune mai mica decat i.
void p _d i n a mi c a ()
tint L j ;
f or (i = n - l ; i >= l ; i - - )
{ c [ i ] ~ 1; p [i J~l ;
for ( j ~ i t l; j < = n; j + + )
if (a [ i J<~a[ i J && L[i] < ~ L[ j J)
{ L [ i]~ L [ j ] + l; p [iJ ~ i ; } ) }
~
Ob ioc tu l Greutatea Profitul Obi ect 1 2 3 4 5 6 7 8 9 10
1 2 20 1 0 20 20 20 20 20 20 20 20 20
2 3 40 2 0 20 40 40 60 60 60 60 60 60
3 0 20 40 60 60 60 60 70 90 90
- -3 - - --~ - -
6
- 50
- -
4 4 45 4 0 20 40 45 60 65 85 85 105 105
Mat ricea p
G re uta tea di s p o nlblla Solutia
Obiec t 1 2 3 4 5 6 7 8 9 10 Obi ect ul Gr eutate a Profitut
r-r-r-r-r I
1 0 1 1 1 1 1 1 1 1 1 4 4 45
2 0 1 2 2 2 2 2 2 2 2 2 3 40
3 0 1 2 2 2 2 2 3 3 3 1 2 20
4 o 2 4 2 4 4 4 4 4 4 T otal 9 115
v oid P dinamica()
{for ( i n t i =1 ;i<=n ;i4·t)
f o r ( i n t j=l ;j<=G ; j ++)
i f ((a [ .i ] . g <= j ) && (o i l] .c +C[ i- l] [j -a [i ] .g] >C[ i - l ] Ij ] ) I
{C [ i ] U ]=a[i] .c+C[i -l] [j -a[i] . g ]; p [i ] [ j]= i.; I
else { C [ i ] [jl =C[i-ll Ij] ; p l Ll [j]=p[i -l] [j] ; I)
v o id a f i s ec z a ()
lint i=n ,j=G ,~ ; coucc-cv p ro Ej t tctal= "« :::[r: ] fG] « e n d l ;
wh i l e ip[i][j)'=OI
{ k=p [ .l ] [jJ ;
cout« " Ob i e c t u l "« k«" eli g.:-eutatea " « a [ k j . g;
cou t« " 5i pro fi :.ul "« a [ k ] . c«endl ;
j - v a [p [ i ] [j 1] . g ;
while ( p l i ] [j] = =k) i --; I I
v o i d mai n ( )
{ci t e s t e ( ); p_dinamica() ; afisea za() ; )
Complexitatea algoritmului proqrama rii dina mice
Algoritmul proqrarnarii dinamice are complexitatea O{n xm) deoarece se rezolva cele n
subprobleme, iar pentru fiecare subproblerna se calculeaza cele m elemente ale valorii
asociate solutiei.
1. Se dau n numere naturale ~i un numar natural 5 . Sa se gaseasca ,
daca exista, solutia de a obtine numarul 5 ca surna de numere
naturale dintre cele n numere date .
2. Sa se afiseze eel rnai mic numar cu exact n divizori.
3. Se citesc de la tastatura doua siruri de caractere S1 ~ i S2. Sa se insere ze spatii in sirul
51 astfel tncat -daca se suprapun cele doua siruri, numarul de caractere care coincid sa
fie maxim .
4. Se dau doua siruri de caractere A si B de lungime n, respectiv m . i ntr-un sir de carac-
tere se pot executa nurnai urrnatoarele trei operatii prin care se poate transforma un !iiir:
S(I) - sterqe caracterul din pozitia i, 1(I,e) - insereaza caracterul c in pozitia I ~I M(i,c) -
Inlocuieste caracterul din pozitia i cu caracterul c . Sa se transforme sirul A in sirul B
folosind un nurnar minim de operatii. Problema se va rezolva in doua variante: a)
transformante se vor aplica de la stanp a la dreapta; b) transformarile se vor aplica de la
dreapta la stanq a.
I n 1"0 r ill a tica 83
5. Se dau doua siruri de num ere X=(x , . xz•. ..• xm} ~ i y =(y , . y z•. ..• yrn} . Sa se determine
eel mai lung subsir comun al celor doua siruri . $irul Z=(z, . zz. .... Zk} este s u bsir
co m un al sirur ior X ~i Y dac a el este sub sir al sirulu i X si subsir al sirului Y. De
exemptu , daca X=( 1,2,3,2,2, 1,4} ~i Y=( 2,1.3,1.2,4}, sirul Z=(2 .3.1,4} este un subsir
comun al celor doua siruri , lnd icati e Valoarea asociata solutiei este lungimea unui
subsir comun , iar functia recur siva defineste valoa rea lungimii maxime a unu i sub;;ir
comun L (i.j) unde i .este indicele {Odaca i=O sau j=O
elerne ntului cu .care mcepe s Ub~ l ~ L(i,j) = 1+L(i. 1,j-1) daca i, O, jeO 'ii XI = Yi
ru l X. tar J est e indicele ele mentului max(L(i,j·1), L(i-1,j) ) daca i. O, j,O 'ii x'*Yt
cu care in cepe subsi rul Y.
6. Se da un ~i r de n matrice A, . A z. .. .. A n 'ii trebuie sa se calculeze produsul lor : A, xA zx
... xA n. Fiecare ma trice A i. cu 2:5ISn, are Pj·1 linii ~ i Pi coloane (doua mat rice A ~ i B S8
pot lnmulti numai daca numarul de coloane din matricea A este egal cu numarul de
linii din rnatncea B ). Sa se puna i n acest produs paranteze le potrivite astfel Incat
nurnarul de Inmultiri sa fie minim (deoarece Inrnultirea matricelor este asoc iativa,
inserarea parantezelor nu rnod ifica rezultatu l).
lndic atie . Fiind date doua matrice A p,q ~i Sq,r, matrice a prod us Cp,r con fine elementele:
'I
c ij = La;" x h"j
k=d
Timpul necesar pentru calculul mat ricei produs este determ inat de nurnarul de Inrnultiri
scalare : 3ikXbkj . De exemplu , pentru produsul A1 XA 2 XA 3, in care rnatricele au dimen-
siunile 10x20 , 20 x5 si, respectiv, 5x40 , nurnaru l de Inmultiri scalars pentru paranterizarea
((A, xAz lx A31 este 10 x20 x5 +10 x5 x40=12 00. iar pent ru paranterizarea (A ,x(A zxA 3ll este
10x20 x4 0+20x5 x40=12000 (de 10 on mai mare decat in exemplul anterior). V aloarea
aso ciata solutiei este nurnarul de Inrnultiri scata re, iar tunctia recu rsive m (i,j ) defineste
nurnaru l minim de i nm ultiri scalare pentru calculul mat ricei produs A iX. . .x A
o daca i= j
m(l,j) =
{ min{ m(i,k) + m(k+1,j) + pi·l xp kxPi I iSk<j } daca i<j
Din cauza acestor deose biri aceste metode se folosesc pentru clase diferite de probJeme . De
exemplu, pro blema determi nar!i termenului n al sirului lui Fibon acci . Rezolvarea acestei
probleme prin metoda divide et impera este ineficienta deoarece pentru a calcula termen ul f n
rrebuie sa S8 ca!culeze termenii f n-1 ~i fn-z. Dar, In calculul termenului f n-1, reapa re calculul
termenului fn -z, iar in calculu l ambilor termeni apare calculul termenului fn -3 s.a.rn.d. in acest
caz, 5e recornanda metod a proqrarnarii dinamice , calculand pe rand termenii ta. f4, ... . fn,
pornind de la termenii f1=fz = 1. Formula de recurenta este: fi = fi-1+fi-2, pentru 3:::;;i -;::;n. Deoa-
rece termenul f i nu depinde decat de doi termeni fi-1 :;;i fi-Z, nu este neces ar sa se memoreze
intregul sir de termeni, ci pentru fiecare subproblerna i, numai terme nii obtinuti In subpro-
blernele i-1 'ii i-2.
I JE:~nmTI.1ULSlJre I
Adev arat sau Fals :
1. in algor itmu l meto dei backtrackin g initializ area elernen tului k al solutiei 58 face cand
se revine de pe nive lul k+1 la nivel ul k .
86 T chnici de program ar c
2. Algaritmul metodei backtracking se incheie daca s-au testat toate valari le posibile
pentru primul element at solutiei .
3. in algoritmul backtracking. dupa gasirea unei solutii, S8 revine la nivelul anterior at solunei,
4. i n algoritmul backtracking . trecerea de la nrve lul k la nivelul k -1 al solutiei se face
cupa ce s-a u gasi t toate valorile pos ibile pentru nive lul k .
5. in algoritmul backtracking initial izarea nivelului k al solutiei S8 face eu valoarea de pe
nivelul anterior al solutiei,
6. i n algo ritmu l bac ktracking . daca s-a trecut la nivelul k al solutiei. i nse am na ca s-au
gasit primele k -1 elemente ale solu tiei.
7. in algoritmul backtracking, trecerea la nive lul k+ 1 al sol utiei se face dupa ce au fost
testate toate valo rile posibile pe ntru nivelul k al solutiei,
8. in impleme ntarea recur sive a metode i backtracking reve nirea din autoap el este echi-
valenta eu reve nirea la nivelul anterior al solut iei din varia nta ite rativa.
9. in implemen tarea recursiva a metodei backtracking autoapelul este echivalent eu
trecerea la nivelul urrnator al solutiei din varianta iterativa.
10. Divide et impera este metoda prin care problema ini\ial a se descompune in subpro-
bleme care nu sunt independente.
11. Prin metoda divide et impera se gase ~te solutia optima a problemei.
12. Metoda proqrarn arii dinamice porne ste de la solutiile optime locale si, pe baza lor.
construie ste solutia optima globala.
13. in metoda proqrarn arii dinamice descompunerea in subprobleme S8 face .ce susin jos",
14. Metoda greedy se bazeaza pe teorema ca optrmul local implica i ntotdeauna optimul global.
Aleqeti:
1. Algoritmu l care implementeaza metoda backt rack ing este :
a. polinomia l b. logaritrnic c. expon ential d. linia r logaritmic
2. Algoritmul care impleme nteaza metoda sortarii rapide este :
a. liniar b. logaritmic c. patratic d. liniar logaritmic
3. Algoritmul care implementeaza metoda cauta rii binare este :
a. liniar b. logaritmic c. patratic d. liniar lagaritmic
4. Se utilizeaza metoda backtracking pentru genera rea anagramelor cuv ant ulu i rnasca .
Sa se precizeze cuvantul precedent si cuvantul urrnator sec vente i camas , camsa ,
caams:
a. csaam l?i casma b. csama ~i casma c. csaam si casma d . csaam ~ i caasm
5. Se utilizeaza met oda backtracking pentru generarea tuturor num erelor cu 4 cifre dis-
tincte care se pot forma cu cifrele O. 2. 4 si 8. Sa se precizeze nurn arul prece dent ~i
nurnarul urrn ato r secven tei 2840 4028 4082 :
a. 248 0 ~i 428 0 b. 2804 si 4280 c. 2804 si 4208 d . 2480 ~i 4280
6. Se utilizeaza metoda backtracking pentru generarea siru lui de opt paranteze rotunde
astfel i ncat e le sa formeze 0 succesiune corecta. Sa se precizeze sirul de paran teze
preceden t ~i sirul de para nteze urrnator secv entei (0(0)) (000) (O())O:
a. ((0 0 )) si O((())) b . ((0 » 0 ~i O((())) c . ((0))0 si (())(O ) d . ((O()) ) ~ i (O)(())
7. Se utilize aza metoda bac ktracking pentru gene rarea sub rnuttirnilor mult irnii (1,2 ,3).
Sa S 8 precizez e submultimea precedenta !?i submultirnea urmatoare secventei de
subm ultirni ( 1) ( 1,3) (1.2) :
a. 0 si (2,3) b. 0 si (2) c. (2,3) ~ i (1 ,2.3) d . 0 ~i (3)
In fo r m a t ira 87
a. Daca se utilizeaza met oda backtracking pentru a genera toate permutarile de 5
ob iecte ~ i primele 4 per rnutari generate sunt: 54 3 2 1. 5 4 3 1 2. 5 4 2 3 1, 5 4 2 1 3,
atunci a cincea permu tare este:
a, 5 4 3 2 1 b. 5 3 4 2 1 C. 5 4 1 2 3 d . 5 4 1 32
(Bacalaureat - Sesiunea speciala 2003 )
9. Se cere dete rm ina rea tut uror rnodalitatilor de planific are in zile diferite a 4 probe
(rezistenta. aruncarea sulitei, sarituri , tir) in oricare dintre cete 7 zile din sa ptarnana .
Prob lema este echivalent a cu:
a. generarea cornbin arilor de 4 obiecte luate cats 7
b. generarea aranjam entelo r de 4 obiecte luate cate 7
c. generarea cornbinarilor de 7 obiecte luate cate 4
d. genera rea aranjame ntelor de 7 obie cte luate cate 4
(Bacalaureat - Ses iunea spec iala 2003)
10, Generarea tuturor siru rilor de 3 elemen te, fiecare eleme nt putand fi on care num ar din
multirnea {1 ,2 ,3,4,5,6), se realize aza cu ajutor ul unui algoritm echivalent cu algoritmul
de generare a:
a. aranjamentelor b . perrnut arilor c. cornbinarilor d. produ sului cartezian
(Bacalaureat - Sesiunea specials 200 3)
11. Se cere determinarea tut uror rnoda litatilor distincte de asezare In linie a tuturor cetor
n sportivi aflat i la 0 festivitate de premiere , Problema este echivalenta cu genera rea :
a. partitillo r unei mult imi de n obiecte b. aranjamentelor de n obiecte luate cate 1
c. perrnuta rilor de n obiecte d. submultirnilo r unei mult.rni cu n obiecte
(Bacalaureat - Sesiunea iunie-iulie 2003)
12. Conditia ca doua dame Q ~i D (de tip structural sa se afle pe ace easi diaq ona la a
table i de sah este :
a . (Q. l inie ==D. l i n i e ) II (Q. c o l oa na ==D. c o l o a na )
b. ab s (Q.linie- D. l i n i e l ==ab s (Q. c o l oana- D.coloana )
c . Q. l i n i e -O .linie == Q. c o l o a na - O. c oloana
d. a b s (Q . lin i e - D . c o l o a n a ) = =ab s { D . l in i a - D .~ o ~ oa~a )
(Bacalaureat - Sesiunea iunie-iulie 2003)
13. Se cere determi narea tutu ror numerelor formate cu cifre aflate in ordi ne strict cresca-
to are, cifre alese din tr-o rnultime cu k cifre distincte date. De exemplu, pentru cifrele
alese din rnultirnea {1,5 ,2) se obtin nume rele 1, 2,1 2,5 , 15, 25,1 25 (nu neaparat i n
aceasta ordine ). Prob lema este echivalenta cu gen erarea:
a. partitiilor unei rnultirni b. aranjame ntelor de 10 obiecte luate cate k
c. permuta rilor de k ob iecte d. subrnultirnilor nev ide ale unei multirni
(Bacalaureat - Sesiunea august 2003)
14. Cineva do reste sa obtina ~i sa prelucreze toate nume rele forma te din trei cifre din
sirul 2, 9, 4 ~i Ie genereaza exa ct i n ordinea 222, 229 , 224, 292, 299, 294 , 242, 249,
244, 922, 929, 924 , 992, 999, 994, 942, 949, 944, 422, 429, 424, 492, 499 , 49 4, 442 ,
449 ,444 . Daca doreste sa obtina prin acelasi procedeu numerele formate din 4 cilre ,
atunci dupa nurnaru l 4944 va urma :
a . 4949 b . 9222 c . 4422 d . 4924
(Bacalaureat - Simulare 2004)
15, Un etev foloseste me toda back track ing pentru a genera subrnul tirnile multimii
{1,2,5,6,9}. Cate solutii (submultimi) care obligatori u contin elementul 2 ~ i nu contin
eleme ntul 6 a gen erat?
a, 7 b. 16 c. 6 d. 8
(Bacalaureat - Sesiunea spe ciala 2004)
88 Teh nici de programurc
16. Pentru a determ ina toa te rnoda litatile de a serie pe 9 ca surna de numere natur ale
nenule distincte (abstractie facand de ordinea termenilor). un elev folo seste metoda
back tracki ng qen er and, in ac easta ordine , toate solutiile: 1+2+6. 1+3+5 . 1+8. 2+3+4 ,
2+7, 3+6 si 4+5 . Aptic and exact acee asi meto da , el de te rrnma solutiile pentru
scrierea lui 12. Cate solutii de form a 3+ ... exista?
a. 7 b. 1 c. 2 d. 4
(Baca laureat - Sesiun ea iunie-iulie 2004)
17 . Pe ntru proble ma ant erioara , care este a opta sol utie deterrninat a?
a. 2+3+7 b. 3+4+5 c . 1+5+6 d. 1+ 11
(Bacalaureat - Sesiune a iunie-iulie 2004)
18 . Pentru problem a ante rioara stabi liti care este solutia cu pro prieta tea ca imediat dupa
ea este qenerata solutia 3+4+5?
a. 3+4 +6 b. 2+3+7 c. 2+ 10 d. 4+8
(Bacalaureat - Sesiu nea iunie-iulie 2004)
19. Se gener eaza toate pe rrnutarile distincte de 4 obiecte nu me rot ate d e la 1 la 4 , avand
prop rietatea ca 1 nu este vec in cu 3 (1 nu se afla imed iat dup a 3, ~ i nici 3 imediat
dupa 1) ~i 2 nu este vecin cu 4. Cate astle l de permut ari se qenereaza?
a. 12 b. 24 c. 6 d. 8
(Bac ala ureat - Sesi unea augusl 2004)
20. Se cere sa se determine to ate mcdalitatile distincte de a programa n sp ectacole i n z
zile (de exemplu , doua spectacole .Micul Print " ~ i . Pacata" se pot programa in trei
zile, mart i, miercuri si jo i, astfel: "Micul Print " - rnarti si .Pacala" - miercuri sau : .Micul
Print" - miercuri ;;i .P'a cala" - rnarti : "Micu! Print" - miercuri ~i ..Pac ala" - joi: "Micul
Prin]" - rnarti ~ i "Pacala" - joi : .Micul Print" - joi si .P'a cala" - miercuri etc .).
Rezolvare a se bazeaza pe algoritmul de generare a:
a. combinarilor de n obiecte luate cate z b. aranjam entelor de n obiecte luate cate z
c. cornbina rilor de Z obiecte !uate cate n d. aranjamentelor de Z obiecte luate cate n
(Bac alaureat - Simulare 2005)
21. Se considera algont mul care dete rmina toate pe rrnuta rile distinct e de n obiec te
(numerotate de la 1 la n) i n care nu exista poz itii fixe . 0 permu tare (p " p z, .... Pn) are
puncte fix e daca exista cel put in 0 cornponenta Pi=i . De exemplu , pentru n=5 ,
permutarea (2.3,5,4 ,1) are puncte fixe deoarece P4=4. Pentru n=4 , stabilliti cate
permu tari tara puncte fixe exista.
a. 8 b. 9 c. 10 d . 12
(Bacalaureat - Sesi unea speciala 2005 )
22. Se consid era algoritmul care determina toate perrnutarile distincte de n obiec te (nume -
rotate de la 1 la n) in care pe once pozitie de rang par se ana 0 valoare para. De
exernplu, pentru n=5, primele trei perrnutari generate in ordine \exicografica sunt
(1,2,3,4,5), (1,2,5 ,4,3), (1,4,3,2,5). Pentru n=4, nurnarul total de astfel de perm utari este:
a. 2 b. 4 c. 8 d . 12
(Bacalaureat - Ses iunea iun ie-iulie 2005 )
23. Se conside ra algoritmul care genereaza . in ordine strict crescatoare, toate numerel e
formate din n cifre distincte (cifrele de la 1 la n), numere in care pe fiecare pozitie para
58 afa 0 cifra irnpara . Pozitia se nurnara de la stanqa catre dreapta , pornind de la
pozitia 1. De exernp lu. pentru n=4, prime le trei numere generate sunt: 2143 , 2341 .
4 123. Pentru n=5 , primul numar generat este :
a. 21345 b. 2 1435 c . 12345 d . 13254
(Baca laureat - Scsiunea august 2005)
l nfu r mat icii 89
24. Se genereaza toate subrnultirn ile formate din doua elemente ale rnultimii (5 ,6,7,8) i n
ordinea: 56, 57 , 58 ,67, 6 8, si 7 8. Daca se utilizeaza exact aceea"i metoda pent ru
a genera submult imile de trei elemente ale multirnli (2,3,4,5,6), atunci penu ltlma mul-
time generata es te:
a. 3 45 b . 356 c. 456 d. 2 5 6
(Bacal aureat - Simulare 2006)
Miniproiecte :
Pentru realizarea m iniproiectelo r S8 va lucra in oc h ip a. Fiecare miniproiect va con tine:
3. doua metode pc ntru con struirea algoritmului (care sunt precizate in cazul pn-
melor 8 miniproiecte);
b. justificarea Io losirii metodelor care au fast alese pentru rezolvarea problemei;
c. explicarea metode lor folosite pentru construi rea agoritmului;
d. compararea celor doua metode din punct de vedere al corectitu dinii solutiei:
e. compa rarea celor doi algoritm i din punct de vedere al cornplexitatii.
1. Rezolva!i problema acoperirii tab lei de sah de dimensiunea n xn cu un cal care porneste
din patratul de coordonate (x ,y) folosind meto da backtracking si metoda greed y.
2. Rezolvati problema cost ruirii tevii de lungime L din bucati de teava de lungimi a: folosind
me toda back tracking si metoda proqrama rii dinarnice.
3. Rezolva ti prob lema gas irii unui traseu pentru a ie;;i din labirintul de dimensiunea nx rn,
stiind ca se porneste din patratul de coord onate (x,y), folosind metoda greedy si metoda
backtrac king.
4. Rezolvati problema platii unei sume cu bancnote cu valori date , pentru fieca re valoare
de bancnota avand la dispozitie un anumi t nurnar de bancnote, fo losind metod a
proqrarnarii dina mice si metod a backtracking.
5. Rezolvati problema turistului care trebu ie sa gaseasca un traseu de munte in care sa
urce cat mai putin , folos ind metoda proqrarnari i dina mice ;;i metod a greedy.
6. Rezolvati problema deterrninarii sumei maxime l ntr-un triunghi folosind metoda greedy
;;i metoda proqrarnarii dinarnice .
7. Rezo lvati prob lema dete rrninarii unui subsir crescator de lungime maxima folosind
metoda greedy si metoda proqramari i dinamice.
8. Se dau n paralelipipece avand fiecare dimensiunile a r, b i ;;j c., Sa se cons truiasca un
turn de lna ltime maxima prin suprapunerea acestor paralelipipede. Un paralelipiped
poate fi asezat pe orice fa\a Un paralelipi ped poate fi aranja t peste un alt paralelipiped
numa i daca fata lui nu depaseste fata paralelipipedului pe care este pus. Rezolva ti
prob lema folosind metoda bac ktracking ;;i meto da proqrarnarii dina mice .
9. Pe 0 tabla de sah de dimensiunea n xn un cal porncste din patratu l de coor dona!e
(X1,Y1) si trebu ie sa ajunqa in pat ratul de coordonate (X2,Y2) Sa se gaseasca traseul de
lungime minima .
10. 5 e dau n piese de domino, fiecare piesa i fiind descrisa prin perechi de doua numere
(Xi,Yi). Sa se gaseasca 0 secventa de lungime maxima de piese i n care oricare doua
piese alat urate au inscrise la capetele cu care S8 lnvecineaza acelasi nurna r.
2. Implementarea
structurilor de date
2.1. Tipuri de date specifice pcntru adresarea memoriei
Memoria intern a a calculatorulu i este orqanizat a sub forma unor locati i de dimensiunea unui
octet, numerotate consecutiv, pornind de la O. Aceste nurnere, ex prim ate in hexazecimal, S8
numesc adrcse de rnernorie- Locatiile de me morie pot fi mani pulate individual sau in grupuri
contigue. Spatiul de memorie este gestionat de sistemul de operate. Fiecaru i program
aflat in exec utie, sistemul de ope rare Ii rezerva (aloca) propriul spatiu de memorie. Daca pro-
gramul apeleaza subprograme, acestea pot fi privite ca blocun care contin instructiuni ,i date
(variabile de memorie ,i structuri de date), carora sistemul de operare trebuie sa Ie aloce
spatiu de memorare in interiorul zanei de memorie rez ervata programului principa l (ca re
corespunde fisierului sursa). Spatiul de memorare este Irnpartit in patru segmente, iar proce-
so rul are aece s la toate ce le patru segmente , ale carer adrese Ie qestioneaza prin inte rmediul
unor req istri:
-7 segment u l d e cod - in ca re S8 in ca rca ins tructiu nile programului care se executa ;
adresa de inceput se pastreaza in registrul CS;
-7 seg m e nt u l de dat e - in care se inca rca anum ite date ale progra mului care se executa
(de exemplu , variabilele globale) ; adresa de inceput se pastreaza in registrul OS ;
-7 se g mc nt u l d e s t iva a sistemului - in care se inca rca adresel e de reveni re din subpro-
,i
grame , i variab ilele locale cu care lucreaza subprograme le; pentru gestion area sa se
folosesc doi reqistri: SS (in care se pastreaza adresa de la baza stivei) SP (in care se
pastreaza adresa de la varful stivei);
~ ex traseg ment ul de date - in care se incarca alte date ale programului; adresa de
inceput se pastreaza in registrul ES.
Siste mul de ope ra re aloca spatiu datel or in mai mu lte zone de mernorie- in functie de
modul in car e a u fost de clarat e in program
~ va ria bile locale I
zona de a dre~~ ibe~~~~ (alocarea implicita)
stiv a siste mu lui (s tack ) 7
I(varia bile gIObal:t- -. segmen tu l d e da te
I variab ile loc al e static e I
(alocarea implic ita) I (aloc are cu stati c)
r e g i ~ trii pr o ce s or ului
variab ile lo c al e I
(alocare cu reg is ter )
o dat a rnanipulata de prog ram prin inte rmediul unei varia bile de memorie e ste carac teri za ta
de mai multe at rib ute - pe ca re Ie prirneste in momentul in care este declarata in program :
-7 Nurnele- Este identificatorul folosit pen tru referirea da tei in cadrul prog ramului (in
exemplu - a).
-7 Adres a- E ste ad resa de memorie interna la care se aloca spatiu da tei res pe ctive , pe ntru
a stoca va loarea datei (in exemplu , da tei i se aloca ad resa adr in stiva siste mu lui).
Informatica 91
2 octeti / valoarea date;
.. ~ -
a = nume dat40000000011 0010 t- - - - - - - '
void sb ( )
lint a ~ 100 ; .. .} ad r = adresa zonei de memorie ad r+2
Memoria intema
-7 Valoarea Este continutul, la un momen t dat, al zonei de memorie rezervate datei (In
exemplu - 100 (10) = 1100100(2)) .
-7 TipuL Determina: domeniul de defi nit ie inte rn al datei (rnultirnea In care poate lua
valori data). o pe rato rii care pot fi aplicaf pe acea data si mo dul i n care data este
reprezentata i n mem oria lntorn a - metoda de codificare in binar a valorii datei (in
exemplu, tipul este unsigned int domeniul de definitie intern al datei este intervaluJ
[0, 65535]) , operatorii care pot fi aplicat i pe aceasta data sunt operatorii perrnisi de tipul
nume ric - aritmetici, relationali, logici, logici pe biti etc. - ~i reprezentarea datei in
memoria intern a S8 face prin conversia nurnarului din zecimal in binar).
-7 Lungimea. Este dirnensiunea zonei de memorie alocate datei ~ i se mascara in octeti.
Ea depinde de modu l de reprezentare inter ns a tipului de data (in exemplu, datei i se
aloca un grup contiguu de 2 octeti ). Pentru a afla dimensiunea zanei de memorie alo-
cate unei variabi le de memorie se poate folosi operatorul sizeof{) .
7 Durata de viata Este perioada de timp i n care variabilei i se aloca spatiu de memo-
rare (In exemplu, data a este a variabila eu durat a loc al a careia i se aloca spatiu de
memorare numai pe dura ta de executie a blacului i n care a fost decla rata, adica pe
durata de executie a subprogramu lui sb ).
Pentru a putea manipula 0 data , prog ramul trebuie sa identifice zona de memorie in care
este stocata. Identificarea acestei zone se poate face atat prin numele datei (a), cat si prin
adresa la care este mernorata (adr). Pentru a putea manipula datele cu ajutorul adreselor
de memorie , In limbajul C++ sunt imple mentate urrnatoarele tipuri de date:
-7 tipul pointer sau adrosa
-7 tipul roferinta
Se poate folosi un nou criteri u pent ru elasifiearea datel or:
I I
,
criterilJlsernrifjq~liei
\,
Adresele sau da te le c are pe rmit
ope rat iilo r de prelucrare. ad resarea ope ranz ilor.
Sun! date ale carer valori sunt tolosite ca Sunt date ale carer valori sunl folosite pentru
operanzi in cecru! expresiilor.utilizete pentru localizarea pe suportul de memorarea datelor
calcu larea rezultatelorcerutede problema. care sunt preJucrate(operanzii).
.--.
2 octet i
+V[O]~
adr adr+2 adr+4 adr+6 adr+8
4 0cteti
1 linia 0 I linia 1
04
linia 2
• 1 linia 3 1
~
.>:OI
a[O][ I
f
1
a[0][ 1] 1
. ',.
t~
z octeu
04~ ..
a[3][0] I
f
~I
a[ 3][11
I a[1][1] I a[2][1] I
adr adr+2 a[ 1][0]
adr+4
t
adr+6
....
a12][0]
coloana 0 coloana 1
d +12
a r
adr+14
Alocarea memoriei unei ma trice se face In mod contiguu , memor area elemente lor facan -
du-se linie cu linie, astfel Incat matr icea apare ca un vector de linii. Daca matr icea are m linii
si n coloane , ea va avea mxn eleme nte. De exemp lu, matricea a are 4 x2=8 elem ente ;;i este
rnernorata ca un vector eu m elemente de tip vector cu n elemente , care au tipul de baza al
matricei (in exemplu, un vecto r cu 4 elemente de tip vector cu 2 de elemente de tip int). Zona
94 Implem entarea st ru ct ur ilor de dale
de memorie alocata unei matrice are dimensiunea m x n x stzeofttipbaza). in exemplu,
rnatricei a j se aloca 0 zona de memorie de 4x 2x sizeof(int) =4 x2 ><2=1 6 octeti. Identificarea unui
element al rnatricei se face folosind doi indici (i ~i j ). Adresa tabloului este ~i adresa prirnului
element, a[O][O] . Daca adresa tabloului este adr, adresa elementului a~]m este:
adr + ixn xsi zeof(ti p_baza) + j xsi zeof(lip _b aza)= adr + (i xn+j) xsizeof(ti p_ baza) ,
Pentru exemplul de mai sus, adresa elemen tului a[3] [1] este:
adr + 3x2xsizeof(int) + 1xsizeo f(int) = adr + 3 x2 x2 + 1x2 = adr + 14.
+------7~~-""-'-'==------'
'* - operatorul de redi rectare
dereterennerea pointerului
Observa tii :
1. Pointerii reprezinta adrese ale une i zone de me morie (co ntinutul unei variabile de me-
morie p de tip pointer este 0 adresa de me mori e).
2. Acce sul la 0 zona de memorie se poate face fie folosind identificatorul asociat zonei
de memorie (nu me le var iabilei de mem orie), fie aplic and operatorul de redirecta re • pe
adre sa zonei de memorie (co ntinutul adresei de memorie indicate de un pointer p se
refera cu lo p).
3. Dimens iun ea si sernnific atia continutului unei zon e de mem orie indicate de un pointer
dep ind de tipul poin terului.
Exemplul1
int a =1 0, *p =&a ;
cou t « p « e nd l «a« e n d l ;
cout« p«endl« \ u« e n dl;
In forma tica 95
S-a definit 0 variabila de memorie de tip int (a) ~i 0 variabila de tip pointer catre tipul
int (*p) careia i s-a atribuit ca valoare adresa variabilei a. in memoria interna se vor aloca
doua zone de memorie: una de 2 octeti, pentru variabila de memorie identificata prin numele
a, in care S8 pastreaza a valoare numerica lntreaqa, ~ i una de 2 octeti pentru variabila pointer
identificata prin nume le p, in care S8 pastreaza 0 adresa de memorie (i n exemp lu, adresa
variabilei de memoria a). Continutul Beeslor zone de memoria asta prezentat in figura .
:1
I I
t
2 octe\i 2 Geteti
4 ~ ---
adC= ~ 10 ~0
Memoria interna
P
~a~ 10 I "p adr_3
p ~~ 1O a ·
I
*p ad r_3 : *q=*p
~~
q
20
• b adr b q -
>
I
,.~ tb
Memoria intern a (1) v Memo ria i ntorna (2)
2. Constructia rp (p fiind un pointer catre un tip de data) poate aparea i n orice expres ie in
locul unei variabile de memorie care are acelasi tip ca si eel asoc iat pointerului :
int a ""lO, *p=&a;
*r-'= *p +S; /+ Lnc remence a z a cu 5 ve Loe r ee va r i ab i.Le i. de 1a aci r e aa
memorat~ i ~ ~a riati~3 P , ad ic ~ valoarea va r i 0b ilei a */
c our.c-c a-c-c'' "<x e p , Ilafi~eaza 15 15
3. Ope ratorii I\: si & sunt operatori unar i si au prioritate mai mare deca t operatorii
aritmetici, relationa li, logici ;;i de atribuire.
in t a=iO , *p"""' &a ;
*p += l ; j k i l l c r e m e nt e a z~ co. 1 valoarea va ri a b ~ lai de ],a adresa memo-
ra t a in p , a dic5 vaJ. oa r e a va riabil e i a " j
cou t c'<e , j/af':;;caz,'j 1 1
4. Asociativ ita tca operatorilor unari este de la drcapta la s tanqa . Din aceasta cauza.
trebuie folositi cu grija operatorii unari ;. liii ++ (respectiv - -). Astfel, * p++ incrementeaza
cu 1 adresa rnernorata i n variabila p, si nu valoarea de la adresa rnernorata i n p :
in t .1--=10 , * .r:= &a ;
++* p ; / - .i nc r eme nt.ea z a ell 1 v a.i oa re.s va r La bi. Le .i. de La ad r e s a
memo r a t.a in p , ad.ice ve Loa r e a var i.eb i Le i a ',1
courc c a , / 100 f =-$eaza 11
{*1:. ) ++ ; I ' .i ncr cmcnt.eez a cu 1 va Loa r ea va r i.abi.Le.i de La ec re ee
r.emo r e t a in p, eo f cs i nc reraen tea za co. .1 va roe ree ve r i.ab i Le i a *1
cout« a ;
5. Datorita tehnicii de suprainc arcare a operatorilo r permisa de limbajul C ++ , caracterul •
(asterisc) este folosit ~ i ca operator de redirectare (operator unar) si ca operator de
multiplicare (operator aritmetic). Pentru a Inrnulti valorile memorate la dcua adrese de
memorie indicate de doi pointe ri P si q este obligatori u sa se foloseasca parantezele:
i n t a ,b= 10 ,c=20 , *p= &b, *q= &c ;
eJ..=;( *pl *( *q) ; /"vi;lrLJ.bi1 0 i a i sc a t ri.bu i.e pr c.dus u l d.lr.t ro va.Loa r ca de
13. udreec mcmor at a in .0 , ~d':"ca vatoa ree va'r i.ab i.Le i. b, s i. vo tce ree
de la adresD memO~ az a i n g, ndica valoa~e~ variabilei c f i
cout« a ; Ila:i~eaza 200
Iulurm at icii 97
Con siderand declaratia: int <1 ,0 , * p ;.;;;& a; instructiu- ._- _ ._ - - - -
'b=a+ 1O; <-> b-* +10;
nile de atribuire din tabelul aiaturat sunt echiva lente: a b; <-> * p~ b ;
Asadar, local izar ea une i date memo rate intr-o varia- a++; ,-> ( *p )++ ;
bita de memo rie se poate face prin: a-a+5 ; <-> *:e-*~
-7 adresare directa - folosind numele variabilei de b-a*a; <-> b ~ ( *I' ) * (~£LL
memorie (in exemplu a); a *-5 ; <-> *p L 5 ;
-7 ad resare lndlrocta - folosind 0 variabi la de tip pointer In care este mernorata adresa
zone i de memorie In care este stocata data (In exempJu, p).
----.... ......-.....
1. Scrieti un progra m In care declarati 0 variabila de memorie de tip
f loat ~i un pointer catre tipul float , cititi de la tastatura valoarea
variabilei ~i l i afisati valoarea folosind cele doua metode de adresare :
adresarea directs ~i adres area indirecta.
2. Scrieti un program in care declarati - 0 variabila de memorie de tip inregistrare care va
contine doua carnpur i, coresp unzatoara numitoruJui ~ i nurnaratorutui unei fractii, ~i 0
variabila de tip pointer catre tipul imegistrare -' , citit i de la tastatur a valorile carnpur ilor
din i nregistrare ~ i afisaf valorile acestor carnpuri folosind cele doua metode de adre-
sare: adresarea directa ~i adresarea indirecta.
20cteti
) adr (
p 20cteti
) adr
Memoria interna (1)
q
.>
...I i : :e\y ..+
.1 4
2 octet i
.
1
j
reprezentat in vi rqula
m~~i1a sjmpla precizie
Exernpl ul 1:
c ha r c = 'A ' , *p;
p=&c; :*\ar~abilei P ~e tip pointer ca:re caracter i se at ibuie
adres a v ari a bilei de memorie c ~ I
cou t-c-cc-oc" "<x e p : I /af:'~eaza A A
Exernplul 2:
in t 0=10 , *p =&a , * q ;
q=p; l ir poi nt e rului q i se a tribuie v a l oa r e a p oi n t e r u lui P, adi c a
a dre s a va r i ab i l e i a ~ /
cout« *p « " " « *q ; //af i ~eaz~ 10 10
Exemplul 3: Numele unui vec tor e ste numele unei var iabile de rnemorie, dar ;;i 0 con-
stanta de tip ad resa CII tipul de baza al eleme ntelor vecto rului , care indica primu l element
al vecto rului. Pointerului p i se poate atribu i adresa vect orului a exprirnata prin :
In 1"" f ill a t ira 99
-7 cons tanta sirnbo lica a;
-7 operato rul de adre sare & aplica t pe nume le va riabilei a ;
-7 operatorul de ad resare & aplicat pe identlficatorul primului elemen t al vectorului a[O],
iar urrnatoarele operatii de atribuire sunt ech ivalente:
p=a <-> p=&a <-> p = &a [OJ ~ i *p <-> a[O]
int a[lOI , i ,k-l , *p ;
f or (i:0 ; i <10 ;1++) a[ i] =k++ ;
p =a ; j Jvar i a b i l ei p i s e a tr ibu ie nurne l e vecto r u lu i d , ca re
e s t e 0 c o n s t a n t a simbol ica de t i p adre sa * /
cout.cc ep-;c" "<c a l Oj c c e nd L, //afi $e az a 1 1. - va Ioa rea e l ementul u i a l O]
Excmplul 4: Numele unei matrice este numele unei variabil e de me mo rie, dar ~i 0 con-
stanta de tip adresa cu tipul de baz a al elemente lor ma tricei, care indica pr imu l elem ent
al rnatricei. Pentru un pointer p cu tipul de baza al elementelor matricei a, care trebuie sa
ndice pr imul element al matricei, urma toarele operatii de atribuire sunt echi va lente :
p=a <-> p=&a <-> p=a[ O] <-> p=&a[O] [0] ~i *p <-> a[O ] [0 ]
i n t a[lOJ [lOJ ,i ,j ,k~l, *p ;
f or (i=O ;i <lO ;i+~)
fo r (j-O ; j<lO ;jH) a l i ] fjJ~kH ;
p =a ; I * v a r iabile i p i SP e t ri bu.i e n u mel e ma t rice i d , c a re
este 0 cons t a n ta simbo li ca de ti p adresa k /
ccutxcepc-;'' "« a [OJ [0] <cendk , / hlfi~ea za 1 1 - veuoc r ea e.lenentulua a (OJ [0]
Exemplu l 5:
i nt a[4][Sl,i ,j ,I:-1, *p ;
=or {i=O ;.i<4 ;i++)
for (j-O ;j<S ;jH) a[iJ [jJ-k++ ;
p =a [0 ]; ;*'variabi l ei p i se e t r i.bu Le adre s a vecto rul ui f orma t
di n p rima l i n i e a mat r ice i a , c a re este 0 c o n s t a n t a * /
cou t « *p « " "« a rO] {O]« e nd l ;
/afl~eaz a 1 1 - v a Lo e rce e Lemen t u Lu.i a[O l [ OJ
Exe m pl ul 6:
.i n t; * q ;
q=O; II pointerului q i 5e atr ibuie consta nta 0
=out«*q « endl ; /~nu afi~eaza ni~ic , deoarece pointerul q are
a Lo a r-e a 0 s i e I fit; i n d i c a n i.c i 0 a d r- e s S d e rnemo r Le ... /
v
~
Unui pointer nu i se poate atribui valoarea unei constante intregi ,
Atcntie • chiar daca este a con stanta hexazc cim ala, deoarece programato rul
. . nu are acces direct la adresele de me morie pentru a Ie gestio na.
.Jnei date nu poate sa ii atribuie 0 adresa de memorie decat sistern ul de ope rare .
~ Deoarece nu m ele tabl oului d e memorie este folos it de cornpila-
~ toru l C++ ca 0 constanta simbolica de tip adresa , une i variabile
de tip tablou nu i se poate atribui a alta variabila de tip tablou sau un
: ointer ca in exe mp lul urrnator :
I
100 IIlIJllcIllcnta rca s t r nct u r ilor dc datc
i n t a [ 1 0], b [ 1 0 ], *!p &b ;
a=b; a=p ; II Er o are ! Une i cons t arrt e nu i se poa t.e mod.i f i.ca va Lo ar ea
Scrieti un program in care declarati 0 va riabi la de memorie de tip i nre-
qistrare. care ccntine coua campuri cores punzatca re numitorulu i ~i nu-
rnaratoru lui unei frac fii si 0 variabila de tip poin ter catre tipu l inregistrare
;;i care sa realiz eze urrnatoare !e:
a. atri buie pointerului adresa variabilei inregistrare;
b. citeste de la tastatura valorile pentru numerator ~i numitor;
c . afise aza fractia simp lificat a - rez ultatele S8 obtin in do ua va rian te , folosind cate una
dintre cele doua metod e de ad resare (adresare a directs ;;1 apoi adresarea indi recta)
;;1 S8 co rnpara rezultatele obtinute .
j -\
t ip da ta &n u me v a r iab il a = n u me v a r i a bi l a re fer ita i
~ 1. Refe rin ta tr ebuie lnit iallza ta c hiar i n m om entu l dec la rari i ei.
~ ExemPlu:
i nt a , &~ ; II Eroare : va r i a b il a re £erin~a nu a f cst ini~ i a:izata
104 Impl cmcnta r ca st r nct nrilor tic da te
2. Dupa ce a fost lnitializata, referinta nu mai poate fi rnodificata (nu S8 mai poate
schimba adresa de mem orie la care S8 refera).
Exem plu :
int a=lO ,b= 100 ,&x =a ;
c ou ti-oc a-oc " " « Y.« e nd l; ! faf i$eaza 10 10
x = &b ; x nu i se poat e a t rLbu i.
/ k Eroare : va .r i ab i.L e L .re f'e r i nt.a
ad r e s a va r i a b ilei de memorie b , d eoa r ece var i a b i la X , pr i n ae f i n i~i e ,
S0 r e fe r S La va ri a o i La de me mor i e a s i. memo r e aa a c d r o s e e i. -k I
x=b ; / '" Care ct : va r Lab i Le i r c Ie r i n t'a x: i s c p o a t e a t r-Lbu i
valoarea va riabilei dc memoric b , aceasta 'i.nse:nndnd ca vari2:.bilei
referite de x (variabila a ) i s e a::.ribuie valoarea variabile_ b -.. /
c ou ti-c-ca-c-c" " <c x-c-cend l , / /afi$e a za 100 100
3. Nu S8 poa te crea un pointer la 0 referint a.
Exe mp lu :
i nt a =]O ,&:-:: =a ;
i n t "P=/. ; / . Ero are: po.i r.r.e r u Lu i p nu i se poa te a t r Lou i edreee
memor~ta ~n variacila x , deoarece nIT~el e variabile~ x nu identific ~ 0
adre s5 , ci 0 valoa re i~tre ag5 mB~orat5 l a adre sa var i abilei a ' j
int * p ~.: &x ; /* Corect : po.i n t er-u Lui. p i se poa t .e a t r i.bu L ad rc s a
va r La b i Le i. r ere rf nt a x , ace a s ta fi Ln c d e rap t: ad r e s a va ri. abi Le i a * /
4. Nu es te perrn isa dec lararea un ei referinte la 0 ad resa exprirnata printr-o rc fe rin\a
sau pri nt r- un po i nte r.
Exemplu :
int a=10 ,b= :00 , "' :;-.)"-' &a , -q-o. b . &:-:= a ;
in t &y = F. x ; / ": Er-oar-e : S- <J. dec Lar a t va.ri.ab.i.L a Y cn r o t rcbuic s b sa r c-'
fcre La 0 ve r i a b i la de li p int , ca 0 ref erint;.~ 1a adre a a va rL a b i. Le i x .~ /
in t ; y =x ; / > Co r e ct: s -a dec1arat var iabi1a y ca 0 re fe r i.md 1a
variabila x, CZlre este 0 r e f e r i ::'1;:a :a va~ iabi1a a; var i a b i l a .y se re fera
In vu riabila a ~ /
i n t &z=q ; I '" Eroa:ce : s -a dec La r a t; va ri abila 7. , ca re tr e b u i e sa
s e r-e f e r e In. I) va r i ab i.l. e de tip i n t, ca 0 re fo rL n ta 1 5 ve r.i a b i l a
po i n t e r q ca r e ml2mor eaza 0 a d r e s a ~/
in t & z = ~ q ; / ~ Co r e ct : s -a decla ra t vu r i a b ila z , care t r e b u i e sa
se re fere la 0 va r iabil a de rip in t , ca 0 re f e r inta la 0 va riabila
a cn re I acrc sc e s t.e .i nd i.c a t S de po i n t e r-u L q (e d i.cf variabila 0; ~ /
c o u t-ocac-c" "« " p« " " « x«" " < x y-c-ce rid L : l/afJ.fjea7d 10 10 10 10
ccc e-cct.c-c '' "«" q« " "<c accencn • / J afi$eaza 100 ::" 0 0 100
"p=-20 ; cou t -c-ca -c-c" "<e -pe-e" "< e x-e-c " " « y«en d l ;
Ilaf i~eaz a 20 20 20 2 0
x-30 ; oou t.c-c a c -c" " <c vp c -c'' "<x x-cc" "<x yc -ce rid L :
I/afi~eaza 30 30 30 30
p~r.z ; b~2QO ;
co u t c-ca -c-c" " <e -p-ee ' " <ex-e-c ' "« '1«" "<c vqc-c" "<c z-c-ce n c .l ,
/ln fi ~eaz 5 30 200 30 30 200 200
5. Tip ul referintei si tipul va riab ilei la care sc re fora tr cbuie sa fi e aco las i 9i refe rinta
~ j ob iec tu l la ca re face referirea trcbu ie sa fie de ace las i tip. Astfel , daca referinta
Inform aticii 105
este 0 variabila de memorie, referirea trebuie sa
S8 taca tot la 0 variabila de memorie ,
si nu, de exemplu , ta 0 cons tanta, chiar daca aceasta este de acelasi tip cu reter inta. Tn
cazu l in care nu S8 respecta aeeste reguli, comp ilato rul va va atenticna. Aceasta
lnseamna CEt pro gramul va putea fi executat, dar rezu ltatul obti nut nu va fi eel asteptat,
deoarece S8 creeaza 0 variabila de memorie tern pora ra , cu tipul referintei, careia i S8
atrib uie valoarea variabi lei referite, respectiv a cons tantei , jar variabila referinta va
adresa aceasta variabila tamporara, si nu variabila referita , respectiv cons ta nta:
Exemp lu:
char c :. ' A ' ; float & w ~ C i
! / e c h i_v a l e n t e u : char c"" ' J\ ' ; float t.emp wc , float s a e t emp ,
/ / t f:>mp f i ind v a rLab L'l.a de memc r i e t.e rnpor-a r a
cout.c-cac-c '' "<cccceocn . II<1 f.i $Gaza 65 A
a o;;o a / 5 ; cou t« a« " "« c«endl; I / a f i.,? e az a 13 A
e l+ ; cout« a «" "« c«endl; / /afi,'2 e aza 13 B
int &a=1 0 ; /I 0.ch i, \'a lenL ell ; int t e mp= l O; int &3""' temp ;
I I t.emp f i i n d variab i l a de memo.rie t e mp o r-a ra
cout« a« endl; / / at i~eaza. 10
0. ""' 2 0 ; c o u t .c-ca : //afi$8aZ a 2 0
Scrieti un program in care declarati a var iabila de memorie de tip f loat ~ i
a referinta catre aceasta variabila de memorie , cititi de la tastatura si
afisati va loarea variabilei de tip float - folosind cele doua nume ale vari -
abi lei de memorie.
[ Swd!:Ji.lI.lJ. de OSlZ I
Seop : exem plifica rea modului in care puteti folosi aloca rea dina rnica a memoriei
Enunt ul problemei 1: Se citesc de la tesieture trei numere intregi - a, b §i c - care
reprezinte marimile lalurilor unu i triunghi. Sa se eiiseze aria triungh iului.
Se foloseste alocarea dinamica a variabileJor clementare . Pentru referire a marimi lor
latur ilor se fol osesc pointer ii a , b si c catre tipul int , iar pent ru referire a ariel si a semi-
perimet rului se folosesc point erf aria ~i sp catre tipul float.
ftinclude < i o s t r c a m. h >
#i nc lud e <ma t h. h >
void mai n ( )
ti n t *a, *b,* c; f loat ~ a r i a , ~sp ; lise declara poi n te ri i (1)
a '"'" new in t; b = new int; c = new int ; l ise a l oca memo rie pen tru
ar i a = new f l o a t ; sp = new float; l /variab i lcle dinamice (2)
I /se cite sc de 161 t .as te cur-s va Lo r.i Le v a r i.ab i Le l o r o l nam i.ce
I l folo s i t e pell t ru lat u ril e t r iunghiu lui
ccu t o cv a -. " ; cin» *a; cout« " b = " ; ci n » *b ; c o u t c-c vc -. "; c in»* c ;
l i s e calcu lea za va10 rile variab ilelor din ami ce fo103ite pentr u
/ /~; emip eri m etru s L a rie
*s p = (* a +* b + *c ) 12 . ; *a r i a =sqrt {* s p * ( *s p - *a )* ( *s p - *b l k ( *Sp_ *c) ) ;
/ I s e a f i s ea z e vel oa r e a va rLab i.Le i di namic e folo s i t e pe n tru arie
c out« " a r i a = "<c e a r i a ,
1158 e Li be r-cn z S z ona de mcmo r i.e a Lcca t a v a r .i ab i Le Lo r d in umi ce (3 )
de l e te a ; d elete b ; delete C i dele t e aria ; de lete sp ; }
Enunt ul problemei 2: Se citesc de la tastatura coordonatclo a (Joua puncte din plan - a
b. Sa se etiseze distnnte dintre cele cou« puncte .
:ji
Se toloseste alocarea dinarnica a structurii de date de tip i nregist rare . Pentru referi-
rea coordonatelor celor doua puncte se folose sc pointer ii a ~i b catre tipul i nregistrare
punc t., iar pentru refer irea distantei se foloseste pointe rul d catre tipul float.
#includ e <.i.o s t r e a m. h >
#i nc lude <ma t h. h > ·
st ruc t punct {i n t X, Y i } ;
punc t e e , *b ; f loat *d; /Ise cecl e r a p o .in t e r i i. ( 1)
v o i d mai n ()
{ I Isealoca memo r ie pentru variabi lele d i narn i c e ( 2 )
a = new pun ct: ; b = new punct ; d = new fl oa t ;
108 lmplcmcntarca st r nc t n r ilor de dat e
lI se c i t e s c de 1a tasta t u ~ a va lo r i le v a ~ i ab il el c r dip.amic~
/ /folo s i te pen t ru coo r done t.e Le punc t e Lo .r a s i, b
CQut« " c oc r d o flil Le l e puncct:! ui a - x : " ; cin» -3 - >y.i
cout«" - y: cin» a ->y ;
cou t« " c oc !"d o na t e l e pUrlc -c.:llui b - Yo : " - cin» b - >x i
co o cc-c" - 'J : ". c.i.noc-b - c-y :
/ /:::::::: ca Lcu LcazS va Loz u-e a va r i.ab.i.Lc.; di nam i c e fo Los.i t;e pont ru d.i st.e.nt.a
*.j =- sqrt (pow {a- > x - b - > x , 2 ) +pow (a- > y - b - > y, 2 ) );
! / 51? a ~i$ e a z a. va Loa rea va r Lab iL e L di. nami.c e £010 3 i t.e pent r u d t s uant a
c out«" d i s t a n t a d i n t re punc te le a 3i beste "« *d ;
I I s e c Li b e r ec zu z cria d e memor Le n Ioc a t a v e r i ab iLeLc r d i.n um.L c c (3)
d el ete i:J ; del ete b ; delete d ; }
Enuntul p roblem ei 3: So citesc de la Insta/ura n numero intrcgi cam sa mem oreaza intr-uo
vee/or. Sa se iovorsozo voctor ut in el insus! §i sa so etiseze vectotul dupa inversare.
Se totoseste alocarea dinarnic a a s tructurii de date de tip vec to r. Pentru refer irea nurna-
rului de elemente ale vectorului se toloseste pointerul n catre tipul int, iar pentru referirea
variabilei prin intermediul careia S8 mterschirnba d0\13 elemen te ale vectorului se foloseste
pointeru l aux catre tipul int. Pentru referirea vectorulu i S8 foloseste pointerul p catre tipul
int r n]. Acest pointer indica 0 zona continua de nxsi zeof(int) octeti, n reprezentand
valoarea citita de la tastatura pentru numarul de elemen te ale vectorului ~i care este referita
de pointerul n . Pointe rii q !?i r catre tipul int se folosesc pentru a parc urge zona de
memorie atocata vec torului in vedere a prelucrarii elernentelor lui.
#i n c l u de < i 0 s t r e a m. ~ >
#i r.c l ud e< ma t h . h >
v oid ma i n ( )
l in t *p,* q, * (, * n,* a u x; / / .'H] d oc La r S po i.n t.c r.i i (1)
//!; e; a Loc a memo ri.e pe nt. ru vo r iab i.I o I e dLn emi .ce (2)
ne .ne w int; au x -n e v i n t ; c c u t c -cvr. > " ; c in» * n;
p = n ew int[* n] ;
l i se c ite~c de la tus: a tu r5 vulorile pent r u e lemen~ele ve ctorulu~
fo r (q ""-" p ; q <p+ * rl; q t t)
{cou t «" e J e me n t u l =- " « q- p + l « " = " ; cin» -- q ; }
I / se .int.e r s ch i.mba e l eme n t.e Le vec t.o r u Lu i.
fo= (q"" p , .:=p +*;;- l ; ::.<.: ; q .,.. +, r - -) { *a u :-:"-*q; * q ""*r; * ro--*a u x ;}
,/SE' e c' t s e e z a e l crnc n t e Le .... e c t or u Iu ;
for {q = n ; q <!,l! *n ; q"1 cou t-c-c v q-c-c " " ; A
I/se e l i.bcr oe ze zan:'! oc memor i e al cca t .a va.r.i ab i Le .lo.r d.inamLce (3) <J~~
delete [I f' ; delete n : de lete aux r } fr-.?!\
Scrie ti urrnatoa rele programe in care Iolc siti aiocare dinamica a rnernoriei:
Cit iii de la tastatura temperatura, presiunea ~ i nurnaru l de mali ai unui
3.
gaz l?i calculati volumul lui.
b. Citl\i de la tastatura nurnaratorul ~ i numitorul a oc ua fractii, calcul ati sum a si produ sul
celor dou a fractii, simplific ati rezu ltatele obtin ute si apoi afisat i suma si produs ul.
c. C,ti\i de la ta statur a coordo natele a doua cclturi ale unui dreptung hi (coltu l din stanpa
sus si coltu l din dreapta jos ) 'ii afisati dimensiunea diaqonalei drept unghi ului.
I II for m a ti cii 109
d. Cititi de la tastatura temperaturile medii zilnice din luna precedenta 'ii afi'ia\i tempe-
ratura medie a lunii , si zilele In care temperaturile au fast ma i ma ri decat media.
-U--
nivellogic
(ni velull a care se alege un model de implementare a structurii
conceptuale)
.D-
nivel fizi c
(nivelulla care sunt stocate datele in memoria calculatorului §i care Impllca
anum ite caracteristici ale operatillor de accesare §i de prelucrare a datelor din
cotect!e . in functle de modul in care sunt memorate datele ~i de algoritmii
implementati in limbaj pentru acces ar ea, citirea §i scrierea datelor in memorie)
( Studiu de ca.z I
Sco p : exemplificarea modului I n care identificati structura de date pe care 0 tolosit i
pen tru a rezo lva problema .
Enuntul probl emci 1. 0 firma ao transport arc lin perc cia 10 I17CJ§ini CII cepeciteti de
transport ciitetite. Trobuio sa so doformine cete dintro ecesto ma§il1i au Goa rna; mare
capacitate de transport.
Pentru rezolvarea problemei trebuie stabilita st ructura de date care se va folosi :
-7 La nivel c o ncept ua l - capacitatile de transport ale masinilor reprezinta un sir de
numere Intregi, aranjate lntr-o ordine aleatorie, in care trebu ie cautat numarul ce l mai
mare ~i de cate ori apa re In sl r.
1~20--1 40 I 50 on 20 I 40 I 50 I 40 I 30 I~
-7 La nivel lo gi c - implementarea perrnisa de Iimbaju l C++ a unei colectii de date omogene
este vectorul , fiecare numar Intreg fiind un element al structurii. Pentru rezolvarea proble -
110
mei S8 vor folosi urmatoni algoritmi: algoritmul pentru parcurgerea vectorului la memo-
rarea numerelor, algoritmul pentru determinarea valorii maxime dintr-un ~i r de numere si
algoritmul de cau tare in vector a elementelor cu 0 valoare prec izata (valoarea maxima).
int a [10 ];
7 La nivel fizic - numerele vor fi memorate intr-o zona continua de memorie interna , fiecaru i
nurnar alocandu-i-se acelasi spatiu pentru memorare. Identificarea unui element al
structurii se face prin numar ul sau de ordine (indicete).
I 20 I 40 I 50 I 30 1 20 I 40 1---::5-:
0- 40 30 40
o[O J a[l ] 0[21 0[3] 0[4 ] a[5] a[6J of7 ] 0[8 J a[9J
Daca se doreste pastrarea datelor memo rate (capac itatile de transport ale rnasinilor din
parcul auto ) pentru prelucrarea Jor ulterior, S8 vor salva intr-un fisier text, de unde vor fi
restaurate in memoria interna intr-un vector, la fiecare prelucrare (executie a programului).
Observatie i n structur a de date folosita (vectorul), i ntre elem entele structurii exista 0
relat ie de ordine in care fiecare element are un succesor ~i un predecesor. Acest tip de
structure este 0 structura liniara
--.~ a,
3, = primul ele me nt a , = eleme nt an = ult imul elem ent
(nu are predecesor) succesorul sau este 3;+1 (nu are succesor)
predecesorul sau este ai_1
Enuntul pro blemei 2. Un profesortrebuie Sa celcuteze media semes/ ria/a a Iiec etu! elev din
clasa §i sa obtin« a {isla eu nume/e, prenumele §i mediile etevilot. in ordinea oescrescetoere
a modiifor.
Pentru rezolvarea problemei, trebuie stabilita structura de date care S8 va tolosi:
~ La nivel con ceptu al - elevii din cia sa reprezinta un si r de enti tati care sunt caracte-
rizate de 0 li sta d e propri et ati (atri bute): nume ,?i prenume (care identifica unic elevul),
cinci note ~i media sern estriala.
Num e Pre nume Not a 1 Nota 2 Nota 3 Nota 4 Nota 5 Med ia
1 Ang hel Maria 10 9 10 9 9,5
... ... ... ... ... ... ... ... ...
30 Vlad Miha i 7 6 8 7
-7 La nivel logic - implementarea permisa de limbajul C++ a unei colectii de date omagene
este vectarul , fieca re lista de atribute ale unui elev fiind un element a l structurii. Pentru
implement area listei de atribute (care este fermata din date nea magene : nume le ~ i
prenumele sunt siruri de caractere , notele sunt numere intregi, iar media este un nurnar
real) se va folosi structura de date de tip inregistrare , fieca re atribut fiind me morat intr-un
camp. Pentru rezolvarea problernei se vor folosi urmatorii algoritmi: aigoritmul pentru
parcurgerea vec torului la memor area listei de atribute a fiecarui elev si la aflsarea med iilor,
algontmul pentru calcularea rnediei antmetice ,?i algoritmul de sortare a elementelor
vectorului in functie de valoarea unui atribut din Iista de atribute.
struct e 2-ev
{char n ume[20J , pren[20j ;
unsigned nota[5] ;
fl oat meo t a , } ;
e Lev clas2. [30 ];
Inform atica 111
7 La nivel fizi c - listele de atribute ale fiecarui elev vor fi memorate int r-o zona continua de
memorie inte rna, fiecarei liste de atribute alocandu-i-se acelas i spatiu pentru memorare.
Identificarea unei liste de atribute I n cadrul structurii se face prin nurnarul sau de ordine
(indicele), iar identificarea unui atribut din lista se lace prin numele carnpului.
:?i i n cazul
acestui exemp lu, daca se doreste pastrarea datelo r memorate (Iista de atribute
a fiecarui elev din ciasa), pentru prelucrarea lor ulterior, se vor salva intr-u n fisie r text, de
unde vor fi restaurate In mem oria interna lntr-un vector de i nreqistrari, la fiecare prelucrare
(executie a prog ramului).
~::;@9 nota[O]
clasa[i } .n u me
I I I I mL l
c l a s a [ i ] . no ta[2]
Observatie i n structura de date folosita pentru lista de atribute , int re eleme ntele structurii
exista 0 rela tie de ordine In care fiecare element are un singur predecesor !iii nici unul, unul
sau mai multi succesori. Entitatea e/ev (corespunde unui eleme nt din vec torul c1asa) are ca
predecesor entitatea clasa ~ i ca succesori entitatile : nume, pren, nota ~ i media. Entitatea
nume are un singur predecesor (entitatea elev) ~i nici un succesor . Entitatea nota are un
singur predecesor (entitatea e/ev) si cinci succesori (nota{O], nota{I], nota{2], nota{3] si
nora{4]) . Structu rile de date de tip in registrare pot Ii ierarhizate pe unul sau mai multe
niveluri. Ace st mode l de re prezen tare a datelor se numeste arbore cu radacina , iar acest
tip de structura de date este o structura ierarhizata .
Nive lul 1
I ~ ~ ...
Nive lul 2
L...::F--J .
G:;J Nivelul3
Nivelu l4
intr-o structure de date ierarh izata. datele pot fi grupate pe mai multe nive luri. Eleme ntul
a1 se gase ~te pe nivelul 1. El nu are predecesor, dar are trei succesori: 311, a12!iii an ·
care se qasesc pe nivelul 2. Elementul a12 are un singur predecesor (a- ) si trei succeso ri:
am . a122,i a123· Elementele a111 . a112, a121, a123,i a131 de pe nivelul 3,i elementele
a1221 si a1222 de pe nivelul 4 nu au succesori.
o matrice cu n linii ~ j m coloane este si ea 0 struct ura de date ierarh izata pe trei niveluri:
pe primul nivel e ste ma tricea ca re are n succesori: liniiie, care sunt pe nivelul 1. Fiecare
112 I mp l emen t area st ruct u r i lo r d c date
---
I a[O][O] I a[0][1J 1 'lI a[1][0] I a[1][1]
.. ~
;---'a[=2]:7[0::::]'I-a"'[2"']["'
1]:0\1
~I
\. I a[3][OJ 1a[3][1]
N ive IuI 3
. En untul prob lem ei 3. 0 oersoens oorosto sa vizileze §aple obiective luristice caro se
gasesc in sopte locolitari, po care Ie notisn: cu A, B. C, E, F, G §i I. in tre cele §<yJle obiective
turistice existe mai multe cil ; de acces. Trebuie sa se gase asca un traseu, astral tncet
turistul sa pIece din tocoutetee A §i sa revine in locaHlalea A, viziumo lo a Ie cote §apte
obiective tara sa l m aca de doua or; ptin eceeesi IDea/ita/e. Daca exis/a me i multe trssee.
sa so ceute tresoui ell drumul eel tne! scurf .
Penl ru rezolvarea prob lemei, lrebu - - ..-----------..,----..-- - - ----;:
ie stabilita strucl ura de date car e se
va folosi. Localitatile reprezinta
entitati care pot fi legale sau nu prin
cai de aeces. Fiecare cale de aeces
este caracterizata de dist anta dintre
eele doua localitati. Pentru a repre-
zent a la nivel conce ptua l aceast a
structure de date vern reprezenta
in plan harta zcnei turist ice prin
intermediuI unor eremente geome- '--">~-,-,~,,.,.."--'----' ==__,....__,....----_c--,.....:>-_,::-__,....-'
trice, astfel: localitatile se reprezinta prin cercuri i n interiorul carora vom scrie identificatorul
locatitatii, iar caile de acces prin linii drepte care unesc anurnite puncte. Acest model de
reprezentare a datelor se numeste grit!.
Obs erv atie . i n structura de date toloslta pentru a reprezenta la nivel conceptual entitatile
(Iocalitatile), int re elementele structurii exista 0 relatie de ordine in care fiecare ~
elemen t are mai multi predece sori ~i mai multi succeso ri. Acest tip de structura de p.~
date este 0 retea ,
Din studiul de caz anterior putem folosi un nou criteriu pentru clas ifica rea structurilor
de date :
I
r----;c~--,---------"i¥
Liniare
.
criteriul relatiei de ordine
I I
.-Dispunerea elementelor in memorie
Structuri contigue
...
Structuri dispersate
Elernentele sunt di sp use in zone contigue Elementele sunt dispuse i n zone dispersate de
de rnernorie, care permit localizarea uneia rnemo rie; pentru a putea localiza elementele in
dintre ere foJosind 0 adresa de ref erinta §,i structure. trebuie sa se memoreze pentru fiecare
deplasarea fa ~a de adresa de rete rinta . element §,i adresa la care se 9aS8$te.
I I
.- Aloearea memoriei interne
.-
Structuri statice Strueturi dinamice
_Dimensiunea zonei alocate este fixa. Dimensiunea zonei alocate nu est e f ixa.
Alocarea ei se face in ttrnpul ccmpl lar ll . in AJocarea sau eliberarea zonelor de memorie
functie de modul in care a fast dectarata folosite de structure se face i n timpul
structura. iar i n timpul execune! programului executlei programului, in functie de numarul
nu rna! poate fi rnodifi ca ta , de componente ale structurii.
Usta liniara este 0 struc tu re d e d ate logic a, e u da te omogcne , in care fie c are
ele me n t are un s ucces o r ~ i un pred ec esor, exc eptand primul el ement, care nu
are dedit s u cce sor, ~ i ultimul ele me nt, c are nu are decat pred cc esor.
l.ista llnia ra, la fel ca ~i ve ctorul, din punct de vedere conc eptual este 0 structure de
date ornoqona tiniara . intre c ele dou a structuri ex ista urrnatoarele deoscbi ri :
Cri teriu l Vecto r i Lis te
Implementarea Sunt structururnpuctte Fiind 0 Sunt structuric xplici te . Fiind ostructura
III lim baj struc ture Ilzlca . este Irnplementata loq lca , trebuie ateasa 0 metoda de
in limbajul de programare. Nu nece- implementare folosind structurile fizice
sita informatii suplimentare pentru 10- existente. Necesita informatii suplimentare
calizarea elementelor structurii in me- pentru localizarea elementelor structurii in
moria interna. deoarece mecanisrnul memoria intema. deoarece mecan ismul
prin care este impleme ntata fizic prin care este implementata fizic nu asigu-
asigura identificarea elementelor. ra identifica rea eiernentetor.
114 ..
Implcm enta r c: st r u ct u r i lor de date .
Criteri ul Vecto r; Liste
Dispunerea Sunt structu ri co nt ig ue . Pot fi structuri d ispersa te . Predece sorul,
elementelo r Predecesor ul, eleme ntul ~i eleme ntul !iii succesorul nu sunt in locatii de
in me mo rie succesorul se gasesc in locatii memorie contigue . Proqramatorul trebuie sa
cont igue prin mecan ismu l de defineasca rnecanis mul prin care elernentele
implementare a stru cturii de date la structurii vor fi legate unele de allele pentru
nive l fizic. a putea fi recasite i n rnemorie.
Al ocarea Sunt structu ri stance. Sunt str ucturi stat ic e sau d inamice, in
rnemoriei funct ie de implementarea alea sa.
Se defineste lungimea Iistei (n) ca fiind numarul de elemente ale listei. Lista vida este lis-
ta care are lungimea 0 (nu are nici un element). Elementele listei se mai numesc ~i noduri
[ SmmlllL de caz I
Seop: exemplificarea modului in care identificati 0 aplicatie in care folositi ca structure de
date Iis ta tiniara.
Enunt uri le problem elo r pentru care trebuie aleasa structura de date si eoneeput elgo-
ritmul pentru prelu crarea lor:
1. lntr-o bibliateea exist« a colectie de eaf1i arganizale in ardinea alfabe tiea a autari/or. Un
canor paate imp rumuta 0 carte (se extrage 0 carte din co/eerie) sau poate inepoie 0 carte
(se inseteeze 0 carte in co/eerie). Toate aeeste operaNitrebuie exeeulate astfel ineat sa se
pestreze organizarea in ordine alfabetiea a au/orilor.
2. La 0 benzinerie s-a forma / 0 coeoe de esteptere. Ma §inile sunl servil e in ordinea
venirii: prima ma§in8 sos ite esle setvits, ier ultima ma§ina venue se 8§8la fa sfar§itul
cozii. Toate aeeste operetii trebuie executate astfel inca! sa se pestreze ordinea in
care au sosit m osinite § i S-8U esez»! la coeds.
3. lntr-o stive de cen: volume/e sun t asezare in ordine a alfabetiea a tiuutito r. Trebuie
extrese 0 carte din stiv» tara a deranj a modul in ca re sunt ordonate carti1e in stive .
Toate aeeste proble me au in eomu n urrnatoarele caracte ristici:
-7 Elementele colectiei sunt omoqene jtnreqlstrarl eu aceeasi structura l .
-7 Conceptual sunt structu ri liniare i n care fiecare element are un succ esor ~i un pre-
decesor , cu exceptia primului ~i a ultirnului element , care au numai succesor, respec-
tiv numai predecesor.
-7 Structurile de date se rnodifica folosind aceiasi algoritmi de prelucrare se insereaza
~ j se extrag elemente, pastrancu-se a anumita ordine de aranjare a elemente lor.
Daca s-ar alege sotutia de a grupa aceste elemente intr-o stnrctura de date de tip vector ,
alqontmii de prelucrare (de actualizare a vectorilor) vor necesita multe deplasari de elemente
care consurna tirnp de prelucrare. Caracteristicile operatiilor de prelucrare a vectorilor sunt:
7 Vectorul este 0 structura de date care are lungimea fizica fixa, iar implementarea lui
la nivel fizic este un proces prin care se face conversia locatiel concep tuale a unui
element , in locatia reala, din mem oria intem a.
-7 Orice operatie de adauqare sau extragere a unui elemen t din colectie mod.fica lungi-
mea logics a vecto rului.
-7 Pentru a insera un element in colectie . trebu ie deplasate toate elementele spre
dreapta , ln cepand cu pozitia inserarii,
-7 Pentru a extrage un elemen t din colectie , trebuie deplasate toate elementele spre
stanqa, de la sfarsit , pana in pozitia din care se extrage.
I n formaticii 115
n cazul structurilor liniare care trebuie s a-~i pastrezo i n timpu l exploatarll ordon area
du pa un anumit criteriu, mecanismul vectorilo r este gre oi. in aeeste cazuri, S8 poate
alege ca solutie de implementa re a structurii de date lisla tiniara ce deg reveaza progr ama-
torul de ordonarea dupa indice a structurii, irnpusa de vectori .
mplementarea structurilor de date cu ajutor ul liste lor are urrnatoarele avantaje:
~ alocarea dina mica a memoriei - care gestionea za memoria rnult mai eficien t:
-') algoritmii de.prelucrare - care sunl mull mal eficienti (se executa mul l mai
punne opera!" pentru mserarea ~I sterqerea urun element).
$
.... W?,.e-
On fun ctie de modul i n care S8 aloca memoria interna, S8 pot folosi metodele:
I Metode de implementare a listelor I
in functie de modul in care sun! aranjate eleme ntele i n lisla, S8 pot folosi metodele:
I Me tode de implementare a listelor I
.t. y. y.
nu m ai statica statica dinamica
i Meto da de impl ementar e Ava ntajul alocarf di nam ice a Ava ntaj ul alg o ritrni lor
rnem ori ei de prelucrare
stati ca secventialii nu nu
- at ati ca inlantulta nu da
otnamtca inlantuita da da
Implementarea statica secventia la nu aduce niciunu l dintre avantajele listelor, fiind 0
implementare In care lista este prelucrata la fel ca un vector. i n implementarea l nl ant ui ta
nodurile listei nu m ai sunt s tocate succesiv i n mem orie. Acea sta implementare se poate
face atat static, cat si dinam ic, int re cele doua irnplernentari existand urrnatoa rele diferente:
~ In implem ent area statlc a, noduriIe Iistei ocupa un bloc contiguu de locatii de m e-
marie (zona de memorie aloca ta vectorului);
~ In imple mentarea dina mica, nodur ile liste i ocupa loc atii di sp ers at e din memorie
(a carer adresa poate fi pastrata cu ajutorul pointeri lo r).
i n c1 asa a X-a ali tnvatat modul i n care puteti implementa stat ic listele liniare. Algoritmii
pe ntru prelucrarea unei Iiste inlantuite sunt aceiasi . atat in cazul im plementarii stance ,
cat ~i i n cazul irnplernentarii dinamice.
Memoria mterna
5 locat ii de mcmorie dispersato
identificate prin adrese le adr1, adr2, adr3 , adr4, adrS
--::"""'be-.'-
a'c-',.::.;, l
"9 a:" a" I [jjfL1
nodul 2
la adresa adr2 l--.-----
"zeta"
nodul 3
la adresa adr3
I " tet a"
I nodul 1 ( prim
la adresa adr1
nodul5
'
nodu l4
(ult im ) la adresa adr4
Deoarece nodurile listei nu sunt aranjate succe siv, ci aleatoriu, In memorie , trebuie irnple-
mental un mecanism prin care sa S8 precizeze ordinea reala a acestor nod uri (ordinea in
care S8 lnlantuie in llsta} . Aceasta tnsea mna ca:
7 treb uie cunoscut locul din care in cepe lista (lan tul de nod uri), adica pozitia primului
nod din lista (nodul p rim ) - i n exemplu, nodul "alfa";
7' trebuie cunoscu t locul i n care S8 terrnina lista , adica poz itia ultimu lui nod din lista
(nodul ultim ) - in exemplu , nodul "zeta ";
7 pentru fieeare nod din lista, cu except ia ultim ului nod, trebui e cun oscut nodul care
este succesorul lui - de exemplu, pentru nodu ! "gama" trebuie cunoscut ca succe -
sorul sau este nodu l "teta" .
Metoda totosi ta pe ntru implementare este ca .
un nod al listei sa cantina do ua tipuri de infer- Infor~atia Il nfOrm a! la p:ntru
rnatii: info rrna tia propriu -zi s a si i nforrnatia propnu~zlsa legatura
de legatura - ad resa prin car e S 8 ide ntifica nodu l care urrneaza i n stru cture . lnfo rrnatia
de legatura mern orat a i n ultirn ul nod (in carnpul de adresa) este const anta NULL (care
semnifica tapt ul ca ultimul nod nu se leaga de nimic) .
Memoria interna
adre sele nodurilor adr1, adr2 , adr3, adr4 , adrS
! - '""
r:- 'b-e-ta-''-- 1'a"",
-- dr-'31 i " ama" l~dr4 1-'--,''-'a-:-,t:-a",,''---''a-
,d-:-r-::"
21
Lista l iniara intantuita este 0 s tructure loqica de date , parcursa Iin ia r , care are doua
extrernitati (i n ceput si sfarsit), in care Iiecaru i element i se asociaza 0 in format ie
s up l imenta ra referitoare la locul eleme ntului urmator , din punct de vede re logic.
Un nod al lister va fi de tipul inregi strare ce contine un camp cu inforrnatia pentru leqa-
tura care este ad resa succeso rului exprimata print r-un pointer.
struc t nod
{< t i p 1> < i ~ fo 11 > , <i n f o 12 > , , <i n f o In > ;
< t i p _ 2> <i ~ fo 21 > , < i n f o 22 > , , < i n f o 2n > ;
Info rm ati cii 117
< t.i p~m> < i n f o _ ml>, < i n f o_ m2>, < i n f o_ mn>;
nod " u rm r L :
nod *prim , *u l t i m , *p ;
Carnpurile < i n f o _ i j> sunt carnpurile cu inforrnat ii, iar carnpul urm este un cam p de tip
pointer catre tipul de baza nod ~i cont ine intorrnatia de leqatu ra (adresa urrnatorutui nod
din lista). Aeest tip de i nre gistrar e se nurneste inregistra rea au to re ferita. S-au declarat
variabilele de tip ad resa a unei i nreqistrari de tip nod:
-7 *prim ~i *ul t i m pent ru a memora adresa primulu i nod , respectiv a ultirnu lui no d ;
ele va ajuta sa ldentificati extrernitatile listei;
-7 * p pen tru a memo ra adresa unui nod curent din lista (este folosit pentru parcurgerea
listei).
in lisle, algoritm ii de inserare si eliminare a unor nod uri din structura S8 sirnplifica foarte mult
7 Inserarea unui nod consta in alocarea zonei de mem orie in care S8 scrie nodul si
legarea lui la structure (stabilirea legaturii eu predeeesorul si eu sueeesorui lui).
?' Eli min area unui n od consta in ruperea nodului din structur e, prin legarea predece-
so rului sau cu suc cesorul lui, ;;i eliberarea zone! de memorie pe care a ocupat-o.
."
." ."
Liste generale Uste restrictive
Nu exlsta restnctii pentru operatiile de Exista restrictii pentru operatiile de
mserare $i sterqere a elementelor din lista inserare $i sterqere a elementelar din lista
(se pot face in ortce pczitie a listei), (se pot face numal la extrernitati).
.
Stiva Coada
.. I
.
Usta simplu Inlantuita
.
Lista dublu inlantulta
.
Usta circulara
Fiecare element pastreaza Fiecare element pastreaaa Este 0 flsta in lantuita in
legatura cu un singur vecin legatura cu ambii vecini care elementul ult im se
(de obicei. succesorul). (succesorul $i predecesorul). leaga de elementul prim .
Implementarea algor itm ului . Se foloseste functia procedurala adaugayrimO al carei para-
metru prim de tip nod S8 transmite prin reterinta, deoarece este parametru de intrare-iesre.
void ada u ga...J'Jritn(n o d *&p r i m)
{no d * p ~ n e w no d ; p -> i nf o=x ; p -> urm=p r im ; pr i m~p;}
Adauqare dupa ultimul nod
Pasii executati in acest algoritrn sunt:
PAS1. Se cere aloearea de memorie pentru nodul p.
PAS2 < Se serie intorrnatia in nodul p.
PAS3 . Nodul peste nod terminal (nu se leaga de nimie - adresa de legatura este NULL) .
PAS4 . Nodul ul tim se leaqa de nodul p adaupat.
PASS. Nodul p adaugat devine nodul ul tim.
info urm ~
.......................................... ,
Im plemen ta rea algoritm ulu i. Se foloseste functia procedurala adauga_ultim() al carei para-
metru ul tim de tip nod se transmite prin referinta, deoarece este parametru de intrare- iesre.
void a d a u ga...;..ult im( nod *&u l t i rn }
{nod *p= ne w nod i p->info=x ; p~ >urm=NULL ;u lt im-> urm=p ; u l tim=p ; }
120 Im plemcnta rea struct u r ilur d e dat e
Adauga re a i n interiorul li st ci S8 poate face in doua modur i:
a. dup a nodul cu adresa q ;
b. in ainte de nodu l cu adresa q.
Ad au g area i n i nterio ru l listei du pa nodul c u adrcsa q
Pasii aiqoritrnu lul sunt:
PAS1. Se cere alocarea de me morie pentru nodul p .
PAS2 . Se sene inforrnat ia in nodu l p .
PAS3 . Nodul p se leaqa de succesorul nodului q .
PAS 4. Nodu l q se leaqa de nodu l p adauqat.
PASS. Daca nod ul q a fast ultimul nod , nodul p ad a uqat devine nodul ul tim.
L~j. m
q
p iinfo lm"t¢r¢j:".J
Implemcntarca algoritmului. Se foloseste functia procedurala ada uga_ dupa () ai carei para-
metri sunt de tip nod : q (adresa nodului dupa care se face adauqarea), care se transmite prin
valoare , deoarece este parametru de intrare, !iii ul tim (adresa ultirnului nod), care S8 transmits
prin referinta, deoare ce este parametru de intrare-iesire.
void adauga. du pa( n od *q , r:.od *& ul t i m)
{ n o d " p v new nod ;
p-csi.n f o e x : p -c-u rme q -c-u r m: q-c- u rur-p , i f (q·== ul tim ) u l.f Ltr r-p r )
I NULUI
In furmatica 121
nodul q trebu ie sa a urmeze. Ast fel, in lista nu se va adau qa nodul p i nainte de nodul q, ci
dupa el, interschirnban d apoi informatiile lnt re cele doua nod uri. Pasii algoritmului sunt:
PAS1 . Se cer e alocarea de memorie pent ru nodul p .
PAS2 . Se cop iaza info rm alia din nodul q in nodul p .
PAS3. Se sene In nod ul q inforrnatia care trebuie adauqata la 115t3.
PAS4. Nodul p se leaqa de succesor ul nodu lui q .
PASS . Nod ul q se leaqa de nod ul p adauqat.
PAS6 . Daca nodul q a fast ultimul nod , nodu l p adauq at devine nodul u l t i m.
Implementarca algoritmului. Se foloseste functia procedurala a d a u g a _ in_ f a t a () ai carei
parametri sunt de tip nod: q (adresa nodului inaintea caruia S8 face adauqarea), care S8 trans-
mite prin valoare, deoarece este parame tru de intrare, :;;i u l ti m (adresa ultimului nod) , care S8
transrnite prin referinta, deoarece este parametru de intrare-iesire.
vo id oda u ga i n fa t a( n od *q, n od *&u l t i m)
{nod * p~ new n o d; p ->infc~q -~info ; q- >inf o =x ; p - > urm~q -> u rm ; q- >u rm=p ;
if ( q o:·~"'u l t i m ) uLt.Lmvp r }
Implementa rea algoritm ului . Se foloseste functia proced urala e liminayrim O al carei para -
metru p rim de tip nod se transmi te prin referinta. deoarece este parametru de intrare-iesire.
v oid e l imina_prim(nod * &p ri m)
{no d q =pr im ; p rim"'p r i m->urm ; delete q ; }
Eliminarea ultimului nod
Pasii executati In aces t algo ritm sunt:
PAS1 . Se salv eaza ad resa nodului ulti m in pointerul q.
PAS2. Se cau ta predeceso rul ultimu lui nod , prin parcurgerea liste i in ce pand de la primul
nod , pim a la pred ec esarul nod ului te rm inal (nodul care nu se leaqa de nimic -
adres a de leqatura are valoarea NULL)
PAS3. Predeces orul nodulu i ult im devine nod termin al (adresa de legatura este NULL).
PAS4 . Predecesorul nodul ui ultim devine nodul ultim .
PASS . Se cere el ibe rarea zo nei de memorie de la ad resa rnernorata I n po interul q .
Informatica 123
p rim
-- .....
Imp lcrnenla rea algoritm ul ui. Se foloseste functia procedurala eliberareO al carei parame-
tru este prim de tip nod. Fiind parametru de intrare-iesi re 58 transmite prin referinta
void el ibe ra r e( r.od * &p r i m)
{n o d *p =p r i m, *q ;
while (p ! =NULL) {q -:-o p; p =p ->unn ; delete q ; }
pr im=NUL L ; }
Ordonate
+ J.
Ncordonate
Nodu rile listei sunt ordonate pe baza valor ii Nu exista a ordine a nodurilor in Hsta.
unui camp cu informatie numit camp c heie. Operatiile de adauqare de noi noduri $i de
Operatiile de adaupare de noi noduri si de rnodificare a valorii campurilor cu infer-
mod ificare a valorii campului c hele trebuie sa mati! S8 fae fara restrictii, Adauqa rea S8
S8 taca astfel tncat sa S8 pastreze ordonarea. face de obicei pe la 0 extremi tate a listei ,
i n cazul listelor ordonate , daca mtorrnatia din nodul listei este 0 data elementara , chela
de ordonare va f data elementara. Oaca intormatia din nodul listei este 0 inregistrare,
chela de ordonare va fi unul dintre carnpu rile inreqistrar!i. Pentru prelucrarea listelor
ordonate putet i folosi :
-7 algoritmul de sortare prin insortie:
-7 algoritmul de interclasare a doua Iiste ordonate .
[Swmu de cmz I
Seop: exempl ificarea modului i n care , pentru rezolvarea prob leme i, folositi algo ritmii de
prelu cra re a listelor simplu l nlantuite ~ i implementarea lor cu ajutorul subprogramelor.
Enunt ul pro bl em c i 1. So citosto dintr-un fi§ier taxt lin sir do numere separate prin spatia
cu care se creeazD 0 listfi simplu inlan tllita in ordinea in care sunt citite numoroto din tisior.
Sa so vcrifico (facti tiste coutine numoi numere distincte §i opo! sa se tuiouqe dupa fiecam
Ill/m ar impar "din lista vetonroe 100 §i sa S8 etiseze numctete din tiste. Penuu testarea
prog ramu!ui se vor folosi aou« setuti do numere: (2, 5, 10, 3. 8) §i (2. 5. 10. 5, 8, 7) .
Nodur ile listei nu sunt ordonate conform unui criteriu . Nume rele se vor cit: din fisier ~ i 58 vor
scrie in lista prin adauqare dupa ultimul nod . Proble ma se desco mpune i n urrnatcare le
subproblerne. iar algoritmul de rezolvare a unei subprobl ems este implemental cu ajuto rul
unui SUbprogram:
iE1l Se crtesteprimul num ar din fisier si se adauqa primul nod la lista (nodul prim ) -
subprogramul adauga no d () .
~ Cat tim p mai exis ta num ere in fisier exec uta : se cite ste un nurnar din fisier si 5e
adauq a un nod cu num arul respe ctiv dupa ultimul nod din lista - subpr ogramul
adauga ul t im () .
~ Se ver ifica daca num erele din lista sunt distincte, astfel: se parcu rge lista de la primul
nod pana la penultimul nod si se venfica daca nurnarul din nod ul curent mai exista i n
. nodu rile care urmcaza dup a el pana la sfarsitul listei - subproqrarnul distin cte () .
~ Se parcurge lista de la primul nod pana la starsitul ei si daca numar ul din nod este impar
se adauqa dupa el un nod care contine valoarea 100 - subproqrarnul p rel ucrare ( ) .
Info rmatic a 129
~ Se parcurge lista de la primul nod pana la sfarsitul ei si se afis eaz a inforrnatia din
fieca re no d - sub prog ram ul afi s are ( ) .
#inc lude < f s t r e am . h >
struct n o d t int i nfo ;
n o d * u r m;) ;
fs tream f( " Li s r.e l . t xt" , i 0 5 : : in ) ;
in t n i
void a d a u g a ,.;n o d (nod *&p r i m, nod *&u l t i m)
{p r i m=new nod ; prim ->info=n ; p rim ->urm=NULL ; ul t im=p r i m; }
void adauga_ultim(nod *&u l t i m)
{nod * F ~new nod ; p->in fb=ri ; p-> u r .m=NULL; u lt i rn->urm= p ; ultim=P i }
v o id ud auga~dupa(nod * &q, nod *&u l t i m)
{n o d *p zonew nod ; p ->info =100 ; p ->urm=q ->urm ; q ->urm=p ;
if (q==ultim) illtim=p ;}
in t d l s t l ~ c t e ( n o d *p r i m)
{f or (n o d *p """p r i m; p->urm!:=.NULL ; p=p ->u rm)
fo r (nod * q =p - > u r m; q !=NULL ; q =q->urm)
if (p ->info==q->info ) retu r n 0 ;
re turn I ; }
v o i d prelucrare(nod *p r i m, nod * &u l t i m)
{fo r (no d *p =p rim ; p ! o;,o NULL; pe p -c-u r m)
if (p ~ >infD %2 = = 1 ) adauga_dupa(p ,ultim) ; }
v o i d a f is a.r e (nod " p r.Lm )
{ for (nod * p=p r i m; p! =::oNULL ; p ep-c -urm) c cutx-cp - o i n foc c '' ". cout-ocendf , }
void ma in ()
{n od e p r Im , * u l t i m; f > > n adauga nod(prim ,ultim} ;
wh i le (f »n ) adaugaultim(ultim) ; f of o s e t j , i
if { di st L n c t t p Lm
e ccc
r l ) c l
.c -csun t
v z I cti m e n t e e d i . s n c t e v c c e n c n .
Enuntul problemei 3. Se citeste dintr-un fi§ier text un :;ir do numere separate prin spa(iu
cu care so creeaz8 0 lista simplu inl8n(uita in ordinea in care suni cilite numerele din Iisler.
Se moi cnest« de /0 tastatura un numar x. Sa se caute $i sa se $tearga din list» nodu/ care
contine acest nutner. Pentru testarea program II/IIi se va tolosi situt de nllmere: (2, 5. 10, 3,
8). iet pentru x patru vetori: 2. 5, 8 $i 7.
Nodurile listei nu sunt ordo nate conform unui criteriu . Numerele se vor citi din fisier ~i se vor
scrie i n lista prin adauq are dupa ultimul nod. Problema se descompune i n urrnatoarele
subprobleme, iar algoritmii pentru rezolvarea subproblemelor sunt irnplementati cu ajutorul
subproqrarnelor:
[i>] Se citeste
valoar ea pentru x de la tastatura.
~ Se citeste prirn ul nurnar din fisier si se adauqa primu l nod la lista (nodul prim ) -
subprogramul ada u g a nod ( } .
~_ C a t timp rnai exi sta numere i n fisier ex ec uta: se citeste un nurnar din fisier ~i se
adauqa un nod cu nurnarul respectiv oupa ultimul nod din lista - subprogramul
a d a u g a u l tim () .
~ Dac a prim ul nod din lista contine numarul x , atunci se elirnina primul nod (subprogra-
mul e limi n a _ p r i m ( )) ; altfel , se cauta predeceso rul nodulu i ca re contine nurna rul x
(subprogramul cau ta () ) si da ca se g ase~te aces t nod, atunc i se sterqe nodul care
urmea za d u p a el (subprog ramul el imin a _ u rm () ).
Informa tic a 131
~ Se parcurge lista de la primul nod pana la sfarsitul ei si se afiseaza inforrnatia din
fiecare nod - subprog ramu l a f Ls er-e () .
#i n cl u d e <f s t r e a m. h >
struct nod tint info ;
n o d - u rm r j •
f s t r e a m f ( " lista3 . t xt " , ios:: in );
i nt n ,x ;
void edauqa nod (n od *&p r i m, nod *&u l t i..'u )
{p r i m=new nod ; u l t i m=p r i m; prim->info=n ; p rim->ur.m=NULL ; }
v oid adauga_u l tim(nod *&u l t i m)
{nod *p =-new nod ; p ->info =n ; p ->urm=NULL; ult~r.l ->urm=p ; ult.i.m=p ; }
n od * cauta {nod ~p )
{ w h i l e ( p - > u~m ! =NULL && p ->urm->info!=x) p=p->urm;
return p ; }
v o i d elirnina prim (n od *&p r i rr.}
{nod *q =p r i m; prim=prim ->urm ; del ete q ; }
void elimina_urm(nod *p )
{nod *q =p - > u r m; p ->urm=p->urm->urm ; delete q ; }
vo i d afisare(nod · p r i m)
{f o r {nod *p =p r i m; p ! =NULL ; p =p - > u r ml cout« p - > i n f o«" ":
cout«endl;}
void mai n ( )
{n o d e p r i m, "u l c i m, "'p ; cou t.c-c" x e " ; cin» x;
f »o ; adauga~nod (prim , u ltim) ;
while (f»n) Ddauga_ul~im(ultirn) ; f . c l o s e ( ) ;
if (prim-> info==x) elimina prim(prim) ;
e lse {p =c a u t a (p r i m) ;
if (p - >u r m! =NULL ) elimina_urm (p ) ; }
afisa=e(prim ); }
Enuntul problemei 4. Se citeste dintr-un tisier text un ~ir de numere separate prin spatiu
cu cam se creeaza 0 Iista simplu inlantuila in ordinea in care sunt cilite numerele din tisier.
Sa se eiimine din tist» vetotite care se reoete, in afara de prima lor aparitie. Pentru leslarea
programului se va tolosi §irul de numere: (2, 4, 9, 9. 9, 6, 2, 9, 9) .
Nodurile listei nu sunt ordonate conform unui criteriu. Numere le se vor cifi din fisier ~ i se vor
scrie in lista prin adauqa re dupa ultirnul nod. Problema se descompun e in urrnatoarele
subprobleme, iar algoritmii pentru rezolvarea subproblemelor sunt irnplernentat i cu ajutorul
subprogramelor:
:E1I
Se citeste primul nurnar din fisier si se adauqa primul nod la lista (nod ul prim ) -
subprogramul adauga nod ( ) .
~ Cat timp mai exista nume re in fisier executa : se citeste un nurnar din fisier ~i se
adauqa un nod cu nurnarul respectiv dupa ultimul nod din lista - subprog ramul
adauga ul ti m () .
~ 5 e elimina din lista valorile care se repeta, astfel (subprogra mul prel ucrare () ):
Pentru un pointer p care indica fiecare nod din lista , in cepand cu primul nod pfma la
p.enultimu l nod , exe cuta :
-7 Se initializeaza pointerui q cu adresa nodul cure nt (indicat de pointerul p).
-7 Cat timp pointerui q nu indica ultimu l nod, executa: daca nodul indicat de
pointeru l p contine acelasi nurnar cu succeso rul nodului indicat de pointerul q ,
132 lmplcrn enrarea st r uc t ur ilo r d c date
: atunci S8 elimina succesorul nodului q (- subpro gramu l e Li.m.i .na u rm n ):
! allfel, pointerul q indica succesorul nodulu i.
~ Se parcurg e Iista de la primul nod pana la sfarsitul ei ~ i se afiseaza inform alia din
fiecare nod (subprogramu l afisare ( ) ).
#incl u de <f s t r e a m . h >
struct n o d lin t in f o;
nod * u rm ; } ;
f s t r e am f { " lis~a 4 .t x t " , i o s : : i n ) ;
int n ;
voi d adau g a n od (nod *&p r irn , nod * &u l t i m)
{p r Lm- n e w nod ; pr Lm-c-Ln fo e x , prirn->unn=NULL i ultim=prim ; }
v oid a dauga _ult im{nod * &u l t i m}
{nod *p =n ew nod ; p- >info=x ; p->urm=NULL ; u lt im->urrn=p ; u ltirn=p ; }
v o i d e limina _ urm (n o d *p }
{ n o d * q=p - > u r m; p-> u r :n=p-> urm ->urm ; delete q; }
void p~el u crare (no d *p r i m)
{::o d *p ,* q ;
fo r ( p =p rim ; p - >u rm!~ NULL ; p=p - > u rm)
{n=p->i n f o; q =P i
whi l e (q! =NULL)
{i f (q-> urm!=NULL && q ->t: rm-> info="'-'n) elimi na_urm(q) ;
e l s e q =q ->urm; } } }
void a fisare{ncd * p r i rn)
{f o r (nod <p -.p r Lm, p!=NULL;p=p - >u Ym) cou t ccp - c- Ln f o -cc" ";
cou t« e ndl;}
void ma i n {} { ~ o d *p r i m, * u l t i m; f» n; ad aug a_nod( p r i m,ultiml ;
while (f » :1) a dauqa_u l t i rn (u l t i m); L c l o s e (} ;
p re I ucr a re (p r i m) ; afisa r e (p r im) ; }
En untu l prob lemei 5. Adunarea a dOlla potinooma. Se citesc oimr-ut: Iisier text de pe
prima linie un numar n1, care teprezinte numiuut oe coeiicienti nenuli oi utiui palinom, apai
do pe urmatoarele 111 linii coeticientii nenuli §i gradlll, de pe tinie urmatoare un numar n2
care repte ziate numetut do coeticienti nenuli ai cetui de al doi/ea palinom §i apai de pe
utmetoetele lmii coeticientii nenuli §i gradul. Sa se creeze cu acesto intormetit ooue listo
simplu inlernuite §i sa se adune cele doue palinoame. Coeticiontut §i gradul tiecetui termen
din polinomul suma se vor salva intr-un tisier. Pentru testarea programului se vot folosi
2
potinoernete -lOx +5x -3x ~j 3x +7/+x +2.
4 3
Se vor crea coua liste in care se vor memora cele doua polinoame. lnformatia utila va fi
mernorata intr-o inregistrare cu doua carnpuri: un camp pentru coeficient si un camp pentru
grad. Ambele liste se creeaza prin citirea datelor din fisier ~i adauqare dupa ultimul nod. in a
treia lista se va memora palinomul obtinut prin adunarea celor doua polinoame . Cele trei liste
se identifica prin adresa primului nod (prim1, prim2 ~i respectiv pri m3) si prin adresa
ultirnului nod (ull im 1, ul li m2 ~i respectiv ull im3). Problema de creare a listei surna a
polinoamelor se descompune in urrnatoarele subprobleme, iar algoritm ii pentru rezolvarea
subproblemelor sunt impiernent ati cu ajutorul subprogramelor:
IE] Se citesc din fisler n 1 si coeficientul ~ i gradul primului term en din primul polinom. Se
adauqa primul nod la lista L1 (nodul prim1 ) - subprogram ul a da uga nod () .
E?] Pentru urrnatoare le n1-1 perechi de numere din fisier , executa : S8 citesc din fisier
coeficientul ~i gradul unui termen al primului polinom si se adauqa un nod cu
inforrnatia respect ive dupa ultimul nod din lista L 1 - subprogramul adauga_ ul tim () .
Inform at icii 133
~ Se citesc din fisier n2 ~i coeficientu l si gradul primului termen din al doilea polinom.
Se adauqa primul nod la lista L2 (nodul prim2) - subprogramul adau ga nod ( ) .
~ Pentru urrnatoarele n2-1 perec hi de numere din fisier, exec uta : S8 dtesc din fisier
coef icientul ~ i gradul unui termen al celui de al doilea polinam ~ i se adauqa un nod cu
informatia respective dupa ultirnul nod din lista L2 - subprogramul adaug a _ u l tim ( ) .
~ Se adauqa primul nod (prim 3) la lista L3 cu urrnatoarea inforrnatie: daca gradul din
primul nod din lista L1 este egal cu gradul prirnului nod din lista L2, at unci gradul este
egal cu gradul nodulu i din Lista 1, iar coeficientul este egal cu suma coeficientil or din
nodurile celor doua liste ~ i in ambele liste se trece la nodul urrnator : allfel , daca gradul
din primul nod din lista L1 este mai mare decat gradul primului nod din lista L2, atu nc i
gradul este egal cu gradul nodului din Lista 1, iar coeficientul este egal cu coeficientul
nodului din Lista 1 ~i in Lista 1 se trece la urrnatorul nod; altfe l, gradul este egal cu
gradul nodul ui din Lista 2, iar coeficientul este egal cu coeficientul nodului din Lista 2 ~i
in Lista 2 S8 trece la urmatorul nod - subprogramul adauga n od () .
~ Cat tim p nu s-a ajuns la sfarsitul Listei 1 si al Listei 2, exec ut a: se adauqa un nod la
lista L3 dupa ult imul nod, cu urrnatoarea inforrnatie : daca gradul din nodul cure nt din
lista L1 este egal cu gradul nodului curent din lista L2, at unci gradul este egal cu
gradul nodulu i din U sta 1, iar coeficientul este egal eu suma ccefi cientilor din noduril e
celor doua liste ~i in ambele liste se trece la nodul urrnator : allfel, daca gradul din
nodul curent din lista L1 este mai mare decat gradul din nodul curen t din lista L2,
at unci gradul este egal cu gradul nodului din Lista 1, iar coeficientul este egaI cu coefi-
cientul nodului din Lista 1 >;i in Lista 1 se trece la urrnatorul nod; allfel, gradul este egal
cu gradul nodului din Lista 2, iar coeficientul este egal cu coeficientul nodului din Lista 2
~i in Lista 2 S8 trece la urmatorul nod - subprogramul adaug a _ u l tim () .
Enuntul problem ei 6. Reuniunea !ji intersectie a doua muttimt. Se citesc dintr-un fi~ier
text do pe prima linie un numar n1, care reprezintfJ numeru! de elemente ale ptimei tnuttimi.
apoi de pe urmatoa rea tinie elementele muuimit, de pe linia urmetoere un numer n2 -
numerut de elemente ale celei de a doua muttim), epoi de pe urmatoa rea tinie elemen tele
muttnni'. Sa se determine reuniunea §i intetsectie celor doua multimi. Pentru testarea
programului se vor folosi doua seturi de date de introte: mu/rimile A ={1,2,3,4,5} §i
B={4,5,6,7} §i multitnite A ={1,2,3} §i B={4,5}.
Se vor crea doua liste in care se vor memora cele doua rnultirni. Ambele liste se creeaza prin
citirea datelor din fisier ~i adauqare dupa ultimul nod. in a treia lista se va memora reuniunea
celor doua multirni, iar in a patra lista - intersectia. Cele patru liste se identifica prin adresa
primului nod (prim1, prim 2, prim3 "i respectiv prim4 ) "i prin adresa ultimului nod (ultim1,
ull im 2, ullim3 " i respectiv ultim4).
Pentru determinarea reuniunii se vor executa urmatorii pasi:
Pas 1. Se adauqa primul nod la Lista 3 (nodul prim 3) care contine numarul din primu l nod
al Listei 1 (p ri m 1).
Pas2 . Se parcurge Lista 1 de la succesorul primului nod pana la sfars itul ei " i se adauqa
un nod cu num arul respectiv dupa ultimul nod din Lista 3.
Pas3 . Pentru liecare nod din Lista 2, exec uta : se parcurg e Lista 1 si daca nurnarul din
nodul curent din t.ista 2 nu S8 gas8iite in Usta 1, atunei se adauqa un nod cu
nurnarul respectiv dupa ultimul nod din Lista 3.
Pentru determinarea int ersecti ei se vor executa urrnatorii pasi:
Pas1 . Se initializeaz a Lista 4 ca lista vida (prim 4=NULL si ult im 4=NULL ).
Pas2 . Pentru fiecar e nod din t.ista 1, executa : se parcurge Lista 2 si daca nurnarul din
nodul curen t din Lista 2 se gase" te in Lisla 1, at unci se adauqa un nod cu
numarul respectiv ca prim nod in Lista 4 (nodul prim4 ).
Pas3 . Daca s-a adauqat primul nod la Lisla 4, atu nci pentru un nod din Lista 1 de la
succesorul nodului curent pana la ultimul nod , executa : se parcu rge t.ista 2 ~i
dac a numarul din nodul curent din Lisl a 1 se gase"te i n Lista 2, at unci se adauqa
in Lista 4, un nod cu nurnarul respectiv, dupa ultimul nod .
#include < : s t r e a ~ . h >
struct nod t i nt i n :o ;
nod - u rn. r } ,
fstream f( "lista 6 .: ~ : t " , i o s : : i n) ;
i nt x ;
voi d adau ga_ nod( nod * & p r i ~ , n o d * & ~ l t im )
III fnrill a ticii 135
{p r i rnvn e w n od i pri rn -c- Ln f oe x r pr irn - >u r m=NULL ; u LtImep r i.mr I
void a d a u g a_ultim( nod *&u l t i m)
{no d - pe new nod ; p- c- Ln f c -cx, p ->unn=NUL L ; u l t i m- >u r m=p ; u l t i m=p ; }
voi d c r e a r e {no d * &p r i m, n o d * &u l t i m)
l i n t n ; f »n»x ; ada uga_flod (p rim, ultim) ;
fo r (i n t i =2 ; i <=rl ; i +i ' ) {f» x; a dauga_ulti rn( u l t im) ; } }
v oid r eun i u n e (n o d *p r i ml , nod *p r i m2 , ~o d * &p r i m3 , no d * &u l t i m3 )
{no d *p ,* q ; int g a 5 it ;
xep r i.mL'- o i.n f o r adauga ~.nod (p r im.J , ul tim3) ;
f o r (p =prim l ->unn ip !=NULL i p- -p->urm) l x=p->info i a dauga u ltim{ul tim3) ; }
f o r (p = p r i m2 ; p ~ ~ NULL ;p = p ~ >u r~)
(for (q =p r i ml, g a s i t =O; q !=NULL && !gas ~t ; q=q- > u r ~ )
i f ( p - > i n f o = = q - > i ~ f o ) ga3it=l ;
if ( ! g a s i t i { x e p -c-Ln f o , adauga_ult.i:ntultim3) ; } } }
voi d .i n t e r s cc t Le Lnod e p r i.rnL, nod * p r i m2 , nod * &p r i m4 , nod * &L:. l t i m4 }
( n o d *p ,* q ; int gasit ; ?r im ~=NULL ; ultim4=NULL ;
f o r (g a s i t= O, p ""'p r i m1; p ! =NULL && i qas i t , p =p ->urm)
fo r (q=prim2 ; q != NULL && ~ g as i t ; q=-q->u r m)
i f (p - >info==-q->info) {g a s i t = l ; x ~p - > info ; }
if (g a s i ':)
( a d a u ga n on (p r i m1 , u l : i m4 ) ;
f or ( ; p ! ~ O ; p=p - >u ern)
{for (ga s i t =O, q =-p r i m2 ; q! =- NULL && !gasit ; q=q- >u r m)
if (p ->info=- =q->info) gasit= l;
i f (g a s i t } {x =p - >i n f o ; adauga_ultim(ultimt;) ; } } }}
void a :i s a re(nod * p r i m)
{for {nod * p = p r i m; p!:-:"NULL ; p =p- >u r m} c out« p - > i n f o «" II .
cou t « e n d l ; }
v o i d mai n ()
{ ~ od * p r i m l ,* u l t i m l ,* p r i m 2 ,* u l ~ i m 2 ,* p r i m 3 , * u l t i m 3 ,* p r i m 4 , * ~ I t im 4 ;
c cee ce (p r .iml , ul timl) ; c r ee r e (prim2 , ul tim2} ; f _close ( ) ;
'*"
r cuni.une (priml , prim2 , pr im.S, u l t i m3 ) ; ccuccc vne cnt u ne e - " ; afisa re (prim3) ;
Ln t c r sec t i e (p r im l , p r i.mz , p r i.mq , u Ltim-1) ; c o u t-cc" Intersectia= " ;
if {prim4l=NULL) afiSar~(p r ~~j.:) ; ~
else cout«" Mu l t l :ne 2. vida " ; }
I info I urm I,
info I urm~ r: info I urm I I'. info I urI"l
-,- I
2.6.4. 1. C rcarc a list c i
Deoareee in algoritmii de preluerare trebuie sa se cunoasca adresa prirnului nod, este impor-
tanta adauqarea primul ui n od la lista vida. Pasii algo ritnl ului de croaro a unei liste sunt:
PAS 1. Se adauq a primul nod la lista (nodul prim )
PAS2 . Cat limp mai exists inforrnatie exec uta : se adauqa un nod la lista dupa ultimul nod.
PAS3. Se leag a ultim ul nod de primul nod.
Impl cm cntarea algori tmu lu i. Se folose ste functia procedurala c rea re ( ) at carei parame-
tru este prim de tip no d : care se transrnite prin reterin ta deoa rece este parametru de
intrare-ieslre. 8e foloseste variabila globala n pentru citirea inforrnatiei din nod. Se conside-
ra ca nu mai exista into rmatie atunci cand valoarea citita pentru n are valoarea O.
vo i d c rea re (n od *&p : i o )
( n o d *u l t i m; cin» n; adau ga _n o d , p r im , u l ~ iffi ) ;
wh i le ( n ! ~ O ) (cin» n; a d a ~ g a_ u l t i ~ ( u l tire ) ; }
ul t.i m-c-u r-mop r-a m }
138 Im plcmenta r ca strudurilor de date
2.6.4 .2. Pa rcurgerea listei
Deoa rece lista circu lara nu contine un ultim nod care sa fie conside rat ca terminator al
listei, S8 va con sidera ca nod care terrnina lista nodul prim . Pasi i algoritmului de prelu-
crare a unei liste circu lare sunt:
PAS1 . Se prelucreaza primu l nod din lista (nod ul prim ).
PAS2. Pentru l iecare nod din lista ln cepan d de la succesoru l nodulu i prim pan a la
prim ul nod, executa: S8 prelucreaza nodul curent.
Implementarea algoritmului. Se foloseste functia procedurala parc urge (J al carei para-
metr u p rim de tip nod S8 transmite prin valoa re deoa rece este pa rametru de intra re.
v o id p a r cug e (no d *p r i ffi )
{ l i s e prel ucreaza prim->info ;
f or (nod * p~prim- >urm ; p r =pri m; p =p- >urm) I /s e prelucreaza p->info; }
2.6.4.3 . Eliminarea unui nod din listii
Daca S8 elirnina din lista nodul care urmsa za dupa nodul curen t p tre buie sa S8 ve rifice
daca aces t nod nu este nodul prim , ca sa nu S8 piarda adresa prim ului elemen t din lista.
Pasii algoritmului de eliminare a nodului urrnator nodului curent sunt:
PAS1. Se salveaza adresa succesorului nodului p i n pointerul q.
PAS2. Se leaqa nodul p de succesorul succesorului lui.
PAS3 . Daca succesorul nodulu i p era nodul prim , atunci succesorul nodului pr im devin e
nodul prim .
PAS4 . Se cere eliberarea zonei de memorie de la adresa mernorata in pointerul q .
Implementarea algoritmului. Se foloseste functia procedurala elirnina_urm() ai carei para-
metri de tip nod sunt: p (pentru adresa nodului precedent nodului ce S8 elirnina), care se
transmite prin valoare deoarece este parametru de intrare si prim, care se transmite prin
referinta. deoarece este parametru de intrare-iesire.
v o i d elimina._urm(nod *p, n od *& p r i m)
{n o d *q =p-> u rm; p->urm= p->urm->urm i
if (q===prirn) pr im==pr im ~>urIll i
delete q ; }
I Swmu de CBlZ I
Sco p: exemplificarea modului in care, pentru rezolvarea problemei , foloslti algoritmii de prelu-
crare a listelor circulate simplu Inlantuite si implementarea lor cu ajutorul subprogramelor.
Enunt ul probl emei. Sa ciuiste dintr-un fi§ier text un sir de numere separate prin spti tiu cu
ctue S8 creeaza a lisla circutare simplu inl antuila in ordinea in care sunt citite numerete din
fi§ier. Sa se §tearga numerele p are din lista §i sa S8 etiseze numetoio din iiste. Pentru
leslarea proqrtnnutu) se vor tolosi doua seiut! de nutnere: (2. 2, 3, 4, 4) si (2. 2, 2, 4, 4).
Problema se descompune in urrnatoarele subprobleme, iar algoritmii pentru rezolvarea
subproblemelor sunt implernentati cu ajutorul subprogramelor:
f1l Se creeaza lista circulara simplu Inlantuita - subprcqramul creare ( ) .
~ Se parcurge lista de la succesorul primului nod pana la primu l nod si daca nurnar ul
din succesorul nodului curent este par, at unei se elimina succesorul nodului curent -
subprogramu l eLa mi n a u r m ( ) ; altfel se trece la succesorul nodului curent.
~ Daca nurnarul din nodul prim este par. atunei se elirnina nodul prim si lista este vida -
subprogramu l e Li.mi.n a_ p r i m ( ) .
Infor matica 139
~ Dac a lista nu este vida (subprogramul es te vida () }, atunci S8 afiseaza numerele
din fiecare nod (subprogramul afisare ()) . -
#inc lude <f s t r e a m . h >
struct nod {int in fo ;
n od *u r m ;};
fstream f( "li s t a7 . t x t " , i o s : : i n } ;
int x ;
void a da u ga nod (n od *&p r i m, nod *&u l t i :nl
{p r i :n=new no d ; pr im-> i n fo =x ; p r i m- > u r m ~ NULL; u l t i m=p r i m; }
void a cla ug a _u l t i m(nod * &u l t i m )
{n o d " p e new n od ; p- c- Lnf oe x , p ->unn=NUL L ; u l t i m- >urm=p ; u L t..inr- p , }
void c reare(nod *&p r i m)
{n o d *u 1 tim ; I c->x , a d a u ga.. ..n od rpr im , u lt im ) ;
while (f »x ) adauga~)1 1 t im(u ltim) ;
u l t Lm- c-u rme-p rLm , }
' v o i d e Li.m.ina __urm( n o d *p, n o d *&p r i m)
{rio d *q =p - >u r :n; p -c-u rmcp -c-urm- o u rm ,
if (q ==p r i m) p r im=prim- >u rm ;
delete q ; }
vo i d e Ld.m.i.na p i .im t n o d * &p r i m)
{n o d *q = p r i m; pr irn=NULL ; delete q ; }
a.n t; e s t .e vLda ( n o o ep r-Lrn ) {return pr i m= =NULL ; }
v oid 2-fisar e( n od *p r i m)
Lcou t.c-cp r i.m -o Ln Fo -cc " ",
for {nod *p "" p- >u rm; p >=p rim;p =p->u rm ) coutxc c - c- Lnfcoc'' "; cout«endl ;}
void ma i n ()
{ no d e p r i.m, *p; c r ee.r-e.Ip r i .m j , afi s ar e (p r i m);
for (p =p r i m- >u r m; p ! =p r i lll;)
if (p - >u r m->i n f o% 2=-"'O) e l i rn i n u.....urm(p ,prim) ;
else p=p- >u rm ; _
i f (p r i m-c -I u Co %2== O)elimina ,:-,"prim (p rim} ; -<I ~~ t>-
i f (! este_v .i.da (p r im ) ) a f L s a r e (pr i m) ; }
-----.--.... Scrieti cate un program care sa rezolve cerintele fiecarei probleme. Fiecare
problema se va descompune i n subprobleme ~i algoritmul pentru rezolvarea
unei subprobleme se va implementa cu un subprogram. Datele se transmit
intre subprograme eu ajutorul parametrilor de cornunicatie ~i nu al variabilelor globale. Se
creeaza liste ci rcu lare sim plu ln lan tu tte in noduriIe carora se rnernoreaza numere intregi.
Sirul de numere se citeste dintr-un flsier text in care sunt memorate pe acelasi rand, separate
prin spatiu. Dupa executarea unei operatii de prelucrare a listei, S8 vor afisa numerele din noduri
pentru a verifica daca operatia s-a executat coreet. Se vor alege seturi de date de intrare astfel
l ncat sa se verifice algoritmul pe toate traseele lui. Pentru urmatorii 4 itemi Jistele se creeaza
asttel lncat ordinea de acces sa fie cea in care sunt citite numerele din fisier.
1. Sa se insereze , dupa fiecare nurnar divizibil cu cea mai mare citra a sa, valoarea cifrei,
~ i sa se elim ine numerele care au ultime le doua cifre consecu tive .
2. Sa se verifice daca num erele sunt in progres ie geometr ica si sa se afiseze primul
termen al progre siei geometriee. (Observat ie. Daca numerele sunt i n progresie geome-
trica, nu este ob ligatoriu ca sirul de numere citit din fisier sa lnc eapa cu primul termen al
progresiei geom etrice.)
3. Sa S8 insereze in tre doua numere pare din llsta media lor aritrnetica pana can d nu mai
exista perechi de numere pare .
140 Implcm cn ta r ca structuril or de d ate
4. Din lists circul ara creata sa se creeze alte dOU8 liste circulate simplu inlant uite - una cu
numerele divizibite cu cea mai mare citra, iar alta cu numerele divizibi le cu cea rnai mica
cifra - ~isa S8 verifice daca cele doua liste cont in numere comune.
5. Se creea za 0 lista ordonata crescat or si S8 creea za apoi din ace asta lista 0 lisla cu
numerele care sunt patrate perfecte.
Alg oritmi i de la listele simp lu ln lantui te S8 rnod ifica prin adauqarea instructiunilor care
Int retin ~i adresa de leg atura cu predecesorul nodulu i. Algoritmul de ada uqare a unui
no d pin inte rio rul liste i i na in tea un u i no d q se sirnplifica deoar ece se cuno aste adresa
atat a succesorului, cat ~ i a predecesorului.
Lista dublu lnlantulte
•I
an t
Seop: exe mplificarea modului in care, pentru rezolvar ea pro blemei, folositi algoritmii de prelu -
crare a listelor dublu Inlantuite ,;;i implementarea lor cu ajuto rul subpro gramelor.
Enunt ul p rob lem ei 1. Sa citeste dintr-un fi§iBr text un sir de numere separate prin spetiu
cu care se ereeaza 0 !ista dublu inlanfuita in ordinea in care sunt citiie numerele din tisier.
Sa se adauge va/oarea 1 dupa fiecare numer par §i sa se §tearga apoi numerele pare din
lista. Sa se etisoze numerele din lista dupa fiecare operatic de prelucrare, in ambele moduri
(de fa primulla ullimul, si de la ullimul fa primu/). Penlru les/area programufui se va folosi
$irul de numere: (2, 2, 5, 3, 4, 4).
In prelucrarea tistelo r dublu inlantuite trebuie lnt retin ute atat adre sa primulu i nod , cat si
adresa ult imu lui nod . Pro blem a se de sco mp une in urrn atoarele subp rob leme, iar algoritm ii
pentru rez olvare a subproblernelor sunt implementati eu aju torul subprogra melor:
lP11
Se creeaza lista du blu inlantuita - sub programu l creare () .
~ Se adauqa un no d eu valoarea 1 dupa l iee are nurna r p ar, a stlel (s ubp rogramu l
pr e l u c r a re 1 (» ):
1 -7 Se p areurge lista de la primul nod pana la pe nul timu l nod si, da ca nurn arul din
:~-ER"
Pentru calcularea rezistentei echivalente se porneste de la ultimele rezistente - Rn ~i Rn-1 -
care sunt legate in serie. 5 e calculeaza rezistenta lor echivalenta Re1, care va fi legata i n
paralel cu rezistenta Rn·2. Prin calcularea rezistentei echivalente a celor coua rezistente
legate i n paralel, R cl o;i R n-2, se va obtine 0 noua rezistenta echivalenta R c2 care este leqata
in serie cu rezistenta Rn-3. Calcularea rezistentei echivalente a circuituiui electric este un
proces repetitiv i n care alterneaza calcularea unei rezistente echivalente a doua rezistente
legate i n serie eu calcularea unei rezistente eehivalente a doua rezistente legate in paralel.
Pentru a ~ti care dintre variantele de calcul se alege, se foloseste variabila 5 care are
valoarea 1 daca rezistentele sunt legate in serie, ~ i valoarea 0 daca sunt legate i n paralel.
144 Implem entarea st ructu r ilor de da te
Va lorile pentru rezistente S8 citesc dintr-un fisier text in care sunt memorate pe acela si rand,
separate prin spatiu , Se creeaza a lista dublu Inlantuita in care ordinea de aeces este cea in
care sunt citite nurnerele din fisier. Lista S8 parcurge de la ultimul nod pana la primul nod .
#inc l ud e <f s t r e a m. h >
struct nod {f loat in fo ;
n o d *a n t , * u rm ; } ;
fst ream f I vre z i s t.ent.e t x t vi Los : : i n ) ;
c
f l oat X i
void a da uga nod (nod *&prim, nc d *&u l t i m)
{ p r ~=new nod ; pr i m-> i nf o=x; prirn- >urm=NULL; prim- >an t =NULL; ultimzprim ; }
vo id adauga (no d * &u l t i m)
{n o d *p ; p e n e w nod ; p- c- Lnf o e x ,
p- >u r m=NULL ; p - >ant= ul t i m; u l t i m - > u rm~~; u l tim=p ; }
voi d c rea r e (n od *&p r i m nod * &u l t i m}
l
Scrieti cate un program care sa rezolve cerintele fiec arei probleme. Fiecare
prob lema se va descompune in subprobleme si algorilmul pentru
rezolvarea unei subprob leme se va implementa cu un subprogram . Datele
se transmit intre subprogra me cu ajutorul param etrilor de com unicate si nu al variabilelor
globa le. Se creeaza liste d ublu I nlant uite in nod urile carora se rnerno reaza numere i ntregi.
Sirul de numere se citeste di ntr-un fisier text in care sunt m emorate pe acelasi rand , separate
prin spatiu. Dupa execut area unei operatii de prelucrare a listei, se vor afisa numerele din
nodu ri pentru a verifica daca opera tia s-a execut at core ct. Se vor aleg e seturi de date de
intrare astfel incat sa se verifice algoritmul pe toate traseel e lui. Listele se creeaz a astfel
ln cat ordinea de acc es sa fie cea in care sunt citite numerele din fisier.
1. Sa se elimine numerele prime $i sa se insereze intre fiecare pereche de num ere rarnase
cel mai mare divizor eomu n al lor.
2. Sa se calc uleze eifra de cont rol a fiec arui nurna r ~i , da ca numarul este diviz ibil cu cifra
de cont rol , citra este ada uqata du pa nurnar; alttel, numarul este elim inat din lista . Citra
Inform aticii 145
de control a unui numar este suma repetata a cifrelor numarulu i pana cane S8 obtine 0
suma mai mica decat 10.
3. Sa S8 mo difice adresele din nodurile Iistei astrel inca t sa S8 obtina doua liste !iniare
dub lu inlantuite care sa cantina numerele din pozitiile pare, respectiv din poz itiile impa re.
4. Se citese dintr-un fisier doua numere foarte marioSa S8 scrie urrnatoare le subprog rame
pentru prelucrare a nume relor:
a. calcu larea sume i, a diferentei §i produsu lui nume relor;
b. com para rea a doua numere (subprogramul trebuie sa
verifice daca cele doua
nume re sunt egale , iar daca nu sunt egale, sa precizeze care nurnar este mai mare) ;
c. ver ificar ea nurn arului daca are un nurnar par sau un numar irnpa r de cif re , fara sa se
numere cifrele nurnarului:
d. determina rea nurna rului de cifre ale unui nurnar:
e. verific area nurnarutui daca este palindrorn.
Seop exempliticarea modului i n care, pentru rezolvarea problemei , folositi algoritmii de prelu-
crare a stive lor ~i implementare a lor cu ajutorul subprogramelar .
Enunt ul pro bl em ei. Se citesie dintr-un tisier text uri sir de numere separate prin speiiu
care se depun intr-o stive in ordinea in care sunt ciiite numerete din tisier. Sa se etimine
nunuuut de la baza sitvei §i numerele ttimese in stiv» sa so scrie intr-un tisier text. Pentru
testarea programului se va lolosi §irul de numere: {t , 2. 5. 3. 4).
in prelucrarea stivelor, pentru a putea ajunge la inforrnatia care treb uie prelucrat a, trebuie
extrase toate nodurile, pan a la nodul care confine acea informatie, deoarece nu poate fi
prelucrata decat inforrnatia din varful stivei. Pentru a nu se pierde informatia din nodur ile
Informatica 147
extrase, ele vor fi descarcate intr-o alta stiva (de rezerva ), iar dupa prelucrarea inforrnatiei,
nodurile vor fi i ncarcate din nou i n stiva.
5 _ _ (
' .... ..
Con su lta rea nodului care c ont ine n um aru! 3
5 Iv arl
oes c arc a consulta Inca rc a
4 • 4
3 [~_3:Jva rl - 3
2 W varl r W W varl r 2
1 W - W W - 1 varl_r= NULL
stiva stiva de rezerva stiva stiva de rezerva stiva stiva de rezerva
Problema se de seomp une i n urrnatoarele subprobleme , iar algoritmul de rezol vare a unei
subprobleme este imple me ntat cu ajuto rul unui subprogram:
rP1l
Se creeaza stiva cu numere le citite din fisier (nodul ve r -f) - subprogram ul c rea re ( ) )
~ Se descarca stiv a Intr-o alta stiva (nc dul va rf r ) pan a la penu ltimu l nod (subpro-
gramu l d e s ca rc a (» ).
~ Se extrag e ultimu l nod din stiva - subp roqrarnul ext rage () .
~ Se l ncarca in stiva (nodul v arf) nodurile din stiva de rezerva (nodul varf r ) - sub-
programu l i n c arca ( ) .
~ Se seriu numerele din stiva (nodul var f ) i n fisierul text - subprogram ul salv e aza () .
# i n c l ude < f s t r e &~ . h >
s t r u c t nod {i nt info ;
nod * u rm ;} ;
fst ream f1 ( "stival .t xt " , i o s : : i n ) , £2 ( " stiva2 .txt " , i o s : : o u t ) ;
i nt x;
vo i d in it (no d * &v a r f l { v a r f = NULL; }
voi d a d a ug a (n od *&va r f ) {nod *p= n e w nod ; p-> i n f o =x; p->urm=varf; va rf~~ ; }
i n t este vida(nod * va r f ) {retu r n varf==NULL ; }
v o i d extrage (nod * &v a r f ) {n o d *p = v a r f ; var f =varf->u rm ; d e lete p i }
void crcare{nod * &va r f )
{i n i t (va r f ); wh i le (fl »x) adauga(varf) ; }
voi d d~sca rca(nod * &v a r f , n o d * &v a r f _ r )
{ Ln i t I va r f vr ) ;
while (va r f -c-u rm! =-NULL) {x=va r £- >i n f o ; ext raqe (varf) ; adauga (var f rl ; } }
void inca rca (nod *&v a r f , n o d * &v d r f r)
{wh 1 l e (le s te_vi6a(varf_T ))
( x =v a r f _ r - > i n f o ; extrage(varf~r ) ; adauga(varf ) ; } }
vo i d salveaza(nod *&v a r f )
( wh i l e ( !este vida {v a r f l ) { f zccv a r f -o i.n fo -cc" "; ex t.r aqe (varf) ; } )
void ma i n () ( ne d " v e r f , " va r f r ; c rea r e (va r f) ; fl . cl o s e () ; _
descarca (v a r f va r f r) ; e xtrage(varf) ;
j -<:I - t>
incarca{varf ,var[_r} ; salveaza(varf); f2 . c l o s e {) ; }
Fieeare problema se va deseompune in subproblerne ~i algorilm ul pentru
rezolvarea unei subprobleme se va impleme nta cu un subprogram. Datele
se transmit i ntre subproqrarne cu ajutorul pararnetrilor de cornunicatie ;;i nu
al varlabilelor globale. Se creeaza stiv e in nodurile carora se merno reaza inforrnatia (numere
sau caracte re). lnforrnatia se citeste dintr-un fisier text i n care , nume rele sau caracterele, sunt
memora te pe acelasi rand, separate prin spatiu. Se vor alege seturi de date de intrare astfel
tncat sa se verifiee algoritmul pe toate traseele lui.
148 lmplcm cntarcu s t r uct u r ilo r de date
1. intr-o stiva sunt memorate numere din intervalul [1,10J, ordonal e crescator, iar i ntr-o alta
stiva, numere din intervalul [20,30]. ordonate crescator. Sa S8 concateneze cere dOUE!
~i ruride numere, pastrand ordonarea crescatca re. (Ind icatio. Se rastoarna a doua stiva
intr-o a treia stiva , S8 rasto arna si prima suva in a treia , peste numerele din prima stiva , !?i
S8 extrag numerele din a treia stiva.)
2. Se cornp ara doua stive fara a pierde conti nutullor i n urma extragerii de noduri.
3. 5e elirni na din stiva numerele pa re.
4. Se rnernoreaza intr-o suva un ~i r de litere mici. Se citeste de la tastatura 0 litera mica a alfa-
betului - lit. Sa se creeze doua stive: una va contine literele din stiva initiala care preced in
alfabet litera lit ~ i alta va conune literele din stiva ini!iala care succed in alfabet litera lit
5. Sa se afiseze in ordine inversa num ere !e dintr-o lista linlara sim plu l nla ntuita. (Ind icat ie .
Se incarca nume rele din lista lntr-o stiva, i n ordinea de parcurgere a listei, !?i apoi S8
extra g ~i se afiseaza numerele din stiva.)
6. Se ordoneaza crescator un ~ir de numere, cu ajutorul a doua stive . Determinati com-
plexitatea algoritmului. (Indicat ie. Se folosesc doua stive. Se serie un nurnar in Stiva 1.
Se citeste un numar. Daca nurnarul din varful Stivei 1 este mai mare decal numarul citit,
atunci noul nurnar se adauqa la Sliva 1; altfel , se descarca din Stiva 1 in Sliva 2 numere
pima cand in varful Stivei 1 ajunge un nurnar rnai mare decal nu rnarul citit, S8 adauqa la
Sliva 1 numarul citit , si S8 lncarca in Sliva 1 numerele din Stiva 2.)
7. Sa S8 verifice daca 0 expr esie aritrnetica ce contine paranteze este balansata. adica daca
fiecare parante za deschisa este i nchisa coree! De exemplu, exp resia (a+b+(cI[d-e]})+
(dis) este balansata, iar exp resia (a+b+{cI[d -e}])+(d/s) nu este balansata , (lnd icatie. Se
codifica paranlezele 1-(; 2- [; 3-{; 4-); 5-J; 6-)). Daca stiva nu esle vida ~; daca difere nta
dintre codul dintre paranteza citita ~i codul parantezei din varful stivei este 3, atunci se
elimin a nodu! din varful stivei: aittel , S8 adauqa la stiva codul parantez ei citite . Daca stiva
este vida la term inarea evaluarii expre siei, inseamna ca expr esia este balansata .)
iaa es te coada care nu confine nici un no d si ad resa no d ului cap are va loarea
NULL (ca p ~ N UL L ; ) . in coada vid a nu se mai pol execut a ope ratii de ex tragere de
noduri. Coada poate sa ajunqa sa fie vida in doua cazuri : la in itlaliza re sau dupa
ext rage re a ultimul u i n od . Pentru testarea unei cozi daca este vida se po ate implem enta
functia operand este_ v i d a () ca re va furniza val oarea 1 ("adevaran. dad! este vida , :;;i
°
valo area ("fa ls") daca nu este vida .
III fo rill 'I tid 149
int e ste_v ida(nod *c a p )
{return c a p == NULL ; }
Pentru preluc rari cu ajuto rul coz ii puteti folosi urrnatorli algorit mi:
-7 lnitlallzar ea cazii ;
-7 adauqa roa unui nod la coada:
-7 ex t rage re a unui nod din coa d a:
-7 con su lta rea nodului di n cap ul co zii.
2.6.7.1.lnitializarca cozii
Prin acest algoritm se creeaza co ada car e con tlne un nod . in acest caz , nodurile cap ~i
baza vor avea aceeasi ad resa .
Implem entarea algori tmului. Se foloseste functia procedura la i ni t {} ai carei parametri
cap si ba za S8transmit prin referinta, deoarece sunt parametri de iesire.
v o id init{nod *&c a p, nod *&b a za )
{ca p =n ew nod ; cap->info=x ; cap->llrl11=NULL ; baza=-cdp ; }
2.6.7.2. Adiiugarca unui nod la coada
Nodul se ada uqa la coada ca succesor al bazei. Pasii algo ritmului sunt:
PAS1. Se cere aloca rea de memorie pent ru nodul p .
PAS2. Se scrie intorm atia in nodu l p
PAS3. Nodul p se leaga de nodu! baza
PAS4. Nodu l p adauqat devine nodul b aza .
hnp lcm entarea alg oritmului. Se foloseste functia procedu rala adauga () al carei parametru
baza S8 transmite prin referinta deoarece este parametru de intrare -iesire.
void ada~ ga(nod * &b a z a )
{no d *p =n ew no~ ; p->in:o=x ; p ->urm~ NUL L ; Da=~->urm~p ; ba z3 =9 ; }
2.6.7.3. Extraqcroa unui nod din coada
Nodurile S8 extrag din ccada pe ntru a putea consu lta inforrnatia care exista in nodurile
urrnatoare . Un nod S8 poate extrage numa i in cazul in care coada nu este vida . Se poate
extraqe num ai nodul din capul cozii (se eliberea za spatiul care a fast ocupal de nod). i n
capul coz ii va ajunge succesorul nodulu i extras . Pasii algoritmu lui sunt:
PAS1. Se salveaza adresa nodului cap in pointeru l p .
PAS2. Succ esor ul nodului cap devine nod ul cap.
PAS3. Se cere elibera rea zone ! de memorie de la adresa rnernora ta i n pointerul p .
lmplernentaroa alg oritmului . Se foloseste functia procecurala extrage () a! carei para~
metru cap S8 transmite prin referinta, deoa rece este parametru de intrare-iesire.
voi d extraq e (Ilo d * &c a p )
{n o d *p <c ap r c ap ec ap - c-ur m : d e le t e p ; }
2.6.7.4. Prclucrarea cozii
Prin acest algoritm S8 consults informatia din fieca re nod al cozii . Deoarece nu poate fi
con s ulta ta decat i nfo rrnatia din ca pul cozii , pentru a ajunge la un nod trebuie se
extraqa toale nodurile pan a la el.
Implementarea algo ritrnului. Se foloseste functia procedurala prelucrareO al carei parame-
tru cap de tip nod se transmite prin referinta, deoarece este parametru de lntrare-iesire.
void preluc~are{nod *&c a p )
{wh i le (cap!=NULL) { l i s e prclucreaza c a p- >i n f o
ext rage(cap ) i )}
150 Implem enta rca str uct u r ilor de date
Scop exemplificarea modului in care, pentru rezolvarea probleme i, folositi algoritmii de prelu-
crare a cozilor ~i implementarea lor eu ajutorul subp roqrarnelor .
Enun t ul proble mei. Se citeste dintr-un fi§ier text un §ir de numere separate prin speiiu
care S8 depun tntr-o coeoe in ordinea in care sunt citite din tisier. Sa S8 a/imine numiuut din
mijloeul eozii, daea numerul de noduri este impar, §i eele oou« numere din mijloe, daea
numetut de noduri este par, iar num erele (amase in cooos sa se sctie lnlr-un tisier text.
Pentru testarea prog ramufui se vor folosi doua seturi de numere: fl , 2, 5, 3, 4) §i fl , 2, 5, 4) .
in prelucrarea cozilor, pentru a putea ajunge la intormatia care trebu ie prelucrata, trebuie
extrase toate nodurile pima la nodul care contine acea informatie, deoarece nu poate fi pre-
lucrata decat informatia din capu l cozii. Pentru a nu S8 pierde intorma tia din noduri le extrase,
ele vor fi descarcate l ntr-o alta coada (de rezerva), iar dupa prelucrarea lntorrnatiei, nodu rile
var fi descarc ate in continuare in coada de rezerva. pana cand coad a initiala dev ine vida.
Consulta rea n odul ui ca re confine numaru l 3
coada coada coada
~
2---l.--,,----,---=---,---,,--,---=nSUl~~ eap =NULL
cap baza cap \ aza
ocscarca desca rc a
coada de rezerva coada de rezerva
C1IU
c aPJ
Problema se des com pune i n urmatoarele subprobleme, iar algo ritmul de rezo lvare a unei
subprobleme este imp lementat cu ajutorul unui subprogram:
[E1J Se creeaza coa da cu numerele citite din fis ier (nodurile cap :;;i baza) - subproq rarnul
creare () .
~ Se descarca coada in tr-o alta coad a (nodurile c ap _ r sl ba z a_ r) pana la nodu rile care
trebuie elimin ate - subproqra rnul de scarca 1 () .
§ Se ex trage nodul sau se extrag nodu rile din mijlocul eozii - sub prog ramul extrage () .
lE1l Se descarca res tul nodurilor din coada (nodul c ap ) in eoa da de rez erva (nodul
ba z a r ) - sub proqrarnul de s c arca 2 () .
~ Se seriu numerele din eoada de rezerva (nodul c ap r ) i n fisi erul text - subprogram ul
s a l v eaza ( ) .
#1 nclude < f s t r e o rn . h >
str uct nod t i nt info ;
n od *u r rn; };
fs t r e a m fl( " c oadal .tx t " , 1 o s : : i n ) , f 2 ( " c o a d a 2 . t x t", ios : :ou t );
i n t x s n , i,j ;
v oid in it {no d *&c a p , no d *&ba z a )
{c a p =n e w nod ; cap ->in £o ~ x ; ca p ->u ~m= NULL ; baza=cap ; }
int este vi d a{nod *c a p ) {r e tu r n cap==NULL; }
v o id adauga(nod *&b a z a )
{no d *p =new nod ; p ->in fo =x ; p ->u rm =NULL ; baza ->u rm=p ; baza=p ; }
v 01d ext rage(nod -& c a p ) {no d *p =c a p ; cap=cap->u rm ; del ete p ; }
v oid crea re{ nod * &c a p , n o d *&b a z a )
{f l» x; i nit( cap ,baza) ; n ++ ;
I II forill a tiea 151
while ( f l » x) { a d a u g a (baz a) ; n ++ i } }
void desc a rca_l(nod *&c a p , no d *&c a p_ r, nod *&b a Za _ L)
{x v c e p - o i n f o , ext ra g e(cap) ; ini t ( ca p _r , ba z a _~r) ; i + +;
while (i <j) {x =c a p- > i n f oi extra ge(cap) ; a d au ga{baza r ); i ++;}}
voi d desc a rc 3_2(nod *&c a p , noc *&ba za _ r )
{whi le (! e ste vida (cap))
{x=c a p- >i n f oi e xt r age(cap} ; a dauga(baza ~ r) ; } }
v o id sa l v e a z a(nod *&c a p )
{whil e { ! este vi da (c a p } ) { f 2« c a p - >i n f o «" "; e x t ra g e (cap ) ; } }
void main ()
(nod *c a p ,* ba z a ,* c ap r, *ba za r ; crea r e (cap,ba za ); f l . c los e ( ) ;
if (n%2==O) j=n/Z -l ;-e l s e j=~/2 ;
descarca_l(cap ,cap_~ ,baza_r) ; e xtrage(cap) ; ~
if (n %2==0) e x t r a qe (cap) ; ~ , " " ~
descarca_2(cap ,baza_T) ; salveaza{cap_r) ; f2 . c l o s e ( } ; J
~ Fiecare problema se va descompune in subp robleme ~i algoritmul
Tem« '>::::J pentru rezolva rea unei subproblems S8 va implementa cu un subpro-
- , -f gram . Datele se transmit in tre subprograme cu ajutorul parametrilor de
cornunic atie si nu al varia bilelor glo bale. Se creea za cozi in nodur ile caro ra se memo-
reaza numere intregi . Sirul de numere S8 citeste dintr-un fisier text i n care sunt memorate
pe acelasi rand, separate prin spatiu. Se vor alege seturi de date de intrare astfe l i ncat sa
se veri fice alg oritmul pe toate traseele lui.
1. Se elirnina din coada nume rele pare.
2. Se verifica caca numerele dintr-o coada sunt ordonat e (cresca tor sau descrescator).
3. Se concateneaza doua cozi, adauqano a doua coada la sfar§iitul primei coz i.
4. Se formeaza din doua cozi 0 a treia coada care contine rnai intai numerele pare din pozi-
tHle impare din prima coada si apo i numerele impare din pozitiile pare din a doua coada.
5. Se inverse aza ordinea numerel or dintr-a coada cu ajutorul unei stive .
Pent ru exercitiile urrnatoa re, daca nu S8 specifica sernnificatia variabilelor de mem orie, se
lolosese urrnatoarele dat e:
struct no d tint inf o ;
n od * u r m;} ;
r. o d * p r i m ,* u l ~ i m /* p ,* q/* r /* u / * v :: /* c a p ,* b a z a ;
int x , k ;
Raspundoti :
1, Analizati din punet de vedere al cornplexitatii algoritmii pent ru prel uerarea listelor. Se
va folosi i n determinarea cornplexitatii timpul maxim de exec utie Pentru compararea
algoritmilor com pletat i urrnatorul tabel:
Lista sim p!u i n l a n~ Li sla dublu inf an!uita
Neordon ata Ord onata Neordonata Ordonata
Cau t a (L ,k)
Ad a ~g ~hL ,~)L _____
Elimina L,x
~u cce s o r u l (h><) -
PredecesorullL,Xl
MinimJ l 1
Ma xim (L )
2. 0 lista simp lu in lantuita ccntine , in ard ine, urrnatoarele naduri: 2 - ) 4 - ) 6 - ) 8 - ) 10
- ) 12 - ) 14 - ) 16 - ) 18 _.) 20 . Ce se va afisa in urma executiei urma toarei sec vente
de prog ram?
for { p ~ p ~ i re , k = 1 ; k < 5 ; k ~ ~ , p = p- > u r m ); co u t « p - > i~f o ;
3. 0 lista simp lu in lantuita contine, i n ordine . urmatoa rete nodu ri: 1 - ) 2 - ) 3 - ) 4 --t 5
-» 6 -o 7 ~) 8. Ce se va afisa i n urma executie i urrnato arei sec vent e de program?
for {k =O,p::.:;prim;p->urm !::.;;NULL ; p~p->u rrn) if (p -> i n f o%2) k += p->i nf o ;
cout« k;
4. Ce se va afisa i n urma executiei urrnatoarei secvente de program , daca lista sirnplu
inlantulta conf ine. in ardine , urrnatoar ele noduri: 1 - ) 2 - ) 3 - ) 4 - ) 5? Dar dac a
naduri le ei sunt, i n ord ine: 1 - ) 0 - ) 3 - ) 0 - » 5?
f or (p =p r i m; p-> i~f o!= O ;p=p -> u rm : ; c out« p - >i n r o;
5. Ce se va afisa in urma exec utiei urrnatoarei secv ente de progra m, dac a lista sirnplu
inlan~uita contine , in ordine , urrnatoarele nadur i: 1 - ) 2 _.) 3 - ) 7 - ) 8 - ) 9? Dar daca
nodurile ei sunt, in ordine: 1 - ) 2 - ) 4 - ) 5 ~) 7 -~) 8?
f or ( ~ = O , p = p r i m ; p - > i n f o ! = O ; p = p - > u rm )
Informatica 153
i f f p -c-urm -'> 'i n f o r p -' > .i n.f o e -eL ) k++;
cou t cc k ,
Miniproiccte:
Observatie: Pentru realizarea urrnatoarelo r miniproiecte S8 va lucra i n echipa. Prote-
sorul va numi ccnducatorii de proiect, le va distribui proiectele si le va aloca un buget pentru
realiza rea lor (pentru simpli!icare , buge tul va fi folosil numa i pentru plata membrilor ech ipei
care vor realiza proiectul). Conducatorii de proiect vor negocia cu profesorul termenul de
predare a aplicatiei, echip a cu care 0 vor realiza, si , daca este cazul, bugetul care Ii s-a
alocal initial. Pe timpu l realiza rii aplicatiilor, membrii echipelor pot migra de la a echipa la
alta. cu co nditia sa rarnana incadrati Intr-una dintre echipe, iar miqratia sa se faca numai cu
accep tul conducatortlor echi pelor int re care migreaza. Fiecare echipa va fj to rrnata din :
-7 Condu catoru! pro ie ct ulu i I~i va forma echipa ~i va distribui sarcinile pentru fiecare
membru, negociind initial suma repartiza ta din bugetul alocat pentru realizarea sarcini i. Va
fixa termene de executie pentru fiecare memb ru al echipei ~i va urma ri rnodulin care sunt
respectate aceste tenn ene. In cazul In care unul dintre membrii echipei nu i~i realizeaza
core ct :?i la timp sarcinile, va redistr ibui a parte dintre sarcini lntre ceilalti rnernbri ai echipe i,
renegociind suma din buget alocata fiecaruia dintre ei La sfarsit , va da calificative fiecarui
membru al echipei , In functie de modul in care si-au respecta t termenele, de modul in
care au cooperat cu ceiialti membrii ai echipei si de calitatea lucrarilor executate.
-7 Ana listu l va analiza cerinte!e info rmatio nale ale aplicatie i. va determina functiile apli -
catiei ~i va elabora modul de rezolvare (datele ~i structurile de da te folos ite, procesele
in care este descornpusa aplicatia - care vor f implementate cu subprograme - si
meniul care asiqura intertata cu utilizatorul ). In rea!izarea acestor sarcini va f ajuta t ~i
indrurnat de conducatorul proiectului.
-7 Grupul de pro g ram atori (numarul lor trebuie sa fie stabilit in funct ie de dimensiunea
proiectu!ui) va implernenta in Iimbajul de programare solutia qasita de analistul echipei.
Conducatorul proiectului Ie va repartiza subprogramele pe care Ie vor realiza ~ i specifica-
tiile fiecarui subprogram: datele de intrare , datele de iesire si functia subprogramului.
-7 Testo ru l va testa aplicatia . EI va trebu i sa aleaqa set uri de date de intrare astfel incat
sa gaseascii erorile de loqica ~i de executie ale aplica tiei ,
-7 Documcnta ristu l va Intocm i docurnentatiile aplicat iei : documentatia pentru beneficiar
si docurnentatia pentru pro iectantul aplicatiei
La terminarea pro.ectului membri i echipelor vor prim i note pentru evaluarea activ.tatii lor.
Sistemul de evaluare trebuie sa tina cant de venitu rile rea lizate pentru munca depusa , de
calificativul obtinut de !a conducatorul de proiect si de ca!itatea muncii eva luata de profesor.
1. Pentru biblioteca scolii sunt aduse carti de la mai multe edituri. Cartile trebuie organ izate
i n ordinea alfabetica a autor ilor , ~i pe fiecare autor in ordinea alfabetica a titlurilo r. Este
posib il ca pen tru acelasi autor ~i acelasi titlu sa se prirneasca ma i mu lte exempla re. Se
va folosi cate 0 stiva pentru fiecare autor, In care se va simula teancul de titluri primite ,
pentru fieca re titlu rnernorandu-se si numarul de exe mp lare . Numele autorilor si adresa
158 Implcm cnta rca st ruct ur ilor de da te
varfului stivei de carti asociate S8 vor memora i ntr-o lista ale carei elemen te contin in
info rmati a utila do ua carnpuri : un camp de tip sir de car acte re pentru numele auto rulu i si
un camp de tip pointer cate tipul nod al stivei pentru varful stivei. Scrieti a aplicatie care
sa asigure urrnato arele ope ratii prin intermediul unui meniu :
a. Distribuirea pe autori si titluri a unui teanc de carti sosit de la 0 editura.
b . Afisare a titlurilor si a nurnarului de exemplare ale unui autor al ca rui nume se citeste
de la tastatura.
c. Afisarea in ordine alfabetica a autorilor si a numarului de titlu ri si de exemplare
pent ru fiecare auto r.
d. Numele autorilor cu cale mai multe, respectiv cu cere rnai putine titluri.
e. Numele autorilor cu cele ma l mu lte, respectiv cu cele ma i putine exemplare.
2. La un concurs participa mai multi candidati identificati du pa nume ~i prenume . Fiecare
candidat primes te la i nscriere un nurnar de identificare. Concu rsul consta i n trei probe ,
notele putanc lua valori de la 1 la 10. Rezultatul concursulu i se stabileste pe baza medi-
ei aritrnetice a notelor primite. Trebu ie prevazute doua varian te de admitere a candida-
tiler: sunt adrnis i toti candid atii care au a medie mai mare decat m ~i sunt admlsi, i n
ordinea med iilor, primii k candidat i (valorile pentru m si k se citesc de la tastatu ra).
Scrieti 0 aplicatie care sa asigure urrnatoa rele operatii prin intermediul unui rneniu:
a. Inscrierea unui no u cand idat la concurs.
b. Retragerea unui candidat din concurs.
c. Completarea notelor ~ i calcularea mediei pentru fiecare candid at.
d . Modifica rea infor rnatiilor despre un candidat.
e. Afisarea candi datilor adrnisi i n fiecare dintre cele doua variante in ordinea descres -
catoa re a medi ilor.
f. Afisarea candidatilor adrn isi in fiecare dintre cere dou a va riante i n ordinea alfabetica
a numelui si prenumelui .
3. Intr-un depou exista 0 linie pe care se gasesc mai multe locomotive , aranjate in ordine a
in care au intrat in depou, ~i a linie pe care se TRIAJ LOCOMOT IVE
gasesc mai multe vagoan e, aranjate i n ordinea i n linia de linia de
care au intrat in depou. Fiecare locornotiva ~i intrare i e~ i re
fiecare vagon are un num ar de identificare. In plus ,
pentr u fiecare vagon este preciza ta ~ i clasa (clasa
1 si clasa 2) Pentr u linia care contine locomotivele
exi sta un tria] cu k linii de rnanevra . Valoa rea k lin ii de rnan evra
pentr u k se citeste de la tastatura. in triajul vagoa-
nelor exista 0 linie de intra re ,,1 0 linie de iesire pe care depla- TRIAJ VAGOANE
sarea se poate face numa i in sensul saqetilor si 0 linie de linia de linia de
ma-nevra pe care dep!asarea se poate face in ambele intrare ies.re
sensuri. Scrieti 0 aplicatie care sa asigure urrnatoarele
operatii prin inter-mediul unui meniu:
a. Intrarea unei locomotive in depou.
b. Afi~area locomotivelor din depou . l ,inia de _
c. lntrarea unui vagon in depou . Jm anevra
d. Afisarea vagoanelor din depou , precizandu-se cate
vagoane sunt de c1asa 1 ~i cate sunt de clasa 2.
e. Formarea unei garnituri. Garnitura este fermata dintr-o
"i
locornotiva cu numarul de iden-tificare p n vagoane , dintre care m vagoane sunt de
clasa 1 (valorile pent ru p. n si m se citesc de la tastatura).
Inform atica 159
2.7. Graful
2.7.1. Definitia matcmaticii a grufului
Se nurneste graf (G) 0 perec he ordonata de rnultirni (X,U), unde X este 0 rnultirne finita ~i
nevld a, iar U 0 multirne de perechi formate cu elem ente distincte din mu ltirnea X (familie
de subrnultimi cu doua elemente din rnultimea X).
Terminologie:
-7 Elem entele rnultirnii X se nume sc varfuri sau noduri. Mulfirnea X se mai nurneste ~i
multirnea varfurilor sau rnultimea nodurilor grafului G. Ea este de forma :
Clasificarea grafurilor:
Criteriul de clas ificare folosit este proprietatea de simetrie a rnultirnii U .
Pentru a identi fica tipu l de graf pe care 11 veti folosi pentru a repre zenta datele , daflniti rel a-
tla dintre noduril e grafului si verificati daca relatia are proprietatea de sirnet rie, astfel:
~ Daca nodul X In relatie eu nodul y irnplica ~ i ca nodul y este In relatie cu nodul x, atunci
grafu l este neoriental.
~ Daca nodul X In relatie cu nodul y nu irnplica ~i ca nodul y este In relat ie cu nodu! x,
atunci grafu l este oriental.
I S1bul.dlJi.u de CSlZ I
Seop: identifiear ea tipul ui de graf pe care 11 folositi pent ru a rezolva problema .
Enuntul problemei 1. Pe neno unui jude! exist» mai muite locetitet) care sunt legate prin
sose te pe care S8 citcule in ambele sensuti. Sa se identltice traseele pe care se poate
ajunge de la localitatea A la tocalitatea B.
160 Irnplernentarea strueturilor de da te
Nodunle grafului sunt localitatile. Relatia care se stabileste lntre nodu rile grafului este:
nodul x este in relatie cu nodul y, daca exista 0 sosea care lea qa direct local itatea asociata
ncdului x cu localitatea asociata nodului y. Relatia are proprietatea de simetrie, deoa rece
soseaua care leaqa direct localitatea asociata nodului x cu localitatea asociata nodului y
leaqa direct ~i localitatea asociata nodului y cu localitatea asociata nodului x. Pentru
reprezen tarea caller de cornunicatie dintre lccalitati S8 va folosi un graf nooriontat .
Enuntul problem ei 2. Pe haria unui cartier existe rna! multe itite rsectii care sun! legate
de strezi. Pe unele strezi S8 paale circula in ambefe sensuri. pe alte strez! numei tnu-u»
anumit sens . Sa S8 identifice traseele prin care se poate ajunge de la iniersectie A la
intersectie B.
Nodurile grafului sunt intersectii'e. Relatia care se stabileste lntre nodur ile gralului este: nodul
x este In relatie cu nodul y , daca exists trafic care leaga direct intersectia asociata nodului x
cu intersectia asociata nodu!ui y (se poate circula de la nodul x la nodul V). Relatia nu are
proprietatea de simetrie deoarece, daca exista 0 strada care leaga direct intersect.a asociata
nodului x cu intersectia asociata nodului y §i pe aceasta strada exista trafic de la nodul x la
nodul y , nu este obligatoriu ca pe acea straca sa existe trafic si de la nodul y la nodul x.
Pentru reprezentarea traficului auto dintre intersectii S8va folosi un graf ori entat .
En u ntul p rob lemel 3. La nivelul unui grup de persoene se face un studiu social. intre
persoane se stabilesc retetii de prietenie, dar §i releti: de simpatie . Sa se descrie eu
ajutorul grafului rotntiile dintre porsoane.
Nodurile grafului sunt membrii grupului de persoane. intre persoane se pot stabili relatiile:
-j- Relatia de prietenie este 0 relatie definita astfel : persoana x este In relatie cu persoana
y , daca este prietena cu ea. Relatia este sirnetrica deoarece, daca persoana x este
prietena cu persoana y , atunci si persoana y este prietena cu persoana x (relatia de
prietenie presupune reciprocitate ). Pentru reprezentarea relatillor de prietenie dintre
membrii grupului se va folosi un graf noorientat .
-j- Relatia de simpatie este 0 relatie defin ita astfel: persoana x este In relatie cu persoana
y , daca 0 simpatizeaza. Relatia nu este sirnetrica deoarece , daca persoana x
simpatizeaza persoana y, nu este ob ligatoriu ca persoana y sa simpatizeze persoana x
(relatia de simpatie nu presupune reciprocitate ). Pentru reprezentarea relatiilor de
simpatie din tre membrii grupului S8 va folosi un graf o rienta t .
1'11111 n-rri-nt:
1 r srminoloqre
-j- Elementele multirnii U (perech ile de noduri) S8 numesc mucn u. Multirnea U se mai
nurneste si Itimea muchiilor grafului G. 0 muchie, fiind un element din rnultirnea U,
este ce terrninata de 0 subrnultirne cu doua eleme nte din multimea X: muchia k a
grafului ( ), care uneste nodurile Xi ~i Xj , este determinata de subrnultirnea {Xi, xi} ~i se
noteaza cu x"j ' [x., Xj] ~i [ Xj , Xi ] reprezinta aceeasl muchie a grafului. Graful G are
m muchii :
nurnar ut de muchi i = ca rd (U) = m
In fo rmatica 161
-7 Numim noduri adiac ent e orice pereche de nodu ri care forrneaza 0 muchie - {Xi,Xj} EU .
Fiecare dintre cele doua noduri (x, ~ i Xj) este nod inc ident cu muchia Uk = [x;,Xj] .
-7 Nodurile vec in e unui nod Xi sunt toate nodurile Xj care sunt adiacente eu el.
-7 Se nurneste nod ext rem al unei muchii oricare dintre cele doua nod uri care S8 gasesc
la capatul muchiei . Nodurile Xi ~ i Xj sunt extrernitatile much iei [Xi . Xj].
-7 Se numesc rnuchi i i nc iden te do ua muchii U j 9i Uj care au 0 extremitate comuns -
nadul Xk.
Un graf neari entat G este definit de 0 pereche de rnultirnl:
rn ult irnea nodurilor sale - X ~i rn u lti rnea muchi ilor sal e - U. EI poa te fi con siderat ca
o rnultirne de noduri din care unele pot fi unite doua cate doua printr-o muchie.
Grafu l S8 reprez in ta In pla n prin intermediul unor elemente geometrice: n od uril e se
reprezinta prin cercuri, iar muchiil e prin linii drepte care unesc anumite cercuri .
Elemenlele mult irnii X (nadurile) se identiflca cu ajutarul unar etic hete , care pot fi numere
sau litere. Pentr u simp lificare , vom folosi ca etichete un sir de numere consecutive,
lncepand cu nurnarul 1. De exemplu, pentru un grat cu n noduri, vom tolosi etiche tele: 1, 2,
3, ..., n-1, n. 0 muchie se va nota cu [i ,j] , unde i ~i j sunt etichetele nodurilor incidente cu
muchi a. De exemplu , muchia [2,3] este muchia care uneste noduri le cu etichetele 2 ~i 3
Exem plul 1:
in gratu ! G, =(X" U, ) din figura 1:
~
-7 Ordin ul gratu lui este 8. ~
-7 Graful are 8 naduri (n=8) ~i rnultim ea nodurilor este
X,={1,2,3A,5,6,7 ,8}
~
-7 Graful are 9 muchii (m=9) ~i mu ltimea muchiilor este Fig . 1
U ,={[1,2]. [1,3] , [1 A], [2,3], [2,5], [3A], [3,5], [6,7]. [6,8]) .
-7 Nodu l 1 este n od adia cent cu nodur ile 2, 3 ~i 4, iar nodu l 6 este adiacent cu nodurile 7
~ i 8. Nodurile 3 ~i 4 sunt adiacente deoarece perechea de noduri [3A] EU , . Nadu rile 5 ~ i
6 nu sunt adiacente deoarece perechea de nodur i [5 ,6] ~U ,.
-7 Nodul5 este nod inci dent cu muchiile [2,5] si [3,5], dar nu este incident cu muchia [1,2].
-7 Nodul 3 este nod extrem much iilar [1,3], [2,3], [3AJ ~i [3,5].
-7 Muchii le [1,21 si [2,3] sunt m uc hii inciden te deoarece au un nod comun (nodul 2).
Muchiile [1 A] ~i [2 ,3] nu sunt muchii incidente deoarece nu au un nod comun .
Teorema 1
Daca graful neorientat G are n noduri (x " X2, ..., xo) , atunci nu m arul total de grafuri
neorientate care sepot forma cu aceste nod uri esteg:
(J= 2c~
b
Notarn cu a - card{A):;;i cu b - card(S). Fieca rui graf ii putem asocia 0 1' da ca [x.y] E U
funcue f:A ~B de finita a taturat. lovers, unei functii f:A ~ B ii putem f( { x.y l)=
atasa un grat, astfel: f(1x,y})=1 daca si numai da ce [x,y]e: U, Rez ulta _ { O. caca [x ,yJ e. U
ca numarul total de grafuri care se pot forma cu n noduri este egal cu
3
numarut de funct ii f. Dar. numarul de functii f:A-) B este ega! cu b , unde b=2:;;i a= C~
1. in gra!ul G , - cu ce noduri este adiacent nodu l1?
i n gra!ul G, - cu ce muchii este incident nodu l 1?
3. Dati exemple de doua noduri adiacente ~i de ooua noduri care nu
sunt adiacente in gra!ul G,.
4. Dati exe mplu de doua muchii incidente ~i de doua muchii care nu sunt incidente in
gra!ul G ,.
Go 5. Desenati gra!ul G,=(X" U, ) definit astfel:
X, ={1 .2 ,3,4 ,5,6,7 ,8}
U, ={[1,2J, [1 ,3), [1 ,5], [2,3]. [2 ,5J, [3,4), [4 ,5J, [4 ,6], [4 .7)}.
6. Desenati gra!ul traseelor rutiere care la c legatura int re localitati le Brasov, Bucuresti,
Buzau, Ploiesti ~ i Constanta. Oaca exists mai multe trase e rutiere i ntre doua localitati
(de exemplu, Bucuresti ~i Brasov), adauqati la gra! noduri pentru localitatile care
identifica unic aceste trasee (de exemplu , Valenl i de Munt e, Tarqoviste si Pitesti),
7. Desenati gra!ul judetelor din Roman ia (intre doua jude te exista a muchie daca cele
doua judete sunt invecinate). ~ 2
8. Cate grafuri se pot construi cu 3 rnuchii? Desenati toate grafurile care
se pot construi cu 3 muchii. 4 3 5
C;'~J' 9. Pentru graful G J din figura 2, precizau ordinul, num arul de noduri,
nurnarul de muchii ~i multimile X3 ~i U3 . 6 7
10. Structura unei molecule de substanta chimica poate fi reprezentata Fig . 2
printr-un gra! neorientat , i n care nodurile sunt atomii ~ i grupa rile din
care este cornpus a molecula, iar muchiile sunt leqaturile dintre ele .
in figura 3 este prezentat gra!ul rnoleculei de apa H20 . Repre-
zentati gra!urile moleculelor de H2S04 , NH3, CH4 ~i C2H4. H H
/\
Fig. 3
2.4.2.2. Gradul unui nod al grafului neorientat
Nodul unui gra! este cara cterizat pnn grad.
Gradul unui nod Xkal gra!ului G esle egal cu nurn arul muchiilor incidente
c u nodul ~i se not oaza c u d(xk) '
Tcrminologie :
~ Se nurneste nod terminal un nod care are gradul egal cu 1 - d(xk) = 1 (este incident
cu 0 sinqu ra muchie).
~ Se nurneste nod izolat un nod care are gradu l ega l cu 0 - d(xk) = 0 (nu este adiacent
cu nici un alt nod al grafului, adica nu S8 g a se ~ te in extremitatea nici unei muchil) .
Info rmat ica 163
Exemplul1 :
Graful G 4 =(X 4 ,U 4 ) din figura 4 este defin it astfel : ® G4,
X 4={1 ,2,3,4 ,5,6 ,7,8,9, 10,11}
U,={[ 1,2], [1,4J, [2,3J, [2,5], [3,4J, [3,5], [5,6J, [5,7J , [5,8J,
[7,9] }, Fig . 4 @
in graful G 4 :
-7 G rad u l nodu lui 5 este 5, deoar ece are 5 muchii incide nte: [2,5J, [3,5], [5 ,6J, [5,7] ~i [5,8J
-7 Nodu l 9 este nod te rm inal, de oarece are gradul 1 (0 sinqura muchie tncide nta: [7,9]) .
-7 Nodu l 10 este no d izolat, de oarece are gradul 0 (nic io mu chie incidental.
Exe mplul2 :
Fie graful G5=(X S.Us), unde X s={1 ,2.3,4,5,6.7,8} si Us={[1 ,2J, [1,5], [2,3], [2,5J, [3,4], [3,5J, [4,5], G, .,,",,"
[4,6], [4,7J). Din lista much iilor unu i graf neorientat , putef preciza urmatoarele inforrnatii:
-7 Determinati gr adul unu i nod - nurnarand de cate on apare eticheta nodului i n lista de mu-
chii. Nodul 5 are gradul 3 (in multirnea muchiilor, eticheta 5 apare de 3 on: [1.5J, [2,5J, [3,5J).
-7 Det errninati dace un nod este terminal - verificand da ca eticheta lui apare 0 singura
data . Nodul 7 este no d terminal (eticheta lui apare numai intr-o sinqura muchie : [4 ,7]) .
-7 Deterrninati da ca un nod este izo lal - verificand daca eticheta lui nu apa re i n lista de
muchii. Nod ul 8 este nod izol at (eticheta lui nu apare in lista muchiilo r).
-7 Deterrnin ati nu rn aru l de nod uri izolatc (n -) astfel: nurna rati etichetele distincte care
apar in lista mu ch iilor (n 2) ~i n1=n-n2 . i n graful G s, i n lista de muchii exista 7 etichete
distincte. Nurn arul de noduri izo late este 1 (8-7).
Observatie: intr-un graf cu n noduri, oricare ar fi nodul Xk , gradul sau este rnai mare sau
egal cu 0 ~i m ai mic sa u egal cu n-1 (O';d (xk)'; n -1).
-------------- .-----.. 1. in g raful G 4 : precizali gradul nodu lui 3 ~ i identificati nodu l cu gradul cel
mai mare, nodurile izolate si nodurile terminale.
2. in graful G 3 : identiflcati nodu rile care au gradul 2, precizati cate noduri
au gradul impar si care este nodul cu gradul eel mai mare.
3. in graful G s: precizat i grad ul nodulu i 3, identificati nodurile izolate si nodurile term inale ,
precizati cate noduri au grad ul 2 ~i cate noduri au gradu l impar.
Teorerna 2
Daca gra ful G are m rnu chl i (Ul, U2, ... , um) ~i n noduri (x-, X2, .. . , Xo ) , atunci in tre gradul
nodu rilc r si numarul de muchii exista urrnatoarea relatie: suma gra dalor tuturor noduriJ or
grafului este cgala cu dublul numarului de muchii:
i: d( 'J ~ 2 m
;,- 1
Dem on stratie. Fiecare muchie Uk = [xj, Xi] coresounde unei unitati din gradul nodului Xi ~i unei unita\i
din gradul nodului Xj . Rezulta ca fiecare muchie contribute cu 2 unitati la sum a gradelor.
Exemplu . in gratul G 4 : d(1) + d(2) + d(3) + d(4) + d(5) + d(6) + d(7) + d(8) + d(9) + d(10) +
d(l l ) = 2+2+3+2+4+1+2+ 1+1+0+0 = 18 = 2x9 = 2xm
... Propozltla 1. Pentru orice graf G , nurnaru l nodu rilor de grad impar es te par.
Demon st ratie. Suma gradeJor nodurilor fiind un numar par, aceast a surna trebuie sa contina un
numar par de termeni care sunt numere impare.
Exemplu . in graful G 3 exista 4 noduri cu grad impar (3, 6 , 8 ~i 9).
164 Imp lcmcntarca st r ucturilor d c da tc
Propozitia 2. Numarul minim de much ii, rnm tn, pe care trebuie sa Ie aiba un graf neorien tat,
cu n noduri, ca sa nu existe noduri izola te, este:
III "'''' =[ II ; I]
Dernon stratl e. Pentru ca un nod X j sa sa
nu fie izolat , trebuie ca d(X r);:::.1. Pentru ca toate noduri le nu
fie izolate, trebuie ca suma gradelor sa fie mai mare sau egala cu n . Dar, suma gradelor este dub lul
nurnarului de muchii - m . Insearnna ca , pentru n par - mmin=n/2 , jar pentru n impar - m min=(n+1 )/2 .
Teorema 3
Daca gralul G are n nod uri (na), atunci eel putin doua noduri au acetasi grad.
Dernonstratte - prin reducere la absurd. Presupunem cit nu este adevarat. Cum, oricare ar fi nodul
xe. O ~d( xk)~ n -1 , ln searnna eel sinqurul sir de n numere, diferite intre ele doua cate c oua. care pot
reprezenta gradele unghiurilor este 0, 1, 2, ... , n-l . Deoarece un nod es te lzotat, eel ma i mare grad al
unu i nod nu poate fi decat n-2 (nodul nu se poate lega de el Insusi s! de nodul izolat). Rezulta ca sirul
de numere definit mai sus (singurul ~ir care se poate defin i) nu poate reprezenta sirul gradelor in graf.
Cond itllle necesare ca un ~ir de n numere intregi pozitive (d" d" ..., dol
sa fie un sir grafic sunt:
(1) d,,; n-r , penlru once i=1,n;
(2) suma d, + d, + ... + do trebu ie sa fie un numar par.
Demo nstratle. Neces itatea ccn ditiei (1) rezutta din faptul ca grad ul ma xim al unui nod dintr-un graf cu
n noduri poate fi n -t . Necesitatea conditie i (2) rezulta din Teo rema 2 - suma gradelor fiind ega la cu
dub lul numa rului de rnuch!i, este un nurnar par .
2.7.3.1. Terminologie
~ Elementele rnultirnii U (perechile de nodur i) se nume sc arce. Mul\imea U se mai nurnes-
te ~i rnultirnea arcel or gratului G. Un arc, fiind un element din multirn ea U, este
determinat de 0 submultirne ordonata, cu doua elemente, din multimea X: arcul k al
gratului (Uk), ce uneste nodurile x; ~ i Xi ' este determinat de subrnultimea {x;,x,} ~i se
noteaza cu [x ;, xi] ' [ x;, xi] ~i [Xi, Xi] nu roprezinta ace las i arc aJ g rafulu i. Gratul G are
m aree:
nu m aru l de arce = ca rd( U) = m
-7 Se numesc n oduri adia ccntc in graful G oricare din perechile de noduri care tormeaza
un arc - (X"X,) EU sau (xj,x,)e U. Fiecare dintre cele doua noduri (x, si xi) este nod
inc ide nt cu arcul U k = [ Xii Xj] sau cu arcul U k =[ Xj , X i].
-7 Nodurile Xi si Xj sunt ex trem itati le arcului [ Xi, Xj]. Nodul X i este extrcrnitatea initial a a
arcului, iar nodul Xj este extremitatea finala a arcului .
~ Se numesc arce incidcnte co ua arce u, ~i Uj care au 0 extremitate com uns - nodul Xk.
~ Se num este suc cesor al nodului Xi orice nod la care ajunge un arc care iese din nodul
Xi. MUI~ime a succcsorilor nodului Xi este fermata din rnultirne a nodurilor la care ajung
arcele care ies din nodul Xi. Se noteaza cu S ( Xj) si se defineste ca multirnea:
I
S(x) = {Xi EX (X;, xj)e U}
~ Se nurneste prcdcccsor al nodului Xi orice nod de la care intra un arc in nodul Xi
Mul1imea predecesor ilor nodului Xi este fermata din multimea nodurilor de la care
ajung arcele care intra in nodul Xi . Se noteaz a CU P(' si S 8 defineste ca m uttimea:
P(x) = { Xi e X I (xj, x;)e U)
166 IlIIplclllcntarca st r nct ur ilor dc datc
-7 Mul~irnea arce lor care ies din nodul Xi S8 noteaz a CU U+(X i) ~j S8 de fine ste ca rnultimea
U+(x,) = {u=(x,. Xj) IUEU} .
-7 Multimea arcelor care intra in nodul x, S8 noteaza cu U -(X i) !?i S8 define ste ca rnutti-
I
mea U"(x ,) = {u=(x;. x,) UEU}
-7 Nodul sursa a l grafului este nodul care are rnultimea succesorilo r fermata din toate
celelalte noduri, mai putin el, jar mu ltimea predecesorilor sai este mul timea vida.
-7 Nodul destinatie al gralu lui este nodul care are multimea predeceso rilor fermata din
toate celelalte noduri, mai putin el, iar rnultimea succesorilor sai este rnultirne a vida.
Observatii
1. card(S(x))=card(U+( x)) ~i card(P (x ))=card(U"(x))
2. Pentru nodul sursa al qrafului card(S (x))=c ard(X).1 ~i card( P(x ))=O.
3. Pentru nodul destinatie al gralului card( P(x))=ca rd (X)- 1 ~i car d (S( x))=O.
4. Daca un graf are un nod sursa , atunei nu poate ave a un nod destinatie, ~i inve rs.
Un g raf o rientat G es te d efinit de 0 per eche de rnulti m i : rnultim ea nodurilor sal e - X
~j m ultlmea a rcelo r sa le - U . EI p o ate fi co ns ide ra t ca 0 multirn e d e noduri din ca re
un el e pot fi unite doua ca te dou a, p ri n unul sa u d ou a arce .
G raful orientat se rep rezinta in plan prin intermed iul unor elemente geometrice: nodurile
se reprezinta prin ce rcuri, ia r arcel e prin linii drepte care unesc a numite cercuri si care a u 0
saqsata la ca patul ca re core spunde extrernitatii finale a arcului.
0 "'- Nodul x i al g rafu l u i G
~ Arc ul uk=[xi,X j] al g ra ru l u i G
Exemplu : ~2
:;> t; , in graiul G, =(X" U, ) - din figur a 5: 5
-7 Ordinul grafului este 5.
-7 Gral ul are 5 nod uri (n=5) si rnultim ea nodurilor este X, ={ 1,2,3,4,5} . 3 4
-7 Gralul are 7 arce (m=7) si multirnea arce lo r este U, ={[1 ,2], [1,4 J, Fig 5
{2,3J, [4,1], [4,3], [5,2], [5,31}. .
-7 Nod ul 1 este nod ad iacent cu noduri le 2 si 4, iar nodul 3 este adiacent cu nodurile 2, 4
~i 5. Nodurile 3 si 4 sunt adiacente deoarece perechea de noduri [4 ,3JEU, . Nodurile 5 ~ i
4 nu sun t adiacente, deoa rece nici una dintre perech ile de noduri [4,5J si [5,4] ~ U, .
-7 Nodul 4 este nod in cident cu arcele [1,4], [4,1J ~i [4,3]. dar nu este incident cu arcul [1,2].
-7 Nodul 2 este ex t re m itatea initial a a arcului [2,3J ~i ex tr em ita tea fln al a a arculu i [1,2Jsi
[5,2J.
-7 Arcele [1 ,2J ~ i [5 .2] sunt ar ce in cide nte deoarece au un nod comun (nodul 2). Arce le
[1,4J ~i [2,3] nu sunt arce incidente, deoarece nu au un nod comun.
-7 Multim ea s uccesori lo r nodu lui 1 este fermata din noduri le 2 si 4. Nodul 2 este no d
s uccosor al nodului 1, dar si al nodului 5. Nodul 1 este nod succesor al nodu lui 4, dar ~i
nodul4 este nod succesor al nodului 1. Nodu l 3 nu are succesori.
-7 Mul!im ea pred eces oril or nodului 3 este fermata din nodurile 2, 4 si 5. Nodul 2 este
nod pred ecesor al nodului 3. Nodul 1 este nod predecesor al nodului 4 , dar si nodul 4
este nod pred ecesor al nodului 1. Nodul 5 nu are prede cesori .
Inform a ti ca 167
Tcorema 4
Daca graful oriental G are fI noduri (X" X2, "', xo), atunci nu rnarut total de grafllri
orientate care se pot fanna ell acoste noduri osto g:
.~~I':'U
g ='" 2
Nodul unui graf orientat este caracterizat prin grad ul intern ~i gra du l ex te rn .
Gradul intern al unui nod Xi al grafului G este egal eu nurnarul arcelor care intra in nodul
x, (arce de forma [x" x,)) ~i se noteaza cu d(x).
Gradul extern al unui nod Xi al grafului G este ega I cu nurna rul arcelor care ies din nod ul
x, (arce de forma [ Xi, Xj)) ~i se noteaz a Cll d+(x).
Tcrrninologie :
-7 Se nurneste nod terminal un nod care are surna gradelo r eqala cu 1 (gradul intern sau
gradul extern ega l cu 1 ~i gradul extern , respectiv gradul intern, ega l eu 0 - d+(x,) = 1 ~i
d'( x,) = 0 sau d"(x,) = 1 si d+(x,j = 0). Nodul terminal este incident cu un singu r arc.
-7 Se nurneste nod izolat un nod care are surna gradelor eqala eu 0 (gradul intern si
gradul extern egal e eu 0 - d+(x,) = d'( x,) = 0). Nodul izolat nu este adiacent cu niei un
alt nod al grafului, adica nu se g as e ~t e la extremitatea niciunui arc.
Observ atii:
+ ' . •
1. d (x)=ea rd( S(x)) ~ I d (x) =c ard( P{x)).
2. Daca graful are n noduri , pentru un nod sursa al grafului d+(x)=n-1 ~i d"{x)=O, iar
pentru un nod destinatie al grafului d-(x)=n -1 ~i d+(x) =O.
168 l mplemcnta r ca structuri lor de d a te
Exemplul 1: 5
Gra!ul G , 0 =(X lO,U lO ) din figura 7 este definit astfel:
X lO={ 1,2,3,4,5,6,7,8,9, 1OJ
UlO={[ l,2] , [1,4]. [2,1], [2,3], [2,5]. [2,6], [2,7]. [4,l J,
[7,2], [8,9), [9,8] j .
in gra!ul G lO :
-') Gradu l intern al nodului 2 este 2, deoarece are 2 arce
care intra: [1,2J ~ i [7,2]. Grad ul ext ern al nodului 2 este 4, deoarece are 4 arce care ies:
[2,1J, (2,3], [2,5] ~ i (2,7].
-') Nodul 5 este nod terminal deoarece are suma gradel or eqala cu 1 (gradul intern este 1
~i gradul extern este 0) ~ i un singur arc incident: [2,5]).
-7 Nodul 10 este nod lzo tat , deoarece are gradul 0 (niciun arc incident).
Exemplul2 :
(." Fie graful Gl1=(X ll ,U l1), unde X ll={ l ,2,3,4,5,6,7,8) si Ull={[l ,2J, (1,5]. [2,1], [2 ,3], [2,5],
[3,4], [3,5], [4,3]. [4,5J , [4,6], [4,7], [5,4]). Din lista arcelo r unui graf orientat, puteti preciza
urma toarele inforrnatii:
-7 Gradu l ex tern al unui nod - numarand de cate ori apare eticheta nodului in Iista de
arce, ca prim elemen t din perec he. Nodul 3 are gradul extern 2 (in rnultirnea arcelor,
eliche ta 3 apare de 2 ori ca prim elem ent: (3,4J ~i (3,5]).
-') Gradul intern al unui nod - nurnarand de cate ori apare eticheta nodului in lista de
arce, ca al doilea element din pereche . Nodul 5 are gradul 4 (i n multirn ea arcelor,
eticheta 5 apare de 4 ori ca al doilea element: (l ,5J , [2,5), (3,5J ~ i (4,5]) .
-7 Mul~ im ea succesorilor un ui nod este fermata din nodurile a carer etich eta apare ca al
doilea element i n perechile i n care primul element este nodul preciza!. Mul\imea
succeso rilor nodului ± este p , 5, 6, 7) .- arcele: [1,3]. [1 ,5], [1,6] si [1,7].
--7 M u l~imea pre dccc so rilor unui nod este fermat a din nodurile a carer eticheta apare ca
prim elem ent in pe rechile in care al doilea ele me nt e ste nodu l precizat. M ulttrnea
predec esorilor nodu!ui ;). este {2, 4) - arcele: [2,;).] si [4 ,;).J.
Exe mplu l3
C " Fie gra!urile G 12 =(X 12 ,U12), unde X 2={1,2.3,4} si U' 2={[l ,2], [1,3], [l,4J (2,3J, [3,4J, (4 ,3]), ~i
G13 =(X 13,U"j, unde X13={1,2,3,4) ' ~i U13={[2,1]. [2,3J, (3,1], [3,4J, [4,lJ, [4,3]). Din lista
r: IJ muchiilorunui graf, puteti preciza urmatoare le informatii:
-') Nodul s urs a al unui gra! apare pe primul lac din pereche de n -t ori - ~i niciodata pe
locul al doilea. i n gra!ul G 12 , nodul 1 este nod sursa. Desenati gra!ul G 2 pen tru a
veri fica ace asta afirrnatie .
'
-') Nodu l destinati e al unui gra! apare pe al doilea lac din pereche de n-l ori - si niciodata
pe primul lac. In gra!ul G 13 , nodul 1 este nod destinatie. Oesenati gra!ul G13 pentru a
verifica aceasta afirm atie .
Observatie l ntr-un gra! cu n noduri, oricare ar fi nodul Xk, oricar e dintre gradele sale este
mai rnaresau egal cu 0 ~i mai mic sau egal cu n -1 (O,;d+(xk) s n -t ~i O,;d -(xk) s n-t ).
1, In graful Gg - preciza ti gradul intern ~i gradu l extern ale nodul ui 5,
identificati nodul cu gradul extern eel rnai mare si nodunle cu gradul
intern eel rnai rnic.
2. in graful G lO - identificati nodurile care au gradul intern 1, precizati cate noduri au gra dul
intern egal cu gradut extern, care sunt nodurile terminale ~i care sunt nodurile izolate.
Info rm atica 169
3, i n gralu l G l l - preciza ti gradu l intern si gradul extern ale nodulu i 4, ldenti flcati nodurile
izolate ~ i nodurile terminate, identificati nodurile care au gradul extern maxim ~i nodurile
care au grad ul intern ega l cu gradul extern .
Tcororna 5
Daca gralul orienta t G are m ar ce (u, . U2, .... Um) ~ i n no duri (x-, X2..... Xo) . atunci i ntre
gradele nodurilor ~ i nurnarul de muchii exista urma toarea relatie: suma gradelor interne
ale tuturor noduriJor este egala cu suma gradelor exteme ale tuturor nodurilor ~i cu
numarui de arco :
II II
L d +( \j)= L d -( \ i)= m
j,.,1 j"' l
Demons tratl e. Fiecare arc Uk ;; [Xi. Xj] corespu nde unei un ttati din gradul extern al nodului Xi ~ j unei
unitali din gradul intern al nodului Xj_ Rezulta ca fiecare arc contribuie eu 0 unitate la suma gradelor
interne ~j eu 0 unitale la suma gradelor externe.
=
Exem p lu. i n gralul G g : d+(1 ) + d+(2) + d+(3) + d+(4) + d+(5) + d+(6) 1+3 +1+2+2+ 1 =10 si
d' (1) + d' (2) + d' (3) + d' (4) + d'(5) + d' (6) = 1+2+ 2+2+2+1 = 10, m fiind ega l cu 10
-------- ~ In graful G 11 verificati ca este Indeplinita relatia dintre gradurile nodurilor
~ si nurna rul de arce ale grafului .
I. dad Ii, il E U
a j,J = { o.Jacali."j Jrl U
Implementarea qraf ului prin matricea de adiacent a se face printr-un tablou bidimensional
(0 matrice patrata cu dimens iunea n), asttet:
i nt a «r:>]l< :1> ] ;
170 Implemcutarca structurrln r de datc ;
Exempl e:
Graful ncorientat G 1
2 3 4 5 - 6- 7 8 G ra fu l oriental Gg
-,-::,- --~-
1 0 1 1 1 0 0 0 0 1 - '-_
--'-" 2 . 3 4 5 6
2 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0
3 1 1 0 1 1 0 0 0 2 1 0 1 1 0 0
4 1 0 1 0 0 0 0 0 3 0 0 0 0 1 0
5 0 1 1 0 0 0 0 0 4 0 1 0 0 1 0
6 .s. 0 .z, .,Jl._ 0 0 1 - 1,-- 5 0 0 1 0 0 1
0
7 0 0 0 0 -~ 1 0 .s, 6 0 0 0 0 1
8 0 0 0 0 0 1 0 0
Proprietati le matricei de adiacenta :
1. Ele mentele de pe dia go nala pr incip als au val oa rea 0 - din definitia grafului re zulta ca
oriee muehie (arc) [i. j) trebuie sa respeete conditi a i,.j .
2. i n cazul unui g ra f n eorientat , matricea de adiac erita este 0 m atri c e s irne t ric a fata de
diagonala principa ta. deoarece , dac a exista rnuchia [i , j] , atu nci exis ta ~i muchia U, i].
Accas ta r e prez entare es te recorn and ata p en t r u probl em ele in c are se tc stc aza pre -
zenta u n c i m u c hii sa u a unui ar c in tre d ou a n o duri , se ca lcu loa z a gradul unui n od
etc . - deoa rece pe r mi te un ac c es r apid la n odu r i le s i m u chi i le (arc ele) unui graf.
~
Exemplu
Se considera graful din FIgura alaturata . ldentificati matricea de adiace nta a
gratului
a) 0 1 1 1 b) 0 1 1 1 c) 0 1 1 1 dI 0 1 0 1
1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0
1 1 0 1 1 1 0 1 1 1 0 0 0 1 0 1
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
(Bacalaureat - Sesiunea specia ls 2003)
Raspunsul coreet este matricea a). Pentru a identifica mat ricea de adiacenta a grafului din
fiqura , S8 vor elimina pe rand variantele incorecte, prin verifica rea urrnatoa relor conditii:
1. Matricea trebuie sa fie binara - toate matriceJe indeplinesc aceas ta con ditie ;
2. Elemen tele de pe diagonala principala trebuie sa aiba v aloarea 0 - matricea b) nu
Indeplineste ace asta conditie .
3. Deoarece graful este neorient at, matricea trebuie sa fie s irnetr ic a - matricea c) nu
lndeplineste acea sta conditie
4. Din analiza grafu lui S8 observa ca doua noduri au gradul 2 si dou a nodu ri au gradu l
3; in matricea de adiacenta treb uie sa existe dou a linii care sa contina doua ele-
mente cu valoarea 1 $i doua linii care sa cantina trei element e cu valoarea 1 -
matricea d) nu ind epllnes te aceasta conditie.
1. Scrieti matric ea de adiacen ta a gratului G4 . Folosin d informatiile din
matrice a de adiacenta , deterrninati: gradul noduJui 5, nodu rile izolate
si nodu rile terminale .
2. Scrieti matricea de adiacenta a gratului neorientat G14=(X ,4,U 14 ), unde X 14={1 ,2,3,4} si
U 14 ={[1,2]. [2,3], [3,4], [4,1]). Ce prop rietate are acest qraf?
3. Scrieti matricea de adia centa a grafului Ga. Folosind inforrnatiile din matricea de adia-
centa, deterrninati: gradul intern al nodului 5, gradul extern al nodului 4, succe sorii si
predecesorii nodului 2 ~i predecesorii nodului 3.
4. Scrieti matricea de adiacenta a grafului G 11. Folosind intorrnatiile din matricea de
adiacenta, deterrninati: gradul intern al nodului 5, gradul extern al nodului 2, nodurile
adiacente nodului 5, succesorii ~ i predecesorii nodului 4,
5.
nodurile terminale ~j nodurile izolate.
Scrieti matricea de adiace nta a qrafului orientat G1 5 din
@ ®
figura 8.
6. Scrieti matricea de adiac enta a grafului G 12. Cum iden- :05
tificati in matricea de adiacenta nodul sursa al grafului?
7. Scrie ti matr icea de adiacenta a gratului G 13. Cum Fig. 8
identificati i n matricea de adiacenta nodul destinatie al grafu lui?
Implcmentarea algoritmilor pcntru reprczentarea grafurilor cu matricca de adiacenta
1. Crearea matricei de adlaconta prin introducerea dateler d e la tastatura , Det er-
minarea gradului unui ned. Salv area matricei de adiaconta intr-un fisier te xt.
Se citesc de la tastatura muchiile (arcele) unui graf orientat (neo rientat) , se creeaza matri-
cea de adiacent a a grafului, se aflseaza nodu rile izolate $i terminale $i se salveaza matri-
cea de adiace nta in fisierul text grall.txt, pentr u gratul neorientat, si graI2.txt , pentru gratul
orientat. In fisierul text se scriu, pe primu! rand, ordinul grafului, si pe urrnato arele randuri,
li /matrtcei de adiacen ta. Functia sc rie () se foloseste pentru a scrie matricea de
172 Implcm eutu re n st ru ct u r ilor d e da te
adiacenta in fisier. Deoarece matricea de adiacenta a lost dectarata ca va riabila ql oba la,
elerne nte le ei sunl initlatlzate cu valoarea O. Pentru testarea programelor se lolosesc
gralul neorienlat G, ;;i gralu l orientat G, .
Gralul neorienlat Functia grad () se 10105e;;te pentru a determina gradul unui nod.
#include <= s L r e a m . ~ >
int a[10J [10J , n, :C.;
fstr eam f( "grafl .t xt " , i o s : . ou ti j ,
v oid .sc r i e t )
t i n t i ,j ; f «n« e n d l ;
f o r {i = l; i < = n; i + T )
(for ( j - l ; j <- n ; j+ + ) f« a [ i ] rj J« " " . f « e nd 1 ; )
f. close () ; }
int q r a dt Ln t; i)
lint j ,g-O ;
f or {j =1;j<=n ;j++) g+ =a[i] [jl ; retu rn g i l
v oid main ()
t i n t i ,j ,k ;
cou t .ccv nu.m ar de nodur i " ; cdrco-n , c c u t-oc't numa.r de muchii II. c in» r1;
f o r \ ~ = l; % < =m ; k T T )
{c ou t -cc vp r LmuI ned e L much i.e I "« k«"; " ; c i n» i ;
cou t .c-c va L do i.Lea nod e L mucn i e i " <ck-cc v: "; c i n» j ;
al i ] [j ]~ l ; a[JJ [ij-1')
o ou ti-oC'N o d u rLl e .i z o La t e sun t: " ;
f o r (i=l ; i<=n ; i-t-+) i f [q r ad (i) ==0) c o u t .c-c i .c-c " ".
c ou t« e nd l « " Nod u r i l e t e r mi n a l e su nt : It ;
f or {i = l; i <=n ; i ++ ) if (grad(il==l) cout« i « " II .
sc rie{) ; }
Graful orlontat Functia g rad_ i n t () se foloseste pentru a determi na gradul intern al unui
nod, iar functia grad_ e xt () S8 foloseste pentru a determina gradul extern al unui nod.
# i nc l ude <f s t r-cer-. . h>
i n t a [101 [10 ] , n ,!n ;
fs t r e a m f ( " g :,- u f 2 . L: t", i o s : :ou t ) i
v oid sc r ie{) { l i e s : €' Lderrt i c a cu cea de La q r a f u I neor-Len t e t j
i n t qrad ext{ i n t i)
{ J.n t j ,g ~Q ;
f or ( j = l ; : <= n i j -t l ) g't=a:i] l j l : r eturn g i }
in t g rad_int( i n t i)
t i n t j ,-:j=O;
f or {j = l ; j < = n i j + +} g + =a[j] [i] ; re turn g i }
v oid main ()
ti n t i , j , :: ;
c o u t .c-C'riume r de nodu r.i " ; cin » :1; c ou t -ccvn umar de arce "; cin» rn;
fo r (k=::' ; k<=rn ; kH-}
{co u t.c-cv nodu I. initial a L a r cu Lu i, " < x k -oc '" : " ,' c i n » i ;
cout« " n o d u 1 final a1 ar c u l u i " « k« " : " ; ci n» j; al i ] [ j]=l ; }
co u t.c -C'No d u rLl e Lzo La t e sun t : " ;
for (i= l; i <,....n,· i t·+ ) i f (g r ad_int ( i. ) +g r a d_e x t (i) =:-::0 ) c out-oc k-cc'' " ;
c out«endl «" Nod u r i l e t e r mi n a l e ,sunt : " i
f or ( i = l; i < = n i i +-+ ) i f (g rad int.(i)+g r a d _e xt(i)==l) ccu t -c-c j.c-c '' ";
serie () ; }
[II fo rm aticii 173
2. Cr earea matricci de ad iacenta prin citi rea datelor din fisie r. Determina rea n urna-
rului de vecin i ai un ui nod. Afisarea m uc hii ior (arc elor] graf ului.
Se citesc din fisierele text create anterior rnatncele de adiacenta ale celor doua qrafuri -
graft .txt, respectiv graf2.txt. Se afiseaza nodurile care au cei rnai multi vecini (cele mai multe
noduri adiacent e). Se determine numarul de muchii (arce) ale gralului ~ i se afiseaza much iile
(arcele). Functia ci tes te () se foloseste pentru a citi matricea de adiacenta din fisier,
Grafu! neorientat Functia n r _ m() S8 foloseste pentru a determ ina nurnarul de muchii ale
grafului. La afisarea muchi ilor, pentru a nu S8 aflsa de ooua ori aceeas i muchie , S8
parcurge matricea de adiacanta numai cteasupra diagonalei principale.
#include <r s t r e a m. h >
int a[lC) [lO],:> ;
fstr e a m f( ' ·g~a~l .txL ' · , i o s : ; i n! ;
v oid c i t.e s t e t )
lint i ,j ; f »:i. ;
for ( i = l; i < ~ n; i + + )
. _ { L JaCfI 1i. .i JE lJ
.I ' , J - O. Jac" li. .i I ~ U
Implemenl area grafului neorienla l prin malr icea de incid enta se face printr-un tablau
bidimensional (0 mal rice cu dimensi unea n xrn ), astfel:
int a l cn> ] [ <m> ] ;
Graful ncoricntat G 1
,;fD 1
1
1
2
1
34
1 0
5
0
6
0
7
0
8
0
9
0
~ 2
3
1
0
0
1
0
0
1
1
1
0
0
1
0
1
0
0
0
0
Grafu l G, 4 0 0 1 0 0 1 0 0 0
Fig .9 5 0 0 0 0 1 0 1 0 0
6
Proprletatile matricci de lncidonta a 7 ~ 0 0 0 0 0 0 1 1
grafului neorientat:
0 0 .s, 0 0 0 0 1 .s,
0 0 0 0 0 10 0 0
1. Pe fiecare coloana exista doua ele- 8
mente cu valoarea 1 (pe liniile i ~i j care corespund nodurilor incidente cu much ia), iar
restul elementelor au valoarea O.
176 lmplcm entarca st r uct u r ilor de d a te
2. Matrieea de incidenta are 2xm etement e egale eu 1, deoareee fieeare muehie este
incidenta cu doua nodur i.
Matricca de incidenta a unui graf orientat este 0 matrice cu n linii §oi m caloane
(A n,m), ale carei c leme nte au s unt definite as tfe l:
1' dac a nodul i este extremitat ea final a a arcului j
a i, J = -1 , dac a nodul j este extremitat ea in il ni~i a arcului j
{
0, dac a nodul i nu este extremitat e a arc ulu i j
Implementarea cu matrice
o 1
1 1 2
2 1 3
3 1 4
Graful neorientat G 1
4 2 3
5 2 4
Implementarea cu vector de lnroqlstrari
6 3 4
Muchi ile
7 3 5
~ - -- - - - - - ---"------ - - - - - -
8 6 7
9 6 8
lmplementarea cu matrice
o 1
1 ......!.... 2
2 2 1
2 ..!-
3 -".-
Graful orientat G,
4 _.-
3 ..2~-
5 3 5
Im pJeme nta rea cu vector de inregistrari
6 4 2
Arcole
7 4 5
8 5 3
- ~ -
9 5 6
10 6 5
Exemple :
Daca implementarea se face folosind matricea, atunci pentru oriee muchie (arc) i, u [i ] ( 0 ]
":f:. u [i] [1] . Oaca implementarea se face folosind vectorul de lnreqistrari, atunci pentru
oriee muchie (arc) i,u [i ] . x" u [ i ] .y .
Acea sta re prezentare este recomandata pentru problemele in care se face
prelucrarea succesiva a m uchiilor (arcelor). Are avantajul ca permite adauqarea la
tipul de data muchie ~i a altar cam pur; (Iungime, cost, timp etc.), corespunzator
unor ma rimi care pot fi asoc iate muchiilor (arce lor).
184 Implcmenturea st r uct u r ilnr de da le
Algorilmi p enlru reprez enlarea grafuri lor f ol o sind li sta much iilor
Din lista muchiilor puteti obtine urrnatoarele informat ii:
Graf neorienta t Graf orie nta l
Gradul unui nod i este egal , in funct ie de Gradu l extern al nodului i este egal, in functie
implementare, cu num a rul de apa ri tli al e de implernentare. cu numaru l de aparit f ale eti-
et lch et cl no d ului in matrice. respectiv in a
c hetel nod ului i n coloana a matricei. respec-
carnpurile vectorul ui de tnreqist rari . tiv in pnmul camp , in vectoru l de lnreqistrari.
Grad ul in tern al nodu lu i i este ega l, in functie
de tmptementare, eu nurn aru l de apa ritf ale eti-
chetci nodu lui in coloana 1 a matricei. respec-
tiv i n al doilea cam e. in vectorul de inre ci strari.
Nc d urile adiacc ntc nod ulu i j sunt , in functie Succesorii nodului i sunt, in funcl ie de
de implernen tare. etiehele le j din coloan a 1, implementare, euchetete j di n coloana 1 pentru
pentru care u[k][O] =i , sau din coloana 0, pentru care u[k][O]=i, respectiv etichetele j din carnpui
care u[k][1]=i, respectiv etich etele j din carnpul (I{k] y pentru care u[k].x=i (k=l ,m).
u[kj.y, pe ntru care u [k] .x=i , sau din campul Prcdecesorii nodu lui i sunt , i n functie de
u{k]x. pentru care u[k] .y=i (k=1.m). implementare. etichetele j din colo ana 0 pentru
care u[k][1 ] =i , respectiv etichetele j din carnpul
(I{k]x pentru care u[k].y=i (k=l, m).
Nodu ri lc adiaccntc nodului j sunt date de
reuniunea dintre multirnea succesorilor ~i
multi mea predece sorilor nodului.
Nurna ru l de vccin i ai nodulu i i este egal eu Num aru! de vecini ai nod ului i este ega l eu
gradul nodului. cardinalul rnultimi i de nodur i adiaeente nodului l.
Nod uril e L1 L2 L3 L4 Ls L, L7 L,
A
...
8 2 3 4 1 3 5 I1 2 4 5
26 10 11 0 13 14 0 16 17 18 0
8 9 10 11 12 13 14 15 16 17 18
~ ~
--------
Ind icii colo ane lo r
Grafu l orienlal G,
Noduri le L1 L2 L3 L4 Ls L,
A
r , ,--L, ~
1 2 3 4 5 6 2 1 3 4 5 2 5 3 6 8
7 8 11 12 14 16 0 9 10 0 0 20 0 22 0 0
1 2 3 4 5 6 7 9 10 11 12 13 14 15 16
--
8
-.,..--
----
Ind icii co loan clor
B . Vectorii Iistei de adiacenta: un ve cto r L cu dirnensiunea m x2 , pen tru gratul neorien-
tat, respectiv cu dimensiunea rn, pentru gratul orienta t, care conti ne listele de adia-
cen ta ale fiec arui nod, si un ve ctor cap , cu dime nsiunea n . care contine indicii de la
care incepe lista vecinilor fiecarui nod in vec torul L. Indicii din vecto rul cap corespu nd
etichetelor nod urilor . Ce i doi vectori sunt defini ti ast fel:
a) pen tru gratu l neorientat: int cap [ ':'"1> j , L (2 "'<:n> J ;
b) pentru graful orientat: in t c ap ~ <ri> J , L [<m> 1 ;
lntorrnutic a 189
7 8
L3
Graful orientat G,
1 234 S 6
cap C-1 J 2 SI 1=U 8 [JQ
1
»> 2
4 3 S 6
J /
7 8 9
I 10
\
L n1 1 [ 3] 4 ] 5_U TIT iJ 6 Ls I
'-y-l '----y---I '-y-l '-------y--J '-------y--J '-y-l
L1 L2 L3 L4 L5 L6
Observatie . Fiecare lista de vecin i Lr, contine indicii coloanelor j in ca re S8 gasesc valori
de 1 in matricea de adiacenta (a [ i] [j] ~ 1 ) .
lrnplernentarea dlnarnica
Lista de adicenta a fiecarui nod S8 memoreaz3 intr-o lista simplu in!antulta, ale carei ele-
mente sunt de tip nod (informatia utila mernoreaza eticheta unui nod din iista), iar adresa
primului elem ent din fiecare lista S8 memoreaza intr-un vector L care are lungime a lcqica
egala cu nurnarul de nodu ri n si ale carui eleme nte sunt de tip pointe r catre tipul nod:
stru c t n o d {int i n f o;
Ho d * u.em ; } ;
n od *L [< n >] ;
2
1
_I .~1 41fj
2
5
3
4 ~s ic1
5
-t--·f:II~--ITJI.O Gr aful orientat G,
5
6
190 Im pleme nt a rea str uetur ilor de date
L
2
1
1
2
1
3
1
4
2
5 G ratul neorientat G 1
7 8
6
Acoasta reprezen tare este recornandata pentru grafurile care au un nurnar mare de
noduri ~i un nurnar mic de muchi i.
Din lista de adiacenta imptomontata static eu doi vectori puteti obtine urrnatoarele intormatii:
Graf ncorientat Graf oriontat
Lu ng im ca listei d e adiacenta a nod ului i L un gimc a li st ci de adiacenta a nodului ;
neizolat. cu eticheta ma i mica decat n, este neizolat. cu eticheta ma i mica decat n. se
egala cu difere nta dintre primu1indice j U=i+1,n-1) calcule aza la fel ca ~ i in cazu1grafului
diferit de 0, din veeto rul cap (cap[jl;tO), ~ i neo rientat . Pentru nodul n . lungimea listei de
indice le elemen tului de la care in cep e lista de adia cent a este egala eu (m +1 • ca p[n] ).
adiac enta a nodului i (capO] - cap[i] ). Pentr u Gr adu l extern al nodu tui I este ega l eu
nod ul n, lungimea listei de ad iace nta est e ega li3 lun gimea li stei de aot ac on ta a nodulu i.
eu diferenta dintre nurn arul tota l de elemente Grad ul int ern at nod ului r este ega l eu
ale vectorul L, plus 1, ~i indicele elementului din num arul de apa ritii ale et iche te i nod ului in
care ineepe lista de aoiacenta a nodului n vsctoullistei l (l UJ=;, cu j=1 .m).
(2xm +1 - cap [n]) .
Din lista de adiacenta irnp lernentata d inamic putet i obtine urrnatoarele inforrnatii;
1. Scr ieti lista de adiacenta (Iolosind eele trei me tode de imp lemenlare) a
grafulu i neorientat G4 . Folosind lnforrna tiile din lista de adiacenta,
deterrninati: gradul nodului 5, nodur ile izolate si nodurile terminale.
2. Scrieti lisl a de adiac enta a grafului orientat G ,4.
Se vor folosi eele Ire i melo de de
implementare. Ce prop rietate are aeest graf?
3. Scrieti lista de adiacenta a qrafului orientat G8 (foloslnd eele trei meto de de impleme n-
tare). Folosind lntorrnatiile din lista de adiacenta, determinati: gradul intern al nodului 5,
gradul extern al nodulul 4. sueeesorii ~ I predeeesorii nodului 2 ~ i pred eeesorii nodului 3.
4. Scrieti lista de aoiacenta a grafu lui orientat G ll . Se vor folosi eele trei metode de imple-
mentare . Din lista de adlacenta , deterrninati: gradul intern al nodulu i 5. grad ul extern al
nodului 2 , nodurile adiacente nodului 5, succesorii si predecesorii nodului 4, nodu rile
terminale ~ i nodurile izolate. 1'ft_ "'-'
Scrieti lista de adiacenta a graiu lul orlentat G' 8 din figura 13.
Se vor folo si eele trei met ode de implementare .
6. Scri eti lisla de adiacenta a gralului G 13. Se vor folosi eele trei
melod e de im pleme ntare. Cum identificati - i n fieeare imple-
men tare a lis tei de ad iacenta - nodul sursa al grafului? Fig 13
7. Scri eti lista de ad iacent a a qrafului G". Se vor folosi eele
trei melo de de im pleme ntare. Cum identifi cati - in fieeare imp lementare a listei de
adiacenta - nodul destinatie al gral ului?
Implementarea algoritmilor pentru reprezcntarca grafurilor cu lista de adiacenta
1. Crearea listei de adiacenta in implementare statica prin citirea Iistelor de vecini
din flsi er. Determinarea gradului unui nod. Obtine rea matricei de adiacenta din
matricea Iistei de ad iac ent a,
in tr-un tisier text se gasese urrnatoarele informatii desp re un gra! neorienta t (~ i varianta
orie ntat) : pe prima linie, valorile pentru nurnar ul de noduri n !?i numarul de rnuchii m,
despa rtite orin spauu , iar pe urrnatoare le n linii, de spartite prin spatiu , nurnarul de veeini ai
unui nod si lista vecinilor (:;;i varianta nurnarul de succe sori ai unui nod si lista succesorilor).
Informatica 193
Se citesc din fisierul text aceste informatii ~ i se creeaza lista de adiacen ta irnplernentata cu
rnatrice, respectiv cv vectori. Se afiseaza nodur ile cv gradul eel mar mare (liii varianta cu
gradul extern cel mai mare ). Se obtine matricea de adiace nta din lista de adiacenta. Se
salveaza apoi matricea de adiacenta intr-un fisier text. in fisierul text S8 scriu: pe primu l
rand ordinul grafului, iar pe urmatoarele randur i - liniile matricei de adiacenta, Functia
citeste() se folose ste pentru a citi listele de adiacenta din fisier , functia g rad() pentru
a determ ina gradul (~i varianta gradul extern ) al unui nod . functia g rad_ma x ( ) pentru a
determ ina gradul ma xim ( ~ i varianta gradul extern max im) al nodurilor din graf , funct ia
transpune ( ) pentru a obtine matricea de adiacenta din lista de ad iacenta , iar func tia
scrie ( ) pentru a scrie matricea de adiacen ta in fisier . lnforrna tiile 58 citesc din fisierul text
grar13.txt, pent ru graful neorientat, ~ i qrett a.txt, pentru graful orientat, ~i se satveaza in
fisierul text grar15 .txt , pentru graful neorien tat, ~ i grar16.txt , pentru graful oriental. F i ~ i e re l e
text grar13.txt si qrett a.txt se creeaz a cu un editor de texte . Pentru testarea programelor se
folosesc graful neorientat G , ~ i graful orientat G, .
Graful neo ric ntat ~i g raful oriental _ impl cmcntarca cu matricc
#i nc l ude < f s t r e a m. h >
i nt n, m , ~[ 3 J [ 50J , a [ 1 0 J [10 J ;
//pentru graful n e o r i e r. t a t:
fstr e am £ 1 ( " qraf13 .t xt " , i o s : :in l , £ 2 ( "g r af l.') . L:{t " , i o s : :out );
// pe n t r u g r a f u l o rienta t
// f s t r e a m f l ( "gru f l lJ . t x t " , i o s : :in ) , f 2 (" g r z,. f 1 6 . t z t ",ios: :ou t );
v o id c i t.e s te ()
tint L j , x , k ; f l »n»:n ;
fo r (i = l; i < o=n; i ++ ) L[1J [ij ""i ; j =- n+l ;
for ( i = l; i <= n; i ++ )
{rI o>x ,
if ( F ~O) L [2 ] [i) = O;
e l s e { L [ 2 ] [ i]=j ;
f or ! k = l ; ~ < = x ; k~ +1 { f l» L [ l } [j]
if ( k '~ " 1
~ [ ] [j) = j + l ;
else L [ J [j; =O;
J++ ; ) ) )
::1 . close {} ; }
int g rad {i n t i )
lint g ,j=L[2 ] [i] ;
i f (1,[ 2J ( i. ; = =O) 9 =0 ;
else { g o= "2.;
while (!'[ 2j [j J ! =Ol { g ++ ; j ++ ;)}
return c; ; }
int ~!:"ad_ma;·; ()
tint i ,I;:ax=C;
f or ( i = l ; i< =n ; i+f) if iq rad\ i1 >max m a x = g ~ 2 d{i) ;
return :n2X ; l
void t r aaa pune ()
lint i ,j ;
f or (i =1 ; i< =n ; i+ + )
{ j = L [ 2 J [i} ;
if (L[ 2j [ i. ; ! = O)
{wh a Le ILl 2] [j] ~ o' O I {a l i ) [L [l ] [jJJ = l; j++ ; }
a l L] ( L[ l J )j]]= l ; )})
194 I m p lc m cnta rca st r ucru r llor de d ate
void s c r ie()
(int i ,j ; f 2« n« e nd l ;
for {i""l ; i<~n ; i ++)
{for (j = l ; j<~n ; jT +1 £ 2« a [ i ) [j ] « " " . f2 « e n d l ; )
£2 . close () ; )
void main ()
{inti; citeste () ;
cout«" Gr a d u l eel mai maTe este "« g r a d _ma x () « e n d l ;
oou t-c-C'N o d u r i.Le vc u gradul eel ma l mare s1Jnt~ : " ;
for ( i=l i i< = n; i·j· ,,,) if (g r a d (i) -o- q r ad max {} [" ccc ecc r -c-c '' ".
t r an spun e t-j • scrie() ; }
void ci tes te ( )
lint i , j =l , x , k ; fl »n »m;
for { i = l; i < ~ n ; i + + )
{ fl »x ;
if ix ~ ~O I cap[ i] = O;
else {c a p Ci ]""'];
for (k ~l;k<~x ;k H I ( fl » L [j ]; j ++ ; ) } )
f lo close () ; }
int g r a d ( i n t i )
(int g ,j ;
if ( c a p[ i J ~ ~ O ) g~ O ;
else
{if ( Lcn j { j ~ i + l;
while ( c a p [ jJ=~O &&j<= n) j++ ;
i f ( j==n+l) g=2 -A- m+l ::" c a p [ i J ;
II g =m+l -cap[ i ] ; pentr u grafu l orientat
else g ~cap[j ]-cap[iJ ;}
else g =2*m+l -cap [ il ; }
return g ; }
int grad max() ( / /este Loe n t tcc cu e ea de l a implementarea e u mar r i.ce j
void t ran s p u n e ( )
ti nt i, j;
for ( i = l ; i< =o ; i ++)
for ( j ~ O ;j<grad ( i) ; j ++ 1 a [ i] [L[c a p [ i] f j] ] ~l ; }
void scrie{) { / I e s t e .i.d en t i ca ell e ea de La i mple rnen t a r e a CD ma t r Lce }
void main() { / / e s t e iden t i c a cu o e e de la .i.mpLemen t a r'e a cu rnatrice }
2. Crearea list ei de adiace nta i n implem en tare sta tica din m atricea de adiacenta.
Salv area listel or de adiacanta intr-un fi sior.
Se citeste din fisieru l ereat anterior (grafI5.lxI, respectiv grafI6.lxl) matricea de adiacenta a
grafului ~ i se obtine din ea lista de adiacenta irnplernentata cu matrice, respectiv cu vecto ri.
Sc salveaza listele de adiacenta 1ntr-un fisier text (grafI7.lxl, respectiv grafI8.lxl) , astfel: pe
prima linie, valorile pentru nurnarul de noduri n ~i nurnarul de muchii rn, despartite prin
Inform atica 195
spatiu, iar apoi. pe urrnatoarele n Iinii, despartite prin spatiu, nurnarul de vecini ai unui nod
si lista vecinilor pentru graful neorientat , respectiv nurnarul de succesori ai unui nod si lista
succesorilor pentru graful orientat. Functia ci teste () S8 foloseste pentru a cif matricea
de adiacenta din fisier. functia transpune () pentru a obtine lista de adiacenta din
matricea de adiacenta, iar functia scrie () pentru a scrie nstere de adiacenta in fisier,
Pe nlru teslarea progra melor se lolose sc gralul neorientat G, ~i gralul oriental G9 .
Graful neorientat ~i gra fu l o riental - implemc ntarca cu m atri cc
#include < f s t r e a m. h >
in t n ,m ,L[ 3 ] [ 5 0 J, a [ l OJ [lO J ;
/Ipe nt r u gr a f u l neorientat
fs t r e am f l( " g raf 15 " , i o s : : i n ) , f 2 ( " g r a f 1 7 . t x t " , i o s : : o u t ) ;
//pentru gr a ful orie nta t
Il f s t r e a m f 1 ( "grafI6 _t xt " , i o s : : in ) , £2 ( "graf I8 . tx t " , i o s : : o ut ) ;
v o i d c i, t este ()
{int L j ; £ 1»n ;
for ( i = !; i <= n ; i T+ )
for l j ~ l; j < ~ n; j ++ ) f fl» a [ i ] [j] ; i f l a [ i ] [ j] ~ ~ l) m l + ; ) fl . c l o s e l) ;
m=m/ 2 ; } //numai pen tru graful neori entat
v oid transpune { )
{int i ,j ,k ,g ;
f o r ( i ~ l; i < ~ n ; i. t+ ) L[ lJ [ l ]~ i. ; ke-n -t I r
f or ( i = l ; i < = n ; i + ' ~ )
ffor l j~ l, g ~ O; j < ~ n; j + + )
if (a[ iJ [j]~~ l) { L [ l ] [ k] ~ j ; L [ 2 ] [ kJ ~ k - l ; k++ ; g++ ; )
if I g~ ~O) L[2] [il ~O ;
e l s e f L [ 2 ] [ iJ~ k -g ; L[2] [ k -1J~O ; ) ) )
i nt grad( i n t i ) {I / i d e n t i c a eu e e a de la ~~lerr£ntarea eu rna t r i ee }
void s c r Le ()
{in t .i ,j=l , J.: ; f2 «n« " "« m«e nd l;
f or (i= 1 ; i <=n ;i++)
if (L[2 J [i] ~ ~O) f2 «0 « e n d l ;
el se { f 2« g r a d ( i) -cc'' " ;
f or (k ~l ;k <~grad(il ; k++, j ++ ) f2 «L[ 1] [ j J«" " ;
f2 « e n d l ; ) f2 . c l o s e ( ) ; )
v oid main ()
{c i t e s t e ( ) ; tr a n s p une ( ) ; seri e() ; }
Graful ncorientat ~i g raful orientat _ im plcmcntarea cu vecto ri
#i n cl u d e <f s t r e a rn. h >
int n ,m ,L[ 50 j,cap[lO] , a[10 1 [lOJ ;
I /pcnt. r u graful neo r i e n ta t
f s t r e a m £1 ( " g ra f13 ; tx t " , i os : : i n ) , £2 ( " g ra f I S . txt " , i o s : : ou t ) ;
I/pentru graful orientat
// f s t r e a m fl ( " graf14 . t x t; " , i os : : i n ) , £2 ( "gra f16 . txt " , i o s : : au t ) ;
void cites t e ( ) (/ / e s t e roen t.t ca eu cea de 10. imp.Icrnente rea c u me t rLce l
v oid t r a n s p u n e()
{i n t i , j,k=l ,g ;
f ar ( i = l ; i <=n; i + + )
{ fo r ( j ~ l; g ~ O; j < ~ n; j ++ ) if (a[ i l [j] ~ ~l) { L j kl e j s k++ ; g++ ; )
if ( g ~ ~ O ) ca p[ i] ~O ; el se cap[ i J ~ k -g ; ) )
i n t g rud{ i n t i ) { I l i de n ~ i c a eu cea de l a L~pl~£ntarea ell vectori }
196 Imp lemcntareu st r uct u r ilor lie da te
v o id sc r i e {)
{ i n t i I j ; £2 «n. « " " <cm-cce ndf :
f or ( i = l ; i < = n ; i + ~ }
{f 2« q r a ci ( i) « " ";
f e r ( j= O; j <g r a d ( i ) ; j - + 1 f2 «L(cop[i]-j] « " ".
f Zx -c eri d L: }
f 2 .cf cs e tj r j
v oid mai n () { I / e a t e ide n t Lca e ll cea de 1a i mpleme n tar ea e ll rna t r i c e)
3. Crearea listei de adiace nta in implementare dinami ca prin citirea lis tei muchiil or
din fi sier. Determ in area veci nilor ~ i a gr ad ului unu i nod.
inlr-un fisier text se gasesc urmatoarele mformatii despre un graf neo rienta t (~i variant a
orientat) : pe prima linie, valorile pent ru nurnaru l de noduri n si nurnarul de muchii m, iar de pe
urrnatoarele m linii, cate 0 pereche de numere de spartite prin spa tiu, care reprezinta etiche-
tele nodu rilor ce tormeaza a muchie (arc). Se citesc din fisierul text aceste informatii ~i se
cree aza lista de adiacen ta implernentata dinamic. Se afiseaza vecinii ~i gradul fiecarui nod .
Functia ini to se Ioloseste pentru a initializa cu va loarea NULL eleme ntele vectorulu i L
(pointerii nodului prim al listei de adiacenta a fiecarui nod din graf) , functia adauga _ nod 0
pentru a adauqa un nod ina intea nodulu i p r im la lista simplu Inlantuita a unui nod din qraf,
functia c r ea re ( ) pentru a crea lista de adiacenta, functia g rad () pentru a determina
gradul (~ i var ianta , gradu l extern) al unui nod, functia af isa r e _ v ec i n i ( ) pe ntru a afisa
veci nii fiecarui nod, iar functia afisa r e _ g r a d () pentru a afisa grad ul fiecaru i nod. lnfor-
rnatiile se citesc din fisierul text graf11 .txt pentru graful neorientat ~i graf12.txt pentru graful
oriental. Pentru testarea progra melo r se l olosesc graful neorientat G , si graful orientat G g .
# i n cl u de < f s t r e a rIl. h>
st ru ct nod t i nt i n f o ;
nod * u r m. j ,
nod * L [ 2 0 ] ;
i n t n ,m ,'
f stream f l ( " g r afl l . t x t " , i o s : : i n ) ;
voi d init ()
{ :» n» ~; f or ( i n t :=l ; i<=r. ;i++) L[i}=NULL; }
voi d a da ug a_nod( ::1od *&p r i :n, int y)
{Lod *p =n e w nod ; p- >i nfo:o:y ; p - >u r m=pri m; pr~ rn= p ; }
v oid c r e e r e ()
t i n t Y. ,y ;
wh i le (f » x »y) ( a d a u g a _ n o d ( L [ x . , y ); a d a u g a _ l1 o d {L [ y ], x );}
f . close () ; }
v o id af~sare_vecini()
{for (i n t ~=: ;i< =n ;i -+)
{ co u t c c v v e c Ln i i. nodc Lu i. " < x L c -c '" : " ;
cou t «endl ; }}
i nt g r ati ( i n t i)
t i n t 9"'0 ;
fo r (nod * p = :" [ =-- ]; p ! =NULL; p = p ->urm) g++ ; r e t urn g ; }
vo id afis are grade(}
{fo r (i n t i = l ; i <= n; i ~+ )
cout«" Gr a d u l n o du lu i "« i« ": "« g r a d (i ) « e nd l ; )
v oi d main ()
{i n i t : l ; c r ea r e t ) , afis are_v e c ini() ; afisa r e _9ra d e{) ; }
I nformati cii 19 7
1. Scrieti un program care citeste listele de adiacenta ale gratului din
fisierul text graf I 3.txt, penlru gratul neorientat, respectiv din fisierul
grafI4.txt , pentru gratul orienlat, ~i care afiseaz a nodurile izolate.
Liste le de ad iacen ta S8 implementeaza dinamic ~i static, in cele doua var iante.
2, Scrieti un program care citeste listele de adiacenta ale gratului din fisierul text graf I 3.txt,
pentru gratul neorientat, respectiv din fisierul grafI4.txt, penlru gratul orienlat , ~i care
afiseaza muchii le (arcele) gratului. Listele de adiacenta se implernenteaza dinamic ~i
static in cele dOUc3 variante .
3, Scrieti un program care citeste din doua fisiere text, respectiv din g5.txt un grat orientat,
reprezentat prin lista muchiilor, ~i din fisierul g6.txt un grat orientat, reprezentat prin lista
vecinilor, si care verifica daca cele doua qrafuri sunt identice (lndicat ie. Se reprezinta
ambele grafun prin matricea de adiacent a si S8 cornpara cele ooua matrice de adiacenta),
4. Intr-o zona turistica exista n localitati. intre unele localitati exista legaturi directe, fie
prin sosele nationale, fie prin sosele judetene. l.eqaturi!e directe sunt caracterizate de
lungimea drurnului, rnasurata i n kilometri . Se vor folosi doua graluri : Go=(X ,U o) pentru
leqaturile prin sosele nationale ~i GJ=(X,UJ) pentru leqaturile prin sosele judetene, Cele
dou a grafuri se vor citi din doua fisiere text, care contin pentru fiecare legatura directa,
pe cate un ra nd, separate prin spatiu , cele doua etichete a le noduri lor asociate
localitatilor si distants dintre localitati. Scrieti un program care sa citeasca aceste
inforrnatii din fisier si sa Ie transpuna intr-o implementare a grafului, adecvata preble-
me i, si care sa afiseze:
a . localitatile la care nu ajung drumuri nationale (nodurile iz olate, in primul graf) ;
b. cea mai scurta leqatura directa dintre doua localitati - se va prec iza eticheta
nodurilor asociate localitatilor, distanta dintre local itati ~i tipul scselei prin care se
asiqura leqatura :
c. pentru doua localitati prec izate , a ~i b (etichetele noduri lor a si b se citesc de la
tastatura) , sa se precizeze daca exista leqatura directa . daca exista . sa se rnai
precizeze tipul soselei si distanta dintre locahtati:
d . pentru 0 localitate p (eticheta p a nodului se citeste de la tastatura ), sa se afiseze
toate localitatile cu care are leqaturi directe ~i distants pana la aceste localitati
(ln d icat ie. Se dete rrnina grafu l reuniune a celor doua grafuri .);
e. loca litatea care a re cele rnai multe leqaturi directe cu alte localitati - ~i sa se
afiseze localitatile cu care are lega turi (nodul cu gradul maxim in graful reuniune).
5. intr-un munte exista n grote . Fiecare grat a i se qaseste la lnaltimea h; fa\a de baza
munte lui. Intre unele grote exista comunicare directa, prin intermediul uno r tuneluri .
Exista si grote care cornunica cu exteriorul. Desenati a retea ipotetica de grote ~i con-
struiti matricea de adiacenta a grafului neorientat asociat {grotele sunt nodurile, ja r
Info rmuticii 199
tunelurile sunt muchiile) . In altimile grotelor S8 vor memora intr-un vector. Gasiti 0
modalitate de a evide ntia grotele care comunica cu exteriorul. (Ind icat ie. Adauqati la
graf nodul 0, care reprezinta exter iorul munte Jui.) Scrieti matricea de adiacenta ~ i
vectorul cu Inaltirnile grotelor, in fisierul text grote.txt. Scrieti un program care sa
citeas ca matricea de adiacenta si vectorul din fisier - ~i care sa afiseze :
a. numarul de tunelu ri de comun icare (nurnarul de muchii ale gratului);
b. grotele care au leqatura cu exteriorul (nodurile i pent ru care exista muchie cu
nodu l 0);
c. grotele care cornunica direct cu cele mai multe grote (nodurile cu eel mai mare grad);
d. grotele care nu co rnunica prin tune luri cu alte grote (nodurile izolate);
e. ce a mai ina Ita grat a si cea mai [oasa grata ca re cornu nica cu exterio ruJ ;
f. pentru a grot a a carei etiche ta se citeste de la tastatu ra, sa se afiseze grote le cu
care cornunica direc t, precizand pentru fiecare tunel daca suie, cob oara sau este
la acelasi nivel cu grota .
6. Reteaua de strazi dintr-un oras este fermata din strazi cu dou a sensu ri ~ i strazi cu sens
unic de circulatie , Ea poate fi reprezentata printr-un graf orientat, i n care intersecfiile sunt
nodurile, iar arcele - sensul de circulat ie pe strazile care leaga doua inter sectii (traficul
auto) . Nodurile sunt intersectii de eel putin 3 strazi. Pentru a stabili prioritatea i n intersectii
si pen tru a fluidiza traficul intersecuile vor fi modernizate. Pentru mod ernizare se vor folosi
panouri cu semne de circulatie, semafoare - :;;i se vor amenaja sensuri giratorii . Pentru
fiecare strad a din ca re se poate intra in intersectie , se rnonteaza in intersectie un panou
cu semn pentru prioritate. Pentru fieca re strada pe care nu se poate intra din intersecue se
rnonteaza in intersectie un panou cu semnul de interzicere a circ ulatiei , i n toate
intersectiile vor fi montate panouri cu sem ne de circulatie , corespunzator strazilor incidente
cu intersectia. Fiecare dmtre aceste mijloace de modemizare are un cost panoul cu semn
de circulatie - costul c t , sernaforul - costul c2. ~i sensuI giratoriu - costul c 3. Pentru a
stabili modu l in care este rnodernizata fiecare intersectie, intersectiile au fost c1asificate in
intersec tii rnici (intersectii cu 3 strazi, i n care var fi mantate numai panouri cu semne de
circulatie). intersectii mari (intersectii cu 4 strazi, care vor fi semaforizate ) :;;i intersectii
foarte mari (intersectii cu peste 4 strazi, in care se vor am enaja sensu ri giratorii). Desenat i
o retea ipotetica de strazi :;;i construiti matricea de adiacenta a grafu lui orientat asociat.
Scrieti matricea de adiac enta in fisierul text strazi.txt . Scrieti un program care sa citeasca
matrice a de adiace nta din fisier :;;i care sa afiseze:
3 . inte rsectiile la care nu se poat e ajunge din nici 0 alt a inte rsec tie (nod urile care nu
au predecesori );
b . inte rsectiile de la care nu se paate ajunge la a nici 0 alta intersectie (no durile care
nu au succesori );
c. daca exista intersects tara nici a intersecue succesor sau tara nici 0 intersectie prede-
cesar, sa se corecte ze desenu l retelei (prin adauqarea unui nurnar minim de arce),
astfel i ncat sa nu existe asemenea intersectii - :;;i sa se actualizeze si fislerul strazi.txt.
d. intersectiile la ca re se poat e ajunge dire ct din cele mai mu lte intersectii (no durile
care au ce l ma i mare grad intern );
e. inte rsec tiile de la care se poate aju nge direc t la cele ma i multe inter sectii
(nodurile ca re au cel ma i ma re g rad extern );
1. num aru l de strazi pe care se circula i n ambele sensuri (nurnarul de pe rechi de
noduri i ~ i j pentru care . i n matric ea de adiacenta, elementele a[i][j) ~i aOWl sunt
ega!e cu 1);
200 Irnplcm cntn rc u st r uct ur ilor de date
g, numarul de intersectii mici, mari si foarte mari (clasificarea nodurilor i n functie de
nurnarul de noduri adiacente: noduri eu 3 noduri adiacente , cu 4 noduri adiacente
~ i cu cel putin 5 noduri ad iacente );
h. numar ui de pan ouri eu semne pentru prior.tate care S 8 var folosi (suma grade lor
interne ale nod urilor):
i. nurnarul de panouri eu semne pentru interzicerea circul atiei care S8 vor folosi
(diferenta dintre suma grade lor externe ale nodurilor ~ i nurna rul de straz i cu sens
dub lu de circulatie):
j. numa rul de sema foare care se vor men ta (suma grade lor interne ale nodurilor
care au 4 nodur i adiacente );
k . costul de rnoder nizare necesa r pentru fieca re lnterse ctie ~ i costul total al moder-
nizarii.
7. Pe un munte exista mai multe parcele eu Ianete ale saten ilor. Unele tanete au aeces
direct la dru mul satesc, all ele nu. i ntre propr ielarii parcel elor veci ne exista relatie de
prieten ie - sau nu . Dac a do; propr ietari vecini sunt prieten i, i ~ i perm it unul altuia
accesu l pe propr ia parcela. Pent ru a transporta fanul, saten ii care nu au acces la
drum ul satesc , trebu ie sa trea ca peste parcelel e all or sate ni, ca sa ajunqa la el. Un
proprietar este co nsiderat izolat daca nu are aeces direct la drumu l sate sc si nici nu
este i n relatie de prieteni e cu vr eunul dintre vecinii lui. Se vor folosi dou a grafuri: unul
pentru a repreze nta relatia de vec inatate a fan etelor, iar allul penlru a reprezenta
relatia de prietenie dinlre proprietari. Desenati 0 harta ipotetica a fane\elor si stab iliti
relatii ipotetice de prieten ie i ntre vecini. Constru iti rnatrice le de adiacen ta ale celor
doua grafuri asoc iate. Scr ieti malricele de adiacenta in fisierele texl Ien ete.txt ~i
prie teni.txt. Scrieti un prog ram care sa citeasca matricele de ad iacenta di n fisiere ~ i
care sa furnizeze urrnatoarele informatii
a. daca exista prop rietari izolati, sa se afise ze lista propriet arilor vecin i cu care
trebuie sa stabileasca relatii de priete nie, pent ru a ajunge la drumul satesc, !iii sa
se iden tif ice vecin ii care au acces direct la drumul satesc;
b. care este proprietarul eel mai neprietenos (care are eel ma i mare procent de
vecini cu ca re nu este prieten).
8. Se anal izeaz a rniqrat ia unei specii de pasari catatoare pe perioada unui an. Migra\ia are
doua etape : rniqrat ia de toarnn a, can e pasarile migrea z8 din zone Ie reci catre zonele
calde (migra\ia de la rece la cald), si rniqratia de prirnavara. cand pasarile miqreaza din
zone le calde cafre zonele reci (miqratia de la cald la rece). Fiecare etapa a miqratiei va
fi reprezenta ta printr-un graf oriental. in graful rniqratiei de la rece la cald, nodurile care
apart in zonei reci au numai succesor i, iar nodurile care apartin zone: calde au numai
predec esori. i n graful rniqratiei de la cald la rece nodurile care apartin zonei calde au
num ai succesori, iar nadurile care apart in zonei reci au numa i predecesari. Fiecarui nod
i se asoc iaza coordonate le geogra fice. Oesena ti cate 0 harta ipotetica pentru fiecare
etapa de rniqratie. Construiti. cu un ed itor de texte, fisieru' migraliel. /xt, care va contine
pe prima linie n1, nurnarul de noduri ale prirnului graf, pe urrnatoarele n1 linii, matricea
de adiacen ta a graf ului, ~i apoi, pe urrnatc arele n1 linii, coordonatele geografice ale
fiecarui nod de pe harta (sunt 6 entitati de intorrnatie, separa te prin spatiu: doua valori
nume rice i ntregi pentru latitudine, in grade ~i minute, ~ i un caracte r pentr u ernisfera,
doua valori nume rice intregi pentru longitudine. i n grade si minute . si un caracter pentru
meridian). Construiti cu un editor de texte fisierul migratio2.txt, care va cont ine acelas i
tip de informat ii, pentru cel de al doilea graf al miq ratiei. Scrieti un program care sa
Informa tica 201
citeasca aceste informatii din fisier, sa Ie transpuna intr-o implementare a grafului
adecvata prob lemei (rec om and are - implementare prin matrice de adiacenta si vector
de structuri pentru coordonatele geografice) si care sa afiseze urrnatoarele inforrnatii:
a. daca cele doua grafu ri sunt corecte (daca a[i][j]= 1, atunc i au][i]=O - , i produsul
dintre gradul intern , 1 gradu l extern ale fiecarui nod trebui e sa fie 0; in plus,
treb uie ca nodu rile din zon a calda sa coincid a - i n ambe le grafuri);
b. dac a in gra ful rniqratiei de la rece la cald exista un nod destinatie al grafului - , i
ce sern niflcatie are exis tent a lui pentru rniqratie ;
c. daca pasarile s-au rein tors i n aceleasi zone , prirnavara (nodurile din zona rece
coincid in cele do ua grafu ri); i n caz con tra r, sa S8 specifice no lle locatii aparute i n
zona rece in care a ajun s specia respective:
d. sa S8 obtina matricea de adiacenta a har1ii rniqratiei, pe in treaga perioada a anului ,
prin reuniunea celor coua grafuri (daca dupa rniqratia de primavara au aparut noi
locatii pe harta in zona rece, se vor adauqa la primul graf ca noduri izolate).
.
Observa tie . Matricea de adiacenta'
a unui graf nul e ste mat ricea zero (nu
contine nici un element eu valoarea 1).
Fig. 14
Teorema 6
Nurnarul m de rnu c hii ale unui grat neo rientat ca mplet , e ll n noduri (Kn), es te:
11 -1
111 = I1X - -
!
202 Im plementarea structurilor de date
ncmon st rat!e . Nurnarul de muchii cstc cat de numa rul de subrnultimi de 2 clemente care se pot
forma dintr-o rnultirne cu n clemen te, aoica m = C/~
2. Se pot construi mai multe grafuri orientate com plete, cu n noduri , deoa rece dOU3
noduri x ~ i y pot fi adiacente In trei situatii: exista arcul [x,V], exista arcul [Y,x] sau exista
arcele [x,Y] si [y,x] .
Teorema 7
Nurnarul de grafuri orientate complete care S8 pot construi cu n noduri este egal cu
Dem on stratie Deoarece nurnarul de subrnultimi de 2 nooun care se pot forma dintr-o muttime de n
noduri este a= CI~ ' ~ j pentru fiecare pereche astfel deflnita S8 pot defini trei situatil de adiacenta.
a
rezurta ca numarul de grafur i complete ca re se pot co nstrui este de 3 .
Exemplu . Pentru n=4 se pot
~M~~
6
defini 3 =72 9 graluri orientate
complete. In l igura 16 sunt pre-
~~~~
zentate patru dintre acestea .
Definit i alte patru gralur; com-
plete cu 4 noduri. Fig . 16
Obsorvatii
1. in cazul matrice i de adiacenta a unui graf neorientat complet , valoarea fieca rui
element care nu se gase~te pe diagonala principa la este 1.
2. in cazul matricei de adiacenta a unui graf orientat complet - pent ru orice pereche de
noduri , ; ~i j . dilerite l ntre ele (iej} - a[i]UJ=1 sau aO][i]=1 .
3. Nurnarul minim de arco in tr -un graf ori enta t comple t ell n noduri este ega 1 ell
nurna rul de much ii ale grafului neorientat complet Kn.
4. Numarul maxim de aree intr-un graf oriental complet ell n noduri este ega l cu dublul
nurnaru lui de muchii ale graf ului neorie ntat complet Kn.
III = 1+ " I + Mx m ]
[ 2
Pentru diterenta de muchii rarnase (m-mma x ) mai este necesar un nod, pentru a lega aceste
rnuchii de nodurile grafulu; complet care s-a fonmat. Numarul de noduri izolate este: n - nl - l,
#inc lude < i o s t r e am. h >
ffinc l ude<ma t h. h >
voi d ma i n ()
( i n t m, n , n l : c o u t«" mu c h i i= " ; c in» rni ccu e .c-cvn o d a r i> " ; cin» n;
nl-l i n tl{( 1+ s q r t(1+8-mIJ/ 2) ;
cou t « "Numarul ma x i m de no dur i izolate e ~t e "« n- n l - l ;}
1. Scrieti un program care citeste , din fisierul text graf.-cl. txt, inforrnatii
despre un graf neorientat (de pe prima linie, nurnaru l de noduri, apoi
mat ricea de adiacenta) , ~i care verifica daca este un graf com plet.
2. Scrieti un prog ram care citeste, din fisierul graf_c2.txt. info rrnafii des pre un graf orientat
(de pe prima linie , nurnarul de noduri, apoi matricea de adiacenta) - si care verifies
daca este un graf complet.
~ ®!Ec:> ~
~
Grafu l Graful partial
G, ~~® ~'@ G, p
Fig. 17
204 lmpl cm cn tarcu s t r uc ru r ilo r lie da te
2. Pentru graful orientat G IO=(XlO.UlO) definit anterior, grafu l G10p = (Xr o, U1CP) definit astfel:
-7 rnu lt irne a nodurilor este X lO={1 ,2,3,4,5,6,7,8,9,10j,
-7 rnultlm ea arcelo r este U, oP=([2,3) , [2,5J, [2,6), [2,7J. [4,1], [7,2), [8,9] , [9,8)},
este subgraf al grafului Gl 0 - figura 18.
~
5 5
Grafu i
Grafu l ~ ...... ® partial
G 10P
G, o .J 9
4 Fig . 18
Teorcma 8
m
Numarul de grafuri partiale al e unui gra f c u m m u chii (a rce) este eg a1cu 2 .
Dcmc nstratle. Grafurile partiale se pot obtine: tara eliminarea une! much ii (arc) - obtinandu-se
gratul initial; prin elim inarea unei muchii (unui arc) - obpna ndu-se grafurile partiale cu rn-1 muchii) ;
..: prin elimi narea a m- 1 muchii (arce) - cbtinandu-se grafurile partial e cu 0 muchie (un arc): ~i a
tuturor muchiilor (arcelor ) - obtinandu-s u un graf partial numai cu nod uri ~ i rara rnuchi i (arce), adica
gratu l vid:
Numarul de grafuri partiale care se pot obtine cu m mucnu (arce): em,"
Numarul de grafuri pa rtiale care se pot obtine cu m -t muchii (arce ): cm - l
'"
Nurnarul de grafuri part iale care se pot obtine cu m -z muchii (arce). : (,m -~
'"
Nurn arul de gra fur i parti ale care se pot obtine cu 0 muchie (un arc ): cl
'"
Nurn arul de grafuri pa rtials care se pot obtin e rara nici 0 muchie (nici un arc ):
Nurn arui total de grafu ri part iale este : C::: + c:::- + c:::-
I l
+ .. + C~l1 + C: 1 = 2'''.
2.7.6.2. Subgraful
Fie graful G = (X,U). Graful Gs= (Y,V) se num esta subg raf al gr afului G dac a Y ~
(subgrafu l contine num ai noduri ale grafulu i) 9i mu chiile (arc ele) din multimea V sunl
t0 3t8 muchiile (arcel e) din rnultimea U care au ambele ext rernitati in multirne a de
no duri Y. Se spune c a subg raful Gs esle ind us sau general de multirnea de noduri Y.
Altfel spus, un subg raf al grafului G esle el insu si sau un graf care s -a obtinu t prin
suprirnarea din graful G a unor nod uri ~ i a tuturor muchiilor (areelar) incidente cu
aces te noduri.
Exernpl e:
1. Pentnu graful neorientat G, = (X"U ,) , definit anterior, gratul G t s = (Y"V,). definit aslte l: (; "
~ rnultlmea nodu rilor este y ,=(1,2.4 ,5,6.7).
~ rnultim ea muchi il or este V, =([1.2]. [1 A]. [2.5]. [6,7]}.
este subgraf al grafului G, - figura 19.
~ q~
Subgratul
Gratul
G, ~ cifiJ G ts
~ ~ 0 '@
Fig . 19
2. Pentru graful arientat G lO =(X lO, U lO) . definit anterior, gratul GlOS= (YlO ,VlO) definit astfel: G
~ multimea nodurilor este Y1O={1,2,3,6,7,9,1OJ.
-7 multlmoa arcclor este V lO=([ 1,2], [2,1], [2,3], [2,6], [2,7], [7,2]}.
este subgrat al gratului GlO - figura 20.
~@ q ~ ® ®
5)
Subgraful Gt os
Fig . 20
-
Teorerna 9
n
Nurnaru l de sub grafuri ale unui graf cu n nod uri este ega I cu 2 -1.
208 Implemcntureu st r uct u ri lor de date
n em cn atret re. Subg rafurile se pot obtme : prin elirmnare a niciunui nod (obtinandu-se grafu! initial ):
a unui nod (obhnan du-se subg rafurile cu n-1 noduri): ...; a n-1 noduri (obtinandu- se subqraf urile eu
un nod):
Numaru! de subg rafuri ca re se po t obtine eu n nod uri:
Numarul de subgrafu ri care se pot obtine eu n-1 nocun:
~
Graful
~ rl ~GrafUIcompleme ntar
G, 6 6 c.,
~
L....( (.;\
8 4 0 5 8
Fig. 21
2. Pentru graful orie ntat GlO=(XlO,U lO), definit anterior, graful Gl 0c= (XlO,VlO) , definit astfel: G10c
-7 multlm ea nodurilor este X,o={1.2 .3,4.5,6,7,8,9,1OJ.
-7 rnu ltirnea arcelor este V,o={[1.3J, [1,5J, (2,4J, [2,8J, [3,2J, [4.2J, [5,2J, [5,6J , [7,1]. [8.2J,
[9,31 . [9,10])
este graf comp lementar al qrafului G10- figura 22.
212 Implem entarea s t r net nr ilur de date
5
1
Gratul
G,o
Fig . 22
Scrieti un program care citeste din doua flsiere text graCi c.txt si
graf_2c.txt inforrnatli despre doua grafuri neorientate - si varian ta orientate
- (de pe prima linie. numaru: de noduri, apoi matricea de adiacenta) $i care
verifies daca unul dintre graturi este grat complementar al celuilalt graf. (Indlc at ie. Oaca
cele doua grafuri au acelasi nurnar de nod uri, S8 determine graful inter sectie, care va trebui
sa fie gratul vid).
Daca mu ltirnea noduri lor unu i graf neorientat este X={X" X2 , , x.}, un lant de la nod ull- la
nodul i, - L(I, .ikJ - va fi defini t prin rnultimea L(I, .I, )= i l" 12 I; . .. . , I, } , unde I,EX pentru
orice i (1<;i<;k) , ia r muc hiile [1 , ,1,], [12,13] , [1 3 ,14 ] , ... , [1,., ,1,] E U. Lantul poate fi interpretat ca un
traseu prin care S8 parcurg anumite muchii ale grafului, traseul fiind ordinea in care S8
parcurg aces te muchii: [1, ,12], [1 2,13] , [13 ,14 ] , ... , [l k• k ] . Fiecare pe reche de noduri succesive din
"l
Ian! reprezin ta pa rcur ge rea une i much ii. Daca exista L( x;,xj) , se spune ca nodul Xj es te
accesibil din nodul Xi .
Graful orientat
Daca multirnea nodurilo r unui gra f orien tat este X={X" X2, x o}. un lant de la nodul 1, la
nodu l Ik - L(I, .lk) - va fi definit prin rnultimea L(I"I,) =[I 12, , I; , ... , Ik] , unde I;EX , pent ru
"
orice i (1s isk). Arcele [1 , ,1 2 ] , [12,1,], [1 3 ,1 4 J, ..., [lk• ] au proprietatea ca , oricare ar fi doua arce
"I,
succesive, ele au 0 extremitate comuns. La defi nirea unui lant, nu S8 line cont de
oric ntarea arc el or , ci numai de faptul ca doua nod uri sun t legate de un arc .
Terminologie :
~ Lungimea unui lant reprezinta nurnarul de parcurgeri ale muchiilor, respectiv arceJor.
De exemplu , lungimea lantului L(I ,) este k-1. Daca a muchie (un arc) este parcursa de
ma i multe ori, S8 va numara fiecare "I dintre parcu rgerile sale .
-7 l. antu l de lungime minima dintre nodul Xi ~i nodul xJ - L min( x j,X j) - este lantu l cu
nurnarul minim de muchii (arce) , din rnultirnea nevida de lanturi L(x" x,).
~ Ext rernitat ile unu i Ian! sunt formate din nod ul cu ca re lncepe si nodul cu care se
terrnina lantu l (1, ~ i Ik ) .
~ Sublantu l este fo rmat dintr-u n sir continuu de nod ur i din lant. De exemplu , pen tru
lantul L(I" Ik)= {I 12 , ... , I" ..., I" " ', Id , L, (I" I,), definit astfel : L, (I;, 1,)= [1" 10+1, ..., 1" " I,l este
un sublant allan"tului l.
Exemple:
G 19.
1. Pentru graful neori entat G19= (X 19 ,U , definit astfel:
'9)
~ rnuttirn ea nodurilor este X , 9={1 ,2,3A ,5,6 ,7,8}.
~ rnultirnea m uc hiilo r este U 19 =([1 ,2], [1,5], [1,6], [2,3J,
[2,5], [2 ,6], [3,4], [3,6], [3,7), [3,8], [4,8], [5,6], [6,7J, [7,8]}.
L , (1,7)= (1, 2 , 3 , 8 , 4, 3, 6, 5, 2, 3, 7} este un lant lntre nodul cu elicheta 1 §i nodu l cu eti-
cheta 7 (figura 23 ). Lungimea lantului este 10. ~ G",
2. Pentru gra ful orientat Gzo = (X'O,U20), definit astfel:
~ multlm ea nodu rilo r este X 2o={ 1 ,2,3A ,5,6 ,7}.
~ mullimea ar celor este U 20 =([1 ,2] , [1 A ), [2,3J, [2A],
,
[3,6], [3,7], [4 ,1J, [4,5] , [5,2], [SA], [6,3], [6,5], [7,6]}.
'-~J..J
Muchii (arce)
Noduri
I
Elementare Simple
Toate muchiile (arcele) din lant su nt
Conl in numai noduri distincte doua cate
dou a: 1,-0"-12 : 1 1 ~IJ7 ; ... ; I,;t.lk: 12"~ [3; . . . ; Ik. 1",lk diferite i ntre ele: [1,,1,] ~ [1,.1,1:
- acelas i nod poat e fi parcu rs a singura (I,.I,J ~ [I, .I,J: ...; [1 ,,1,) ~ [I" .IJ; ...:
data. [lk •2 .1 k.,1;t. [1" "'1<] - aceeas! much ie (arc)
~ peate fi parcursa 0 sinqura data . ~
Neelementare Compuse
Con tin noduri care se repeta - prin in lant se pot re peta u ne le much ii (aree)
acelasi nod se poate trece de rnai rnurte - aceeasi mu chie (arc) poate fi parcursa
ori. de mai multe ori .
Exemple:
1. Pentru graful neorientat G 19 :
-? l.an tul L , (1,7) definit anterior este un lant neelem entar , deoa rece se repeta nodul cu
eticheta 3. Este un lant campus , deoarece in lant se repeta muchia [2 ,3)
-? l.antul L, (1,7) = {1, 2, 3, 6, 7} esle un lant elementar deoa rece fiecare nod este par-
curs a sinqura data.
-7 l.an tul L, ( 1,7) = {1, 6, 3, 2, 6, 7} esle un lant simplu , deoarece nicio muchie nu se
repeta, dar este un lant neelementar, deoarece se repeta nodu l cu el ichel a 6.
2. Pentru graful oriental G,o :
-? l.antul L , (1,5) definil anlerior esle un lant neelementar, deoarece se repeta nodul cu
el ichel a 6. Este un lant campus, deoarece i n lant se repeta arcul [6,7].
-? l.an tul L, ( 1,5) = {1, 2, 3. 7, 6, 5} este un lant elementar, deoarece fiecare nod este
parcurs 0 sinqu ra data .
-? l.antul L, (1,5) = {1, 2, 4, 5, 2, 3,6, 5} este un lan] sirnplu , deoarece niciun arc nu se
repeta, dar este un lant neelementar deoa rece se repeta nodul cu eticheta 2.
Teorem a 10
Daca un graf confine un Ian! i nt re doua noduri, x ~i y,
atunei contine un Iant elem entar intre nodurile x si y.
Dern on strati e Consideram lantul L(x,y)=! x, 11, 12..... Ik, YI . oa ca tantul nu este elementar, el confine
eel putin un nod z care se repeta - exista i ~ i j , astfe l inca! I;; IJ; z: L(x,y)= {x, 1" 12, ..., lr. ..., 11_ "', Ik• V}.
Nodul z apartinand lantului L(x,y), tnseerrma ca el este acces ibil din nodu l x, iar nodul y este accesibi l
din nodul z. l nseamna ca din tant se poate elimina sublantul care leaga nodul z de el Insus i: L(x ,y)= ~x .
11. 12, ..., Ii, Ij+1. "', Ik, y } in ace tas! mod , se pot elimina din lant , tcate sublantunle care leaqa un nod de
el tnsusi, obtinandu-se i n final un lent in care fiecare nod nu apa re decal 0 sinqura data , adica un lant
elementar.
Exemplu :
i n graful neorien tal G '9, lantul L ,(1 ,7) este un lant neelementar. Prin eliminarea din acest lanl
a sublantului {B, 4 ,3}, se obtine lantul {1, 2, 3, 6, 5, 2, 3, 7}, care esle un Ian! neelemenlar.
Prin eliminarea din acest lant a sublantului {6, 5, 2, 3}, se obtine lantul {1 , 2, 3, 7}, care este
un lant elemen tar.
Informatica 215
Tcorcma 11
Dacii un Ian! esl e elemenlar, alunci este ~ i Ian! simplu.
oemcnetrat !e - prin recuc ere la absurd. Presupunem ca lantut elementa r este Jan! campus . Daca
este lant campus, el treb uie sa parcurqa de dou a on aceeasi muchie (arc), ceea ce ar insemna sa
treaca de doua ori prin nodurile adiacente muchiei (arcului). l.antut fiind elementar, nu trece lnsa de
doua ori prin acelasi nod.
3. Ver ifi carea u nu i sir de et ichete de noduri daca Iorrnoaza un Ian! simp lu.
Algor itm ui. Se verifica daca :
~ sirul de etic hete poate forma un lant (daca fiecare pereche de noduri consecutive din
lant este leqata prin much ie. respec tiv arc);
~ lantul este simp lu (se verifies daca muchiile formate cu noduri le din lant nu se repeta).
Impl ementarea alg or itmului . Se citesc din fisierul text graf3 .txt lista muchii lor unui graf
neorientat. respectiv , din fisierul graf4 .txt lista arcelor unui graf oriental. Se citeste apoi, de
la tastatura, un sir de k numere , care reprezinta etichete ale nodurilor din graf. Se verifica
daca acest sir de noduri poate reprezenta un lant simplu in graf. $iru l de numere citite de la
tastatura se mernoreaza in vectorul v . in vectorul z cu Inreqistrari de tip muchie, se memo-
reaza muchiile (arcele) pe care Ie formeaza doua noduri succesive din sirul de numere.
Pentru a identifica doua muchii (arce) identice, perechile de etichete care torrneaza 0
muchie sunt memorate ordonat. Functia ci t e s t e () se fotoseste pentru a citi intorrnafiile
din fisier 'Ii pentru a Ie memora in matricea de adiacenta a grafului , functia La rrt. () se
\n 1'0 rm a tica 217
toloseste pentru a verifica daca sirul de numere poate reprezenla un lant din graf, functia
si mp lu () se toloseste pentru a verifica daca lantul este un lant simplu. Pentru testarea
programe lor se folosesc graful neorientat G, si graful orientat G, .
#includ e <f s t r e a m. :-t>
s truct ~u chie t in t x, y; };
mi.:chie <: [10 J ;
i n t < ,n ,m ,a [ 1 0 ) [ 10 ) , v [ 1 0 ];
fst re a m f { "g r a f J. t x L" , ios:: i n ) ;
v oid ci t este {/
t i nt i ,x ,y ; f »n»m ;
f or {i <; i <9n ; i ++ ) { f» x» y ; a [x ] I y ]~ l; aryl Ix] =l ; ) f . c l o s e ();)
i n t lant ()
{ f o r (int i = L i<Y.. : i++) i f (a{'/[ i ] ] [v(i+1]) = =0) r e t u r n 0 ;
r e t ur n I ; }
in t s i.mp lc {}
{fo r l i nt l=l ;i<k ;i++)
f o r (i n t j= i ~ l ; j < =k ; j ~~ } i f {z [i ] .x==z i j ]. x && z [i j . y= =z [ j ] . y ) ret~-n 0 ;
r e t ur n 1 ; )
v oid main ()
tint i ; c Lt.e a t.e t j , ccu t c c vk-. " ;cin » k ;
f or ( i = l; i <= f'. : i ++ ) {co u t .c-C'E 't i.c h e t a "« 1. « " = It ; c i n »v[ i] ; }
f o r {i = l ; i < k; i ++ ) i f (v [ i]<v [i+ 1 ]) { z [ i ] .x ~v [ iJ ; z [ i ] . y =v [ i + l ]; }
el s e { z I L ] .z~ v [ i+ l ) ; : [ i } . y =v l i ] ; }
i f (Lan t f l )
i f Ls i .rnp Lu t l ! c cu c-cc ve s t e La n t. s i.mp L u" ,
e ls e cou t cc vn u e s t c Lan t s iu.p Lu" ,
e lse cout«" n u e 5~e :'a.nt " ; }
1. Scrieti un program care citeste dintr-un fisier text lista much iilor unui
graf nearientat (g ra /3. /xI) sau varianta graf orientat (g ra /4.IX/), ~i care:
a. Ve rifica daca un ~ir de k numer e citite de la tastatura reprezinta
un lant ele me nt ar pentru graf .
b. Cauta toate lanturile elementare cu lungimea d ~ i Ie afiseaza. Valoarea numerics d se
citeste de la tastatura. Daca nu exrsta nici un lant elementar cu lungimea d, se
afiseaza un mesaj.
c. Cauta toate lanturile elementare . eu lungimea cea mai mica, ce exista intre coua
noduri x si y, ~i Ie afiseaz a. Etichetele nodurilor se citesc de la tastatura. Daca nu
exista nici un lant elementar , se afiseaza un mesaj..
d. Cauta toate lantunle elementare intr e doua noduri x si y , care tree printr-un nod z
care are gradul minim in graf. Etichetele celor doua noduri se citesc de la tastatura.
Daca nu exista nici un lant elementa r. se afiseaza un mesaj.
e. Cauta toate lanturile elementare de lungime maxima ~ i afisea za cate lanturi s-au
gasit ~i care sunt ele . Daca nu exista nici un lant elementar , se afiseaza un mesaj.
f. Cauta ~i afiseaza eel mai lung lant elementar care este format din noduri care au
etichete cu numere consecutive, ordonate crescator.
g. Cauta si afiseaza eel mai scurt lant elementar care trece prin p noduri si prin q rnuchii
(arce) date. Se citesc de la tastatura urmatoarete valori numerice: p - nurnar de noduri,
un ~ir de p numere , care reprezinta etichete ale nodurilor din graf t q - numar de muchii
~i un slr de q perechi de numere, care reprezinta muchii (arce) din graf.
2. int r-un fisier text sunt memo rate informatii despre doua grafuri neorientate G' ~i G" : pe
primul rand nurnarul de noduri ale celor ooua grafuri (n, ~ i nz), pe urrnatoarele n,
218 lmplcmenturca st r uct ur tlor de dale
rand uri mat ricea de adiacenta a grafu lui G', iar pe urm atoa rele n2 randuri matricea de
adiacenta a grafului G " . Scrieti un program care citeste din fisierul text informatiile
despre cele cou a grafu ri ~i care determina doua noduri p si q (p din graful G' ~ i q din
graful G" ) care - daca se leaga printr-o much ie - asiqura leqatura , printr-un Ian! de
lungimea k , i ntre doua noduri precizate x ~i y (x din graful G' ~ i Y din grafu l G" ). Valorile
pentru x , y ~ i k se citesc de la tastaura.
2.7.7.2. Ciclul
Un Ian! care are toate muchiile distincte doua cate doua ~i
extrornitaf care coin cid - se numesto ciclu .
Ciclul este un Ian! simplu ([1, ,1,) '" [1, ,13 ); [1,,1,) '" [13,I, J; ...; [I" I,l " [I,." I,J; ...; [I,." I,.,J " [1,., ,1 ,)),
in ca re extremitatile coincid : 1,=lk_
Un graf far a cicluri se nurne sts graf ac iclic .
Daca toate nod uriIe unui ciclu sunt distincte doua cate doua , cu excepti a extrernitatilor,
ciclul S8 nurnes te cic lu clcme nta r.
Exem pl e:
1. Pentru graful neo rientat G 19 :
~ Lantul L, (1,l ) ={1, 2, 3, 6, 2, 1) nu este un ciclu deoarece in Ian! se repeta muchia [1,2).
~ Lantul L s(1 ,l ) = {1, 2, 6, 3, 7, 6, l)=C, este un ciclu neelementar deoar ece se repeta
nodul cu eticheta 6.
~ l.ant ul Lo(l ,l ) = {1, 2, 3, 7, 6, 1)=C 2 este un ciclu eleme ntar deoarece nu se repeta
niciun nod .
2. Pentru graful orie ntat G, o:
~l.antul L4 ( 1,1) ={1, 2, 4, 5, 2, 1} nu este un ciclu deoarece i n lant se repeta arcul [l ,2J .
~l.an tul L5(1,1) = ( 1, 2, 5, 6, 3, 2, 4, l }=C, este un ciclu neelementar deoarece se
repet a nodul cu etic heta 2.
~ t.ant ut L6 (1,1) = {1, 2, 3, 6,5,4 , 1} este un ciclu eleme ntar deoarece nu se repe ta
niciun nod.
" . G~
.. 3. Un circuit elec tric poate fi reprezentat cu ajuto rul unui graf orientat G 21 , i n care nodu rile
rete lei sunt nodurile grafu lui, iar sens ul arce lor este dat de sensu I ales pentru curentul
electric - figura 25.
R,
--.
11 I 12
+'• I,
E,
R,
R,
R, R,
2 4
~ I, E, 14 :; l~ Rs 1~5' Ie" E 2
Fig. 25
Un ochi al retele i electrice repre zinta un ciclu in graful orientat. Fiecare arc k are asociate
trei rnarirni: rezistenta R k, intensitatea curentului Ik ~ i tensiunea electromotoare a sursei Ek.
Semnul curentului electric este dat de sensul arcului: daca arcul intra in nod, curentul
electric are semnul plus, iar daca arcul lese din nod , curentul electric are semnul minus.
l nfo r rn a tica 219
Pentru fieca re nod din grat , se aplica teorema lntal a lui Kirc hhoff:
I'
2:1, = 0
k= l
unde peste suma dintre gradul intern si gradul extern ale nodului.
Pentru fi ecare cic lu din grat, se aplica l eor ema a doua a lui Kirchhoff:
" q
2:E, = 2:1, x R,
1;", 1 1;= 1
Doua lantu ri - L 1={ 11, 12, .•" Ij, ... , Ik.1, I k, Ii } ~ i L'1={I'1 ' 1'2, ..., ( i l " " I'k_1, I'k t I'd -
care au aceeas i l ungime k, formeaza acetasi ciclu daca ex is ta un nu rna r i ntreg
j , astfel incat li= I' (i+j) mod k+1, pentru orice i=1, 2, 3,... , k.
Exemp lu :
in gratul neorientat G' 9 lanturi L,= :I" I" 13 , I" 1, 1 = { 1, 2, 6, 5, 1} ~i L ,={ I " 12, 13 , 14 , I', ) = {2,
6,5, 1, 2 ) care au lungimea 4 , forrneaza acelasi ciclu. Se observa 1,=1 ~i 1,=1. Din (1+j)
mod 4 + 1 = 4, rezulta ca j=2. Verificam daca pentru acest j si pentru orice i= 2, 3, 4, exista
doua noduri cu aceeas i eticheta in ambele lanturi:
;=2 <> (2+2) mod 4 + 1 = 1; dar: 1, =2 si 1.,=2 => 1,= .1, .
i=3 => (3+2) mod 4 + 1 = 2; dar: 13=6 si 1,2=6 c> 13 =1.2.
i=4 c> (4+2) mod 4 + 1 = 3; dar: 14= 5 ~ i 13 =5 => 1, =13 .
In gratul neorientat G ' 9 lanturi L,= {I" 12 , 13 , 14 , I, ) = : 1,2, 6, 5, 11 ~i L ,=:;" I" 1.3 , 14 , I , ) = { 2,
5,6 ,1 , 2 } care au lungimea 4, nu forrneaza acelasi ciclu . Se obse rva 1,=1 si 14 =1. Din (1+j)
mod 4 + 1 = 4, rezulta ca j=2. Veriflcarn daca pentru acest j ~ i pentru orice ;= 2, 3, 4, exista
doua noduri eu aceeasi eticheta in ambele lanturi: ,
i=2 <> (2+2) mod 4 + 1 = 1; dar: 12=2 ~i 1,=2 => 12= I , .
i=3 => (3+2) mod 4 + 1 = 2; dar: 13=6 ~i ;'2=5 => 13" ;'"
s t i v a st ;
fstream f( "g ra f l .txt " , i o s : :i n ) ;
void citeste() ( I I :;; e c i t.c s t c me t .r i cee d e e d a a cent.a d in f.i s i.e rI
void .i n i t Cl
{ / / es t e ident i c a c:.:: cea de 1a a f i $area l a n t;:ur i lor elen;e:1tare }
int s u c c e s o r ()
{! Ze s t e .i d e n t L o a CD CEa de La c L i se rce Lan t u ..ri L c r e Lemen t a r e }
int va Li d ()
{ / / s-s t e Ldent t ca ell cea c e La af t s e re a Lan t ur i.Lo r element are }
i nt ~') o l 1J r, i e ( ) {return a [ s t[ k] ] j x ]== l && k>2 ; }
lise ob;;:ine solut;:iaatunci canci ultimlJl nodadaugat este ad iacent
//nodu lui x ~i in s t i vb cxist~ eel pu~i n troi Docturi
void t Lpa r ()
{f or (i n t i=l , e st e= lii <= k; i ++ ) ccut«s t [i]« " "; cou t« x«endl;}
void bti} { / I p a r t e a fix a a e Lqc r i t.mu l ui.
v oid main ()
{ c i t e st e.t I : ,
for ( z=1:x<=n ;x++j { s t j Ll e x : bt () ; }
i f (Le s t.e j oou t.c-cv Nu e x i.s t.e n.i c i. u ri c .icl.uve L eme ri ua r" i }
1. i n exemp lul prece de nt, sunt afisate lanturi care tormeaza acelasi
cicl u (acelas i ciclu este afisat de mai multe ori: deosebirea consta
do ar in nodul cu care se i ncepe ~i se i nchei e ciclu l). Modificati
programul astfel tnca t sa se elimine afis area inforrnatie i redu ndante (afisarea aceluia si
cicl u de mai multe ori ).
2. Scrieti un progra m care cites te din fisier ul te xt graI3 !x! lista muchiilor unui graf neori-
entat - si afiseaza to ate cicl urile elementare care trec printr-un nod cu grad ul minim .
3. Scrie ti un prog ram care citeste din fisieru l text graI3. !x! lista muchiilor unui grat neo ri-
entat si care verifica daca un sir de k numere citite de la tastatura reprezinta un cic lu
eleme nta r pent ru graf .
4. Scrieti un program care citeste din fisierul text graI4.!x! lista arcelor unui graf orientat si care:
a. Cauta toate cicluri le elementare care exista in graf !?i Ie afiseaza. Daca nu exists
nieiun eic!u ele mentar, S8 afiseaza un mesaj.
b. Ca uta toate cicluri!e elementare care tree prin toate noduri le gra fului si Ie aflsea-
za. Daca nu ex ista nici un eiclu elementar care trece prin toate nodurile grafului,
se afiseaza un mesaj.
c. Cauta toate ciclurile elementare de lungime ma xima care tre e prin nodul x - ~ i Ie
afiseaza. Etieheta nodulu i se cite ste de la tastatura . Oaca nu exista nici un cielu
elementa r care sa trea ca prin nodul x , se afiseaza un mesaj.
2.7.7.3. Drumul
Intr-un gral orientat G= (X,Uj se doflnosto un drum ca f ii n d a succesiune
de noduri care au proprietatea ca - oric are ar f i doua nod uri succes ive-
ele sunt legate print r-un arc .
Daca , intr-un graf orientat , rnultimea nodur ilor este X ={X1, X2, ... , xn}, iar multirnea areelor
este U=(U" U2, ..., Urn}, un drum de la nodul d , la nodu l dk - D(d k) - va f definit prin
"d
Infonnaticii 221
rnultim ea nadurilar D(d k) = {d d" ..., dkJ, unde d,EU, pentru orice i (t si sk ), iar arcele
"d[dk- l ,dk)"E U. Drumul poale fi privit ca un lant In care parcu rgerea
[d d, ], [d 2,d 3 ] , [d 3 ,d4], ...,
"
de la un nod la altu l trebuie sa S8 faca in sensu ! arcului care leaqa nodurile. Oaca exista
D(xj,xj), S8 spune ca nodul Xj este ac cesibil di n nodu l x..
Terminolog ie :
-7 Lungimea unui drum este data de nurnarul de arce care i l compun . in cazu l in care
arcele au asociate lunqirni, lungimea unu i drum este data de suma lungimilor arce lor
care iI com pun .
-7 Drumul de lu n gim c minima dintre nadu l d, ~i nadul dJ - Dm,"(d" dj) - este drumul cu
numa rul minim de aree din m ult imea nevida de drum uri D(di,dJ} .
-7 Subdrumul este format dintr-un sir cantin uu de nod uri din drum. De exem plu, pent ru
lantu l D(d d k)= {d d" ..., d, ..., dj , ... , dk:, 0, (d" dj ) definil astfe l: D, (d" dj) = :d" d,., , _
"
dj_1 , dJ ) - este "
un subdrum al drum ului D.
Drumul elementar este drum ul in care nodurile sunt distincte doua cate doua , Dru mul
simplu este drumu l i n care arcele sunt distincte dou a cate doua.
Exe m ple - Pen tru graful arientat Gzo.
-7 l.antul L,( 1,6) = (1, 2, 5, 6) nu este un drum dea arec e parcurgerea nu se face i n
sens ul saqetilor,
-7 l.antul L 8(1,6) = (1 , 2, 3, 6, 3, 6) = 0 , este un drum neelementar, deoarece se repeta
eli cheta nadurilar 3 si 6 - si campu s, deaarece prin arcul [3 ,6] s-a trecut de doua ori.
-7 l.antul L,( 1,6) = (1 , 2, 3, 7, 6) = 0 , este un drum elementar, deaarec e nu se repeta
nici un nod .
-7 t.antul L9 (1,6) = (1, 2, 4, 5, 2, 3, 6}= D, este un drum sirnplu , deoa rece nici un arc nu
a fost parcu rs de doua ori. dar este un drum neelemen tar, deoarece se repeta nod ul
cu etich ela 2.
Teorema 13
Daca un grat neorientat confine un drum intre doua noduri, x §i y,
atunci, contine §i un drum elementar, Intre nodu rile x §i y.
nemon strat!o - la fel ca demonstratia de la Teorema1 1 de la subcapitolul Lanturi.
Matricea drumurilor este 0 matrice patrat a binara de dimen siune n (n rep reze ntand
ordinul grafulu i), delinita astlel:
lnforrnatiil e din rn atri ce a drumurilor se pot folosi pentru a verifica daca exi sta drum
i ntra doua noduri al e grafului
Algoritmul. Daca nu exists un arc de la nodul i la nodul j , con siderarn ca exista d rum de la
nodu l i la nodul j , daca exista un nod k (ksel ~i k*j) care are propri etatea ca exi sta un drum
de la nodul i la nodul k ~i un drum de la nodul k la nodul j . Matneea ~ 2
drumurilor S8 obtine din matricea de adiacenta prin transformari
sueeesive, astfe l: se gene:eaza toate nodurile k (1;;k;; n), iar pentru 3 4 5
fieeare nod k se genereaza toat e perechile de noduri i (Lek) ~, j (jek )
si se verifica daca a li ] [kJ~l ~i ark] [j]=1. in eaz afirmativ, i n matri - Fig , 26
cea de adiacenta S8 atribuie valoarea 1 elernentului a [i] [j].
1 2 3 4 5
G" Pentru graful G" din figu ra 26 matrieea de adiacenta sutera 1 0 1 0 0 0
urmatoarele cinei transformari. La fiecare transformare , daca 2 0 0 1 0 0
dru mu l de la nodul i la nodul j trece prin nodu l intermediar k 3 1 1 0 1 0
(drumu l treee de la nodul i la nodul k si de la nodul k la nodul 4 0 0 0 0 1
J), atunci el ementului a [i] [j ) i se va atribu i valoarea 1. 5 0 0 0 1 0
k=1 k=2 k=3
2345 2 345 1 2 3 4 5
1 0 1 0 0 0 1 0 1 1 0 0 1 1 1 1 CeQ-
2 0 0 1 0 0 2 0 0 1 0 0 2 1 1 1 1 IQ
3 1 1 0 1 0 3 1 1 1 1 0 3 1 1 1 1 0
4 0 0 0 0 1 1 1
5 0 0 0 1 0
4
5
0
0
0
0
0
0
0
1 0
4
~ - ~- 0 0
5 0 0 0 0
"
k=4 k=5
2 3 4 5 2 3---- - - 4 5
- - -- - - - ~ - - _ .
1 ~ 1 1 1 0 1 1 1 1 1 1
2 1 1 1 1 0 2 1 1 1 1 1
3 1 1 1 1 0 3 1 1 1 1 1
4 0 0 0 0 1 4 0 0 0 1 1
5 0 0 0 1 1 5 0 0 0 1 1
I n f orm al ica 223
Interpretarea datelar din matricea obtinuta in urma transfo rma rilor se lace astfe l: exista
drum de la nadul i la nadul j daca a [i 1 [ j 1~ 1. De exemp lu, exista drum de la nadul 2
la nadul 4 . dar nu exists drum de la nadul 4 la nadul 2.
Implem entarea alg oritm u l ui. Se citeste din fisieru l graf20.txt matricea de adiace nta a
unui gral oriental. Se afiseaza toate perechile de naduri din gral intre care exista un
drum . Functia ci teste () se foloseste pentru a citi matricea de adiacenta din fisier,
Functia transforma () S8 foloseste pentru a transforma matricea de adiacenta in matri-
eea drumurilor. Matricea de adiacenta va suferi n transforrnari succesive (pentru fiecare
noua valaare a lui k) , astlel: fiecare element a [i 1 [ j], cu Leek ,i j"k , este inlacuit cu
valoarea produsului a [iJ [k ] *a [k] [j] - ceea ce este echivalent cu a atribui valoarea 1
acestui element daca ali ] [k]~l, i a rk] [ j]~1. Functia afiseaza() se foloseste pentru
a afisa toate perechile de noduri i !?i j intre care exists drum. Aceste perech i sunt identificate
in matricea drumurilor ca fiind indicele pentru linie si indicele pentru colcana ale elemente Jor
care au valaarea 1. Pentru testarea pragramului se Ioloseste graful arientat G" .
#i nclude <fs t ream .h>
int a[20 ] [20],n ;
fstream £( " g r a f 20. txt " f Lo s : : in ) ;
void cit es te() {l i se c i tc~ te mat r i cea de ad iacent5 din f i~ ie r }
void t r e ns tc rme () .
{for (int k=l; k<= n ; k++}
for {int i = l; i <= n; i + + )
for{int j = l ; j<=n;j++ l
i f {a [ i ] [ j]~ ~ O && .il e k && j! ~ k ) a li. ] [ j ] ~ a [i. ] [k] *a[kl [j ] ; )
vo id a f i ae a z a t)
{c o ut« " Ex i s t a drum intre perechi lede nodilri " « e nd l ;
for (int j.::-""l,- i<=n ;i ·i+)
f or (int j =l ; j <"-" n;j++-}
i f (a [i. ] [ j ] ~ ~ l && .i ! ~j) cou t;e ;e;" ( " «i.« " , "« j «" ) "«" " ; )
voi d main() { c i.te s t. e t L : t. c a n a r o r ma ri . a f Ls eaz a Ll : }
~
' - - "
I
'~
'
-7 rnult imea muchiil or este U23 ={[1 ,2J , [1,4J, [2,3J, I 1 "2 \
I
I
1 5
6 \ _ ...
It@\
[2,4J, [3,4J . [5,6J , [5,7J}. I I .... ,/
nu este con ex, deoarece nu exista niei un lant intre un \. 4 3 / \ . __ ~ " I C3
nod din rnultirnea C,={ l ,2,3,4} ~ i un nod din multi rnea
-_ ... -'
C1 C2
C2={5,6,7}, sau din muttimea C3={8}.
Fig . 27
Daca un graf G=(X,U) nu este conex, se poate defini un
subgraf conex al grafului G, adica se poate defini a rnultirne X'eX care sa indues subgraful
G'=(X',U'), ce are proprietatea ca este conex .
Dac a un graf G=(X,U) nu este co nex, se nurn est o componenta conexa a grafului un
sub qraf co nex al sa u C=(X',U'), m aximal in rap ort cu aceasta pro prietate [contine
numa rul ma xim de nod uri din G ca re au proprietatea di sunt legat e cu un lant},
Altfel spus, subgraful conex C este a components conexa a grafului caca are proprietatea ca
nu exists nici un lant, al grafului G, care sa uneasca un nod x, al subqrafului C (X, EX') cu un
nod x, care nu apartine subgrafului C (X,EX-X').
Observ ati e: Un graf conex are 0 sinqura cornponenta conoxa (grafuJ insusi).
Exemplu - i n graful neorientat G23 definit anterior, fiecare dintre cele trei rnultimi de noduri,
C l , C2 si C3 , induce cate 0 components conexa .
Daca un graf este defin it prin multimea nodurilor si rnultirnea muchiilor,
-7 rnultirnea nod ur ilor este X23={1,2,3,4,5.6,7,8}.
-7 rnul tim ea m uchiilor este U23 ={[1Z], llAJ, [231. [2.4J , [3.41, [~'§l , [~J} .
pentru identificarea componentelor conexe, procedati astfel:
PAS1. Se formeaz a prima components conexa , pornind de la prima muc hie. Se scriu
nodurile incidente cu muchia i n prima cornponenta conexa - C,={l ,2} - ~ i se mar-
che aza rnuchia: [12]. Componenta conexa C l este componenta cure nta.
226 Implementa rea struetllri lor de date
PAS2. Se parcu rg celelalle rnuchii. Dad; se qaseste a much ie nernarcata, care contine
noduri din com ponenta conexa curenta, 58 adauqa nodu rile la cornponenta :
,i
C,; {1,2,4,3), se rnarche aza much ia: [11], ~ , !L±], QAj.
PAS3 . Daca rna! exista much ii nemarcate , S8 identifica prima muchie nernarcata si S8 formea-
za urrnatoarea componenta conexa, scriind nodurile incidente cu muchia - C, ;{5,6} -
~i S8 rnarcheaza mu chia: [5•.6.1. Componenta conexa C 2 este componenta curenta.
PAS4. Se parcurg celela lte muchii. Daca se gase, te a muchie nernarcata care contine
nod uri din componenta conexa curenta, S 8 adauqa noduri le la cornponenta:
C,;{5,6,7} si se marcheaza muchia: [w.
PAS5 . Se executa Pasul 3 ,i Pasul 4 pana se marcheaza toate muchiile, ldentificand
urrnatoarete componente conexe .
PAS6. Se verifica daca t0 3 t8 nodurile din rnultirnea nodu rilor 58 reqasesc i ntr-o components
conexa. Daca exists noduli care nu apartin unei componente conexe, acestea sunt
noduri izolate, , i vor forma, fiecare dintre ele, a compcnenta conexa. C3 ;{8}.
Teorema 15
Numarul minim de muchii mmin necesar e pentru c a un g ra f neo rient at, eu n n o du r i . s a f l e
Pn - Graful G n, cu n noduri ;;i n-1 muchii, este conex ~i min imal cu aceasta pro prietate (se presupune
adevarata ).
P n+1 - Considerand prcpozitia Pn adevarata . trebuie sa demonstram ca grafu l G n+1 , cu n+1 noduri ~i
n+2 muchi i, este conex 9i m inimal cu aceasta propr ietate. Prin adauqarea un ui nod s! a unei mucb li la
grafu l G n, se poate obtine un graf con ex . Nod ul adauqat se leaqa cu much ia noua de graful G n (;;i,
im plicit, la lanturile din acest graf) , obtinandu-se un nou graf con ex . Presupunem ca
graful obtinut nu
este min imal cu aceasta propri etate. Inseamna ca, pr in eliminarea une i much ii, se obtine un graf
conex. Daca eliminarn muchia adauqata, se izole aza nodul n+ 1, cbtina ndu-se doua com ponente
cone xe . Daca se elirni na a much ie din graful G n, se obtin dOU8 comp onen te conexe, deoare ce graful
G n est e m inima l cu aceasta proprietate . Rezulta ca
graful G n este minimal cu aceasta proprietate .
Propozitia 4 . Daca un graf cu n noduri are p compo nente conexe , atunci nurnarul minim
de muchii care trebuie adauqate , ca sa devina conex, este p-1.
Demonstratle Putem considera fiecare cornponenta conexa ca un nod a! unui graf cu p nodun.
Numaru! min im de muchii necesare pentru ca acest graf sa fie conex este p-1 .
Propozitia 5 . Daca un graf conex cu n noduri are n-1 muchii, atunci orice pereche de
noduri este leqata printr-un lant, ~i nurnai unul.
Dem onstratie - prin redu cere la absu rd. Graful G fiind conex , rnsc amna ca exista eel puttn un lant
care leaqa cricare dou a nod uri, x ~ i y . Presupunem ca exista eel putin dou a lantur i i ntre ncdurile x ~ i
y : L1 ~ i L 2. Insearrme ca . suprimand a much ie din lantul al do ilea. graful rarnane conex , deoa rece
nod uriIe x ~i y vor fi legate prin lantul L1. lnsearn na ca un graf cu n noduri s! n-2 muchii este conex ,
ceea ce cont raz ice Teorema 15. Rez ulta ca cele doua nodu ri, x ~i y , nu sunt legate decaf printr-un
singur tent
Propozitia 6. Daca un graf neorientat cu n noduri ~i m rnuchii este conex, nurnarul maxim
de much ii care se pot elimina pentru a obtine un graf partial conex este: m -n+1 .
Demonstratle. Oeoarece numaru l minim de much ii necesare pentru ca un graf sa fie conex este n-1,
atunei din graf se pot elim ina restu l much iilor: m-n+1 .
Teororna 16
Un graf neorientat conox cu n noduri ~i n...:.1 muchll este aciclic ~ i
maximal cu aceasta proprietate.
Demonstratle: Notam eele coua propozi tii, astte l;
(1) - Gra ful G neor ientat, cu n noduri, este conex ~ i are n-1 muchi i.
(2) - Gra ful G neo rientat , cu n noduri, este aciclic si maxima l cu aceas ta prop rietate
Trebuie sa dernonstram ca (1)::::>(2).
1) Este acieli c - prin reducere la absurd . Presupunem ca acest graf confine eel putin un ciclu.
C= lX l , X2 , X3 , ..., Xi, x, f. Insearnna ca, daca vom lnlat ura din graf muchia [x - . X2], se obtine un graf
conex - nodul va fi legat de toate celelalte nodu ri din ciclu prin lantul L :;; ~X2 , X3, ..., Xi, x- } - ceea ce
cont razice teo rema anterioa ra. CEl un graf cu n noduri ~i n-1 muehii este eonex si minimal eu
acees ta proprietate .
2) Este maximal eu acea st a pr opriet ate (daca S8 adauqa 0 noca mue hie, grafu l nu mai este
aciclic) - prin reducere la absu rd. Pres upu nem caprin adauparea une i m uchii oarecare [x,y], se
obtine un gra f aci clic. Graful fiind conex , tnseamna ca Intre nodurile x ~ j y exista un Ian! L(x,y) elx ,
.., z, ... , y:, tar prin adauqarea muchiei [x.yjlantu l se i nchide, torman d un ciclu Ceqx, ..., Z , . .. , y ,
x ) - ceea ee cont razice presupunerea ca gra ful este aciclic.
Propozit!a 7 . Daca un graf neorientat conex are n noduri ~i m rnuchii, nurnarul de much ii
care trebuie eliminate , pentru a obtine un graf partial eoncx aciclic , este egal cu m-n+1 .
n emon stratr e. Din Prop ozitia 6, rezutta CEl - i nlaturand din graf m-n+1 muchii - se obtine un graf
partia l conex , iar din Teo rema 16 rezulta ca acest graf este acidic. Graful fiind eonex , lnseamna ca
Intre oricare do ua noduri. Xi ~ i Xj , exista un lant elementar ~ i numai unu \ (Propozitia 5). Orice noua
muehi e [ Xi, Xj] adauqata va forma eu acest lant un ciclu elemen tar.
Propozitia 8 . Daca un graf are n noduri, m muchii si p compo nente conexe, nurnarul de
much ii care trebu ie eliminate, pentru a obtine un graf partial aeie lic , este egal cu m -n+p.
Demonstratie. Fiecare cornponenta con exa i (1:s:i ~ p) va avea nj noduri ~i m, muchii, iar:
228 Implcmcnt urcn st r ucru r ilu r d e <l ate
I'
:;;i 2)n j = 111 .
;"'1
Nurnarul de muchii care trebuie eliminate din compon enta conexa i, pen tru a obtine un graf part ial
cone x aciclic . este egal cu rn, - n: +1 (Propo zina 7). Rezulta ca
numarul total de rnuchii care trebuie
eliminate din grat, pentru a obfine gra f partial conex acidic, este egal cu :
I' II II
I(m,- n + I) = I
j ", 1
i
j "' l
Ill , - In, + P = m- 11 + "
i=]
Propozltia 9. Pentru a obtme, dintr-un gra! neerientat cenex, doua componente conexe,
nurnarul minim de muchii care trebuie inlaturate mm in este egal cu gradul minim din graf:
Hl mln = grad m in .
Dem onstrati e. Ce le d OUE! co m ponente conexe ale unui graf neo rientat con ex G=(X,U) S8 obtin astfel:
~ Componenta con exa C1=(X1,U1) S8 formeaza dintr-un nod izolat Xi - pent ru a elim ina un numer
minim de mucnu, nodul S8 alege dintre nodurile care au gradul minim: X, = {Xi } ~ i U,=0 .
~ Cam panenta conexa C 2=(X2,U2) se forrneaza din restul nodurilor din graf: X2=X-{Xi} ~i
card( U,}=rn-grad min
Teorema 17
Numarul maxim de muchii rnmax d intr- un graf neorientat , cu n noduri ~ i p componente
conexe, este :
m ( ,' ',-_- -'.1'_+:........:.
= -,-I,' ',-_- -'.I':.c)_x-,: 1)
ru3\ - 2
Dernon strati e - prin reducere la absu rd. Numarul maxim de rnuchii corespunde unor p-1
com ponente cone xe forma te din naduri izolate s! a cc mponenta conexa ferma ta cu n-p+1 nod uri.
Pentru ca sa se ab!ina nurnarul maxim de rnucttii. ultima componenta trebuie sa fie un graf comp let
+,
K n_p care are nurr-arul de much ii m:
(n -p ) x (n -p +l )
III :::0 "--'-"-7'---'--"-
2
Sa pres upu nem ca exis ta Ins a un graf format din p-2 componente conexe forma te din noduri izolate
~i cu dou a cornponen te conex e C, cu n, noduri ~i In,
muchii ~i C2 CU na noduri ~i 1n2 mu ch Ii, cu n , ~
n 2~ 2, n, + " 2 = n-p+2 care are numarul maxim de muchii m, + m z = m max Cele doua componente
conexe pe ntru a avea un numar maxim de muchii trebuie sa fie qrafuri complete: C, =K n1 ~i C2=K n2
Modificam ace st qraf rnutand un nod din companenta C2 i n componenta C, . in com ponenta C, acest
nod trebuie unit prin much ii cu cel e n, nod uri ale componentei. Nurnarul de muchii ale componentei
C, va fi m, + ", . in componenta C2 prin eurnmarea nodului. se inliHura ~i cere na - 1 rnuchii care iI
uneau cu celelate noduri din graf. Numarul de muchii ale componentei C2 va fi m 2- "2 + 1. Numarul
tota l de muchii al nou lui gra f esteIn, + n, + m 2 - ttz + 1 ~ 1n1 + m2 + 1 = m max+ 1. Concluzia
contrazice ipoteza ca gratu l initial avea nurnarul maxim de muchii. lnsearnna ca graful care are
nurnarul max im de muchii es te cel care conune p-1 compo nente conexe form ate din noduri izolate s!
o cornpcn enta conexa forrnata cu n- p+1 noduri care este graful complet K n_p +'.
2.7.7.6. Graful tare conex
Un gra! orientat G se nurneste gra! tare conex daca are proprietatea ca, pentru ori ce
perech e de noduri diferite i nt re ele, exi sta un drum care sa le leg e.
Aille l spus , un gra! orientat este tare conex caca - pentru orice pereehe de noduri { Xi, Xj} ,
ca re au proprietatea x /*Xj - exista un drum de la Xi la Xj.
Informatid 229
Exemple :
1. Graful orientat G20 = (X 20,U 20 ) , detinit anterior, este un graf tare conex, deoarece exista
un circ uit elementar care trece prin toate nodu rile grafulu i: (1,2,3,7,6,5,4 ,1): altfel spus ,
oricare ar fi doua noduri din multimea X 20 , ele pot fi legate pri ntr-un drum .
2. Graful orientat G' 4= (X' 4, U 24) - figura 28 - definit astfel: G'4
-7 multimea nodurilor este X' 4=(1,2,3,4,5,6).
-7 rnultlmea arce lor este U'4 =([ 1,2], [1,41, [2,31 , [3, 1], [4,5], [5,4]).
nu este conex, deoarece nu exista niei un drum lntre un nod - -, -,
din multirnea C, =(4,5} ~ i un nod din rnultimea C,=(1,2 ,3},
sau din rnultirne a C,=(6}.
Daca un graf orie ntat G=(X,U) nu este tare conex , se poate C3
,
defi ni un subqraf tare conex al grafului G, adica se poate
defini a rnultirne X'eX care sa induca subgrafu l G'=(X',U'), ce
, -
C1
-
are proprietatea ca este tare con ex . Fig. 28
Daca un graf G=(X,U) nu este cone x, se nurn este componenta tare conexa a grafului
un subgraf con ex C=(X' ,U') al sau, maximal i n raport cu acea sta propri etate [confine
nurnarul maxim de noduri din G care au proprietatea ca sunt legate printr-un drum ).
Altfel spus , subgraful tare conex C este 0 cornp onenta tare conexa a grafului daca are
propr ietatea ca nu exists niei un drum al grafului G care sa
uneasca un nod Xi al subqrafului
C (X;EX') cu un nod xJ care nu apartine subgrafului C (XJ EX-X') .
Exem plu - i n grafu l orientat G24 defini t anter ior, fiecare dintre cele trei multirn i de noduri -
C 1 , C 2 si C 3 - induce cate 0 cornp one nta tare ccnexa .
Observatie : Un graf tare conex are 0 sinqura cornponenta tare conoxa (graful insusi) .
Terminologie :
-7 Subqraful predecesorilor unui nod este format din ace I nod si din multimea noduri lor
din care este accesibil nodu l.
-7 Subgraful succesorilor unui nod este format din acel nod si din rnultirnea noduri lor
care sunt accesibile din el.
Observatie: Componenta tare conexa di n care face parte un no d este data de
intorsectla dintre subgraful predecesorilor l?i subgraful succesorilor ace lu i no d.
Daca un graf este definit prin multirnea nodur ilor si rnultimea muchii lor,
-7 multirnea no duril or este X 24=(1 ,2,3,4,5,6).
-7 multirnea arcelor este U'4 =([1 ,2], [1,4J, [2,3J, [3,1], [4,5], [5,4]).
pentru identi ficarea componentelor tare conexe procedati astfel:
PAS1. Se identifica subgrafu l succesorilor primului nod din primu l arc (1n exe mp lu, nodu l
1), folosind algo ritmul de deter minare a unei componente conexe: S, =(1 ,2,3,4,5).
PAS2. Se ide ntifica subgraful predecesorilor primului nod din primul arc (i n exemp lu,
nodul 1), folos ind algoritmul de determinare a unei componente conexe , in care
se iau i n calcu l num ai nodurile care apar in arc in a doua pozitie: P1={1,2,3}.
PAS3. Se determine com ponenta ta re conexa - prin intersectia celor doua rnult imi de
noduri: C ,= S,n P, ={1 ,2,3).
PAS4. Se identifica, in multimea arcelor, primu l nod care nu face parte din compone nta
tare conexa evidentiata anterior (in exemp lu, nodul 4) ~ i se reiau Pasul 1, Pasul 2
si Pasul 3, pentr u a determina subgraful succesorilor, respecti v subgraful predece-
230 Im p lcrncn ta rca stru ct ur ilor dc date
sorilor nodul ui si apoi urmatoarea cornponenta conexa . prin intersectia celor doua
rnultirni (in exempl u, nodul 4 ~i S2={4,5), P2={1 ,2,3 A, 5} ~i C2= S2" P2 ={4,5)). Se
repeta acest pas pana cane nu S8 mai identifica in rnultirnea arcelor niciun nod
care sa nu apartina unei componente tare conexe.
PAS5 . Se verifica daca toate nodurile din rnultimea noduri lor se reqasesc intr-o
components tare consxa. Daca exista noduri care nu apartin unei componente
tare canexe, acestea sunt noduri izolate - si vor forma , fieca re dintre ete 0
com pone nts conexa. C,={6}.
Graful componentelor lare conexe ale unui graf care nu esle l are c onex G=(X ,U)
58 obtine prin reducer ea fiecarei co m ponente conexe la u n no d.
Identificarea grafului componentelor tare canexe este utila in rezolvarea uno r prob leme,
prin descompunerea problemei in subprobleme (rezolva rea problernei pentru fiecare com-
ponenta tare conexa) ~i combinarea solutiilor - strategia di vide et im pera.
Exe mplu:
T'C,c ~ .", in graful oriental G25= (X25,U'5) - figura 29 - definit astlel :
~ mult imea no durilor este X 25={ 1 ,2,3A ,5,6,7}.
~ multi m ea arce lo r este U' 5 ={[1.2], [1 A], [2,3], [3,11, [4,5],
[5,61, [6A ], [7,5J, [7,3]} ,
1i':';\ Gc" componentele tare conexe sunt C , ={1,2,3), C,={4 ,5,6} ~i C,={?}, C3
.'. iar graful componentelor tare conexe Ge2S = (Xe2S ,Ue2S) - figura Fig . 29
30 - este definit astfel.
~ mu lt irnea nodurilor este Xc 25={ C C" C,} .
~ rnultirnea arc elor este Uc25 ={[ c, " C2], [C " C , I, [C " C z]}.
fo r ( y ~ l; y < = n ; Y + - 1
if (x!=y l (este =O; bt l );
if {e s t e ) { v [ y } ""l; cout-ccy-;c" " ;}}
cout«endl ;}}
void main() t c Lce s t e t j • componente () ;}
3. Detenn inar ea com pon entelor tare co nexe in tr-un graf orien tal.
Algo ritm ul. 0 cornponenta tare conexa este fermata din toate nodurile i ~i j intre care
exista un drum elementar de la nodul i la nodul j , dar ~i de la nodul j la nodul .i.. Se
foloseste un vector cu n elemente, pentru a memora nodurile care au fast deja inregistrate
i ntr-o cornponenta tare conexa . Initial, elementele vectorului au valoarea 0 (nici un nod nu a
fast inregistrat intr-o cornponenta conexa), iar daca un nod L va fi adauqat la a cornponenta
conexa, valoarea elementului i din vector va fi 1. Pentru a verifica daca exista un drum
elementar de la nodul .i, la nodul j , se pot folosi doua variants ale algoritmului:
Vari an ta 1. Se fo losese metoda backtracking.
Imp lementarea algo ri tm ulu i. Se citeste din fisierul graf20.txt rnatricea de adiacenta a unui
graf orientat - ~i se determina daca graful este tare conex. Oaca nu este, se afiseaza compo-
nentele tare conexe. Variabila e s t e l se foloseste pentru a verifica daca s-a gasit un drum
elementar de la nodul i la nodul j (are valoarea a- False , daca nu s-a gasit un drum ele-
mentar), variabila este2 se foloseste pentru a verifica daca s-a gasit un drum elementar de
la nodul j la nodul .i. (are valoarea a - False , daca nu s-a gasit un drum elementar), iar
variabila e s t e se foloseste pentru a verifica daca s-a gasit un drum elementar de la nodul x
la nodul y (are valoarea a- False , daca nu s-a gasit un drum elementar). Tn vectorul v se
rnemoreaza nodurile care au fast deja in registrate intr-o components tare conexa. Variabila m
se foloseste pentru a numara componentele conexe identificate. Functia c i. te ste () se folo-
seste pentru a citi matricea de adiacenta din fisier. Functia c omponen te () se foloseste pen-
tru a afisa camponentele tare canexe ale grafului: pentru fiecare nod i (1.$.i.$.n) care nu a fost
afisat intr-o cornponenta conexa (v [ i ] =0 ), se cauta toate nodurile j (1,;j';n ~i j;ti) care sunt
legate cu un drum elementar care porneste din nodul i , dar !?i de la care porneste un drum
care ajunge i n nadul i . Pentru un nod j qasit, se rnarcheaza in vectarul v faptul ca a fast
adauqat la a components tare conexa (v [ j J =1). Pentru testarea programului se foloseste
graful orientat G'2.
III form a tid 233
#inc lude <fs t r e a m. h >
typedef st i va [ l OOI ;
int a[20 } [20J , n, k ,us ,ev , x , y ,v[2 0 J , c s t e l, e s t e 2, e s t e -= O;
s t L va s t :
f stream f( " g r a f1 9 . t x t " ,io:s : :i n };
v oid c i t e ste() {l i s e c i te ~t e mat r i c e a d e adiac en ;a di n f i s i e r }
void i ni t() {/ I :"de n t i c a ell cea d e la afi~a :-e a drumur i l o r elementa re }
int succ e s o r() {/ I i den t i ca cc cea de 1a afi 9 a ~e a d rumurilor elementa re }
in t va l i .d () { / / Ident i.ca eil c e a de la af i s e ree d rumurilor e Lemen t e r e I
int ao Lu t i.e L) {re t urn s t[k] ===OY i }
lI se ob t i n e solutia atune i cand ultimul nod adaugat in stiva este y
vo i d t Lpe r () {e s t e = 1;)
// d a c3 ex ista s olu~ ie (u n d ~um intre nodurile x $i y j ,
// va r i a bi l a este va avea val oarea 1
void bt ( ) { / i i d c n t i c 5 ell cea de La af i s ar-ee d r umu r i.Lo r e Lemen t e r c }
void coxponen t e ()
l i n t i ,j , m=O i
fo r ( i = li i <= n; i + + )
if ( v[ iJ ~~O)
{m+ + ; v [ i ] = l ; cou t c c vCc mp o neri t a co ne x e " <c mc -cv : " <x i c c " II.
for ( j = l ; j <= n ; j t + )
i f (j ! ;;o: i )
{z = i; y = j ; s t l l l e x • cstc;;o:O ; b tl) ; c s t.c l. ee s t e :
x = j; y .... i : s t j l j ex : es te=O ; bt (} ; e ste2=este ;
if (estel & & E: 3 ': e 2 ) {v[j ]=l; cou t c -cj c-; " " ; }}
cou t « e n d l ; } }
voi d ma i n () {c .i teste () ; component.e () ; )
Var ianta 2. Se fotoseste matricea drumurilor. 5e deterrnina dOU8 matrice ale drurnurilor:
una corespunzatoare grafului G ~i alta core spunzatoare unui graf i n care toate arcele au
sensu l invers decal i n graful G (Gt - graful lranspus al grafu lui G). Din intersectia celor
doua matrice, se va obtme 0 matrice in care vor fi evidentiate numa i drumurile care exista
in ambe le sensuri, intre oricare doua noduri i ~ i j .
Pent ru graful Gn din figura 26, prin inversarea arcelor se obtine ~ _ . G22t '~
graful transpus G22t din figura 3 1. Malricele de adiacenta ~ i matri-
~
cele drumurilor pentru cele dou a grafur i ~ i matricea intersectie sunt
preze ntate ma i jos.
Matri cea de adiacenta G22 Matricea d rum u ri lo r G22 Fig. 31
1 2 3 4 5 1 2 3 4 5
1 0 1 0 0 0 1 1 1 1 1 1
1 1 1
1
~ 1 1
2 0 0 0 2
3 1 0 0 1 0 3 1 1 1 1 1
Matri cea intersec tie
4 0 0 0 0 1 4 0 0 0 1 1
1 2 3 45
5 0 0 0 1 0 5 0 0 0 1 1
1 1 1 1 0 0
1 1 0 0
Matricea de adla ce nta G22t Matricea drumu ril or G22t
2
3
e-!-
1 1 1 0 0
1 2 3 4 5 1 2 3 4 5 4 0 0 0 1 1
1 0 0 1 0 0 1 1 1 1 0 0 5 0 0 0 1 I 1
2 1 0 0 0 0 2 1 1 1 0 0
3 0 1 0 0 0 3 1 1 1 0 0
4 0 0 1 0 1 4 1 1 1 1 1
5 0 0 0 1 0 5 1 1 1 1 1
234 Implem enta re a structurilor de d a te
Interpretarea datelor din mat ricea intersectie se tace astfel: doua noduri i ~i j fac parte
din aceeasi cornponenta tare conexa - daca exista drum de la nodul i la nodul j
(a [i] [j] ~ 1) . Pe matricea intersectie se pot identifica cele doua componente conexe :
C1={l, 2,3} ~ i C2={4 ,5}.
Im pl ementarea algoritmului . Se citeste din fisierul graf20.txt matr icea de adiacenta a a
unui graf orientat. Se foloseste matricea ap in care S8 rnernoreaza arcele i n sens invers si
matricea drumurilor obtinuta din aceasta. Pentru a identifica nodurHe i si j intre care exista
un drum atat de la nodul i la nodul j , cat ~i de la nodul j la nodul i , se obtine matricea b
care este intersectia celor doua matrice ale drumurilor: a ~i ap. Functia ci teste ( ) S8 folo-
seste pentru a citi matricea de adiacenta din fisier. Functia transforma_ s ( ) S8 foloseste
pentru a transforma matricea de adiacenta a in matricea drumurilor, iar functia
transforma_p () pentru a transforma matricea de adiacenta ap in matricea drumur ilor.
Functia intersectie () se foloseste pentru a obtine intersectia celor coua matrice ale
drumurilor. Functia compone nte () se foloseste pentru a afisa camponen tele canexe ale
grafului: pentru fiecare nod i (15i5n) care nu a fast afisat Intr-o components conexa
(v [i] =0 ), se cauta in matricea intersectie a drumurilor b toate nodurile j (lSjSn ~ i jo'i) la
care ajunge un drum ce porneste din nodul i. Pentru un nod j gasit, se marcheaza in
vectorul v faptul ca a fast adauqat la a cornponenta tare conexa (v (j] ~1 ) . Pentru testa rea
programului se toloseste grafu l orienta t G".
#include <fstream .h>
typedef s t i va [lOO j;
int a[20] [20 ] , n , v [20] ,ap[lDJ [ l D] , b [ l D] [ l O] , n r;
fstrearn f( "g re f19 .txt " , i o s : :in );
void c Lt c c t e () { / Isecite;;;te mat r i cee de e d i a cen t a di n .f .i e .i.er l
void predecBso r()
{for (int i = l ;i<~n ;i++)
for l i n t j=l ;j<=D ;joHl april [j )=a[ j] I i ] ; }
vo.i.d vtr arre f'o rrne s.I )
j
Vizitarea sau traversarea unui graf este operatia prin care S8 parc urge graful trecandu -se
de la un nod i (nodu l curent) la nod uriIe vecine lui, intr-o anurnita ardine , in vederea
prel ucrarii inforrna tiilor asocia te nodurilor. Pentru parcurgerea grafurilor , exista urrnatoa-
rele doua metode :
1, Metoda d e p arc u rge re "i n latirne" - Breadth First (BF ). Se viziteaza mai Intai un nod
initial i, apoi vecinii acestuia . apo i vecinii nevizitati ai acestora, 9i asa mai departe -
pana cano se parcurg toate nodurile grafu lui.
2. Meto d a de parcu rg er e "in adancime" - Depth First (OF ). Se viziteaza mai Intai un
nod initial i , dupa care se parcurge primul dintre vecinii sai nevizltati, de exemplu j, dupa
care se trece la primul vecin nevizitat al lul j , ~i asa mai departe - pana cand se parcurge
Tn adancime ramura respectiva. Cand s-a ajuns la capatul ei, S8 revine la nodul din care
s-a plecat ultima data, ~i S8 parcurge urrnatorul sau vecin neviz itat.
' G" Ex em pl u - pentru graful neorientat G" = (X'6,U'6) - figura 32 - definit astlel:
-7 mu lt irne a noduril or este X26={1 ,2,3,4,5 ,6,7,8,9j.
-7 rnu ltirnea rn uchiilo r este U26={[1,2], [1,3], [1,4], [2,5], [3 ,5], [3 ,6],
[3,7], [4 ,7], [5,8] , [6,8J, [6,9]}
Graful G' 6 poate fi parcurs astfe l, pornind din nodul 1:
1. In cazul metodei de parcurgere SF - "in la\ime", vor fi parcurse pe rand Fi g. 32
nodurile:
1,2, 3, 4,5 , 6, 7,8 ,9
2. I n cazul metodei de parcurgere OF - "in adancirne", vor fi parcurse pe rand nodu rile:
1, 2, 5, 3, 6, 8, 9, 7, 4
v iz itat I I I • ! ' ! ! I U I U ! U I U I
10
C
10
C
viz i ta t '--'--'--::--.J'---:--'--'--'-O--'--:--'_,O--'--:--'---'o----'
10
c
Prelucrarea nodului: prim=5 ~ ul tim=B .
viz i ta t '--'--'--::--.J'--:---'---'--'-o--'--:--'_,o--'--:--'_,,:-,
10
c
Pr elu c rarea nodului : prim= 6 e> ul t i m= 9.
v iz i ta t L--'---'----'----.JL--'-----'-----'-----'_-'----'-----=---'_,-'----L----=---'- '------'
10
c
viz i ta t '--'--'--::-~'---:---'---'--'-o--'--:--'_,o--'--:--'_,':-'
10
c
prim= 9 :..:::- u l tim=9.
10
Algo ritmul const a in eliminarea unui nod din coada de asteptare "i adauqarea vecin ilor
(succeso rilor) sai in coa da de asteptare. Fiecare nod va fi adauqat i n coada de asteptare
o data si, prin urmare, va f eliminat din coada de astepare 0 sinqur a data. Comp lexitatea
operati ilor de eliminare a celor n noduri din coada de astept are este O(n). Pentru a
adauqa noduri la coada de asteptare, sunt exarninati vecinii (succesorii) nodului curent.
Vecinii (succesorii) unui nod sunt exarninati 0 sinqura data , atunci cane nodu l este
eliminat din coada de asteptare. Nurnarul total de vecini exarnina ti este egal cu m -
nurnaru l de much ii (arce) ale gra!ului. Complexitatea operatiitor de adauqa re de noduri
este O(m). Comp lexitatea algoritmului este liniara O(m+ n).
f s tr e a rn f {"graf 21 . t xt " , i o s : : i n) ;
voi d c Lt e s t e t ) { l i s e c i t e s t;e matriceade ad Lac.ent a din f i$ ier )
void z e r o() {for (i n t i=l ; i<=n;i++) {v i z i t e t Li.L e O', p[il = D; }}
void i n :if(i n t k ) { p r i m = u l: t 'L m ~ l ; e [;Jl t i rn] .:= k ; '.Ii z i t a t lkl = l ; p [k ]= O; }
int es t e j v i de () {return u L t i.mcp.r Lm r }
void a d aug( i n t i , int }c) {u l t i rn+ +; c lu l t im j-e i , v i zi t .at Li l e l. : p[iJ .=k ; }
vo i d p r e l u c r a r e ( )
{i n t i ; kvcLp r jm l •
f o r (i;;;ol ;i<= D i i + -l ) i f L j a k ] [ &&1 ] i lt t
= = 1 vls.e
z a L i L i kr ,
O ) a d a u q l
prim++ ; }
void a r i s a re ( )
li nt i ,j , e st e , y ,d[lO ) ;
cou t-c-c't Drumu.I minim car e po rn e s t e d .i n 'no d u I " « x« " : " <xe n d.l :
for {j =l ; j <e n : j+ + )
i f ( j !=x )
{cout«" p a ~ a 1a nodu2. "« j«" : ";
for (:L=l , c s t e = O; i <= u l t i m && ! est e;i++ ) if (c[il==:i) es t e v l :
if (c ste=~: ) {y =p [j ]; i=O ;
while ( '1) ( i t +; d[i }=.y ; y =-p [ y] ; )
for (;i>=l ;i- - ) cout« d [ i ]«" "« j«" "; }
else cou t.-oc vri u ex i.s t a d rum " ;
cout« endl ; }
cou t«endl; }
void main ()
{ c Lt.e s t e () ;
cou t-ocv Dr-umu r i.L e d e Lunq Lme mi nimaintr e doua nodu r i. sunt : "<Xe rid.L:
f o r (x =l ;x<=n ; x ";-+ ) { z e r o {); ini t(x) ;
while ( ! e s t;e vida ()) p re Lu c r a r e () ;
a f isar e () ; } }
v iz i tat I 1 I 1 I 1 I 0 I 1 I 1 I 1 I 1 1 I
1 2 3 4 5 6 7 8 9 10
st 1 I 2 I 5 I 3 r--7 I I I I~
Prelucrarea nodului: v f _4 e> vf=5 .
vi zi tat I 1 I 1 I 1 I 1 I 1 I 1 I 1 I 1 1 I
1 2 3 4 5 6 7 8 9 10
st 1 I 2 I 5 I 3 I 7 I 4 I I II~
Prelu crarea nodului: v f= 5 ::::::> v f =6.
vizi tat I 1 I 1 I 1 I 1 I 1 I 1 I 1 I 1 1
1 2 3 4 5 6 7 B 9 10
st 1t~1 5D~ 1 4 I I
Prelucr area nodului: vf= 6 ::::::> vf=S .
v izitat 0 I 1 I 1 I 1 I 1 I 1 I 1 I 1 1
1 2 3 4 5 6 7 8 9 10
st LlJ 2 I 5 I 3 I 7 I I I
Prelucrarea nodului: vf= 5 :::::;. vf=4 .
v i zitat C1 I 1 I 1 I 1 I 1 I 1 I 1 I 1 1
1 2 3 4 5 6 7 8 9 10
st 1 I 2 I 5 I 3 I I I I
Preluc rarea nodului: vf- 4 ::::::> v f- 3 .
viz ita t I 1 I 1 I 1 I 1 I 1 I 1 I 1 I 1 1
1 2 3 4 5 6 7 8 9 10
st 1 I 2 I 5I I I I I I
Prelucra rea nodului: vf::::: 3 c> vf=2 .
III forma t icii 243
vi zi t a t I 1 I 1 I 1 I 1 I 1 1 1 1 1 I 1 1 1
1 2 3 4 5 6 7 8 9 10
st I 1 I 2 1 1 I 1 I I
Prelucrarea nodului: v f- 2 => vf- l .
v izitat I1 I 1 I 1 I 1 I 1 1 1 I'1 I 1 I 1
1 2 3 4 5 6 7 8 9 10
st I 1 I 1 I I 1 I I 1
Prelu crarea nodului: v £ = l => vf=O. Term in ar e : vf=O
Pentru implemen tarea algoritmului se folosesc subprogramele:
-7 functia procedurala c i t e s t e creeaza matricea de adiacenta prin prel uarea informa-
tiller din fisierul text f ;
-7 functia proce durala ini t lnitializeaza stiva cu primul nod vizitat;
-7 functia operand este_vida testeaza stiva daca este vida;
-7 functia procedural a adauga adauqa un nod la stiva:
-7 functia proced urala el imi n a elirnina nodul din varful stivei;
-7 functia procedurala pre l u crare prelucreaza nodul din varful stivei: cauta primul
veci n nevizitat ~ i dac a gas e~te un astfel de nod, i l afiseaz a ~i i l adauqa in stiva:
altf el, nodul din varful stivei este eliminat (nu mai are vecini nevizitati) :
Pentru testarea programului se foloseste graful neorientat G 26 a carui matrice de adia-
cents se citeste din fisierul text gra f2 1.txt.
Obs ervati e. Pentru grafurile orientate, i n functia p relu cra re () conditia structurii repetitive
whil e este: Lc en s s I la[ k] [ iJ ~ ~O I I ali] [ k J~~O) i l I(a[ k ][ i ] ~ ~ l I i
a l i ] [k] ~ ~ l) && v Lz i r e t l i l e s Lj )
int n ,a [l O] [l Ol ,v i z i t a t r2 0 J ,st f2 0 1 ,v£ ,k ;
fs t ream f ( " g :-a f2 1 . t x t " l i a s : : in ) ;
v o id c i t e s t e() { l i s e c Lt es t e matricea de ad i acen t.a din f i.s i.e r I
vo id i nit ( i n t k ) { v f = l ; s r Iv f l e k r vi z itat[kJ =l ; }
i nt este_ v ida ( ) {r e t u r n vf==O ; }
v o id adauga {i n t i ) {v f ++ ; s t[vf]=i ; vizitat[i] =l ; }
v oid el i mi n a () { v f - -;}
vo i d preluc ra re( )
t i n t i.= l; k=st (v f ] ;
while li< ~ n && (a (k ] [ iJ~~O II la (k] [i] ~ ~l && v.i z i t a t l Ll e -e ll l ) i ++ ;
if (i==n+ l) e limi n a ( ) : e lse {cou t« i«" "; adau g a(i ); } }
v oid ma in ( )
{c i t e s t e ( ) ; coc ti-oc't n odu I de p o r n Lr e : " ; cin» k ;
cou t «" No d u r i l e vlzitate prin metoda DF s u n.t : "«end l;
o ou ti-c-ck-c-c" " ; in it (k) ;
whil e ( ! e s t e _ v i d a() preluc rare() ; }
~ Prin parc urge rea in adancime a unui graf detenninati nodur ile
~ f tcnne ~ c are apart m aceleiasi componente co nexe, respectiv ~ubrafului
~ de succes o ri ai unui nod .
Complexitatea alg oritmului de parcurgere in adancirne
Algoritmul consta in extragerea unui nod din stiva ~ i adauqarea vecinilor (succesorilor) sai
in stiva, iar daca nu mai are vecini, nodul este eliminat din stiva. Fiecare nod va fi adauqat
in stiva a data si, prin urmare, va fi eliminat din stiva 0 sinqur a data. Complexitatea
244 Implemcnta re a st r u ct u r i lo r!l c date
operatiilor de eliminare a celor n noduri din stiva este O(n). Pentru a adauqa noduri in stiva
sunt exarninati vecin ii (succesorii) nodu lui din varful stivei . Vecinii (succesorii) unui nod sunt
exarninati 0 sinqura data , atunci cand nodul este extras din stiva. Numarul total de vecini
exarninati esle egal cu m - nurnarul de rnuchii (arce) ale gratului. Comple xitalea operatiilor
de adauqare de noduri este O(m ). Complexilatea algoritmului esle liniara O(m+ n)
a) Matricca costurilor rninlrne . Elementele arj ale matricei sunt definlte astfe l:
'{C' dac,aex. ista a m·uchie (un'.a.rc) T.,u. costul c ~i Ojntr~ nodurile i~i j, cu i *j
ai,j = • 0, daca 1= J . ' .t: .' ~ . ' .
"', daca nu exista a muchie (un arc) lntre nodurile i si j, cu i " j
.. . . .' -- . ~ . " .. < , . '. ',. >,-,. . '.-. . .- ";,,
248 Im plcm cn tarca st r uct ur ilor d e dat e
Fiecarei muchii (arc) care nu exista in gral i se asocia za 0 valoare lo arte mare, deoarece,
cautancu-se costul minim, acea sta muchie (arc) nu va mai
fi selectata. Deoarece pentru impleme ntarea matricei nu 1 2 3 4 5
1 0 4 3 00 00
S8 poate folosi simbolul 00, in locul lui S8 va folo si cea mai
mare valoare ce S8 poate reprezenta in calculator pentru 2 00 0 00 7 8
tipul de data asociat costului. 3 00 00 0 00 00
b) Matri cea costurilor maxime . Elementele a i,j ale rnatrice i sunt definite astfel:
c, dac_a ~xista 0 muchie (un arc) cu costul c > 0 intre nodu rile i si j , cu i " j
H i, i = O, daca 1= J
{
- 00 , daca nu exista a muchie (un arc) intre nodurile i ~i j, cu i ;C. j
Fiecare i muchii (arc) care nu exista in graf i S8 asociaza 0 valoare foarte mica, deoarece,
cautandu-se costul maxim, aceasta muchie (arc) nu va ma i fi selectata. Deo arece pentru
implementa rea matricei nu se poate l olosi simbolul - 00 , i n locu l lui se va lol osi cea mai
mica valoa re ce se poate reprezenta in calculator pe ntru tipul de data asoc iat costului .
a) Algoritmul Roy-Floyd
Al goritmul foloseste un principiu asernanator cu cel care a fast utilizat pentru determ ina-
rea matricei drumurilor: gasirea drumului optim intre doua noduri oarecare i si j prin
descope rirea drumurilor optime care iI compun si care tree prin nodurile k se face prin
transformarea matricei costur ilor . Matricea trece prin n transformari, in urma carora
fiecare element a [ i ] [ j] va me mora cost ul drumului minim dintre nodurile i si j .
PAS1 . Penlru etiche te ale nodului k de la 1 la n (adica pentru arice nod al grafu lui)
exec uta :
PAS2. Penlru arice pereche de noduri din graf i ~ i j (cu t s is n si t sj sn) executa:
i PAS3. Dac a suma dintre costul drumului de la i la k si costu l drumu lui de la k
i la j (a [ i ] [ k]+ a [ k] [jJ) este mai mica decat costul drumului de la i
! la j (a [ i ] [ jJ) , at unci in matricea costurilor cost ul drumului direct de
! la i la j este inlocuit cu costuI drumului ca re trece prin nodul k
i (a [ i ] [ j]= a li] [k J+a [ k ] [ j J) .
Pentru grafu l din figura 32 matricea costur ilar sutera urmatoarele cinci transforrnar i. La
fiecare transformare , daca drumu l de la nodul i la nodul j are costul mai mare decat
costul drumur ilor care trec prin nodul intermed iar k (de la nodul i la nodul k si de la nodul
k la nodul j) , atunci elementului a [ i] [ j] i se va atribui valoarea a t il [ k] + a [k] [ j] .
250 Implernentarea strueturilor de date
k=1 k=2 k=3
2 34 5 1 2 3 4 5 1 2 345
1 0 4 3 1 0 4 3 11 12 1 0 4 3 11 12
2 co 0 co
'"7 '"8 2 co 0 eo 7 I 8 2 co 0 7 8
3 co 5 0 eo 3 5 0 12 13 3 5
'"0 12 13
4 co co 4 0
'" 4
'"
co 4 0 1 ", 4
'"
co 9 4 0 17
5 2 6 5 2
'"0 5
'"
2 6 5 2 I 0 5 2 6 5 2 0
k=4 k=5
2 3 4 5 1 2 3 4 5
1 0 4 3 11 12 1 0 4 3 11 12
2 co 0 11 7 8 2 10 0 11 7 8
3 5 0 12 13 3 15 5 0 12 13
4 '" 9 4 0 17 4 19 9 4 0 17
5 '"2 6 5 2 0 5 2 6 5 2 0
Interpretarea datelor din matricea obt inuta in urma transformarilor se fac e astfe l: drumul
de la nodul i la nodul j are costuI minim a[ i ] [j ] . De exemplu , drumul cu costul m inim
de la nodu l 2 la nodu l la nodul 4 are costul minim 7. Matric ea nu furnizeaza informati i
des pre etichetele drumului cu c ostu l m inim .
Pentru im plem entarea algor itm ului se folosesc subprogramele:
-7 funct ia procedurala in it initializeaza matricea costurilor:
-7 functia procedurala c it ire actua lizeaza matricea costurilor cu date1e din fisier:
-7 functia procedura ta tra nsformare transforrna matricea costurilor;
7 functia procedural a afisare afiseaza lungim ea drumu rilor min ime i ntre toate nodurile
grafu lui.
#include < fstream .h>
int a[ lOO] [lOO],n ;
int canst MAX =5000 ;
f stream f ( " c o s t . tx t ", i o s: : i n );
vo i d init () { l i s e i n it i a l i zeaza mat ri cea c o s t u r i l or l
void citir e(} {l I s e actuali zea za mat r i cea costur i l or ell date l e din fi $ier }
v o id t r ans f o r ma r e ( ) li s e trans forma mat r i cea costu rilo r
{ f or (i nt k~l ;k<=n ;k++)
for {int i =l ;i<=n ;i++)
for (int j~l ;j<~n ;j++)
i f (a [ i J[ k ] +a [ k J [j]<a[i] [jJ) ali) [j]~a[i] [k]+a[ k) [j] ; }
v oid afisa re ()
{cout«" c o s t u l drumu r ilo r minime intre nodurile : "« e n d l;
f or {i nt i=l ;i<=n ;i+~)
fo r (i n t j=l ;j<=n ;j+ +)
if (a [ i J [jJ<f·1AX && i !=j) cout«" ("« i«" ,"« j«" )-"« a f i ] [j] « endl ; }
v o i d main ()
{i n i t {) ; citire() ; transf orrnar e ( ); a f isare{) ; }
lnformatiile din m atricea c ost urilor transformata prin algoritmul Roy Floyd se pot
fotosl pentru aver if ica daca ex.sta drum cu costul minim intre doua noduri ale gra-
fului , iar in ca z afi rmat iv , se poate atrsa lungimea lui ~i se poate descopcri drumul ,
Algoritmul de descoperire a drumului eu cost ul minim pornind de la matricea costurilor
transtormata foloseste acelasi rationarnent ca la transformarea ei: daca lungimea drumului
minim dintre noduriIe i ~ i j este eqala cu suma dintre lungimile minime a coua drumuri care
tree printr-un nod intermediar k (a [ i ] [k]+a[k j [j]=a[i] [j J). atunci nodul k face parte
Informa tica 25 1
din drumul de lungime minima de la i la l Deoarece problema pentru determinarea nodurilor
care forrneaz a drumul de lung ime minima S8 descompu ne in doua subprobleme: de terrnina -
rea drumului minim de la nodul i la nodul k (cu k" i) ~i determinarea drumului minim de la no-
dul k la nodul j (cu k.;j), in implementarea algoritmului se foloseste strategia divide et im pora
Pentru implementarea al goritm ului prin care se determina drum ul minim dintre doua
noduri x ~i y (a carer eticheta se citeste de la tastatura) se folosesc subproqra mele :
-7 fun ct ia procedurala init initializeaza matricea costurilor;
7 functia procedu rala citire actuali zea za matricea costurilor cu datele din fisier:
-7 func tia proced urala transformare transforms matricea costurilo r;
-7 func tia procedurala d r um deterrnina nodurile dru mu lui eu cost minim;
-7 functia procedu rala afisare afiseaza costul drumulu i minim ~i nodurile care torrneaza
drumu l;
#inc lude <fstream .h>
i nt a[lOO J [lOOJ , n;
iot const MAX=5000 i
fstream f{ " c o s t . t x t " , i o s: : in) ;
void i n i t ( ) {! /se initia lizeaz a me t r i.cee cos t ur i.Lo r l
void c i t i r e { ) { / I s t:: ectualLzeeze rnet r i cea costurilor cu da tele din fi$ier }
void t r a n s f o r ma r e ( ) { l i s e transformamatricea costuri lor }
void drum (i n t L . int j) // se de t e r mi. ne noduril e d rumu 1u i mi nim
{int k , qa s i.t :
for (k=l, gasi t=O ; k ee-n && l.qe s Lt , k+ +)
if l i ! ~ k && j !~kl && (a[iJJj] ~~ i1[ i}[k]+a[k J .lj Jl
{d r uml i , k ); ·d rum( k , ] ); gasi t = l ; }
if (!gasit) c ou t « j « " "i }
void a f i s a r e (int x , int y )
{if (a(x Jly ]<MAX)
{cout «" d r umu 1 minim d e 1a Dodul " « x «" 1a n o d Ul " « Yi
c ou t; c c" a re c o s t.u L "« a ( x] [y]« e nd l ;
cout « x «" H; drum{x ,y ) ; }
e lse cout « " Nu e xista d rum " ; }
voi d main()
{int x, y ; cout « " x = " i cin» x; cou t« " y = It; c in» y;
i n i t n; c itire () ; t.rensIorme re rj • a fisare(x,y) i }
Complexitatea alqoritrnului Roy -Floyd
Algoritmul de transformare a matricei costurilor are ordinul de complexitate O (nxnx n )~ 0 (n
3
)
deoarece fiecare structura repetitiva for se executa de n ori, iar structurile for sunt imbricate.
Algoritmu l de de terminare a drumurilor cu costul minim din matricea costuri lor transtorrnata
are ordinul de complexitate al algoritmului di vid e et imp era: 0(n xlg2n). Ordinul algoritmului
3 3
este 0(n )+ 0(n xlg 2n) ~ 0(n + nxlg2n) ~ O(n').
b) A lqoritm u l D ij k stra
Algoritmul lui Dijkstra construieste drumurile cu costuI minim care pornesc de la un nod
oarecare x - nodul sursa - pana la fiecare nod din graful G ~(X ,U) - nodul destinatie.
Algoritmul lntretine 0 multirne cu nodurile care au fost deja selectate - S, si 0 coada de
prio rita t i Q cu nodurile ca re nu au fas t selectate inca: Q=X -S, astfel:
252 Im ilcmcnturca st r u ct urilo r de date
~ Un nod y este declarat selectat atunci cand s-a det erminat costu l final al drumul ui cu
c ost ul minim de la nodu l sursa x la el. Selectare a unui nod nu este echivalen ta cu
gasirea drumului cu costul minim deoarece este po sibil ca in urma calc ula rii costului sa
rezulte ca nu exista drum de la nodut x la acel nod.
~ i n coada Q prioritatea cea mai mare 0 are nodul pentru care costul drumu lui are
valoarea cea mai mica dintre toate costurile de drurnuri care porn esc de la nodul x la
celelalte noduri nese lectate i nca. La fiecare extragere a unui nod din coad a de prioritati
Q , nodul este adauqat la rnultirnea S, iar coada de prioritati este reorqanizata i n functie
de acest nod (se recalculeaza costul drumurilor de la nodul x la noduril e rarnase i n
coada, co nside rand ca unele drumuri, daca tree ~i prin nodul extras, pot sa-si rnicso reze
costul). Pentru calcularea drumurilor de lungime minima S8
i ntretine 0 rnultim e 0 in care S8 rnerno reaza co stuI drumurilor de
la nodul x la nodurile neselectate, costuri care S8 reca tculeaza la
fieca re extragere de nod .
Drumul cu costul minim care porneste din nodul x este fonmat din
nodul initial x ~i creste pana cand coada de prioritati Q nu mai corinne
noduri. Deoarece, cele doua rnultirni S ~ i Q sunt disjuncte, iar
reuniunea lor este multimea nodurilor X, este suficient sa S8 in tretina
numai multimea S. Aigo ritmul foloseste strategia greedy , deoar ece
intotdeauna alege nodul eel rnai apropiat de nodul sursa x.
PAS1, Se initializeaza: S=8 , se citeste nodul initial x ~i se atribuie
multimiiS .
PAS2, Se initializeaz a multirnea D cu cost urile drumurilor de la nod ul x la toate celela lte
noduri ale grafului (sunt preluate din matricea costurilor elementele a [xl [i i ).
PA S3. Cat timp coada de prioritati Q nu este vida (mai exista noduri neselectate) ex ecuta
PAS4 . Se cauta printre nodur ile neseleetate nodul y cu eel mai mic cost al drumului
(reprezinta elementul care trebuie eliminat din coada de priorita\li Q) .
PASS. Se adauqa nodul y la rnultime a S: S=Su {y} (tnsea rnna extra gerea nodului y
din coa da de prioritati Q si declararea lui ca nod selectat ).
PAS6. Pcntru fiecare nod neselectat (nod din coada de prioritati) executa
i PAS? , Se recalculeaza costul drumului de la nodul x la acest nod folosind ca
J nod intermediar nodu l extra s.
i
PA sa, Daca acest cost este mai mic dedit eel din rnultirnea D, atunci el va fi
i noul cost.
Implementarea algoritmului. Se folosesc trei vector!
~ Vectorul s pentru rnultimea nodurilor selectate, definit astfel :
Pentru determinarea drumului cu costuI minim se executa pasii algoritmu !ui. Pasul 2 are
ordinul de complexitate O(n). Pasul 3 se executa pentru fiecare nod din graf, mai putin
nodu! sursa, deoarece fiecare nod trebuie selectat a data (se executa de n-1 ori). Pentru
In forma tic a 255
fiecare nod selectat S8 ana lizeaza cel elalte noduri , exec utandu -se : Pasul 4 de n ori (S 8
cauta printre toate cele n nod uri da ca mai exists in coada de prioritati, iar printre cele care
mai sunt in coada de prior itati S8 cauta nodul cu costu l drumul ui eel mai mic), iar Pasul 6 de
n ori deoarece treb uie identificate printre cele n noduri care mai sunt in coada de prioritati.
Ordinul de com plexitate al algor itmu lui f. entru dete rm ina rea drumului cu costu l minim va fi:
2
=
O(II )+O (lI x( II+ II)) = 0 (11)+0 (11 ) 0(11 ). In algor itmul pentru afisarea drumu lui sunt ana li-
zate toate cele II noduri ale grafu lui, iar pe ntru fiecare nod i se deter rnina recursiv drum ul.
Complex itale a algoritmu lui de afisare va fi 0(11) x 0(lI xlg211) = 0(1I 2xI92n).
Example: ,
1. Graful neorientat G4 definit anterior este un graf bipartit , deoarece exists , 1 ,
mult irnile A ~ iB care sa Indeplineasca conditiile din definitie : A = {1, 3, , ,
,
6,7,8, 10} ~ i B = (2, 4,5 , 9,11). Se observe ca : Au B = {1, 2 ,3, 4, 5, 6, 1 ,
7, 8, 9, 10, 11) = X4 ~i Ar>B=0 ~i ca fiecare muc hie uEU, ={[1,2J, [1,4] , 1
,
, ,
I
[2,3J, [3,4J, [3,5J , [5,6J, [5,7], [5,8J, [7,9]} are 0 extrem ite in rnultirnea A ~i
cealalta extremitate i n rnultirnea B: , ,,
, ,
[1,2) c> 1EA si 2 EB [1,4) c> 1EA si 4eB [2,3) "" 2eB ~i 3eA ,
[3,4) c> 3EA si 4 EB [3,5) <> 3EA ~i 5EB [5,6) "" 5eB ~i 6 EA , ' ,@
1 ,
,
[5,7) c> 5EB si 7GA [5 ,8) c> 5EB si 8EA [7,9) c> t e». ~ i geB ' @O' , ,
\ I
/
Obs erv ati e. Nodurile izolate pot face parte din oricare dintre cele doua
Fig .3 5
rnultirn i.
I II fo r III a tic ii 257
-,
2. Graful orientat Gg definit anterior este un graf bipartit deoarece exista '
mult irnile A ~ i B care sa i ndepllneasca cond itiile din definitie: A ; A ; (1. :
3, 4, 6) ~i B ; (2, 5). Se obse rva ca: AuB ; (1, 2, 3, 4, 5, 6) ; X g ~i I
AnB;0 si ca fiecare muchie UEUg; {[1,2J, [2,1J, [2,3], [2,4], [3,5], [4,2], :
[4,5J, [5,3], [5,6], [6,5]) are 0 extrernite in rnultim ea A ~i cealalta extre- I
mitate in multimea B: I
. I
[1,2] => 1EA ~ i 2EB [2,1] c> 2 EB si 1EA [2,3J => 2 EB ~i 3EA I ~
[2,4] => 2 EB si 4 EA [3,5] => 3EA si 5EB [4,2J => 4 EA ~ i 2 EB ,
I
[4,5] => 4 EA ~ i 5EB [5,3] => 5EB ~i 3EA [5,6] => 5EB si 6 EA
[6,5J => 6 EA si 5EB Fig . 36
Graful bipartit G ; (X,U) se nurn ests graf bipartit cornplet dac a - pentru
orice nod Xi EA §i orice nod xje B - exista 0 muchie (un arc) fe rmata din cele
doua nod uri care apartine rnultimii U; [Xi, Xj]EU,
Exemple:
1. Graful neorientat G,,;(X28 ,U' 8) definit astlel: X28 ;{1 , 2, 3, 4) ~i U'8;{[1,2]. ~3
[1AJ, [2,3], [2.3]) este un graf bipartit complet. deoarece exists multirnile A si B
care indeplineasc conditiile din definitie: A;{1 , 3) ~i B;{2, 4). Se observa ca: 2 4
AuB; (1 ,2,3A }; X, si A,,-,B; 0 si ca fiecare nod din rnultimea A este legat cu 0 Fig . 37
muchie de fiecare nod din multimea B.
2. Graful orientat G29 ; (X 29,U29) definit astfel: X29;{1 . 2. 3, 4) ~i U, g;{[1 ,2], ~ 2
[1,4J, [2,1], [2,3], [3,2], [4,3]) este un graf bipartit complet, deoarece exists G2~
rnultimile A ~i B care sa Indeplineasca conditiile din defin itie: A;{1 , 3) si 3 4
B;{2 , 4). Se observ e ca: AuB;{1, 2, 3, 4};X, si AnB;0 ~i ca fiecare nod .
din rnultimea A este legat cu cel putin un arc de fiecare nod din rnultirnea B. Fig . 38
Observatie. Graful neorientat bipartit complet se noteaza cu Ka,b ~ i are axb
rnuchii, unde a; c ard (A ) ~ i b; ca rd(B). De exemplu , daca graful neorienta! are 3 noduri,
S8 obt in urrnatoarele variante de grafuri bipartite complete:
cout«en d l ;
cout;c " Hu cb i i.Le sunt : " .
for {i=l ; i<=n ;i ++)
i f (a[il~~l)
f o r (j = l ;j<=n ;j-t+)
i f (a[jl==O & & i ~ = j) cout«" [ " « i « " , " « j « "] to;
cout«en d l ;} }}}
void main { } ( i n t n ; c out«" n uma r de nodu rL > 'I; cin » n ; c c n c r e re tnl r )
2. Ver ifi c ar ea un ui graf dac a es te graf biparti t .
Algo ritmul. Pentru a verifica daca graful este bipartit, se genereaza rnultimile de noduri A
~i B pan a cand ace ste mult irni i ndeplinesc conditia unui graf biparti t, sau pima cand s-au
generat toate multimile ~i nici una dintre variante nu a indeplinit condit ia pentru gra! ul
bipartit. Gra!ul este bipartit daca i ntre orice pereche de element e din cele doua rnultiml -
(x ,y), cu x EA si YEB - exis ta muchie care sa Ie lege in gra! ([X,y] EU). Pentru generarea
rnultirnilor de noduri A ~ i B se pot folosi doua variante:
Vari anta 1. Ca ~ i in algoritmul prece dent, se qenereaza ln tr-un vector toate submultirn i-
Ie care se pot obtine din cele n etichete de noduri (exceptand rnultirnea initiala ~i multi-
mea vida) ~ i se verifies daca nodurile apartinand celor doua rnultimi generate pot fi
rnultirnile unui graf bipartit.
Impleme ntarea algorit mul ui. Se citesc din fisieru l text gb.txt info rrnatii despre un graf
neorientat (nurnarul de noduri ~i matricea de adiacenta ). Functia bipar t i t () verifica
daca graful este bipartit furniz and un rezultat logic. Elementele vectorului x in care se
genereaza muttirnile A ~i B sunt initial O. Variabila ga si t se foloseste pentru a veri!ica
daca s-au gasit cele doua rnultimi de noduri corespu nzatoare unui gra! bipartit (are
valoarea 1 - true , atunci cand s-au gasit).
# inc l ude <: £ s t r e a m. h >
#inc lude <ma t h. h >
f stream f ( " g b . txt " I i o s: : i n ) ;
i n t a[ I O] [ l O],n ;
v oid ci t e s t e ( ) { l l c i t e C? t e matr icea de a di acen1;.a di n fi ~i e r }
i nt biparti t ()
lint x [ ~ O ]= { O I , i , j , m ,k = O ,p o s ~ b i l =l ,g as it = O ;
wh i l e ( pos ~b il && ! g asit l
Informatica 259
{m=n;
while (m>O && x [ m ] ~ ~ l l (x[rn] =O; m- - ; )
i f (m==OI posib i l~O ;
e lse
{ x l m ] ~ l; k ++ ;
i f ( k <~p ow ! 2 , nl - 21
fo r ( i=l ,gas i t=l ;i <=n && gasit ; i ++)
for (j=l ;j<=n && gasi t ; j ++ )
i f (a[i] [j]~~l)
Seop: exempl ificarea unei aplicatii i n care solut ia problemei este un graf ham iltonian.
Problema voiajorului comercial. Un voiajor comercial trebuie sa ceietoteesce in mai
multe orase pentru a-§i prezenla proousete. Se CLIIJOa§te eostul deplasarii intre localitati.
Trebuie sa se stabileasea un traseu prin care sa se ajun ga in toate loealitatile, astfel incat
Informatica 261
costuf deplasarii sa fie minim. voieiorut va trece 0 singura data prin fiecare focalitate si se
va tntoerce in locafitatea de pornire.
Localitatile torrneaza nod urile unui grat, iar traseul voiajorului trebuie sa fie un ciclu hamilto-
nian i n acest graf. Daca exista mai multe cicluri hamiltoniene, S8 va alege eel cu costuI
minim (ciclul i n care suma cost urilor asociate muchiilor este minima).
Obs ervatie, Orice problema la care soluua este de a gasi un traseu - care porneste dintr-un
anumit punct, l rebuie sa treaca prin puncte precizate, cu revenire la punctul de pornire - se
rezolva prin gasirea unu i ciclu hamiltonian. De exemp lu:
-7 0 firma de mesagerie trebuie sa distribuie zilnic colete la mai multe adrese. Ma~ i n a care
distribuie aceste colele pleaca de la sediul firmei, ajunge la mai multe puncle din eras ~i
revine la sediul firmei. Leqatura directs dintre doua puncte este caracterizata prin
distants rnasurata in kilometri (costul asoc iat fiecarei muchii). Trebu ie sa S8 ga seasca
traseul de lungime minima pe care trebuie sa-l parcurqa masina.
-7 0 persoana doreste sa taca un circuit prin l ara ~ i sa viziteze mai multe puncle turistice,
plecand din localitatea de domiciliu ~ i Intorcandu-se in aceeasi localitate. Legatura directs
dintre doua puncte turistice este caracterizata prin distants rnasurata i n kilornetri (costul
asocia t fieca rei muchii). Trebuie sa S8 gaseasca circuitul turistic de lung ime minima.
*
-7 0 persoana doreste sa viziteze mai multe cabane , intorca ndu-se la locul de plecare.
Leqatura directa dintre doua cabane este caracteriz ata prin timpul necesa r parcurge rii
traseul ui de munte (costul asociat fiecarei muchii). Trebuie sa se gaseasc a
circuitul de vizitare a cabanelor care sa se faca i n timp minim. ....
Teorem a 18
Daca gratul G=(X,U) este un grat cu mal mult de doua noduri (n<:3) ~ i gradul
. flecarui n od X EX sat isface co nditia d(x)<:nf2, atunci gratul G este ham ilto nia n,
Observatie. Aceasta teorema precizeaza numai condltia sufic ienta ca un graf sa fie
hamiltonian. Acea sta conditie nu este Insa ~i necesara. Astfel, este posibil ca un graf sa nu
Indeplineasca aceasta conditie 9i sa fie totusi hamiltonian. Din aceast a cau za , teorema nu
poate fi folosita pentru a const rui un alqoritrn care sa verifice daca un grat este hamiltonian.
Dem ons trat ie. Notarn cele doua propozitii, astfel :
(1) - Gr aful G are m ai mult de dOU3 nodun ~i gra dul fiecarui nod XEX satisface conditia d (x)~n/2 .
(2) - Graful G este hamiltonian .
Trebu ie sa derno nstr arn ca (1)=>(2) - prin reducere la absu rd. Pres upunem ca graful G nu este ham il-
tonian . Adau ga m muchii la acest gr af pima se obtine un graf hamiltonian (in eel m ai rau ca z se ajunge
la un gra f cam plet , car e sigur es te hamiltonian ). Prin ada uqa re a de noi muchii, gradul u nor nod uri
creste , ceea ce in se amna ca se pastreaza ineg alitatea din propozitia ( 1). Adauqarea ace stor muchii
se face pa na ca nd se obtine graf ul G , ca re nu este hamiltonian, da r ca re . pr in adau qare a unei singure
muchii de vine ham iltoni an . Acest graf nu e ste sigur un graf com pte! !iii tnseem na ca exists eel putin
doua no du ri ne adi acent e. Luam dintre aceste noduri dou a nodu ri x ~ i y ~ i [X,Y] EU, ca re au propri-
et ate a ca. prin adauq area muchiei [x,Y] ta graful G, . se cbtin e un cidu hamiltonian C = {x, Xl. . .. . xk-t
Xk, y, x} . lnsearrma ca i n graf ul G 1 exis ta un lant elem entar L(x,y) ca re con tine toate nod urile grafului.
Oeoar ece d(x):2:n/2 , rezult a ca i n gra ful G , mai exis ta un nod xi cu care este adia cent. Acest nod face
parte din lantul Llx.y). Fie Xi., nodul care precede nodul Xi in lan1ul L(x,y). Da ca nod urile xi.1 ~i y
Iorrnea za 0 mu ch ie ([Xi_l ,y] e U, ), lnsearnna ca gr aful G, ccntine un ciclu hamiltonian C, = {x, Xl ' ,••,
Xi_'. y , Xk. Xk_l , ..., Xi, X} , ceea ce contrazice presup unerea ca graful G , nu e ste hamilton ian. Rezulta
ca nodul y nu formeaz a muchie cu nici unul dlntre nodurile care i l preced in la n~ul L(x ,y) ~i care sunt
adiacente cu nodul Xi . inseamn a ca nodul y nu poate fi adiace nt decat cu cel mult n- 1-d(xi) noduri , adica
d ( y)~ n-1-d(x,). Dar, d(x;)2n/2. Rezulta ea d ( y)~ n-1 -n/2=n/2-1, adlea d(y) ~ n/ 2 , ceea ce contrazice
ipoteza. Cont radictia a aparut din presupun erea ca gr aful G nu este hamiltonian .
262 Implcm entarea stru ct urilnr de date
1. verificati daca gra ful ham iltonian G, o din figura 39 lndeplineste
conditiile preciza te in teorerna .
2. Desenati toate grafurile hamiltoniene cu 4 nodu ri.
G 31 3. Veriticati daca este hamiltonian graful G31 =(X 3 1,U3 1) cu X 31= {1,2,3,4,5,6,7j si U31={[1, 2],
[1,5]. [1,6]. [1,7]. [2,3], [2,7]. [3,4), [3,5], [3.7]. [4,5]. [4,6J, [5,6J). Daca este graf hamiltonian,
gasiti un ciclu ham iltonian si veriticati daca graful lndepline.;;te conditiile precizate in teorerna .
4. Dernonstrati ca un graf bipartit cu nurnar impar de noduri nu poate fi graf hamiltonian.
5. Dernonstrati ca nurnar ul ciclurilor hamilloniene din graful com plet cu n noduri este I n ~ I) ! .
~
1. Un graf eulerian poate co nt ine no duri izolate 2 3
2. Pentru ca un graf sa poata fi tacut eulerian prin adEiugarea muchiilor
trebuie sa fie i ndeplinite urmatoarele conditii: 4 5
8
-7 daca nurn arul de noduri este par, sa nu existe noduri cu gradu l maxim ; 6 7 .
~ nurnarul de noduri cu grad impar sa fie par.
Nurnarul minim de much ii care trebuie adauqate este egal cu jumatate Fig.40
din numa rul de nod uri eu grad impa r.
[ §1tuMjlju de cez l
Scop : exempl ificare a aplica tiei In care solutia problemei este un graf eulerian.
Pro blema pod urilor d in o rasu l Konigsberg . ~. . s,
~," ~
in acesl ores exist» septe poduri peste della . - ,
teului Pregel care !oaga cele palru sectoare ale '-. r ~ ...
oresulu! """" '" Problem: 00"'";''' ,"M,
un traseu prin care un vizitator sa parcurga toate ~
cele patru sectoero ale oresutui lA, B, C § ! 0), ~~ ~ ~
in tcrceti du-se in punclul de unde a plecat, ~~~
. ~.
trecetid peste fiecare pod a singura data.
Cele patru zone (notate
0...-"": $~
~,
~~ Fig. 41
,
." ,
"
~_
Observatie . Daca graful contine noduri izolate, alqoritrnli anteriori se pot ap lica pe subqra-
ful conex care se obtine dup a tnlaturarea nodur ilor izolate .
_....-... 1. Deterrninati comp lexitatea algoritmu!ui de qasire a unui ciclu eulerian.
2. Scrieti un prog ram care citeste din fisierul text graf_e1 .!x! matricea de
adiace nta a unui graf eule rian si, de pe ultirnul rand, un sir de numere
care reprezinta etic hete de noduri - ~i care verifica daca sirul de etichete reprezinta un
ciclu eulerian . .
268 Implementarea strueturilor de date
3. Scrieti un program care citeste din fisierul text grale2./x/ matricea de adiace nta a unui
graf neorientat care poate contine nodur i izolate si care verifica daca graful este un graf
eulerian, iar daca este graf eulerian, aflseaza ciclul eulerian.
4. Scrieti un program care citeste din fisierul text grale3.txt matricea de adiacenta unui gral
neori entat conex ~i care verific a daca graful este un graf eulerian, iar dac a nu este, verifica
daca poate fi facut eulerian - In aces t caz, S8 prec izeaza nurnarul de m uchi i care treb uie
adauq ate ~i care sunt aceste m uchii .
~
;;": Gj,. Exemplu - Gralui G 37 din figura 43
Observa tli
~
1. Arcul dintre doua noduri poate ave a oricare dintre cele doua orlentari .
2. Gralul tum eu este un gral complet .
Teorerna 20 Fig . 43
Orice graf turneu contine un drum elementar care trece prin toate nodurile grafului.
Demonstratle - prin reducere la absurd. Presupunem ca nu exista un drum elementar care trece
prin toate nodurde grafului. Conside rarn D (xj, xj ) un drum de lungime maxima din graf s! un nod
x eD(xj, xj), Graful turneu fiind un graf cornplet, tnseamna ca nodul x este adiacent cu orice nod din
drumul D( x i, xj) , inclusiv cu nodurile Xj si Xj. Pot sa apara ur rnatoarel e situ atii:
-7 Exista arcul [x.x.] . i n acest caz, tnseamna ca exista drumul D(x ,xj) mai lung decat drumul
D( xj ,xj) , ceea ce contrazice ipoteza.
-7 Exista arcul [xj .x] . in acest caz, tnseamna ca exista drumul Df xr.x] mai lung cecat drumul
D (x j,xj ). ceea ce contrazice ipoteza.
-7 Nu exista arcele [X,XiJ :,?i [xj,x] . Oeoarece graful este complet, inseamna ca exista arcele [xj.x]
:,?i [x.xj] . Daca pentru orice nod XkED(Xi,Xj) exista arce numai cu sensul [Xk,XJ. tnsearnna ca
exista -drurnul D,{ xj, xj) mai lung cecat drumul D( x j,xj ), deoarece contine in plus muchiile [ Xj.1,XJ
:,?i [x ,Xj]. Daca pentru ortce nod XkED (Xj,Xj) exlsta arce numai cu sensul [X,XkJ, tnseamna ca
exista drumul D 2(xj,xj) mai lung cecat drumul D(xj ,xj) , deoarece confine in plus muchiile [Xj,x] :,?i
[X,Xj+1]. Daca exista doua noduri adiacente Xk ~i Xk+1, care apartin drumului D( XhXj) pentru care
arcele incidente cu nodul x au sensuri contrare, se obtine un drum D3(x j,x;) mai lung cecat
drumul D (x j,xj) , deoarece coni ine ~i arcele [Xk,X] ~i [X,Xk+1J. ceea ce contrazice ipoteza.
Rezulta CEI drumul D(xj ,xj) contine toate nodurile din graf.
Propozitia 10
Pentru mice gral tumeu, exista un nod x, astl el inca t toate nodurile y"x sunt
accesibile din x pe un drum care contine un are sau doua aree .
nemonstrat!e - prin reducere ia absurd. Consiceram nodul x cu gradu l extern maxim - p
Inseamna ca intre nodul x ~i celelalte p noduri exista un drum format dintr-un singur are, Sa
presupunem ca printre ceJelalte noduri exlsta un nod y care nu este aeeesibil din nodul x prin coua
arce. lnseam na ca din aeest nod pleaca p aree entre nodurile care sunt aecesibile printr-un singur
arc din nodul x ~ i un arc catre nodul x. lnseamna ca nodul yare gradul p+1, mai mare decat gradul
nodului y, ceea ce contrazice ipoteza
Propozitia 11
Pentru m ice nod Xi dintr-un gral tumeu cu n noduri, d+( Xi) + d-(X j) = n-1 .
Informatica 269
Demon strat!e. in graful turneu. fiecare nod Xi fiind legal de celelalte n-1 nod uri Xj din graf pnntr-un
arc s! numai unul, insearnna ca orice nod Xi esle incident cu n-1 arce si suma dintre g radul intern ~i
gradul extern este eqala cu n-t .
Propozitia 12
Intr-un gra! turneu cu n noduri Ln d+( \ ,) = L" d- (\,) = C; , unde Xi este un nod din grato
i~ 1 1=1
Dernonstrat ie . in orice graf nearientat suma dintre gradele interne ~j grad ele externe este egala. cu
nurnarul de arce m ; iar numarul de arce intr-un graf turneu se determine la tel ca !?1 in cazul unui graf
complet neonentat K n
Propozitia 13
" n
intr-un gra! turneu L d ' ( \,)' = L .r (\, )' , unde Xi este un nod din grato
i", ) 1= 1
Dernon st ratie . d' (x,)' + d-(Xi)xd' (x,) = (n-1)xd' (x,) s! d-(x,)' + d' (x,)xd-(x,) = (n-1)xd-(x,) Scazand
cele doua identitati, obtinem d +( x/ - d- (x/ = (n-1)x(d+(Xj) - d- (xj)). Acunand aceasta identitate
pentru loate nod urile Xi obunern:
n n n n
L d + (\ , )' - L d" (\ , )' = ( II - I) x (L d' (\ , ) - L d- ( \ ,» = (II - I ) x (Ill - Ill ) = 0
i- I i- I i -I I- I
1. Derno nstrati ca un graf turneu este tare conex, daca si numai daca
contine un ciclu elementar care trece prin toate nodurile grafului.
2. Scrie ti un program care citeste din fisierul text grafJtxt matricea de
adiacenta a unui gra! orientat , i care verifica daca gra!ul este un gra! turneu.
3. Dernonstrati ca nurnarul de grafuri turneu care se pot eonstrui cu n noduri este 2c~ .
I SWWlLlL de CaLZ I
Scop: exemplificarea unei aplicatii in care soluua problemei este un gra! tumeu.
Enuntul problem ei. Pentru un concurs hipic s-au montat n obstaco/e. Pentru a parcu rge
traseu l concursutui, catarelii pot incepe cu orice obstacol. trebuie sa treaca peste toate
obstaeolele, iet de 18 un obsta col la altul pot citcute intr-un singu r se ns, stabilit inain tea
concursului. Sa se precizeze ce trasee poate urm8 un cetsret.
Obstacolele forrneaza nodurile unui graf orientat, in care fiecare doua noduri sunt legate de
un arc. Deoarece drumul dintre doua obstacote nu poate fi parcurs decat intr-un singur
sens, insearrma ca graful concursului este un graf turneu. A determina un traseu •
pentru parcurgerea obstacolelor , tnsearnna a determina in gra!ul turneu un dr um -e ~ e-
eleme ntar care trece prin toate nodu rile gra! ului.
Daca graful G 37 din figura 43 este gralu l unui concurs hipic; dete rrninati
traseul pe care trebuie sa-l parcurqa un cala ret.
Informatica 271
2.7.10.5. Aplicatii practice
1. Graful miqratiei pas arilor cala toare este un graf bipart it, cele doua mul tirni fiind forma te
din locatiile din zona rece , i locat iile din zona calda . Verificati daca aces t graf este un
graf bipartit complet in caz afirmativ , ce conc luzie traqeti despre rniqratia specie i de
pasa ri studiate?
2. Consid erati ca graful din figura 39 reprezin ta graful oraselor prin care tre buie sa treac a
voiajoru l come rcia l. Adauqati fiecare i muchii distanta in kilometr i i ntre erase . Scriet i un
program care sa rezolve problema voiajorului comercial - care sa gaseasca traseul cu
costu l min im. lndicatie. Fiecare ciclu hami ltonian gas il (nodurile depuse in stiva ), va fi
memor at intr-o matrice cu n coloane, num arul de linii fiind egal cu nurnarul de cicluri
gasite. Alege\i din ciclurile gasite pe cel cu costul minim .
3. Jocul icosian a tost inventat de William Hamilton in anul 1857. Era un dodecaed ru regu-
lat confectionat din lemn (un polredru cu 12 tete sub form a de pentag oane regulate) , i
care avea in fiecare varf cate un cui care era marcat eu numele unui eras (figura 44). Cu
ajutoru l unei sfori , care trecea prin fiecare cui 0 singura data, trebuia sa
~
_ .. ', ..... (,
S8 gaseasca un traseu care sa parcurqa toate orase le (sa parcurqa
toate muchiile dodecaedru lui) cu reven ire la orasul de plecare . Scrieti
un program care sa qaseasca solutii pentru
•. _' )"" ' <' J" acest joe, in trei variante: a) S8 cunoaste ora-
sul de plecare ; b) se cunos c primele doua
erase prin care trebuie sa treaca tras eul; c) S8
Fig . 44
cunosc prirnele trei erase prin care trebuie sa
treaca lraseul. Etichetele oraselor initia le se cornunica de la
tastatura . lndicatie. Dodecaedrul poate fi reprezentat cu ajutorul
unui graf neorientat. in care trebuie sa se gaseasca un circuit
hamiltonian . Nodurile sunt cele 20 de varfuri ale poliedrului
(figura 45). Fig . 45
4. Joc ol de sa h . Sa se gase asca un traseu de acoperire a lablei
de sah cu una dintre piese (piesa tre buie sa treaca 0 sinqura data prin fiecare dinlre
cele 64 de patrat e ale la blei de sah ,i sa revina la pun ctul de plecare). Piesa poate fi:
a. calul - se cepl aseaza in forma de L (problema a fost studiata de Eule r i n anuI 1759);
b. dama - se dep laseaz a in oricare dintre patratele adiacente;
c . nebunul - se depla seaza numai i n patratele afiate pe diagonala patratului i n care se
gase,te ;
d . tura - se deptaseaza num ai i n patratele afiate pe verticala sau pe orizontala fa\a de
patratul in care se gase,te .
tn dicat ie. Ta bla de sah poate fi reprezentata cu ajutorul unui graf neorrentat i n care tre-
buie sa se gaseasca un circuit ham iltonian . Nodurile sunt cele 64 de patrate ale lab lei
de sah, jar intre doua nod uri exista muchie numai daca piesa pea te sa se deplaseze
i ntre cele doua patra te, conform regu lilor jocului.
5. Scri ef un program care sa demenstreze ca problem a podurilor din ora sul Ko nigs·
ber g nu are solut ii.
6. a persoana dore ste sa viziteze mai rnutte cabane, legate prin trasee turistice , astfel
l ncat sa parcurqa fiec are traseu 0 singura dat a , i sa se relntoa rca la locul de plecare .
Leq atura dire cts dinIre doua cabane este caracterizata prin timpul necesar parcurgerii
traseului de rnunte (costul asoc iat fiecare i muchii ). Scrieti un progr am care sa gaseasca
traseul turistic si care sa determine timpul necesar parcurgerii lui.
272 lm pl em cntarca st r uct u r ilor de d a te
7. Masa rot unda a reg elui Arthur. Scrief un program care sa afiseze sotutia araojarii la
masa rotunda a rege lui Arthur a celor 2xn cavaleri, stiind eel fiecare dintre cavaleri are n-1
@
dusrnanl ~ i ca la rnasa nici un cavaler nu trebuie sa stea Ifmga dusmanul lui. lnd icatie.
Relatiile dintre cavaleri pot fi reprezentate cu ajuto rul unui graf neorientat in care nodu-
rile sunt cavalerii, iar muchiile leaqa numai cavaleri care nu sunt dusrnani. Dernonstrati
eel acest graf es te un graf eulerian ~ i gasiti un ciclu eulerian .
8. Scrieti un program care sa gaseasca solutia de a dese na figura 46
fara a ridi ca creion ul de pe hattie ~ i fara a trece cu creion ul pe a
latura deja ce sen ata. ln d icatie . Figura geomet rica poate fi re pre-
zentata printr-un graf neorientat , in care nodurile sunt varfurile
figurii, iar rnuchiil e, laturile . Prob lema cons ta i n a gasi in acest graf , Fi . 46
care nu este eulen n, un lant euleria n. 9
9. 0 compet itie sportiva se desfasoara prin meciuri directe intre doi participanti. Nu exists
meciuri nule ~ i nici meciuri eliminatorii (trebuie sa existe cate un meci int re fiecare doi
participanti). Scrieti un program care sa afiseze 0 solutie de organiza re a cornpetitie
sportive (ordinea de desfasurare a meciurilor). lnd icati e. Deoarece doi participanti nu
joaca impreuna decat un singur meci, rneciul va fi defimt prin relatia nesirnetrica
sportivul x [oaca cu sportivul y (adica, daca sportivul x joac a cu sportivul Y. atunci
sportivul y nu mai joaca eu sportivul x). Graful campionatului este un graf orientat, in
care nodurile reprezinta sportivii. iar muchiile, meciurile. Prin modul de organizare a
cornpetitiei. el este un graf turneu.
Alaqeti:
1. Deterrninati nurnarul total de grafuri neorientate distincte cu 3 nodu ri. DOUEl grafuri S8
considera distincte daca matricea lor de adiacenta difera .
a. 4 b. 7 c. 64 d. 8
(Bacalaureat - Sesiunea special a 2003 )
2. Nurnarul de grafuri orientate care S8 pot construi cu 3 noduri este:
a. 8 b. 9 c . 64 d . 16
3. Numarul maxim de aree intr-un graf orientat cu 5 noduri este:
a. 5 b. 10 c. 20 d. 25
Urrnatorii 12 item i se refera la graful neorientat cu 8 ncdu ri si avand much iile [1 ,2], [1,3],
[1,4], [1,5], [2,3], [3,4] , [3 ,7J, [4,7] . [4 ,5).
4. Numarul de noduri care au gradul maxim este :
a. 1 b. 2 c. 4 d. 3
5. Nurnarul de nodu ri izolate este:
a. 1 b. 2 c. 0 d. 3
6. Numarul de e lemente de 0 din ma tricea de adiacenta este:
a. 9 b . 18 c. 20 d. 46
7. Nurna rul de elemente de a din matricea de incid enta este :
a. 18 b. 9 c . 36 d . 54
8. Suma elementelor de pe Iinia 1 din matr icea de incid ents este:
a. 8 b. 4 c. 2 d. 6
9. Numarul de ciclu ri e lementare de lungime 4 este:
a. 4 b. 3 c. 6 d. 5
t n.Nurnarul de lanturi elementare de lungime 4 este
a . 16 b. 8 c . 10 d . 22
11. Numar ul de lan tur i eleme ntare in tre nodu l1 :;;i nodul7 este:
a. 6 b. 3 c. 4 d. 8
12. Numarul de subgratur i cu 3 noduri care se pot obtine din graf este :
a . 10 b. 3 c . 20 d . 56
13.Numarul de grafuri parti ale cu 7 rnuc hii ca re se pot ob tin e din graf e ste:
a. 72 b. 18 c. 36 d. 9
14.Numaru l minim de m uchii ca re se pot elimina din co mponen ta cone xa {1,2,3 ,4, 5,7} a
grafului pentru a se obt ine un gr af pa rtial neconex este :
a. 1 b. 4 c. 3 d. 2
274 Im p lcmcnta rca structurilo r de date
15. Numarul maxim de muchii care se pot elimina din componenta conexa {1,2,3,4,5,7} a
grafului pentru a se obtine un graf partial conex este:
a. 5 b. 4 c. 3 d. 2
Urrnatorii 11 itemi se refera la graful orientat cu 6 noduri si cu arce le [1.2J, [1.3], [1,4],
[1,5]. [2 ,3], [3, 1], [3,4], [3 ,6], [4.1], [4,5], [4 ,6], [6,4].
16.Numarul de noduri care au gradul intern egal cu gradul extern este:
a. 1 b. 2 c. 4 d. 3
17. Nurnarul de elemente de 0 din matricea de adiacenta este:
a. 9 b. 18 c. 26 d . 24
18.N umarul de elemente de 1 din matr icea de incidenta este:
a . 22 b. 11 c. 6 d. 8
19.5 uma elementelor de pe linia 4 din matr icea de incidenta este :
a. 8 b. 4 c. 0 d. 6
20. Suma gradelor externe ~i a grade lor intern e ale tuturor nodurilor este :
a. 12 b. 24 c. 20 d. 14
21. Numarul de cicluri elementare de lungim e 4 este:
a. 4 b. 3 c. 0 d. 6
22. Numarul de lanturi elementare de lungime 4 este :
a. 16 b. 8 c. 10 d. 22
23.N umarul de circ uite elementare de lungime 4 este :
a. 2 b. 4 c. 3 d. 5
24.Numarul de lantu ri elementare l ntre nodu l 1 ~ i nodu l 6 este :
a. 6 b. 3 c. 4 d. 8
25.Numarul de dru mu ri elementare lntre nodu l 1 si nodul 6 este :
a. 6 b. 3 c. 4 d. 5
26.Numarul de componente tare conexe este:
a. 1 b. 3 c. 2 d. 4
27. Se considera graful neorientat dat prin matri cea de adiacenta alatu rata . in 0 o1
graf , nodurile sunt numerotate de la 1 la 4. corsspunzator liniilor tablo ului. 1 010
Sa S8 determine cate perechi de noduri neadiacente exista in graf. Se con- 0 1 0 1
sidera perec hile neordonate (perechea 1-2 este aceeasi cu perechea 2-1). 1 o 1 0
a. 1 b. 2 c. 3 d. 4
(Bacalaureat - Sesiunea august 2003) ~ 3
28. Se considera graful neorie ntat din fig ura alaturata. Sa se determine
care dintre urmatoarele liste reprez inta lista de adiacenta a nodului 3: 2 4
a. 1 2 4 b. 3 1 2 4 c. 24 d . 1 34
(Bacalaureat - Sesiunea lunie-iulie 2003 ) 0 o 0
29.Se considers un graf orientat avand matricea de adiacenta alaturata . 0 0 o 0 1
Stabiliti care dintre nodur ile grafului au gradul intern egal cu gradul extern .
o 1 o0 0
0 1
100
a. 3 b. 1 c. 0 d. 2 0 1 o 1 0
(Bacalaureat - Simulare 2003 )
30.intr-un graf neorientat cu n noduri nurnarul maxim de muchii ce pot exista este:
2
a. nx(n+1 )/2 b. nx (n-1 )/2 c. nx(n -1) d. n
(Bacalaureat - Sesiunea iunie-iulie 2003)
31 .Numarul maxim de muchii intr-un graf neorientat cu 8 noduri care nu contine niciun
ciclu este:
a. 4 b. 8 c. 27 d. 7
(Bacalaureat - Simulare 2005)
Inform atic a 275
10
(Bacalaureat - Sesiunea speciala 2003)
45.1n matricea de adiacenta asociata grafului orientat din figu ra alaturata 3
nodurile sunt numerotate de la 1 la 4 corespun zator linillor matricei.
Nurna rul de elemen te egale cu 1 aflate deasupra diagonalei princi pale • •
depaseste numarul de elemen te egale cu 1 aflate sub diag onala 2 4
principa la cu 1
a. 2 b. 0 c. 3 d. 1
(Bacalaureat - Sesiunea iunie-iulie 2004)
46.Se considera un graf orientat cu nod urile numerotate cu 1. 2, 3, 4 , 5, 0 0 0 0 0
cor espunzator liniilo r matricei de ad iacenta alatu rate. Stabiliti daca 0 0 0 1 1
nodur ile 1 si 3: 0 0 0 0 0
a. apartin aceleiasi componente conexe b. sunt noduri izolate 0 1 0 0 1
c. sunt conectate printr -un lant d . sunt noduri ad iacente 0 1 0 1 0
(Bacalaureat - Simula re 200 3)
47.Care dintre urrnatoare!e secvente de nodu ri reprez inta un lant in graful o 1 0 1 0
1 0 0 1 0
neorientat dat prin matricea de adiacenta alatura ta stiind ca nod uriIe
sunt numerotate de la 1 la 5 corespunzato r liniilor tabloului?
o 0 0 1 1
1 1 1 0 1
a. 3 4 1 2 5 b. 1 5 3 4 2 4 c. 4 1 2 4 5 d. 2 1 3 4 o0 1 1 0
(Bacalaureat - Sesiunea iunie-iulie 2004 )
48 .Se considera graful neon entat dat prin matr icea de ad iace nta alaturata . in o 0 1
graf, nodurile sunt numerotate de la 1 la 4, corespunza tor liniilor tab loulu i. 1 0 0 1
Sa se determine lun gimea maxima a unui lan\ ce uneste nod uriIe 1 si 3: o0 0 1
a. 1 b. 2 c. 3 d. 4 1 1 1 0
(Baca!aureat - Sesiunea iunie-iulie 200 3)
49 .Care dintre urrnatoarele secvente rep rezinta un drum in graful orientat dat o 1 0 0
prin ma tricea de adiac enta alaturata, stiind ca nodurile sunt num erota te de 1 0 0 0
la 1 la 4 coresp unzator liniilor ,i colaanelor tabloului? 1 1 0 1
a. 3 4 3 2 4 b. 3 1 2 3 c. 2 1 3 4 d. 4 3 1 2 o 0 1 0
(Bacalaureat - Sesiunea special a 2004)
Infor matica 277
50.Cel mai lung drum elemen tar In gralul orientat din figura alaturata are 3
lungimea
a. 2 b. 4 c. CD d. 1
(Bacalaureat - Sesiunea iunie-iulie 2004) 2
.~
.~.J\
4
.
51. Se considera un graf neorientat cu 7 noduri si 3 rnuchii. Nurnaru l de 1
componente conexe din care poate f format gralul este:
a. exact 4 b. 4 sau 5 c. 3 sau 4 d. cel putin 5
(Bacalaureat - Simula re 2003)
sz .Daca l ntr-un gral neoriental conex cu n nodur i, lista de adiacen ta a fieca rui nod este
ferm ata din exac t doua elemente , atunci In gralul respectiv exista :
a. eel putin n/2 cicluri b. exact n/2 cicluri
c. e xact un ciclu d. eel putin doua ciclu ri
(Bacalaureat - Sesiunea speciala 2003)
~
53.Numarul minim de muchii ce se pot alege pentru a f eliminate din gralu l
neorientat din Figura alaturata astfel incat acesta sa devina neconex este:
a. 2 b. 4 c. 3 d. 1
(Bacalaureat - Sesiunea iunie-iulie 2003)
54 .Numarul de grafur i canexe aciclice care S8 pot obtine CU 4 nod uri este :
a. 2 b. 4 c. 28 d. 24
55. Se co nsidera un graf orientat tare conex . Stabiliti nurnarul circuitelor care ccntin t08t8
noduriIe gralului :
a . exact unul b. cel mult unul c. nici unul d. cel putin unul
(Bacalaureat - Sesiun ea iunie-iulie 2003)
56. G radul maxim a l unui nod ce S8 poate obtine intr-un graf neorientat conex cu n noduri
~ i n-1 much ii este (s-a notat cu [n/21catu l Impartir ii Intreqi a lui n la 2):
a. n- 1 b. [n/2] c. n d. 2
(Bacalaureat - Sesiunea iunie-iulie 2003) o 0 1 0 0
57.Se conside ra gralul neorientat avand nodurile notate cu 1, 2, 3, 4. 5
o 0 o 1 1
1 0 o0 0
corespunzator liniilor matr icei de adiacenta alaturate. Stabilit i care dintre o1 o0 1
urrnatoare le prcpozi tii este adevarata. o1 o1 0
a . graful este conex b. orice noua muchie s-a r adauqa graful devine conex
c. graful este ac ictic d. orice much ie s-ar elimina graful dev ine ac iclic
(Bacalaureat - Simulare 2003)
58.in gralul neorientat dat prin matricea de adiacenta alaturata numaru l de 0 0 1 0
componente conexe este: 0 a 0 0
a. 0 b. 2 c. 3 d. 1 1 0 0 0
(Bacalaureat - Sesiunea iunie-iulie 2003) 0 0 0 0
59. Stabiliti care dintre urrnatoarele matrice de adiacenta corespunde unui graf conex aciclic:
a) I0 I I I I
1 1 0 b) IOl1TOl I I I I I
c) 0 1 0 1 d), 0 0 1 0
1
1
0
0 1 0
1 0 1
0 1 0
I~ I -~T~-l 1 0 1 0
0 1 0 1
1 0 1 0
0 0 0 1
1 0 0 0
0 1 0 0
a~ V. V b·
o
0 c~ \ d'D
(Bacalaureat - Sesiunea august 2004)
66.Conslderand un graf neorientat avanc nodurile 1,2,3 ,4,5 , 0 1 1 0 0 0 0 0 0
6,7,8,9 cores punzato r liniilor mat rice i de adiacenta alaturate , 1 0 1 0 0 1 0 0 0
stabiliti care dintre urrnatoa rele propo zltii este adevarata: 1 1 0 1 1 0 0 0 0
a. este un grat bipart it b. este un graf conex 0 0 1 0 1 0 0 0 0
c. este un graf eule rian d. este un graf hamiltonian 0 0 1 1 0 0 0 0 0
67. Cate muchi i are graful bipart it complet G=(X,U), cu 11 noduri 0 1 0 0 0 0 1 1 0
,?i cu rnultirnea nodurilor A si B definite astlel : AuB=X , 0 0 0 0 0 1 0 1 0
An B=0 si card (A)=4? 0 0 0 0 0 1 1 0 1
a. 4 b. 10 c. 16 d. 28
o 0 0 0 0 0 0 1 0
Propozltia 14
Gri ce arbore cu n no duri are n- 1 much ii.
Derno ns tratie . Arb orele fiind un grat conex minimal, tnsearnna ca are n-1 muchii.
Propozitia 15. Grice arbor e c u " >=2 noduri contine eel pu!in doua noduri termina le.
Dcm onstralie - prin reducere la abs urd. Presupunem ca nu exista decat un singur nod terminal X.
Oricare alt nod din arbore are eel pulin gradu! 2. Alegem din arbore, dintre lanturile elementare
care au 0 extremitate in nodul x, lan\ul de lungime maxima: L(x,y ). Nodul y avand gradul
mai mare decat 1, inse am na ca mai exista , in afara nodului ca re iI pr ec e de in lant , eel putin
u n nod z ca re e ste ad iace nt eu el. Lantul fiind e lementar, inseamn a cil nodul y nu exista in
lan\ decat la extremitatea lui, iar muchia [y ,z] nu face parte din lan\ ~ i putem adauga
aceasta much ie la lan\. Lan\ul fiind de lungime maxima, i nseamna ca nodul z aparline
Inform nrica 283
lantului si prin adauqarea acestei muchii la lan t S8 inc hide un ciclu , ceea ce contrazice
definitia arborelui (graf aciclic).
-------- -----.. 1. Precizati daca este arbore graful G4 0 (x" o, U40 ) definit astfel: 0 40,: 0 "
, Jr
X40={1,2,3,4,5,6,7,8,9,1O}
U4o={[1,2J, [1,31 , [1,5J, [2,6], [2,7], [3,4], [3,9J, [4,8], [8,10] }.
2. Oernonstrati ca un arbore este un graf bipartit. Reciproca este adevarata?
3. Scrieti un progra m care citeste dintr-un fi~ i e r text intorrnatii despre un graf neorientat
(de pe primu l rand , nurnarul de nodur i ale grafu lui - n , iar de pe urrnatcarele n randuri
matricea de adiacenta a grafu lui) ~ i care:
a. verifica daca graful este un arbore:
b. daca nu este arbo re, verifies daca prin eliminarea muchi ilor poat e fi facut arbore ; in caz
afirmativ sa S8 specifice cate muchi i trebuie eliminate ~i care sunt aceste muchii.
c. daca nu este arbore , verific a dac a prin adauqarea muchiilor poate fi fac ut arbore ; in
caz afirm ativ sa
se specifice cate muchii trebuie ad aug ate si ca re sunt aceste muchii.
c::=)
Fig. 48 Arbo re partial al grafurui G 41
Graful G 41
Teorema 22
Un graf G contine un arbore partialdaca ~i numai daca este un graf conex
Dernonst ra tie . Notarn cele doua propozitii, astfel:
(1) - Graful G coruine un arbore partial,
(2 ) - Graful G este conex .
Trebuie sa dernonstrarn ca (1)=>(2) , i (2)=>(1).
(1):::;::.(2). Sa considerarn ca graful G conune arb orele part ial H. Din deflnitia arbo relu i rez ulta ca H este
un gra f conex. Din de finitia arbo relui partial rezurta ca H este graf partial al gra fului G. Deoarece graful
G se obtine prin adauq area de much ii la un graf conex (H), este ~i el un graf conex.
(2):::;::.(1). Daca G este un graf conex minima l, inseamna ca este un arbore (din Teorema 21: (1) e> (5))
~i H=G, Daca G nu este un graf cone x minimal , lnsearnna ca exista 0 muchie [x ,y] pe care 0 putem
elimina astfel incat sa obtmem un graf partia l conex G 1 . Daca graful partial G1 este un graf conex
minimal, tnseamna ca H= G1; altfe l se repeta procesul de eumtnare a cate unei mucfui pim a se obtine
un graf partial conex minima l. Acesta va fi arboreJe partial H.
Se nurneste graf partial de cost minim al unui graf G conex, cu functia de cost c .
un gr af partial cone x H care are co stul minim .
Teorema 23
Graful partial de cost minim al unui graf conex G, cu functia de cost c,
est e un arbore .
Dern on stratie - prin reducere ta ab surd. Daca graful G este un arbore, atunci H=G, deoarece
orice muchie am elimina din G si-ar pierde proprietatea de conexitate. Daca graful G nu este un
arbore, i nseamna ca el ccn tme un numar finit de grafuri partiale conexe. Alegem dintre aceste qrafuri
partiale graful H care este graful partial de cost minim. Presupunem eel acest graf partial nu estc
arbore. lnsearnna ca el corinne eel punn un ciclu !?i exista 0 rnucrue u=[x ,Y] pe care 0 putem suprim a
astfel tncat sa obtinern un alt graf partial conex H1. Rezulta ca:
c( H )=c( H 1)-c( u» c( H 1)
Inegalitatea c(H»c( H1) contrazice faplul ca graful partial H este de cost minim. lnseamna ca graful
partial H este arbore.
A rborel e care este un gr af partia l de co s t minim al gralu lui conex G, cu
fun ctia de c ost c . se nurneste arbore partial de cost minim (APM) .
[ §mdllll.ll. de caz )
Scop: ide ntificarea aplicatiilor in care se Iolose ste arborele partial de cost minim.
Enuntul probleme i . a retee de cetcutetoero este formata din 7 cetcutotoero server conoetate
intre ete si calculatoare cliont conectate ta servere. Unele servere pot fi tegate direct, enete
nu. Pentru ca reteaua sa tunctionezo trebuie sa se esiqure transportul date /or intre oricete
aou« cetcutetoere server (daua servere trebuie sa comunice fie prin /egatura directa, fie prin
intermetiiut altor servere). Fiecare legatura onect« dintre doua 2 10 4 2
setvere are asociat un cost de constructie. Legaturife care se pot 5
face intre servere §i costume asociate acestor legaturi sunt 1 1 1
prezentate in figura 49. Sa se gaseasca a sotutie de construire a 8 3 }-- n--{
reteiei de calculatoare (de a lega setvetete intre ele) astfel incet g
costul de realizare a retelei sa fie minim. Fig . 4 9
0 •• 0 retea de servere este un gral neorientat G" cu n noduri (i n exemp lu, n=7) , in care
nodurile sunt serverele, iar leaqaturile directe dintre doua servere, much iile galului. Gralul
este conex (oricare ar fi doua serve re din rete a, i ntre ele tre buie sa existe un lant care sa
Ie perrnita sa comunice intre ele). Gasirea solutiei optime de conectare a serverelor,
astfel tncat costul finan ciar sa fie minim , in seamna determina rea unui graf conex de co st
minim , adica gas irea arborelui partial de co st minim al grafu lui.
Observatie. Orice retea de transport (de calculatoa re, rutiera , de cale terat a, aeriana. de
teteco muni cat ii, de ca nalizare etc .) este un graf neorientat con ex. Construirea cu
costu ri fina ncia re min ime a unei asUel de reteIe se rezolva prin gasire a arbor eJui
partial de cost minim al grafului asociat retelei. ~
-<I*"t>-
Info rma t ica 285
2.8 .2.3. Algoritmi pentru determinare a arborelui partial de cost minim
Algaritmii pentru determ inarea arba relui partial de cost minim folosesc strategia greedy:
PAS1. Se alege un subarbore al arbare lui partial de cost minim - Hini' .
PAS2. Gat timp nu s-a format arborele partial de cost mini m ex ec uta :
PAS3. Se ale ge a much ie siq u ra din rnultirnea muchii lor nealese (rarnase),
PAS4. Se adauqa muchia la subarbare.
Mu chia siq u ra trebuie sa Indeplineasca urrnatoarele conditii;
-7 sa alb a co stuI minim ;
-7 sa apartina arborelui partial de co st minim .
Dete rm ina rea arborel u i part ial d e cost mini m S8 poate face prin:
a) Algo ritmul lui Kruskal.
b) Algaritmul lui Prim
Cei dai algar itml difera prin:
-') modul i n care se aleg e subarbarele de la care se porne ste:
-7 modul i n care este gasita 0 muchie siqura.
Pentru a tine evide nta arbori lor partiali Hi care se dezv otta, se foloses te lista L i n fiecare
element L(i ) al listei se rnernoreaza num arul de ordi ne al arborelui partial din care fac e
parte nodul i. Initial, exist and n arbori partial! Hi. fiecare dintre ei contmand un nod al
qraf ului, elementele liste i vor L( i)=i . pentru iE :1 , 2, 3, .. .. n }. Pe parcursul executarii alqorit-
mului, L (i)=j i nseamna CEl nodu l i apartine arbor elui cu numarul de ord ine j.
286 Implementa rea strueturi lor de date
Pentru ca muchia [x,y) care se alege sa fie 0 much ie sigura trebuie sa ind ep lineasca conoitile:
-7 sa aiba costul minim - muchiile S8 aleg in ordine, din lista muchiilor, unde ele sunt aran-
jate in ordinea crescatcare a costului;
7 ex trernit atile sale Sa apartina la doi arbori partiali difen!i - trebu ie ca l(x)>,L(y).
Dupa ce s-a qas it 0 rnuchie siqura , unificarea arbo rilor 58 face astfel:
7 Daca L(x)<L(y), se adauq a arbore le partial din care face parte nodul y la arbo rele partial din
care face parte nodu l x , adica se inlocuiesc toate elementele L(i)=l(y) cu valoarea l(x) .
7 Daca L(x»L(y), se adaug a arborele partial din care face parte nodul x la arbore le partial din
care face parte nod ul y , adica se inlocuiesc toate elementele L(i)=L(x) cu valoarea L(y) .
Pentru graf ul G" se obtine arbo rel e partial de cost minim din figura 50 . Alg oritmul se
excuta as tfe l:
Ll st a muchiiJ or
Arborii pa rtia li
L[ i] H;=({i},0 ) cu l $i$n
Pentru ca muchia [i ,j] ca re se alege sa fie a muchie siqura trebuie sa l ndeplineasca conditi'e :
-7 sa alba costul mini m - 58 cauta nodul j pentru care i n mat rice a costu rilor elementul
a[Q OJlO] are valoarea minima;
-7 extremitatile sale sa apartina la do i arbori partia li diferiti - Irebuie ca Q(i)",O si QU)=O.
Dupa ce s-a gasit a muchie siqu ra, ea esle adauqata la arb ore prin TU)=QU).
Pe nl ru g raful G 42 din figura 49, con siderand r=1. algoritmul se excuta as lfel :
Nodul i 1 2 3 4 5 6 7
H[7]=0[7] H[i] 0 1 1 6 4 3 5
0[7J=0 Q[i] 0 0 0 0 0 0 0
Cost u l [i,Q[I]] - - - - - - -
Actualizar e Q[i] ,~ 0 0 0 0 0 0 X-A= 0
o Costu l [1, Q[i]] - - - - - -
Arborele partial H=({1,2 3,4,5,6, 7),{[1,2), [1,3], [3,6], [4,5], [4,6], [5,7} i - } m --6
Pentru implem entarea algoritmului S8 folosesc urrnatoarete variabile ~ i structuri de date:
~ var iabi lele n ~ i r pentru numarul de noduri, respecti v pentru nod ul radacina ;
7 matricea patranca A, cu dimeniunea n , pentru matricea cost urilor asociata grafului;
7 ve cto ru l Q, cu n elemente, pe ntru coada de priori tati;
-7 ve cto rul H, cu n ele mente , pe ntru lista much iilor d in A PM ;
-7 variabila ct pe ntru a calcul a co st ul tota l a l arbo relu i:
In formaticii 291
~ varlab ila k pentru a numara muchii le adaugate la arborele partial : irntial are valoarea 0
- arborele nu co ntine nici 0 muchie - valoarea sa fina la este n-1 (nu rnarul de muchii
ale unui arbore cu n noduri):
-7 variabilele i si j pentru indicele cu care 58 parcurge coada de prioritati , respectiv
pentr u nodul care se adauqa la arbore :
si subpro gramele:
-7 functi a procedu rala ini t _ me initi alizeaza mat ric ea co sturilor:
-7 func tia proced urala ci ti re_me actualizeaza matricea costu rilor cu da tele din fisie r;
~ functia procedurala i ni t _Q initializeaza caad a de prioritati Q ;
-7 functia operand rnuchie cauta 0 much ie siqura in multi mea muchii lor nealese ;
-7 functia procedurala actualizea za_ Q actualizea za coada de prioritati Q dupa ce a
fast adauqata muchia la arbarele partial:
-7 functia procedurala a f i s a.r e afiseaza APM .
#i nc l ude < fs t realn .h>
fs tream f {"co s t a p m. Lx t " , i o s: :in );
i nt a[SOJ [ SOJ, Q [ SOJ, H[ 50l, n , r ;
cons t int VM?~~5 0 0 0 ;
void ini ( ~mc ()
(i nt i ,j : f» n :
for (i = l: i<=n :i+ +)
f or ( J ~ 1; j < ~ n ; j + + ) i f ( l ! ~ j ) a li ] [j]=VMAX; )
void citi r e mel)
lint i c ; while (f» i » j »c) a j i.] [ jJ =c ; a [j J l i JC' c ; f.clos e {); I
void i n i t -:,O Cl {for ( i n t i= l ;i <= n ; i ++ ) if ! = r J Q [i J=r : }
i n t muchie()
{ i n t .i , j , mi n=Vi'1AX ;
for (i= l; i <= n; i + + l
i f i Q[ H !~O && a[Q [i) J lH<min) [ mi n =a [Q [ i J] [ 1 ] ; j = i ; )
return j : }
void ac t ua l i zeazd_Q( i n t j)
{for (int i=1; i <=n ; i H ) i f (Q [i ] ' ~ O && a l i] I o l tl l c-e LilLj l.) Q [ i ]= j ; )
vo id a f Ls a r e.l )
{ c o u t « " AH 1 este format di n niuc hii.Le : "<cend.l ,
for ( i n t i ~ l; a -e- n : .i ++) if (H [i]! =0) cou t-oc " [ " « li[ i ] « ", "<c t-cc " ] "; }
voi d main {)
ti nt i ,j ,K""'O ,ct=Q ; i n i t~m c ( ) ; citi re_Dic() ;
cou t -oc vNo d u I .i n.L t i a l : "; cin» r·; init~Q(} ;
wh i l e (k<n -l) //cat timp nU s -c:::.u gas itcele n -1 muc h i i a le APM
{ j =mu c h i e ( ) ; / / alege 0 muchie s i qu r a
H[j) =Q[j) ; ct+=a [Q[ j J] [j) ; Iladau ga 1a arb ore nod u L s i. rnuc h.i a
Q[jJ=O ; /Ielimina din coada de prioritat;.i Dodul adau g at
actual i zea za~Q( j) ; Ilactuali zea za coadade prio r i t at i
k+ + ; )
cou t.c-c't co s t u I t.o t a I> "<cc t -cc e ncn. , afisare() ; }
Complexitatea algoritmului lui Prim
Pasul 2 si pasu l 3 au ordinul de complexitate O(n) Pasul 4 se executa de n -1 ori, i n cazu l
pasu lui 3, pentru fiecare much ie aleasa, S8 executa pasul 5 si pas ul 8 de n ori . Rez ulta ca
2)
Pasul 3 are ordinul de com plexitate 0((n-1)x(n+n))=0 (n . Ordinul de camp lexitate al
2)
algoritmu lui va fi : 0(n)+0(n)+0(n =0 (n\
292 Implementarea st r uet nr ilnr de date
Pentru graful G43 din figura 51, deterrninaf APM executand alqoritrnul lui
Prim, Verificati daca solutia obunuta este corecta executano programul
pentru graful G43.
A
Fig . 53
B e
Fig . 54
e B
Pentru un nod racacina ales, se pot obtine patru
arbori diferiti, De exemplu, daca se considers Fig . 55
nodul A ca nod radacina, exista patru moduri
diferite de a repartiza in arbore nodurile B si C:
l©
In 1'0 rma ti d 295
nodul A are doi fii (8 ~ i C sau C ~i 8 - in acest caz ordinea nodu rilor 8 ~i C contea za),
sau un singur fiu: 8 sau C,.ob jinandu-se patru arbori diferiti (cei
prez entati in figura 55 ). In total se obtin 3x4=12 arbo n cu 8
radaci na ordonati diferiti .
-7 Structuri arborescente . Pentru un nod radacina ales (de A C
exemplu nodul 8 ) se pot obnne 3 structuri arborescente dile rite Fig , 56
deoarece exista trei moduri diferite de a repartiza i n arbo re
nodurile A ~i C: nodul 8 are doi fii (A ~i C) sau un singur fiu: A
sau C (figura 56).
Ob sorv at ie intr-un arbore pozitional , fiii fiecarui nod sunt etichetati lipseste fiul
~ cu etichela 12
cu numere intregi pozitive consecutive, iar daca lipseste fiul cu
eticheta k, aceasta etiche ta nu se atribuie nici unui fiu (arborele A 3 -------
lipsesc fiii
Fig. 57 A~ . .'
din figura 57). cu etic hetele
112 si 113
[§ ro«fuilill die lCBl?: I
Seop : identificarea colectiil or de date care pot fi repreze ntate prin arbon cu radacma .
Enu ntul problemei 1. 0 firma are mai multi anga}a!i. intre enqejet) existi: fie releti! de subor-
dine, fie teleti! de colaborare. Directotui firmei da 0 dispozi!le pe care 0 transmite subordo-
na!llor sei directi. Ace.tia primesc simuftan dispozne .i 0 transmit mai departe subordonal"or
direct! s.e.m.d. Transmilerea dispozi(iei de la un nivel ierarhic la altul necesite ecetesi timp t
Sa se determine in cat timp aj ung sa cunoasca dipozilia data toti anga}atii finnei (figura 58).
[ Director 1
Sef com partiment 1 l?ef com partim ent 21 r $ef compartirnent 3 1
sel sel s el
subco mpartimenl subcompartiment subcomp artim enl
11 12 13
1 11 1
Fig . 58
Firma are 0 structura ierarhica, iar relatiile dint re anqaj ati pot Ii reprezentate cu ajut orul
unei arborescent e, in care anqaj atii sunt noduri le, iar arce le rela tiile de subordonare .
Rad acina arborelui este directoru!. in tre un angajat care are in subordine un alt angajat
exista 0 legatura de tip tata -fiu . intre anqajatii subordonati aceluiasi angajat exista relat ii
de colaborare . Acesti anqajati sunt nodu ri frate. Timpul T necesar ca c ispozitia sa ajunqa
de la director la toti anqajatii este dat de produsul dint re tirnpul t necesar pentru
transmiterea de la un nivella altul ~i inal\imea h a arborelui: T=txh .
Enuntul problemei 2. Un produs este realizat din mai multe componente. Fiecare
componente la rendu! sall este realizata prin asamb larea aftor componenle . Atat produsul
cal .i
componenlele sunt caracterizate prin tr-o tist« de alribute (ptoptieteti): denumire,
296 lmplementarea st r ucru r ilor dc datc
cod, pret, Iunctie reenzet», costul esembletii, firma care a produce etc. Sa se determine
pretut produsului (figura 59).
,---~I ,-I_-,
Fig. 59
Produsul are a structu re ierarhica , iar relatiile dintre compo nente pot fi repr ezentate cu
ajutorul unei arborescente , in care componentele sunt nodurile, iar arcele relatii le de
apartenenta a unei componente la a alta componenta . Radacina arborelui este produsul
final. intre a cornponenta ~i componenta pe care a are in subordine exista a legatura de
tip tate-flu . Componentele care fac parte din aceeas i cornponenta sunt frati. Pentru
stabi lirea costului total al produsului trebuie parcurs arborele, ca sa se calcule ze costul
fiecarei componente. Costul c al unei componente se obtine prin adunarea pretu lui de
achizitie p la costu l asarnblarii a: c=p+a. Parcurgerea arborelui se face pornind de la
ultirnul nivel catre radacina. Radacin a se prelucreaza ultima , dupa ce au fast prelucra ti
toji subarborii subo rdonati ei.
Observat ie . Pentru studierea proprietatilor unui obie ct, orice obiect poat e fi descompus
la randul sau i n obiec te mai simple. Fiecare obiect, la randul sau, poate fi caracterizat
printr-o lista de proprietati. Procesul de descompunere poate sa continue pe mai multe
nivelur i. EI este finit si se terrnina dupa un nurnar de etape care este dependent de
problema care trebuie rezolvata. Procesul de descompunere este un pra ces recur siv
(un obiect este cam pus din alte obiecte). Prin proc esul de desco mpune re se ~
stabileste 0 ierarhie a obiecteJ or, iar reprez entarea acestei descompuneri se .....c:l :~ e-
poate face printr-o ar boresce nta .
int nodt( i n t x)
{for ( i n t i ===l ; i< =n; i ++ ) if ( t U l == x ) return 0 ;
return 1 ; }
voidinit (i n t r)
{int i=1; v f=] ;
while (i< =T1 && t liJ ! "'""r) i+ + ;
st [vn .NP=r ; s t [vf) . PFNNP =i ; }
int es te vi da() {return v f =-=:O ; }
void adaug( i n t x , int y) {v f ++; s t [vfJ . /\,P =x; src(vf] .PFNNP= y ; }
void e l im i n () { vf - -;}
void pre lucrarc()
(int NC"= st [vf] . NP , PFNN C=s~ [ v f ] . PFNN P, NP"" PFNNC, PYNNP , i = PFNNC+ l ;
ccut.ccu r'<c" "; P FNt~ P = s t [ v f ) . PFNNP ; e lim in() ;
while ( i <""D && t[i l j =NC) i + -r ;
if ( i< =n} { P F NNC=i; aclaug {NC,P FNNC) ; }
if ( ! noc t (NPl )
{ i = PFNNP+ l; while (i<=n & & t [ i] ! =NP ) i+ + ;
if ( i <=rt) {PFNNP=i; adaug(NP ,PFNNP) ;}}}
void c i t i r e ( ) { t» r,; for (i n t i =1; i <= n ; i + + ) f » t [ i ]; f. c lo s e () ; }
int r ad t )
{f o r (i n t i = l ;i<=rt ;i++) if (t [ i]==O) return i ;
return O; }
void main ()
{in t x. c.i t Lr e j j.: .c=rad() ; i nt t{ r ) ; cc-rtccv uodu r .t Ie v i zi t ate : "« r « " II .
':::>~
A . ~ Prin parcurgerea i n tat irn e a unu i arbore cu radacina, pre lucrarea
~ . tcntic .:s:- informatiilor din noduri se face pe n iv el uri ier arhice, iar prin
~ pa rc u rq er ea in adancime in p reordine a unu i arbore, prel ucra rea
in fo rrnatiilo r din noduri se f ace dupa relatii le de s ubordonare.
Co mpartime nt marketing
Arbori multicai .
Torrninoloqie:
-) Cei doi succesor i ai unui nod (daca exista) se numesc succesor stan q (s ubarbore
stanq) ~i s ucce s or dre pt (s ubarbore dropt) - arborele A, din figura 66 . A,
Caracteristici : Radacina
-) Deoarece , oricare ar fi un nod al arborelui , el nu
are mai mult de doi descendenti directi, ordinul
unui nod dintr-un arbore binar poate fi 0 (nod
termi nal), 1 (unul dintre subarbori este vid) sau 2.
-) Definitia arborelui binar este 0 definitie recurs iva .
Exista' un nod privilegiat - numit nod'radacina, iar
celelalte nodur i (daca exists) sunt repartizate Tn
doua grupuri disjuncte si, fiecare dintre aceste
grupuri formeaza, la randul sau, un arbore binar.
No durilc
m
tcnninalc
Observatie- Arborele binar fiind un arbore cu radaci - (frunze)
na pozitionat , se face diterenta Tntre succesorul Fi g. 66
'
B
nod (B), iar succesorul drept este arborele vid, iar Tn arbore le Ab2
succesorul stang este arborele vid , iar succesorul drept are un nod (B). Fig. 67
306 Implementarea struetnrilor de date
Y2 = Y3f2 + X2
Y1 = Y2/2 + X1 Fig .69
Rezulta ca: N:: 1+Yk+Yk_1 + ... +Y2+Y1+YO= 1 +2 X(Xk+ Xk.1 + . . +X2+X1) :: 2xn+1 7
Propozrtia 16.Un arbore binar strict are un nurnar impar de nod ur i.
Demcnstratle - Pe fiecare nivel k+1 , pentru fiecare nod de pe nivelu! k ,
exista cate doi descendenti sau nici un descendent. Rezulta ca pe tlecare
nivel, cu exceptia nivelului 0, exista un nurnar par de noduri. Numarui total
de noduri va f impar, deoarece la aceste noduri S8 adauqa s! nodul
radacina
4
Se numeste arbore binar echilibratun arbore binar care are
proprietatea ca diferenta dintre Inaltirnlle celor do i subarbori ai Fig . 70
ori carui nod este cel mult 1.
A, Exemplu - Arbo rele A, din figura 70. 1
Se numeste arbore binarperfect echilibrat un arbore binar care 2 3
are proprietatea ca diferenta dintre nurnarul nodurilor celor doi
subarbori ai oricarui nod este cel mult 1. 4 8
A 1Q Exemplu - Arborele A 10 din figura 71
6 Fig . 71
Proprietate. Un arbore binar cu n noduri este perfect echilibrat
daca subarbo rele stanq are [nl2] noduri, iar subarborele drept are n-[n/2]-1 noduri.
Se nurneste arbore binar complet un arbore binar strict care are
toate nodurile tenninale pe acelasi nivel.
A u Exemplu - Arborele A" din figura 72
Informatica 307
Propozit la 19. Un arbore binar complet, care are n noduri
terminale, are i n total 2 xn~1 noduri.
Demon st ratie - Folosind principiul inductiei matematice, oemonstram
k
ca. Intr-un arbore binar complet, pe ruvelul k sunt 2 noduri (se noteaza
cu Pi propozitia i). 4 7
Po- Pe nivelul 0 exista un singur nod (nodul radacina), adica 2° =1 nod
1 Fig , 72
P 1 - Pe nivelul 1 exista doua noduri, adica 2 = 2 noduri.
.... . .
Pk - Pe nivelul k exista Zk nod uri ..
Pk+1 - Con siderand propozitia Pk adeva rata, trebuie sa dernonstrarn eel pe nivelul k+1 exista Zk+1
noduri, Daca niveluJ k+1 aparune arborelui, atunci pe acest nivel exista cate doi descendenti pentru
k;;;2k 1
fiecare nod de pe nivelul k , in total 2xZ + noduri. '
Considerand ca arborele are k nivelun ~i ca numarul de noduri de pe nivelul k este n , numarul total de
noduri din arbo re se obtine adunand nodurile de pe cele k ruvelun:
2° + 2 1 + 2 2 + ... + Zk = Zk+1_ 1;;; 2x(Zk) - 1:; 2xn -1
[ SmdlillJl. de ClllZ t 8
Scop: identificarea colectti lor de date care pot Ii reprezentate prin arbori binari.
Enunt ul p ro bleme i 1. Trebuie sa S8 organizeze un campionat de meciuri de base /let
intte ech ipele mei multor licee . Nutne tul de echipe este n . in fiecare oumince se
organizeaza un me ci. Ech ipele care vor juca in prim a etepe se trag la sotti. Sa se
realizeze pla nificarea meciurilor §i sa se de termine numetut de duminici in care se va
oestesure cempionetut (figLira 74).
Fina l
~
Campio natul are 0 structure ierarhica, iar
relatiite dintre componente pot fi repre- Se mifinala
zentate cu ajutorul unu i arbore binar, In
/ '"
~rti~ 2rti~ ~rti~ 2rti~
care cele c oua echipe care joac a sunt
nodur ile. Nodurile terminale sunt echipele
liceelo r, iar celelalte noduri reprezinta cate 0 A Be 0 E F G H
echipa care a castiqat in meciul etapei
Fi g. 74
anterioare. Radacina arborelui este echipa
care ca~ti ga finala. Deoa rece 0 echipa castiqa toare se desemneaza in urma unui rneci
jucat , nodurile care nu sunt terminate reprezinta meciuri juca te, iar nodul radacina cores-
punde mec iului final. A rcele reprezinta relatia de participare a unei echipe la un meci.
Arbore le meciurilor este un arboro binar strict (la un meci participa doua echipe). Daca
arborele meciurilor este un arbore bin ar compt e! si la cam pionat participa n echipe , vor
fi n nodur i term inale si arborele va avea 2 xn ~1 noduri. Nurnarul de meciuri care se vor
juca este dat de diferenta dintre nurnarul total de noduri ale arbo relui si nurnarul de noduri
terminale , adica n-t rneciu ri, iar campiona tul se va destas ura in n~1 duminici.
Enuntul pro blemei 2. Sa se reprezinte modul in care se evalueaz8 0 expresie eritmetic« .
a exp resie aritrnetica este fermata din operanzi (constante si variabile), operatori aritrne-
tici (+, -, I, • ~i A - pentru ridicar ea la putere ) si paranteze . in evaluarea expresiei aritme-
308 lmplcm cn tarca str ncturilor dc datc
lice S8 resp ecta prio ritatea operatorilor aritmetici. Op eratorii aritm etici sun t
o perato ri b.inar i care nu su nt toti comutati vi (operatorii pentru scadere,
l rnpartire si ridicare la putere nu sunt comutativi). Daca notam operanzii cu
x ~i y ~i operatorul cu OP t atunci expresiei E = x op y putem sa-i asociem
arborele binar din figura 75, in care radacina este operatorul o p , subar- Fi g. 75
bore Ie stanq este primul operand - x , iar subarborele drept este al doile a
operand - y . Daca expresia coniine un singur operand , acestu ia i S8 poate asocia un
arbore binar cu un singu r nod - nodul radacina - in care se memorea z8 ope randul. Pentru
a putea reprezenta 0 expresie care este fer mata cu un operator unar (de exemplu, E=-x),
vom transforma exp resia astfel ln cat sa contina un operator binar (in exemplu, E=O-x).
Expresia are 0 structura ierarhica, iar relatiile dintre componente pot f reprezentate cu ajutorul
unui arbore binar, in care operanzii si operatorii sunt nodurile. Nodurile terminale sunt ope-
ranzii, iar celelalte noduri reprezinta operatorii. Radacin a arborelui este operatorul care se
evalueaza ultirnu l. Subarborele stanq ,i subarborele drept ai radacin ii reprezmta expresiile
carora Ii se aplica ultirnul operand . Radacina fiecarui subarbore va reprezenta operatorul care
se aplica pe cele doua expresi i reprezentate prin subarborii
Fi g. 76 +
stang , i drept ai sai, Arcele reprezinta relatia de participare a
unei expresii la operatorul din nodul parinte: ca prim operand •
sau ca al doilea operand . Arborele expresiei este un arb ore
bi nar strict (un operator leaqa doi operanzi ). Daca expresia
contine n operan zi, arborele va avea n noduri terminale . Fiind
un arbore binar strict. va avea 2xn -1 noduri . Nurnarul de
operatori este dat de diferenta dintre numarul total de noduri
y
ale arborelui si nurnarut de noduri terminale, adica n-1
operatori. Arbore le expresiei nu este un arbo re ec hilibrat.
Arborele binar din figura 76 este arborele expresiei aritmetice:
. _ ( _ ., 2+ 4 x y ) x _
l'.. = :'!x +- ~,
z +y y -<3 ~~.1>-
,i
nivelul stra-strabunici. Radac ina este persoana pentru care se i ntocmeste arbo rele
genealogic. Fiecare nod are doi descendenti : mama tata . Ce tip de arbore binar este?
Cornparati acest arbore cu arborele genealogic al descendentilor (arborele filiatiei).
2. Desenati arborele campionatu lui de baschet pentru 7 echipe. Ce fel de arbore binar este?
sl [i]
dr[i]
2
14 1 6
31
0 'I 5
O 0 I 0 ~If-'--'-
0 8
Observa t ie. Din cei doi vectori puteti obtine urrnatoarele inforrnatii:
-7 eticheta nodului radacina r - nodul i pentru care, oricare ar f md ice le j , s l m",i si
d rDl;t:i (nodul a ca rui eticheta nu ex ista nici In vectorul st, nici in vectorul dr);
-7 etichetele nodurilor terminale - nod uriIe i pentru care sl [i] +dr[i] =O;
-7 eticheta pa rinte lui unu i nod i - ind icele j pentru care s l m =i sau d rm =i ;
-7 etichetele liilor unui nod i - sl[i ] si dr[i] (daca sunt diteriti de 0) ;
-7 eticheta Iratelu i unu i nod I - st jj ] pentru d rm =i sa u d r jj ] pentru slm =i .
2. Folosind dci vectori in care se rnernoreaza filiatia nod uri lo r
-7 vectorul tata - in elementu l i se merno reaz a nu rnaru l de ordine al nodu lui predece-
sor (parinte) al nodului i ;
-7 vectorul fi i (In elementul i se memoreaza ce lei de succesor al parintelui .este: daca
fii [i]=-1 , atunci nodul i este succesorul stanq al parintelui sau , iar daca fii[i]= 1,
atunci nodu! i este succesorul drept al parin telui sau.
Daca nodul i este nodul racacina. elementul din vectorul tata , respectiv fii , va avea
valoarea O.
Caracteristici :
-7 Pentru orice nod , subarborele stanq contin e noduri cu valor i mai rnici ale cheii, iar
subarbo rele drept coniine noduri cu valori rnai mari ale cheii.
-7 int r-un arbore binar de cautare nu exista doua nod uri cu aceeasi valoare a cheii .
Pentru rnultirnea de chei {2, 5, 7, 10, 12, 15, 23} des enati arbor ii binari de
caut are cu in altimea 2, 3, 4, 5 ~ i 6.
r'->s~NULL ; r->d=NULL ; }} vo i d ma i n( }
v o i d ma i n () {int k :
{in t k , . . . cout« "Chei a care s e inserea za : 11 .
~
l;>tergere nod terminal k=1. o l;>tergere nod terminat k=7.
P ->S= NULLi p ->d=NULL;
p---. 5 1
del ete ql ; de lete cr2 i
q,---. l' ' 7 -q,
Fig. 81
Fig. 82
1
Fig. 83
3
PAS1 . Se cite ste chela k a nodului care se sterqe.
PAS2. Se initializeaza pointerul r cu adre sa radacinii,
PAS3 . Cat timp nu s-a sters nodul ~ i nu s-a ajuns la arborele vid exec uta :
PAS4. Dad ; nodul eurent are cheia egala eu k , atun ei se trece la Pasul 5. pentru
a se analiza ee tip de nod este; altfe l, se trece la Pasul 9.
PASS . Dae ii nodul curent este nod term inal . atunei , i n nodul parinte , adresa lui
este inlocuita cu arborele vid, S8 eliberea za zona de memorie ocupata de
nodul curent - ~i se revine la Pasul 3.
PAS6 . Dac a nodul curent are numai succe sor drept, atunc i, in nodul parinte ,
adresa lui este lnl c cuita cu adresa succesorului sau drept, se elibereaz a
zona de memorie ocupa ta de nodul curent - si se revine la Pasul 3.
Informatica 321
PAS? Daca nodul curent are numai succesor stanq , atu nci , in nodul parinte.
adresa lui este tnlocuita eu adresa sueeesorul ui sau stanq, se eltbereaza
zona de memori e ocupata de nodul curent - si se revine la Pasul 3.
PAsa. Se cauta, In subarborele drept al nodului curent, primul nod care nu are
sueeesor drept, se copiaza inforrnatia utila din aeest nod in nodul eurent, se
elibereaza zona de rnernorie ocupata de nodul gaslt - ~i se revine la Pasul 3.
PAS9. Daca nodul curent are cheia mal mica decat k , atunc i se cauta nodul
care trebu le sters in succesorul crept: alttel , se cauta nodul care trebuie
sters In succesorul stanq. Se revlne la Pasul 3.
PAS10 . Daca s-a ajuns la arborele vid, atunci se afiseaza mesajul "Cheie nu existe" ,
Observatie. Transmiterea adresei de la nodul curent (care se sterqe) la parintele sau, se
face prin transmiterea prin referinta a parametrului eu adresa nodului.
void s t e r qe._n o d( n od *&r, no d *&c )
/ *58 ca uta in subarborele dr ept; &1 n odului c u ren t{ r ) p r i mu I. n od care
nu are sucCe s o r d rept (cl ~/
{nod *Pi
if (c - > d ! ~NULL ) s t e r g e _ n o d J r, c - > d )i
else t r -c-nr v c- on r. lise ccpi a za .i.nf o r mat i a u ti li§. di n rrodu L
Ilg'as it i n n ociu Lccu r e n t
p~c - > s; delete c ; c =p ; } }
/Is e $ t erge Dodu1 gas i t ca nod ca r e a r e numai s ucc es o r dr ept
void s t erge r e (no d *&r, irit k )
{nod 'kC ;
if ( r! =NULL)
if (r ..; >n r = =k) Iidacas "': ag a si t nodulc a r e t c e bu.L e s t e r s
if (r"':>s=~NULL && r ->s"N'""NULL) I idaca est e nod t ermin a l
(delete r ; r =NULL ; }
else
if { r~> s~ =;NULLr / / oe ca e s te nod ca re a re nlillla i 's ucce soz- drept
{c=r- >d; delete r ; r = c ; }
else i f (r -e-d NULL ) //daca. c s t c nod care a r e r usne f euccesor s tang
{ c ~ r - > s; de lete r ; r ~ c ; }
else sterge n od(r r r -> s) ; I /daca a re ambii succes ori
else I idacami s - ag a sitpodlllcare t .reb u i.e s t.e r s
if (r->tu·<k) s t e rqer e (r - >d , k) i / /caut5. in s u c ce s c ru .I d rept
else sterg e re( r ->s , K) ; IlcaU t a in succeso rul stang
else cout«" Ch e i a n u ex ista" ; }
void main ()
{int k ; ... cout«"Che i a c a r e se s t e r c e : "; cin» k; ster ger e( T , k} ; . . . }
Ordinul de complexitate al algoritmului este Oth) Rezulta ca timpul consumat pentru operatii-
le de prelucrare a arborilo r binari de cautare este direct proportional cu i nalfim ea arbore lui h .
Propozitia 20
inal\imea unui arbore binar cu n noduri poate lua valori i nt re 1092(n)-1 ~i n-1.
Demcnstratle. Notam cu h Inaltimea arbcrelui binar cu n noduri. Arbor ele binar are cea mai mare
tna'time (h_ m a x ) atunei cand este degenerat (nodurile sunt distribuite cate unul pe fiecare nive! -
cu exceptia nodului terminal, ordinul fiecarui nod este 1). Rezulta ca h_max =n-1 ~i hs n-t Arborele
binar are cea mai mica Inaltime (h_ min) atunc i cand este comp let (toate noduri le termin ate se
qasesc pe acelasi nivel-:- ~ i ordinul fiecarui nod, cu exceptia nodurilor term inale, este 2). In acest caz,
pe fiecare nivel i vor fi t noduri, iar nurnaru ! n de noduri va f ega! cu Z h_ mm +1_ 1. Rezulta ca n+1 =
2h_mio+l . i h_m in+1 = lo g2(n+1). Din ultima eqalitate rezulta ca h ~ 1092(n)-1 .
Eficienta algoritmului de prelucrare a arborilor binari depinde de modul in care a fost
creat arborele. Daca el are Inaltirnea maxima (arborele binar degenerat, in care fiecare nod nu
are decat un succesor), ordinul de complexitate al algoritmului va fi O(n) si este egal cu cel al
algoritmului de cautare secventia'a intr-o structura de date liniara. Daca el are Inaltim ea minima
(arborele complet sau aproape complet), ordinul de complexitate al algoritmului va fi 0(1092n).
1. Cornparati, din punct de vedere al eficientei, algoritmii recursivi si
iterativi pentru determinarea minimului, respectiv a maximului, intr-un
arbore binar de cautare. Care dintre variante este mai eflcienta?
2. Pentru arbo rele binar A '4 din figura 79, cate operatii de deplasare in structura de date
se executa pentru a determina minimul? Daca valorile din arbore ar fi fost memorate
intr-o structura liniara, cate operatii de deplasare s-ar fi executat pentru a determina
minimul? Care dintre structurile de date este mai eficienta?
3. Scrieti 0 functie care sa creeze un arbore binar de cautare perfect echilibrat.
4. Scrieti 0 functie care sa verifice daca un arbore binar este un arbore binar de cautare.
5. In nodurile unui arbore binar sunt memorate numaratorul si numitoru l unor fractii
distincte. Sa se simplifice fractiile din arbore, iar daca in urma sirnplifica rii rezulta un
nurnar int reg, sa se elimine din arbore.
6. in nodurile unui arbore binar sunt memorate numere intregi . Se citeste de la tastatura un
numar intreg x. Sa se caute in arbore nodul cheia x si daca se qaseste , sa se afiseze
fratele sau - precizandu -se daca este fratele stanq sau fratele drept. Sa se afiseze un
mesa] de informare daca nu se gase$te cheia x in arbore sau daca nodul nu are Frate.
i n algoritmi i pentru prelucra rea unui ansamblu Heap S8 va folos i implementarea statica a
ansamb lului cu ajutorul vectorulu i. Daca lungimea fizica a vecto rului este NMAX , nurna rut
de noduri n ale ansamblului Heap nu trebu ie sa fie mai mare decat NMAX -1. Deoarece
vectoru l Heap 58 con struieste pe baza mecani smului de leqatura parinte-fii Intre indici,
etichetele ansam blului Heap 58 vor memora in vector lnce pa nd eu indicele 1.
In forma tica 325
Algoritmul pentru crearea unui ansamb lu Heap
Crearea unui ansamblu Heap presupune adauqarea elementelor in vector , pomind de la pri-
mul element, astfel l ncat aceasta reprezentare sa respecte proprietatile unui ansamblu Heap:
(1) Sa fie un arbo re apro ape compl e!. Deoa rece in arbore nodu l trebu ie ad auqat pe
ultimul nivel, imediat la dreapta nodu lui existent, tnsearnna ca in vecto r S8 va
adauqa noua cheie imediat dupa ultimul elemen!.
(2) in orice pereche de noduri tala -fl u , cheile trebu ie sa fie i n relati a de ordine presta-
bilita. Daca in arbore se adauqa un nod in pozitia prec izata , este pos ibil ca el sa
nu fie cu pari nte le sau i n relatia de ordine prestabiita . Solutia este de a propaga
inforrnatia din aeest nod catre radacina, pEm a cane este lndeplinita relatia de
ordine intre nodu l in care a ajuns lnforrnatia sl parintel e SEIU.
in algoritmu l pentru crearea ansamblului Heap se foloseste variabila j pentru lungimea
loqica a vectorului (reprez inta nurna rul de elemente care au fast adauqate in vecto r) ~ i
variabila i pent ru indicele nodului curent. Algoritmul urrnator se poate lo losi pentr u crearea
unui Heap Maxim :
PAS1. Se citeste prima cheie ~i se rnernoreaza in radacina arbo relui (elementul v j i j).
PA S2. Penlru nodul j de la al doilea nod , pana la ultimul nod din arbore , oxocuta :
! PAS3 . Se scrie cheia in elementu! cu indicele j .
iPAS4 . Se initializeaza indicele elementu lui curent i cu lungimea loqica a vectorulu i j .
! PASS. Cal l im p nodu l curent este dilerit de nodul radacina exec ut a:
PAS6. Daca che la mernorata in nodul curent (elementul cu indicele i) este
mai mare dedit chela rnernorata in nodul parinte al nodului curent
(elementul cu indicele i/2), alunci se interschirnba cheia din nodu l
curent cu cheia din noduJparinte, iar nodul parinte dev ine nod curent;
altfel , radacina devine nod curent.
fst ream f( "heap .txt " , i o s : :in ); //c h e i le s e c i t e ec dinLL$ier
int const N11'AX=100 ;
int \' [NMAX ] , n :
void c r e a re~h eap()
{i n t i , j , a u x ; f »n ;
i f (:o<=NMAX -l)
{f » v [ l ] ;
fo r ( j=2 ;j<=n ;j++)
( f »v [j ] ; i=j ;
wh i le (i>l)
if (v [iJ>=v [i / 2 J ) {a uxev Li ] , v [ i ] = v [ i/ 2 ]; v[i!2] =au x ; i = i ! 2 ; )
else i=l ; } )
els e cout«" Nu se p oa t e c.re a - arborele a r e rnai rnu.Lt e n c du ri
decat l u n gi me a f i zic a a vect o r u l~ i r ' « e n d l ; )
void e f i.s a r et ) {for l i n t i =Li <=tl ;i ++ ) cou t-oc v I i j c-c" ";}
vo id ma in () {cr e n r e _ h e a p ( ) () ; a f i s a r e (} ; }
=~
Ch eia ma xim a din n-1 noduri
1 2 3 4 n- 2 n -l n
[ JE"V'S1]:\Ulaur-<e )
Adevarat sau Fals:
1. Arborele este un graf fara cicluri , minimal cu aceast a prop rietate .
2. Arborele partial de cost minim deterrnina drumuri le de lungime minima dintre oricare
doua noduri dintr-un graf conex.
3. in algoritmul lui Kruska l pentru const ruirea APM , se porneste de la un arbore partia l
care cont ine nodul radacina.
4. intr-un arbore cu rad acina , implementarea cu referi nte ascend ente Ioloseste doi
vectori: unul pentru a me mora nodurile terminale ~ i altul pentru a memora parintii
nodurilor terminate .
5. Algoritmul de parcurge re in latime a unui arbore cu radaci na prelucreaza into rmat ia
in functie de rela tiile de subordonare dintre noduri.
6. Arborele binar este un arbore cu radacina, in care fiecare nod are eel mult doi
succesori.
7. Un arbore binar strict este un arbore echi libral.
8. Un arbore vid este un arbore in care nodul radaci na nu are succesori.
9. intr-un arbore binar de ca utare , cheia or icarui nod este mai mare deca l chelle
succesorilor lui.
10. Pentru a sorta crescato r un vecto r cu algoritmul HeapSort , vectorul trebuie sa imple-
menteze un arbore binar in care , pentru fiecare nod, cheia din succesorul stang este
330 Im plcrncntarca structurilor de da te
mai mica decat cheia din nod . iar chela din succesorul drept este rnai mare deca t cheia
din nod.
11. Tntr-un ansamblu Heap , cheile nodurilor trebuie sa fie distincte.
Alcqeti :
1. Grice graf neorientat cu n nod uri ~ i n-1 rnuchii:
a. este aciclic si neconex b. este conex daca si numai daca este aciclic
c. este un arbo re d . este conex si conf ine un ciclu
(Bacalaureat - Simulare 2003 )
2. Nurnarul de muchii ale unui arbo re cu 9 noduri este:
a. 9 b. 7 c. 8 d . 10
3. Nurnarul maxim de noduri terminale ale unui arbore liber cu 15 noduri este :
a.15 b. 14 c.12 d.10
4. Numarul maxim de nodu ri terminale ale unui arbore cu radacina cu 15 noduri este:
a.15 b.1 4 c.12 d.10
5. Nurnarul maxim de no duri terminale ale unui arbore binar cu 15 noduri este:
a. 6 b. 7 c. 5 d. 4
6. Se considers un arbore cu urrnatoarele propr ietati : radacina este nodul 1 (considerat
de nivel 1) ~i fiecare nod i (cu hi$3) allat pe nive lul j are ca descendenti nodurile i+j
si i+2 ' j . Nodu rile i (cu i>3) sunt nodur i terminate (frunze). Stabiliti care dintre vectorii
urrnatori este vectorul de tali (sau de predecesori) corespun zator arbo relu i:
a. 0 1 2 2 1 3 3 b. 0 -1 1 -1 -1 1 1
c. 0 1 1 2 3 2 3 d. 0 1 1 2 2 3 3
(Bacalaureat - Simu lare 2003)
7. Se cons idera arborele din ligura alaturata . Care dintre noduri
tr~b.ui: ales ca radacina astfel lncat lnaltirnea arborelui sa fie ~ 2 3 4
minima.
a. 7 b. 3 c. 5 d. 6 5 6 7
(Bacalaureat - Sesiunea specials 2003)
8. Un arbare are 14 naduri. Atat radacina . cat 9i fiecare dintre nadurile neterm inale au
ce l mu lt 3 descendenti directi. Inal~jmea maxima a arbarelu i (nurnarul maxim de
much ii ce leaqa radacina de 0 trunza ) este:
a. 4 b. 13 c. 5 d. 3
(Bacalaureat - Ses iunea specia la 2003)
9. Memararea unui arbore cu ajutarul matr icei de adiacenta a grafului este 0 metoda :
a. eficie nta b . nee ficienta c. incorecta d . recornandabila
(Bacalaureat - Sesiunea specia la 2003 )
10.5e conside ra arborele din figura A2B. Definim i naltimea arbo relui ca fiind nurnarul
maxim de muchii care torrneaz a un lant care une ste radacina de
un nod termin al. Care este l naltimea maxima a arborelui cu
radacina ce se poate obtine aleqand ca radacin» unu l dintre
nodu ri?
a. 5 b. 3 c. 6 d. 7
(Bacalaureat - Sesiunea iunie-iulie 2003 )
11.5e cons idera un arbore cu radacina in care arice nod care nu este term inal are exact
3 descende nti directi. Atu nci, nurna rul de noduri term inale (frunze) poate fi:
Inf o r m atica 331
a. 15 b. 24 c. 2 d. 14
(Bacalaureat - Sesiunea iunie-iulie 2003)
12 .5e considera un arbore in care rad acina este considerate de nivelul 1 :;;i orice nod de
pe nivelul i are exac t i+ 1 descend ent! directi, cu exceptia noduril or de pe nivel ul 4
care sunt noduri term inale. Numarul de noduri terminale (frunze) sunt:
a. 24 b. 120 c. 6 d. 30
(Bacalaureat - Sesiunea august 2003 )
13.Se considera un arbore. Despr e un lant care uneste doua noduri distincte n, si nz se
poate afirma:
a . e ste unic oricare ar fi "1~i "1 b. este unic daca ~i numai daca n- sau n2e ste terminal
---.)t:r-
C. nu este unic oricare ar fi "1~ i "2 d. este unie daca ~i numai daca n, sau "2 este radacin a
(Bacalaureat - Sesiunea august 2003)
14. Stabili\i care dintre grafurile ataturate ~ ~
este arbore : a. b. c. -..- d
(Bacalaureat - Simul are 2004) .
Urrnatorii 4 item i se refers la arborele cu %
radacina cu 8 noduri, cu much iile [1.7],
[1,8]. [3,1J, [3,4], [3,5], [4,2], [4 ,6] si cu radacina in nodul cu eticheta 3.
15.Vectorul tata al arborelui este:
a. 340 334 1 2 b. 330 43 4 1 1 c. 3 40334 1 1 d. 34 3 34 1 1 0
16.Numarul de noduri terminale ale arborelui este:
a. 6 b. 4 c. 5 d. 3
17 .inal\imea ma xima pe care 0 poate a vea , schirnbandu-se nodul , radacina este :
a. 6 b. 5 c. 4 d. 3
18 .Daca S8 ia ca radacina nodul cu eticheta 2, Inaltirnea arborelui este:
a. 5 b. 2 c. 4 d. 3
ts. Nurnaru' de componente conexe care S8 obtin daca S8 elirnina muchiile care au 0
extremitate in nodul cu etiche ta 3 este :
a. 3 b. 4 c. 2 d. 1
Urmato rii 5 itemi 58 retera Ia arborele cu radacina cu 8 noduri care are vect orul tata: 2 0 2
1 1 1 3 3.
20.Numarul de noduri terminale ale arborelu i este:
a. 3 b. 4 c. 5 d. 2
21.Numarul de lanturi de lungime 3 este :
a. 3 b. 4 c. 5 d. 6
22.Numarul de lanturi de lungime 2 care pornesc din radaci na este :
a. 2 b. 4 c. 3 d. 5
23.Numarul de nivele ale arbore lui este:
a. 2 b. 3 c. 4 d. 5
24.Fiii nodulu i 3 sunt:
a. 4, 5 6 b. 1. 2 c. 7, 8 d . 2. 7.8
25.Un arbore binar strict cu 4 ncdu ri terminate are in total
a. 5 noduri b. 7 noduri c. 9 noduri d . 10 noduri
26.Un arbore binar strict are:
332 Irnplemc nta r ea structnrilo r de date
a . un numar par de nod uri b. un numar impar de noduri
c. un numar par de muchii d. un numar impar de muchii
27.Se considera arborele din figura alaturata . Stabiliti ce fel de
arbore nu este:
a. arbore binar b . arbore de cautere
c . ansamblu Heap d. arbore strict
28.Se considera arborele din figura de la problma anterioara.
Stabilit i ce fer de arbore nu este: 3
a . arbore echilibrat b . arbore comp let
c . arbo re aproape complet d . arbore strict 10
29. Un arbore binar strict cu 4 noduri termina te are in total :
a. 4 muchii b. muchii c. 8 muchii d. 9 muchii
Urrnatorii 5 itemi S 8 refera la arborele binar din fjgura alatur ata: r
este un pointer catre radacina, iar p si q . doi pointeri catre un
nod oarecare :
30.Alege1i varianta corecta pentru a afisa cheia 15:
a. cout« r- >d - >d >- > i n f o; b. cout« r - >s - >s >- >i n r o ;
c. p = r -> s ->d ; cout« p- >d - > i n f o; d. p =r ->s->d ; c o u t «p->info ;
31.Daca se executa instructiunea: p =r - >s ->d ->d ; pointe rul p va indica che ia:
a. 21 b. 20 c. 18 d . 25
sz .u rmatoarea secventa de instructiuni :
per -c-d -c-d , p""V-> s; q'"'"new nod ; q ->info=5 ; q ->s""'NULI. ; q ->s=NULL ; p - >s:=:q ;
realizeaza :
a. adauqa nodul cu cheia 5 ca succesor stanq al nodului cu cheia 30;
b. adauqa nodul cu cheia 5 ca succeso r drept al nodului cu chela 30;
c. adauqa nodul cu cheia 5 ca succesor stanq al nodului cu cheia 19;
d. adauqa nodul cu cheia 5 ca succesor crept al nodului cu cheia 19;
33.Urrnatoarea secventa de instructiuni:
for {p= r ; p - >s !=NULL i P=P- >S) ; q~n ew nod ;
q-> i nfo=20 ; q->s =NULL; q->s o=NULL; p->s=q ;
realizeaz a:
a. adauqa nodul cu cheia 20 ca succesor stanq al nodului cu cheia 25;
b. adauqa nodul cu cheia 20 ca succesor drept al nodului cu cheia 25;
c. acauqa nodul cu cheia 20 ca succesor stanq al nodului cu cheia 21;
d . adauqa nodul cu cheia 20 ca succesor drept al nodului cu che ia 21;
34.Urmatoarea secventa de instructiuni :
for (p~ L; p ->d- >j! ~NULL ;p=p->j) ; q - p -od . p - >d 'NULL; dispose q ;
realizeaza:
a. elimina nodul cu cheia 21; b. elimina nodul cu chela 18;
c. elirnina nodul cu cheia 25; d. elirnina nodu l cu cheia 30;
Miniproiecte:
1. Pentru evidenta elevilor din clasa, se pastreaza urrnatoarele inforrnatii: nurnarul de ordine
din catalog. numele si prenumele, mediile semestriale ~i media anuala la disciplina infor-
matica. Reallzati a aplicatie care sa asigure urmatoarele functii:
a. adauqarea unui nou elev;
Informatica 333
b. elirninare a unui elev;
c. modificarea mediei unui elev:
d. afisarea elevi lor eu med iile (semestriale, respectiv anuale), in ordinea descrescatoare a
rnediilor ,
e. afisarea elevilor eu mediile (semestriale, respectiv anuale) cuprinse intre doua valori care
se citesc de la tastatura .
2. lntr-o biblioteca, pentru fiecare carte se pastreaza urmatoarele lntormatii: codu l cartli, titlul,
autorul, numarul total de exemplare ,i nurnarul de exemplare disponibi le la un moment dat.
Realiza~i a aplicatie care sa asigure urmatoarele functii:
a. reqasirea unei carti, du pa autor, pentru a afisa nurnarul de exemplare disponibile;
b. adauqare a unui nou titlu:
c. ad auqa rea de noi exemplare, pentru titlurile existente;
d. modificarea nurnarului total de exemplare (In cazul distrugerii unora dintre ele):
e. modificarea nurnarului de exemplare disponibile, in cazul in care 0 carte este
imprumu tata sau tnapoiata:
t. afisarea cartilor pentru care nu mai exists exemplars disponibile;
g. afisarea In ordine afabetica a autorilor.
3. Pentru fi ecare articol dintr-o magazie, S8 pastreaza urmatoarele informafii: codul articolului
(este unic pentru fiecare articol), denumirea articclului, unitatea de rnasura si cantitatea din
stoc. Realizati a aplicatie pentru gestianarea magaziei - care sa asigure urrnatoarele fu nctii:
a. adauqarea unui nou articol;
b. sterqerea unui articol;
c. introducerea de la tasta tura a can titatii intrate, dintr-un articol precizat prin cod , ~ i
actualizarea stocului;
d. introducerea de la tastura a cantitatii iesite, dintr-un articol preeizat prin cod , si cu
aetualizarea stoeului;
e. afisarea articolelor care au stoeul pe 0;
f. afisarea stocului unui articol al carui cod se introduce de la tastatura ;
g. afisarea . In ordinea codurilor, a stoeurilor din fieeare artico l.
Cup rins
I. Tchnici de proprnnuu-c ••....•. ... ... .... ...... ... .............••.......•................. ..•..••....••....••. 3
1.1. Analiza algoritmilor 3
1.2. Metode de construire a algoritmilor 5
1.3. Metoda backtracking .. .. 6
1.3.1. Descrierea metodei backtracking 6
1.3.2. Implementarea metode i backt racking 10
1.3.3. Probleme rezolvabile prin metoda backt racking. .. 14
1.3.3.1. Generarea perrnuta rilor . .. 15
1.3.3.2. Generarea produsu lui cartezian 17
1.3.3.3. Generarea ara njamente lor .. 20
1.3.3.4. Generarea combinarilor .. 22
1.3.3.5. Ge nera rea tuturor partitiilor unui nurnar natura l 24
1.3.3.6. Generarea tuturo r partitillor une i rnultirni 27
1.3.3.7 . Generarea tuturo r functiilor surject ive 28
1.3.3.8. Problema celor n dame . .. 30
1.3.3 .9. Pa rcurgerea tablei de sah cu un cal., . 31
1.3.3.10. Generarea tuturo r posibilitatior de iesire din labirint .. 34
1.4. Metoda " Divide ot Impera" .4 0
1.4.1 . Descrierea metode i "Divide et Impera" .4 0
1.4.2. Implementarea metode i "Divide et Impe ra".. .. .. 41
1.4.3. Cautarea binara , .. .4 8
1.4.4. Sortarea rapida (QuickSort) .. 50
1.4.5. Sortarea prin interclasare (MergeSort) . .. 53
1.4.6. Prob lema turnurilor din Hano i 54
1.4.7. Generarea mode le!or fracta le 56
1.5. Metoda greedy 59
1.5.1. Desc rierea metode i greedy .. . 59
1.5.2. Implementarea metode i greedy. . 61
1.6. Metoda proqramarii dinamice . . 70
1.6.1. Descrierea metodei proqrarna rii dinamice 70
1.6.2. Impleme ntarea metodei proqrarnarii dinamice ..73
1.7. Compararea metodclor de construire a algoritmilor 83
Evaluare .. 85
2 . Irnplcmcntarca structurilor de dale 90
2.1. Tipuri de date specifice pentru adrcsarea memoriei 90
2.2. Tipul de data pointer 91
2.2.1. Declarararea va ribilelei de tip point er 92
2.2.2 . Constante de tip adresa ., .. 92
2.2.3. Ope rator i pentru variabile de tp pointe r 94
2.2.3 .1. Operatorii specifici.. . 94
2.2.3 .2. Ope ratorul de atribuire 97
2.2.3 .3. Operatorii aritmetici 100
2.2.3.4. Operatorii relation ali .. 101
2.3. Tipul de data referinta 102
2.4 . Alocarea dinamica a memorici 106
2.5 . Clasificarca structurilor de date 109
2.6. Lista liniara 113
2.6.1. Implem entarea dina rnica a listelor in limba jul C++ . .. 115
2.62 . Clasificarea listelor 117
2.6.3. Algoritmi pentru prelucrarea liste!or simplu i nlantuite 118
2.6 .3.1. lnitia lizarea listei 118
2.6.3.2. Crearea liste i 118
2.6.3.3. Adauqarea primului nod la lista . . 118
2.6.3.4. Adauq area unui nod la tista 119
2.6.3.5. Parcurgerea listei . 121
2.6.3.6. Cautarea unui nod in lista 121
2.6.3.7. Eliminarea unui nod din lista 122
2 6.3.8. Eliberarea spatiutul de memo rie ocupat de lista 123
2.6.3.9. Liste ordonate 124
2.6.3.10. Preluc rarea listelor simplu Inlantuite .. 127
2 6.4. Algoritmi pentru prelucra rea listelor circula re simplu lnlantuite. . 137
2 .6A .1. Crearea listei ... 137
2.6A .2 . Parcurgerea listei .. . 138
2.6A .3. Elimi narea unui nod din lista 138
2.6.5. Algor itmi pentru prelucrarea listelor dublu lnlantuite 140
2.6.5.1. Adauqarea primului nod la lista 140
2.6.5.2. Adauq area unui nod la Iista ....... . 140
2.6.5.3. Parcurgerea listei 141
2 .6 .5A . Eliminarea unui nod din lista 14 1
2.6.6. Algoritmi pentru prelucrarea stivelor 145
2.6.6.1. lnitializarea stivei ... 145
2.6.6 2. Adauqarea unui nod la stiva ., .. 146
2.6.6 .3. Extragerea unui nod din stiva .. . ... 146
2.6 .6A . Prelucra rea stivei .... .... .. 146
2.6.7. Algoritmi pen tru prelucrare a cozilor 148
2.6.7.1. lnitiafizarea cozii 149
2.6.7.2 . Adauqarea unui nod la coaca 149
2.6.7.3. Extragerea unui nod din cc ada . 149
2 .6 .7 A . Prelucrarea cozii 149
2.6.8. Aplicatli practice 151
Evalu ar e .. 152
2.7. Graful 159
2.7.1. Defin itia matematica a grafului .. . 159
2.7.2. Graful neorientat .. 160
2.7. 2.1. Terminologie .... . 160
2.7.2.2. Gradul unui nod al grafului neorientat 162
2.7.2.3. $ irul grafic 164
2.7.3. Graful orient at 165
2.7.3.1. Termi nologie .. 165
2.7.3.2. Grade le unui nod al grafului orientat .. 167
2.7A . Reprezentarea si implementarea grafu lui 169
2 .7 A .1 . Reprezentarea prin matricea de adiacenta . 169
2.7 A .2 . Rep rezentarea prin matricea de incidenta . .. 175
2.7 A. 3. Reprezentarea prin lista muchiilor (arcelor) . . . 182
2.7 AA . Reprezentarea prin lista de adiacenta (Iistele vecini lor) 187
2.7 A .5. Aplicatii practice . .. 197
2.7.5. Gra furi spec iale. .. 20 1
2.7.5.1. Graful nuL 20 1
2.7 .5.2. Graful comple!.. ........ . 20 1
2.7.6. Grafu ri derivat e dintr-u n graf 203
2.7.6 .1. Graful parjial........... . 203
2.7.6.2. Subgraful 207
2.7.6.3. Graful complementar 211
2 .7 A .4 . Ap licatii practice .' 212
...
eV-((Vll.
2.7.7. Conexi tatea grafurilor. 213
2.7 .7.1. Lantu l . 213
2.7.7.2. Ciclul ........ ..21 8
2.7.7.3 . Drumu!.... ..220
2.7.7.4. Circuitu l . . 223
2.7.7.5 Graful conex ...... . 225
2.7.7.6. Graful tare conex 228
2.7.4 .7. Aplicatii practice . 235
2.7.8. Parcurgerea grafului 235
2.7.8.1. Parcurgerea in latirne - Breadth First 236
2.7.8.2. Parcurgere a in adanc ime - Depth First 240
2.7.8 .3. Aplica\ii practice . 246
2.7.9. Gra ful pond erat.. .. .. . 246
2.7.9.1. Definitia grafului pon derat .. . 246
2.7.9.2. Matricea costurilor .. . 247
2.7.9.3. Algo ritmi pentru determinarea costulu i minim (maxim) 249
2.7.9.4. Aplicatii practice 255
2.7.10. Grafuri spectate 256
2.7 .10.1. Grafu l bipartit 256
2.7 .10.2. Graful hamiltonian . 260
2.7.10.3. Graful eulerian. .... . 263
2.7.10.4. Graful turneu 268
2.7.10.5. Apticati i practice . 27 1
Evaluare . 272
2.8. Arborele 281
2.8.1. Arborele liber . 281
2.8.1.1. Definitia arbore lui liber . 28 1
2.8.1.2. Proprietatile arbori lor liberi . 28 1
2.8.2. Arbo rele partial . . 283
2.8.2 .1. Deli ni;ia arborelui partial, ...283
2.8.2 .2. Defi nitia arbore lui partial de cost minim 283
2.8.2.3. Algoritmi de determinare a arbore lui partial de cost minim 285
2.8.2.4. Aplicatii pract ice 292
2.8.3. Arborele cu radacina .................................. . 292
2.8.3.1. Defin itia arborelui cu radacina 292
2.8.3.2. Impleme ntarea arborelui cu radacin a 297
2.8.3.3. Algorit mi pent ru parcurgere a unui arbore cu radacina 299
2.8.3.4. Aplicatii practice 304
2.8.4. Arborel e binar . 305
2.8.4.1. Defin itia arborelu i binar 305
2.8.4 .2. Implementarea arborelui binar 305
2.8.4.3. Algoritmi pentru parcurgerea unui arbore binar 312
2.8.4.4 . Aplicatii practice 315
2.8.5. Arbo rele binar de cautare . 315
2.8.5. 1. Definit ia arbor elui binar de cautare . 315
2.8.5.2. Algoritmi pentru prelucrarea unui arbore binar de cauta re 315
2.8.5.3. Aplicatii practice . 322
2.86. Ansa mblul Heap ................................................ . 323
2.8.6.1. Definitia ansambului Heap . 323
2.86 .2. Algoritmi pentru prelucrarea unui ansamblu Heap 324
2.8 .6.3. Algori tmul HeapSort 327
2.8.5.4. Aplicatii practice 329
Evalu are . 329
I: - 19S1 - 01: - 1: £6 ' 8£6 NaSI
6 - 19S1 - or - 1:£6 NaSI
-:»
"
-,
0,
·'