P. 1
Informatica intensiv

Informatica intensiv

5.0

|Views: 8,767|Likes:
Manual pentru clasa a XI-a
Manual pentru clasa a XI-a

More info:

Published by: Pătrașcu Mircea-Gabriel on Dec 02, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

11/11/2015

pdf

text

original

MINISTERUL EDUCATIEI ~ I CERCETARII

Mariana Mllosescu
I W
norma lea
I I
In enslv
c++
Filiera teoretica,
profilul real ,
specializarea
matematica • informatica,
intensiv informatica
Manual penlru clasa a XI-a
EDITURA DIDACTICA $1 PEDAGOGICA, R.A.
Man ualul a fost apro bat prin Ordinul ministrului Educ atic i si Cercetarii nr. 4742 din
21.07.2006, in urma evaluiirii calitative organizmc de catre Consiliul National pentru
Evaluarca si Difuzarca Manualelor si este realizat in confortni tate ell programa analitica
aprobata prin Onli nul rninistr ului Edu catie i Cercctarii nr, 3252 din 13.02.2006.
Dcscrier ea elr a Bibli otecii Nati on ale a Rom:ini ei
MILOS ESCU, MARIANA
Informat ica intcnsiv: manual pentru clasa Xl- a I
Mariana Liliana Mi losescu. - Bucuresri: Edit ura Didactica Pcdagogica, 2006
ISBN ( I0) 973 -30- 1567-9; 1513:" ( 13) 978-973-30- 1567-3
004(075.35)
007(075.35)
Lim buj ul C++
© [UP 2006. Toate drepturile asupra acestei edit ii sunt rezervate Edi turii Didactice si
Pedagogi cc R.A., Bucuresti. Orice preluare, partialf sau integrala, a textului sau a materialu lui
gra fic din accasta lucrare se face numa i ellacordul scris al edit uri i ,
EDiTURA OIDACTICASI PEOAGOGI CA, R.A.
SIr. Spiru Huret. nr. 12. sector 1, cod 0 10 176, Huc uresti
Tel.: (02 1) 315 38 20
Tel./Fax: (02 1) 312 28 85;
(02 1) 3 1573 98
E-mai l: edp@b .ast ral.ro. ed pcom@b .astral.ro
web : www.edituradp.ro
Comenzile pcntru aceasta lucr are se prlmesc:
• prin posta , pc adresa editurii, eu mentiunea Comandis carte
• prin e-mail: edpcom@.b.astral .ro.comenzi@edit uradp.ro
• printel. rfax: (02 1) 315 73 98
• printel.: (021) 3 15 38 20
Referenti: prof gl: I Emma Gabriela Dnrn cscu .
Colegiul Tehni c Pet r u Rares, Bucuresti : rnetodist de spe cial itate -
Bucu resti
pro/ g/: I Georgi na Pat rascu.
Colegiul Nat ional Sfa nt ul Sava. Bucuresti
Redactor: Lia na Faca
Tehnoreductor: i\ l a r iana
Desenator: Aurica Georgescu
Coperta: Ele na Dr agul etei Dumit ru
Nr. de plan: 5 1263; Format 16'70 " 100
Bun de tillar: august 2006: Coli de t!p.lr: 21.
Tiparul exec uta: la Iml'riml!ria dl! le.If Oradea
1. Tehnici de programare
1.1 . Analiza algoritmilor
Prin analiza unui algoritm se identifica resursele necesare pentru executarea
algoritmului: timpul de executie ~ i memoria.
Analiza algoritmilor este necesara atunci cand exista mai multi algoritmi pentru rezolvarea
aceleiasi prob leme ~ i trebuie ales aigoritmul cel mai efi cient.
Eficienta unui algoritm este evaluate prin timpul necesar pentru executarea
algoritmului.
Pentru a compara - din punct de vede re al eficientei - doi algoritmi care rezolva aceeasi
problema, S8 foloseste aceeasi dimensi une a dat elor de intrare - n (acel asi nurnar de
valor! pentru dateIe de intrare) .
Timpul de oxecutle al algoritmului se exprima prin nurnarul de operatil de baza
executate i n functie de dimensiunea dat elor de intrare: T(n) .
Pentru a compara doi algoritmi din punct de vedere al timpului de executie, trebuie sa se stabi-
leasca umtatea de rnasura care se va folosi, adica operati a de baza executata in cadrul algorit-
milor, dupa care. S8numara de cateonS8 executa o p e r a ~ i a de baza in cazvl fiecarui algoritm.
Operatia de baz a este 0 operatie eternentara - sau 0 succesiune de operatil
element are, a carer executie nu depinde de valorile datelor de intrare.
Exist a algoritmi la care timpu Jde execut ie depinde de distributia datel or de intrare. Sa
cons ider arn doi algoritmi de sortare a unui vector cu n elemente - algoritmul de sortare
prin metoda selectiei directe si algoritmul de sortare prin metod a bulelor - ~ i ca operatie
de baza cornparatla. Daca, in cazul primului algoritm, timp ul de executie nu depinde de
distributia datelor de intrare (modul in care sunt aranjate elementele vectorului inainte de
sortarea lui) , el fii nd T(n) = nxIn - J) , i n cazul celui de al doilea algoritm timpul de exe-
Z
cutie depinde de distributia datelar de intrare (nurnarul de executii ale structurii repetitive
whil e depinde de modul in care sunt aranj ate elementel e vecto rul ui in ainte de sortare). in
cazul in care nurnarul de executii ale operatiilor elementare depinde de distributia datelor
de intrare . pentru analiza algoritmului se folosesc :
-7 timpul ma xim de execut i e - timpul de executie pentru cazul cel rnai nefavorabil de
distributie a datelor de intrare; in cazul sortarii prin metoda bulelor, cazul eel mai
nefavorabi l este atunei cane elementele vectorului . sunt aranjat e i n ordine inversa
decat aceea ceruta de criteriul de sortare ;
~ timpul mediu de execut ie - media timpiJor de executie pentru fiecare caz de
distnbutie a datelor de intrare.
Deoarece, i n analiza ef icientei unui algoritrn, S8 urrnareste comportamentul lui pentru 0
cimensiune mare a datelor de int rare, pentru a cornpara doi algoritmi din punet de vedere
al eficientei, este suficient sa S8 ia in considerare numai factorul care deterrnina timpul de
exe cutie - ~ i care este denumit ordinul de complexi tate.
4 Tehnici de progra ma rc
Ordinul de complexitatc al unui algoritm l l reprezinta timpul de executie - esti mat
prin ordinul de rnarirne al numarului de execut ii ale operatiei de baza: O{{f(n)), unde
f {n) reprezinta termenul determinant al timpului de executie T{n).
De exemplu, daca - pentru algoritmul de sortare, prin metoda select iei directe - timpul de
executie este T{n) = = n
2
1
ordinul de complexitate al algoritmului este
O{n\ deoarece i n calcularea lui se ia in considerare numai factorul determinant din
timpul de executie.
i n functie de ordi nul de complexitate, exista urrnatoarele tipuri de algoritmi:
Ordin de Ti pul algoritmului
complexitate
O(n) Algoritm liniar.
O{n
m
)
Algorit m polinomial. Daca m=2, algoritmul este patratic , iar dat a
m=3, alqoritrnul este cubi c.
Algoritm exponential. De exemplu: 2 , 3 etc. Algoritmul de tip O(n!)
O{k") este tot de tip exponential, deoarece:
, n- 1
1x2x3x4x...xn > 2x2x2x...x2 = 2 .
O(logn) Alqoritrn loqaritmic.
Otnloqn) Alqoritrn Iiniar loqarltmic.
De exemplu , algoritmul de sortare prin metoda selectiei directe este un algoritm patrati c.
Ordinul de complexitat e este determinat de structur ile repetitive care se executa cu mult i-
mea de valori pentru datele de intrar e. in cazul structurilor repetitive imbri cate, 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
for \ i=l ; i<=n ; i=::'H: ) { ... . } f(n)=n/k --) O(n)=n Liniar
for { ... . } f(n)= log,n --) O(n)=logn Loqar itrnic
for (i=l1 ; i>=n ; i=i/l:) ( ... . ) f(n)= log,n --) O(n)=logn Logarilmic
for (i=n ; i <=n;i=i +p) { .. .. } f(n)=(n/p)"{n/q) = n
2
/(p*q) - ) Polinomial
for (i =n ; l<=n ; i=j +q) { .. .. } O(n)=n
2
patratic
for (i =:1 ; ' <=n ;i=i - +) { .... } f(n)=1 +2+3+ ... +n =(n*(n+1 ))/2 - ) Polinomial
for (; =i ; j <=n ;l=i"--"-) { .. .. } O(n)=n
2
patrat ic
Determinati complexitatea urrnatorilor algoritmi !?i precizaf tipul algoritmului.
Pentru fiecare algoritm se va considera dimensiunea datelor de intrare - n.
a. determinarea valorii minime dintr-un sir de numer e;
b. inserarea unui element l ntr-un vector, dupa un element cu valoare precizata:
c. sterqerea dintr-un vector a unui element cu valoare precizata,
d. stabilirea daca un sir de numere confine numai numere distincte;
e. sortarea unui vector folosind metoda bulelor;
f. cautarea unui element cu valoare precizata, l ntr-un vector nesort at;
g. cautarea unui element cu valoare precizata, l ntr-un vector sortat ;
h. determinarea tuturor perrnutarilor unei rnultirni de numere.
Infurmaticii
5
1.2. Metode de construire a algoritmilor
in functie de procesul de calcul necesar pentru rezolvarea unei probleme, exista urmatoarele
clas e de probleme:
...
"" Probleme de decizie
Probleme de optimizare
prin care se precizeaza daca
prin care S8 identifica solutia
exista sau nueel putin 0
optima dinmulnmea de solutii
soluue
posibile
Probleme de enumerare
prin care S8 gasesctoate
solutiile posibile
I Clase de probleme
¥
Generarea tuturor permutarilor unei multirni de numere este 0 problema de enumerare, cauta-
rea unei valori precizateintr-un sir de numere este 0 problemade decizie, iar qasirea modahtat ii
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 invatat deja ca - pentru rezolvarea aceleiasi probleme - puteti lolosi un:
-7 algoritm iterativ;
~ algoritm recursiv.
Solutiile recursive sunt mult mai clare, mai scurte ~ i mal user de urmarit. Al egerea
algoritmului recursiv in locul celui iterativ este mai avantajoasa in cazul in care solutiile
problemei sunt definite recursivsau 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 prezentat a alaturat, unde
8( 1) reprezinta tirnpul de executie a unei operatii elementare de atribuire a unei valori
sumei . Rezulta ca T(n)=(n+1) x0(1), iar ordinul de complexitate a algor itmulu i este O(n) la
l ei ca si cel al algoritmulu i iterativ, i n cazul irnplernentarf recursive, li ecare apel al unui
subprogram recurent tnseamna inca 0 zona de memorie rezervat a pentru executia sub-
programuiui (variabilele locale ~ i instructiuniie). Din aceasta cauza , i n alegerea 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 vi tati i , 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 metoda backtracking;
-7 metoda divide et irnpera:
-7 metoda greedy;
-7 metoda proqrarnar!l dinamicc.
Fiecare dintre aceste metodede 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 construirea algoritmilor, criteriul de alegere va fi efic ienta algoritmului.
6 Tehnici de programare
1.3. Metoda backtracking
1.3 1. Descricrca metodei backtracking
Metoda backtracking se poate folosi pentru problemele i n care trebuie sa se genereze toate
solutiile , 0 solutie a problemei putand fi data de un vector:
S = {X1 , X2, ..., x
n}
ale carui elemente apartin , fiecare, unor rnulti rni finite Ai (XiEAi), iar asupra elementelor
unei solutii exista anumite restri ctii specifice problemei care trebuie rezolvata, numite
conditii interne . Mult irnile Ai sunt rnulti rni ale carer elemente sunt i n relatii bine stabilite.
Mult irnile Ai pot sa coincide sau nu. Pentru a qasi toate solutiile unei astfel de probleme
folosind 0 metoda clasica de rezolvare, se executa urrnatorul algoritm:
PAS1. Se gene reaz a toate elementele produsului cartezian A1 x A2 x A3 x . .. x An.
PAS2. Se verifica fiecare element al produsului carte zian, daca l ndeplineste condit i ile
interne impuse ca sa fie solutie a problemei.
Seop : identificarea problemelor pentru care trebuie enumerate to at e sol uti i le, fiecare
solut ie fiind forrnata din n eleme nte Xi, care apartin fiecare unor rnultimi fin.te Ai ~ i care
trebuie sa respecte anu mite conditii interne.
Enuntul problemei 1: Sa se genereze toate petmutettte multimii {1, 2, 3}.
Cer inta este de a enumera toate posibilitatile de generare a 3 numere naturale din
rnultirnea {1, 2, 3}, astfel i ncat numerele generate sa fi e distincte (condi t i a in terna a solu-
tiei). 0 solutie a aces tei probleme va fi un vector cu 3 elemente: S ={X1 ,X2,X3}, i n care
elementul Xi reprezinta nurnarul care se va qasi, i n permutare, pe pozit ia i , iar mul tirnea Ai
reprezinta rnultimea numerelor din care se va alege un nurnar pent ru pozitia i . In acest
exemplu, rnultirnile Ai coincid. Ele au aceleasi 3 elemente, fiecare element reprezentand un
numar. Ai ={1, 2, 3} =A
Daca s-ar rezolva c1 asic aceasta problema , ar insemna sa se genereze toate elementel e
produsului cartezian A1 x A2 x A3 = A x A x A = A3, adica rnultirnea:
{(1,1 ,1) , (1,1,2), (1,1,3) , (1,2,1), .. ., (3,3,2), (3,3 ,3)}
dupa care se va verifi ca fiecare element al multimii daca este 0 sol uti e a problemei, adica
daca cele trei numere dintr-o sol utie sunt di stincte . Soluti ile obt inute sunt:
{(1,2,3) , (1,3,2), (2,1,3) , (2,3,1), (3,1,2), (3,2,1)}
Enuntul problemei 2: Sa se generoze toate erenjememele de 2 elemente ale mullill7ii {1, 2, 3}.
Cerint a este de a enumera toate posibilitatile de gene rare a 2 numere naturale din
mul tirnea {1, 2, 3}, astfel i ncat numerele generate sa fie distincte (condit ia i nterna 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 aranj ament pe pozi tia i , iar rnulti mea Ai
reprezinta rnultimea nume relor din care se va alege un nurnar pentru pozitia i. ;;; i In acest
exemplu, multirnile Ai coincid. Ele au aceleasi 3 elemen te, fiecare elemen t reprezentand un
numar. Ai ={1, 2, 3} =A
Daca s-ar rezolva clasic aceast a problema, ar l nsemna sa se genereze toate elementele
produsului cartezia n A1 x A2 = A x A = A2, adica rnultimea:
{(1 ,1), (1, 2), (1,3), (2,1), ..., (3,2), (3,3)}
I II furill aticii
7
dupa care se va verifica fiecare element a! multirnii , daca este 0 soiutie a problemei,
adlca daca cele doua numere dintr-o sol utie sunt distincle. Solutiile obtinute sunt:
((1,2), (1,3) , (2.1), (2.3), (3.1) , P,2)}
Enunt ul problemei 3: Sa se gonereze toate combinarile de 2 elemente ale multiml! (l , 2, 3).
Cerinta este de a enumera toate posibilitat ile de generare a 2 numere naturale din multi-
mea {1,2,3}, astlel tncat numerele generate sa fie di stincte (condit i a interna a solutiei),
iar solutiil e obtinute safie distincte. Doua soluti i sunt considerate distincte daca nu cont in
aceleasi 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. Ai ={1, 2, 3} =A
Daca s-ar rezolva ci asic aceasta problema, ar insemna sa se genereze toate elementele
produsului 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 fica fiecare element al multirnii daca este 0 solutie a problemei, adica
daca cele doua numere di ntr-o sclutie sunt distincte ~ i daca sol utia obunuta este distincta
de solut iile obtinute anterior. Sol utiile obtinut e sunt: {(1.2), (1,3) . (2.3)}
Enuntul problemei 4: Sa se qenoreze toate petmuterlte multitnii {l ,2,3,4} care indeplinesc
cond1ia ca 1nu este vecin eu 3. §i 2 nueste veein eu 4.
Cerinta este de a enumera toate posibilitatile de generare 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 (condltia int erna a solutiel), 0 solutie a acestei probleme va fi un
vector cu 4 e!emente: S = {X1 ,X2,X3, X4} , in care elementul Xi reprezmta nurnarul care se va
gasi in permutare pe pozit ia i, iar multimea Ai 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 element reprezentand un numar. Ai ={1, 2. 3. 4} =A
Daca s-ar rezolva clasic aceasta problema, ar insemna sa se genereze toate elementele
produsului cartezian A, x A2 x A3 x A4 = A x A x A x A = A
4
, adica rnult irnea:
((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 obtinute 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)}
Enuntul probl emei 5: Sa se aranjeze pe tabla de §ah opt dame care nu se ataca intre
ele (problema cel or 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 aceeasi coloana (s-ar
ataca intre ere) . tnsearnna 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 reprezent and un nurnar de
linie: Ai = {1, 2. 3.4.5.6.7, 8} =A
8 Tchnici de programarc
Daca soar rezolva clasic aceasta problema, ar i nsemna sa se genereze toate elementele
produs ului cartezi an A, x A2 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 numere dintr-o solutie pot reprezenta coloanele pe care pot fi aranj ate
damele pe fiecare linie, astfel tncat sa nu se atace intre ele. Solut iile 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 ciasica de rezolvare a acestui tip de probleme necesita l oarte mulle
operatu din partea calculatorului, pentru a verifica fiecare element al produsului cartezian.
Presupunand (pentru simplificare) ca fiecare mult irne Ai are m elemente , atunci algoritmul de
generare a elementelor produsului cartezian are cornplexitatea O(card (A,) x card(A2) x ... x
card(A
n))
= Q(m x m x m x " . x m) = O(m
n)
Considerand ca algoritmul prin care se verifica
daca un element al produsul ui cartezian este 0 solutie a problemei (respecta condit ia interne
a solutiei) are complexitatea O(p), atunci complcx itatoa algoritmului de rezolvare a
problemei va fi Otpxm" ). De exemplu, i n algoritmul de generare a permutarilor, complexitatea
algoritmului de verificare a conditiei interne este data de complexitatea algoritmului prin care S8
verifica daca 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 aceI nurna r mai exista in sir. Complexitatea algoritmului este data de cele doua-e ~ I>
structuri for imbricate: O(m
2)
_ >p = m
2
. .
Metoda rccomandata pentru acest gen de probleme este metoda backtracking sau met o-
da cautari i cu revenire - princare se reduce volumul operatiilor de gasire a tuturor solutitlor.
Met oda backtracking const rul este progres i v vect orul solut iei , pornind de la
primul el ement sl adauqand la vector urmatoarol e elemente, cu revenire la
elemcntul anterior din vector, in caz de insucces. Elernentul care trebuie ad auqat se
cauta in multime, printre elementele care respecta conditi ll e interne.
Prin metoda backtracking se obtin toatc solutute problcmci, daca ele exista. Pentru
exemplificarea modului in care sunt construite solut iile, cons ider arn problema generarii
perrnutar ilor rnult irnil {1, 2, 3, "" nJ(A, =A2= '" =A
n
=A={l, 2, 3, .. .. n} ).
PAS1 . Se alege primul element al solutiei ca fiind primul element din rnultirnea A. in
exemplu, x1=1, adica primul nurnar din permutare 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
condit ii le interne. Cautarea continua pima cane 58 gase!?te primul element din
rnullimea A care Indephneste condtti 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 el ement al solutiei (X3). Cautarea va lolosi acelasi algori tm de
la Pasul 2. in exemplu, se cauta nurnarul din pozitia a treia din permutare. Se
gase.te elementul x3=3
PAS4. Presupunand ca s-au gasit primele k elemente 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, pana se g a s e ~ t e primul
element i care l ndeplineste conditia interna. in exernplu , conditia mterna este ca
Informatica
9

3 3 0 .!.
2 2

numarul din pozitia k+1 a perrnutarii sa nu fie egal cu nici unul dintre numerele
din pozitiile anter ioare lui k+1 . Pot sa apara dou a situatii:
a. Exista un element i i n rnultirnea A. astfel Incat Xk+1 = i sa fie element al solutiei
problemei . i n acest caz, se atribuie elementului Xk+1 al solut iei valoarea i , dupa
care se verifies daca s-a gasit solutia problemei. in exempl u, presupunem ca pe
nivelul k+1 s-a gasit nurnarul 4. Se verifica daca s-au generat toate cele n
elemente ale multi rnii S, adica daca s-au gasit numere pent ru toate cele n pozitii
din permutare (k=n). Dad! s-a qasit solutia problemei , atunci se afiseaza solutia:
altfel , se cauta urrnatorul element al solutiei. reluandu-se operatiile de la Pasul4.
b. S-au parcurs toate elementele rnultirnii A 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 imediat dupa eel care a fost atribuit anterior pentru elemen-
tul Xk al solutiei in exemplu, luand i n considerare modul in care au fost generate
primele k numere ale permutarii, in poziua k+1 , orice numar soar alege, el mai
exista pe una dintre cele k pozitii anterioare, se revine la elementul k, care presu-
punem ca are valoarea 3. Se qenereaza i n aceasta pozitie urmatorul nurnar din
rnultirnea A (4) si se verifica oaca el nu mai exists pe primel e k-1 pozitii ale permu-
tarii, iar daca exista, se genereaza urrnatorul element din rnultimea A (5) s.a.rn.d.
PASS. Algoritmul se incheie dup a ce au fost par curse toate elementele rnulti rnii A pentru
elementul X1 al solut iei . in exemplu, algoritmul se inchei e dupa ce s-au atribuit pe
rand valorile 1, 2. .. . , n, elementului de pe prima poziti e a per mutar ii .
Generarea tuturor perrnutarilor rnultirnii {1, 2, 3}
23ffi 0> W,
W3

1 2
1 r 1
_. -
3 3
W
§
AUfast parcurse
toate elementelc
3 0 .!. rnultirnii A pen-
tru elementu l Xl al solutiei.
Observatie. in metoda backtracki ng, daca s-a gasit elementul Xk al solutiei, elementului
Xk+1 al solutiei i se atribuie 0 valoare numai daca mai exista 0 valoare care sa i ndeplineas-
ca conditia de continuare a construirii solutiei - adica daca, prin atribuir ea acelei valori , se
poate ajunge la 0 solutie finala pentru care conditiile interne sunt i ndepli nite.
Oesenati diagramele pentru generarea prin metoda backtracking a:
a. tuturor aranjamentelor de 2 elemente ale rnultimii {1, 2, 3};
b. tut uror cornblnariior de 2 elemente ale multimii {1, 2, 3};
c. tuturor perrnutarilor rnultirnii {1, 2, 3, 4} care indepl inesc condiiia ca 1 nu este vecin cu 3,
2 nu este vecin cu 4.
10
Tchnici de programarc
Algoritmul metodei backtracking poate fi generali zat pentru oric e problema care i ndepli-
neste urrnatoarele cond itii:
1. Sotutia problemei poat e f, pusa sub forma unui vector S = (Xl . X2• . . .• Xn} ale caru i
elemente Xi apartin - fiecare - unei mut tirni Ai. astfel : X1 EA1, X2EA2, ...• XnE An.
2. Multimile Ai sunt f ini te. iar elementele lor sunt numer e intregi :;;i S8 qasesc Int r-o
ord ine bi ne stabi lita.
Aigoritmul backtracking est e urrnato rul :
PAS1 . Se alege primul element al solutiei S: X1EA,.
PAS2 . Cat t imp nu au fost parcurse toate elemen tele mult imi i Al (nu au fost gasite toate
sol utiile) ex ec ut a:
! PAS3 . Pentru fiecare element al solutiei exec ut a:
i PAS4. Se presupune ca s-au gasit primele k elemente ale solutiei (Xl . X2• . ..• Xk)
i apartinand rrurltimilor Al . A2, A3, "' , Ak ~ i se trece la cautarea celui de al
: k+1-1ea element al solutiei , Xk+1, printre elementele rnultimi i A k+1. Cautarea
se va face astlel : se atribuie. pe rand. lui Xk+1- elementele multirnii Ak+l .
pana se g a s e ~ t e primul element care indeplineste conditia de conlinuare.
PASS. Daca exista un element aj i n multi mea Ak+' , astfel i ncat Xk+1 = aj sa
aparnna soluuei problemei, at unci S8 atribui e elementului Xk+1 valoa-
rea a, si se trece la Pasul 7: al tfel . se trece la Pasul 6.
PAS6. Oeoarece s-au parcurs toate elementele multirnii Ak+l si nu s-a gasit
nici un element a, care sa lndeplineasca condi tia de continuare, S8
revine la elementul Xk ~ i se considera generate primele k-1 elemente
ale sol utiei: X1. Xz, ..., Xk.1 . ~ i pentru elementu l Xk se reia cautarea cu
ur rnato rul element din rnult imea Ak. adica se reiau operatiile de la
Pasul 4 pentru elementul Xk al sol utiei , tnsa nu cu primul element di n
rnuttimea Ak ci cu eleme ntul din rnulti rnea Ak care se g a s e ~ t e imediat
dupa cel care a fast atribuit anterior element ului Xk.
PAS7. Se verifica daca s-a gasit soluti a problernei, adica daca s-au gasit
toat e eleme ntele rnultimi i S. Daca s-a gasit soluti a prob lernei, atunci
se afi seaza solutia; al tfcl , se trece la cautarea urrnatorului element al
sol utiei , reluandu-se operatii le de la Pasul 4.
I..t2. 1mplcmcntu rca metndei backtracking
Pentru implementarea meto dei se folosesc urrnatoarele structuri de date l;ii subproqrame.
Dato ~ i structuri de date
Pentru a memora elementele Xk ale solutiei se foloseste a structure de date de tip stiva . care
este implernentata static printr-un vector - st. Pentru varfu! stivei se foloseste variabila k
Cand s-a qasit elementul Xk al solutiei, se urea in stiva, prin incrementarea varfului cu 1
(k++), pentru a cauta elementul Xk+1 at solutiei, iar pentru a reveni la elementul Xk-1 al solutiei
S8 coboara in stiva prin decrementarea varfului cu 1 (k--). Initial, stiva are dimensiunea 1
(k
m
in=1), corespunzatoare pozitiel de pornire, ~ i contine valoarea primului element al solut.ei
Pentru elementul din varf ul stivei (care corespunde elementului Xk al solutiel) se va atribui 0
valoare din rnultirnea Ak care poate fi un element al solutiei : st [k] =a [ i] . Dupa parcurgerea
cornpleta a rnultimilor Ak, stiva va avea dimensiunea n (kmax;;n) corespunzatoare nurnarutui
I II for ma t ira 11
de elemente ale scl utiei . Varful stivei va fi initial 1, la gasirea unei solutij va avea valoarea n,
iar la terminarea algor itmului varful stivei va avea val oarea O.
Se ma i folose sc urrnatoarele variabile de memorie:
-7 as - pentru a daca pentru elementul Xk al solufiei mai exista un succesor, adica daca
mai exista un element i n multirnea Ak care ar putea fi elementul Xk al solutiei (este a varia-
bila logica ce are valoarea 1 - true, daca exista succesor; altfel, are valoarea 0 - false),
-7 ev - pentru a sti daca succesorul gasit respecta co ndl tia de cont inuare poate fi
elementul Xk al solutiei (este 0 variabila logica ce are valoarea 1 - true, daca
succesorul este element al solutiei: altfel, are valoarea 0 - false)
-7 n - pentru dimensi unea solutiei (nurnarul de elemente ale solutiei, i n cazul
problemelor in care l oate solutiile au acelasi nurnar de elemente).
typedef int stiva [ l OOj ;
st i va s t ;
int n ,k,ev .as ; //k=vArful s ti vei
in cazul problemelor prezentate in studiul de C3 Z, un element Xk al solutiei este l ormat
dintr-o sinqura vatoare: nurnarul din pozitia k (i n cazul permutarilor, al aranjamentelor si
al combinarilor) , respecti v numarul liniei pe care va fi pusa dama din coloana k. i n preble-
mele i n care trebuie gas1t un traseu, un element Xk al sol utiei este format din coua valori
care reprezinta coordonatele pozitiei in care se face urrnatoarea deplasare. in acest caz.
pentru memorarea elementelor Xk ale solutiei se va fotosi a stiva dubla:
t ype def i nt st i ".;a[ lOOj [3] ;
sau 0 i nregistrare i n care cele doua carnpuri reprezinta eoordonatele deplasarii:
struct clenent {i n t X/ Yi };
typedef e Leme n t s t Lva [100J ;
s t.Lva s t. .
Elementele rnult imil Ak vor Ii perechi de valori (i ,j) vor reprezenla coordonatele unei
pozitii, iar pentru elementul din varful stivei 5 8 va atribui 0 valoare, din rnultimea Ak, care
poate f un element al solutiei, astl el: st[ k] st( k ] [2 ]=j . respectiv
s t(k ] . x =i st[k ] . y = j .
Pentru simplificarea implernentarii, toate aeeste date structur i de date sunt deelarate
globale. deoareee valoarea pentru varful stivei 58 va transmite mai user, int re subpro-
grame - ca variabila global a.
bprograme
Algoritmul va Ii implementat prin:
-7 un subprogram - care va fi acelasi pentru to\i algoritmii de rezol vare prin metoda
backtr acking (parte fi xa) care descrie strategia general a backtracking si
-7 subprogramele care au aceeasi sernni ti cat ie pentru toti algoritmii , dar al carer conti-
nut difera de la 0 problema la alta, depinzand de condltlile interne ale solutiei.
Sernni frcaua subprog ramelor folosi te este (se va considera ea exemplu generarea
permut arilor rnulti rnii { 1, 2, 3, ... , n}}:
-7 Subprogramul ani. t (tunctie procecurala). Se initializeaza elementul din varful stivei
(elementul k). in acest element se va i megi stra urmatorul element al solutiei, Acest
element S8 initializeaza cu a valoare care nu face parte din rnultimea Ak considerata,
urrnand ca i n urrnatoru pasi ai atqcntmutui sa se atribuie acestui element prima
12 Tchnici de progr umare
valoare din rnultirne a Ak. in exemplu, nivelu l k al stivei S8 va initializa cu valoarea 0
(s t [k] =0). urmand ca la pasul urrnator sa i se atribuie ca valoare 1. adicii primul
numii r din rnultimea (1. 2. 3• ...• n}.
void i n i t ()
}
Subproqramul succe s or (functie operand) . Verifica daca rna i exis ta in multirnea Ak
un element pent ru nivelul k al solutiei (un succesor). Daca mai exista un succesor, S8
trece la urmatorul element din rnuttirnea Ak. iar functia va returna valoarea 1 (true).
Dacii nu mai exist a un succesor. functia va returna valoarea a (false). Valoarea
retu rnata de functie S8 va atribui variabilei as. Initial , valoarea variabilei de memorie
as este 1 (true) - se presupune ca mai exista un succesor. in exemplu, subproqrarnul
succesor va verifi ca daca pentru pozitia k din permutare mai exi sts un nurnar. Daca
nurnarul i de pe nivelul k este rnai mic dec at n, pozitiei k i S8 va atribui numarut
urrnat or , i+1. functia va returna 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
nurnar - si functi a va returna valoarea a (false).
i nt succesor ( )
{if r s t l k l c n) ( s t [ k ] + -; r e tur n l; )
e l se r eturn 0 ; )
-7 Subproqrarnu l va L'i d (functie operand). Ver ifica daca valoarea atribuita elementului
Xk al solutiei Indeptineste co ndi tla de cont inuare , adica poat e fi considerate eel face
parte dm solutia problemei (daca succesorul gasit este element al sol utiei). Daca este
Indeplini ta condi tia ( S8 evalueaza expresi a prin care este des crisa cond itia), functia va
returna valoarea 1 (true); altfel , va returna valoarea a (false). Valoarea ret urnat a de
functie S8 va atribui variabilei ev . Initial , valoarea variabile i ev este 0 (fa lse) - S8
presupune ca succesorul gasit nu este elementul k al solutiei , in exemplu, subpro-
gramul valid va verifi ca daca numarul di n pozitia k nu mai exis ta in cel e k-1 pozitii
ant erioare. Daca numarul nu i ndeplineste aceasta conditie, functia va returna valoarea
a(falsa ).
int valid ()
(for int
i f bt[l]=::. .,.,; t [ LJ) return 0 ;
return 1 ; }
-7 Subprogramul sol u t.r e (Iunctie opera nd). Verifica daca s-au obt inut toate elementele
solutiei . i n exemp lu, subprogramul s olutie va verifica dace au fost gasite toat e cere
n elemente ale soluliei , adica daca s-au gasit solutii de aranjare i n permutare pentru
toat e cere n numere . Daca s-a gasit solutia , subprogramul intoarce valoa rea 1 (t ru e):
altfel , intoarce valoarea 0 (falsa).
int solutie ()
{return ):= =:1; }
-7 Subprogramul tipar (functie procecurala). Afi seaza elementele sol uti ei, De obicei ,
afi sarea solutiei consta i n afisarea valorilor din stiva.
void tipar ()
{for (int cout« s L[ i }« "
c o ut«endl ;}
" .
Informati ca 13
k=k-1
I
I
X
n
....
X;
X2
x,
Eteme ntele solut i ei
Parcurgerea elementelor se face cu
I
subprogramul s uccesor
8i1 a i2 8ij aim
k=k+1
2
a21 a22 a2j 82m
1
a11 a12 a1j atm
Numarul de ordi ne al
ele mentelor solut ie;
•n a
n
1 an 2
se cau ta SUCC9sor
II c a t t imp are succesor $ i n u s -a gasit
I I elementul k a l
II
{ a s > SUCCGsor () ,.
\ 1 2 m/ t
Nurnarul de ordine al eleme ntelo r din rnultimea Ak Stiva - st [k]
Subprogramul valid verifica caca este element al solutiei
Subprogramul fix poate fi irnplementat iterativ sau recu rsiv.
Impl ement area it erat l va
v oid b t() / Jpart.ea f i x a a algorit:mului
{ke l : lise ri n i. J;: i 2l1i zea zavJr f ulst i ve i
init() ; lise iniJ;:iallzeazd stI va pe rrt r u p.rimu L eleme nt a lsoJ uti ei
whi le (J.-:>O ) Ilea l Li mp s t t va nu s -a g ol i t
{a s =l; eve O,
while {a s && ! e v i
i f (a s ) II daca a r e a t un c i
eve vaL'i d Lj r } 1/ se ve.r i .fi ce oaca este e lement a l ao.Lu ti.e.i.
l ise iese d in s t r u c t u r a r e pet ltiva while dace. TIU ma l exis ta
II s ucces o r sau dac5 s -a gaslt el emer ltul s o1utiei
i f (a s ) I I dac a a rc s u c cosor , a tunc i
if ( s o l u tie (» ) I l daca. s-i eu obt i n ut t.oa t.e e.tee.e n cete aoLu r.i .ei ,
tipar () ; I I a tunci se af i $eaza e Leme nt. e Le s o lut.dei. ,
else { k++; 1/ altfel , se urea in e t t va pentru a. Lnre qi .st r a
I I ur-r.a t.orul e lement 01 ao.Iu t i.e i.
init() ; } / 1 se ini t,: i al i z e a z a s ti va perl t r u
I I ur ma t.o t-u L e Lemen t; 211 s o l utI e -t ,
else k- - ; ) I I altfel , s e coboa i-a in s t i va p en t r u a r e v e n i
I I 121 e 1eme nt ul an te r ior 0. 1 30111<; i e i
v oid main () .. ._ bt () ; . . . }
Impl ementarea rccurslva - Prelucranle care se fac pentru elementul k al solutiei se fac
si pentru elementul k+1 al solutiei 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 algoritmul backtrac king implementat iterativ, reve-
nirea la nivelul k-1 trebuie sa se taca atunci cand pe nivelul k nu se a valoare
care sa l ndepli neasca co nd lt ll l e i nte rne. In cazul implernentarii recursi ve. co nditia de
14 Tchnici de p rogramarc
baza este ca pe nivelul k sa nu S8 gaseasca 0 valoare care sa ln deplineasca co nd iti il e
i nte rne. Cand S8 aj unge la conditia de baza, lnceteaza apelul recu rsiv S8 revine la
subprogramul apel ant, adica la subproqrarnul i n care se prelucreaz a elementul k-1 al
soluti ei, iar i n stiva S8 vor reqasi valorile prel ucrate anteri or i n acest subprogram.
Deoar ece apelu l recursiv S8 face in funct ie de valoarea varfulu i stivei (k) . aceasta valoare
S8 va transmite, intr e subprograme, prin intermediul pararnetrilorde cornunicati e.
void bt(int k ) /Ipartea fixa a algor i tmu lui
{ Ln.i,t (k) ; /Ise .i ni t LcLi zee ze 'st i. va pentru elementul k a1 so.Iut.Lei
while { s uc.ces ox ( k})
/Icat t irnp segase;;; te s uc ce s or pe ntr-u elementul k a l
i f (va l i d (k ») sllccesorul este element al solDt iei
i f {ssc Lu t.Le (k )) I/daca s -au obt;:. i nut t oa t e elernent ele soI ut i e .i •
tipar (k ) ; II atunci 5e elementele sOlut;:.iei ;
e l s e bt (k +l ) ; //a l t f e l , s e apeLeaza .subp.roqremu.l pent ru a qasi
Ilel ementul k+l a l .'301\)1;-ie1
voi d ma i n () { .. . bt(l) ; '" )
Compl exitatea algoritmului metodei backtracking
Daca fiecare solutie are n elemente fiecare multirne Ai din care se alege un element al
solut iei are m elemente, atunci complexitatea algoritmului metodei backtracking este
O(card(A,) x card(A2) x .. . x card(A
n
)) = Q(m x m x m x .. . x m) = O(m
n)
. Daca nurnarul de
elemente ale rnult irnilor Ai este diferit si notarn cu:
mm;n= min (card(A1), card(A2), ' '' , card(A
n
))
mmax= max(card(A,) , card(A2), .. ., car d(A
n
))
atunci complexit atea algoritmului va fi cuprinsa lntre 0 complexitate minima O(mminn) 0
complexitate maxima O(mrnax'\ Rezulta ca algoritmul metode i backt rack ing este un
algoritm exponential , Av'and 0 complexi tate exponentiala, metoda backtracking se reco-
manda numai daca nu S8 cunoaste un alg orit m mai ef i cient.
1.3.3. I'roblcmc rczolvabilc prin metoda backtracking
Metod a backtracking este recornandata In cazul problemelor care au urmatoarele
caracteristici:
-7 se cere gasirea tu turor s olutlil or posibil e;
-7 nu se cunoaste un algoritm mai eficient.
Alte exemple de probleme clasice care se pot rezolva fol osind metoda backtracking:
-7 generarea tuturor elementelor unui produs cartezian;
-7 generarea tuturor partitiilor unui nurnar natural;
-7 generarea tut uror partitillor unei rnultimi;
-7 generarea tuturor functiilor surj ective;
-7 generarea tuturor functiilor injective;
-7 generarea tuturor posibititatilor de plata a unei sume cu bancnote de valori date ;
-7 gener area tuturor posibilitatilor de acoperire a tablei de sah prin saritura calului (parcur-
gerea tablei de sah prin saritura calului , fara a se trece de doua ori prin aceeasi pozitie).
-7 generarea tuturor posibilitatilor de ieslre dintr-un labirint;
Informatica
1.3.3.1. Generarea pormutarilor
Prin asamblarea subprcqrarnelor definite
perrnutarilor rnutirnli (1, 2, 3, .. ., n] va fi:
Implcrnentarea itorativa

typedef int s t i va[ lOO] ;
int n ,k ,ev,as ;
s t ive s t ,
void .i.nt t t )

iot s ucces o r ()
(if ( st [ k) <ni
( s t [ k ] =s t [ k ] + l ; return 1 ; )
el s e return O; }
int v a l i d ()
( for ( i n t
if return 0 ;
return I ; }
.i.nt; sol u::i e ()
{return k = =n; }
v oid t i.pe r t )
(for (int :=l ; i <=n ; il+l
c cut.c-c s t Li l c-c" If;
c out«endl ;)
voi d bt; ( )
( k= l ;
i n i t () ;
while (k>O)
{ a s = 1; ev= O;
while (a s && ! e v )
( a s =s u c c e s 0 r ( ) ;
i f {a s ) e v =val id() ; }
i f ( a s)
if (solutie {} ) t i p a r () ;
e lse ( k++; .i n i t () ; )
else k- - ; ) )
v oid main ()
(cou t«"n = " ; cin» n;
b t . ) ; )
15
anterior, programul pent ru generarea tuturor
Implementarca rccurslva
#include<i o s t r e a m. h >
typedef int s tiva[l OO) i
int n ;
e t i va s t ,
void i n i t ( i n t k)
)
int succesor( i n t kJ
(if Is t [ k ]<ll l
Ls t.j k l e s t l k j t- L: return I ; }
else return O; }
int va l id( i n t k )
{for {i n t i =l ii<k ; i++ )
if Is t[ k] ==s t[i J) return 0 ;
return l ; }
i n t Solllti e( i n t k )
{return k= =n ; }
v oid t Lpa r ()
{f or {int
c oce-ccs t [ :. 1« " II .
c out«endl i }
void bt (i n t k )
( i n i t Ik ) ;
while ( s uc c e s o r {k ) )
if (vali d I ki )
if l s o l u t i e ( k ) ) tipar ( ) ;
e l se D-c(k..,.l ) i }
v oid ma i n ()
{cout «"n= n. cin» n;
btl l) ; )
Algoritmul de generare a permutarilor poate fi folosit in alte probleme. De exemplu. sa se
genereze toate perrnutarne multimii {1, 2, 3, ... , n} in care nu apar numere consecutive.
Aceasta problema face. parte din categoria de probleme de generare a permutarilor cu
conditie - solutia contine 0 conditle interna suplirnentara fata de cea impusa de permutare.
in acest exemplu, conditia suplirnentara de continuare a construirii solutiei este ca numarul ales
pentru nivelul k al solutiei sa nu difere pnntr-o unitate de numarul care se pe nivelul k-t
al solutiei. Modificarea apare in subprogramul v alid ( ) :
16 Tchnici de programarc
i nt v a lid ()
{i f (k>1 & & abs ( s t [ k ] - s t [ k- 1 ] ) == 1l r etur n 0;
f o r ( i n t i =1 ;i<k;i+ l i f (s'[ i ]==s [kl) r eturn 0 ;
return I ; }
Scrieti urmatoarele programe, in care sa folositi metoda backtracking pentru
generarea tuturor perrnutarilor.
1. Sa se genereze toate perrnutarile unei rnultirni de numere oarecare.
Numerele se rnernoreaza i ntr-un vector. (lndicat ie, Se permute indicii elementelor din
vectorul v, i n subprogramul tipar () se afiseaza elementele v [s t [i I I ).
2. Sa se afiseze toate anagramele unui cuvand citit de la tastatura.
3. Sa se genereze toate matricele binare patrate, de dimensiune n, car e au un singur
element de 1 pe lini e un singur element de 1 pe coloana, a matrice binara este 0
matrice ale carei elemente au valoarea 0 sau 1. lndicatie. Solutia are n elemente.
Elementul sol utiei Xk reprezinta nurnarul coloanei de pe linia k pe care se
el ementul cu valoa rea 1.
4. Sa se genereze toate functiile bijective f : unde card(A)=card(B)=n .
5. Sa se genereze toate posibilitatile de aranjare pe 0 tabla de san. cu dimen siunea nxn, a
n ture care sa nu se atace i ntre ele. Deoarece tura se poate deplasa numai pe linia sau
pe coloana pe care a fest plasata, turele se pot ataca i ntre ele pe lini e pe coloan a,
lndi catie. Se observa ca fiecar e tura trebuie sa fie plasat a sinqura pe 0 coloana, ca
sa nu se atace intre ele. Solutia problemei este data de multirnea cu n elemente {X1 ,
X2, ••. , xn} care se rnernoreaza i n stiva. Elementul solutiei Xk repr ezinta numarul liniei
i n care se asaza ura din coloana k - se rnernoreaza pe nivelul k al sli vei s t .
Deoarece doua ture nu pot fi asezate pe aceeasi linie, stiva trebuie sa contina ele-
ment e disti ncte. Probl ema se reduce la generarea perrnutarilor rnultimii {1, 2, 3, ... , n}.
Interpretarea solutiei est e: fiecare tura se plaseaza in col oana k, pe Iinia s t [ k I .
6. Sa se genereze toate perrnutarile rnultirnii {1, 2, 3, .. ., n} i n care doua numere vecine nu
trebuie sa fie ambeIe pare sau ambele impare. lndicatie. In subprogramul v alid ( ) se
mai verifica si conditi a suplirnentara de vecinat ate.
int val i d()
(if 'k>l & & (st[k-1]%2=O && st[k] .2-=0) I I
(st ik-1] ·:2==1 && st [k] .2=1)) r eturn 0 ;
f o r (i n t i=l ;i<k ; ltt l if return 0 ;
r eturn I ; }
7. Sa se genereze toat e permutarite rnultirnii {1, 3, 5, ... , 2xn+1}. Ind icatio. Solutia are n
elemente. In subprogramul i n i t () elementul din varful stivei se initializeaza cu valoa-
rea -1, iar in subprogramul suc cesor () se rnodifica modul de determinare a succe-
sorului.
int s uccesor ()
{i f (stf k]<2 'n+1) ( s t [ k ] = st [ k]+2 ; r e turn 1; )
e lse r eturn O; }
8. Sa se genereze toate perrnutarile unei rnultirni de numere oareca re, astfel tncat cea mai
mica cea mai mare valoare sa-si pastreze pozitiile initiate.
9. Intr-un sunt aranjate n persoane. Sa se genereze toate posibilitat ile de rearanjare in
sir a acestor persoane, astfel lncat fiecare persoana din sir:
a. sa nu aiba i n fata sa aceeasi persoana pe care a avut-o i n sirul initial:
b. sa nu aiba aceiasi vecini ca in sirul initial:
lntormatica
17
C. sa nu aiba in rata sa persoanele pe care le-a avut in sirul initial;
d. sa fie despartita - de vecinii pe care i-a avut in sirul initia l - de una sau eel mult p
persoa ne; valoarea pentr u p se cites te de la tastatura.
1.3.3.2. Generarea produsului cartezian
Se genereaza toate elementele produsului cartezian A1 x A2 x A3 x ... x An. unde A;=(1,
2, . . " ru] .
a soluti e a problemei va fi un element al produsului cartezian va fi fermata din n ere-
mente. Un element Xk al solutiei poate fi once element din rnultirnea Ak (nu exists
condi ti i interne). Nurnarul de elemente ale fiecarei multiml Ai va fj memorat intr-un
vector rn cu lungimea loqica n. unde m[ i ] =ni . Fata de algorit mul pentru generarea per-
rnutarilor , apar urrnatoarel e di ferente :
-7 Deoarece fiecare rnultirne Ak are un numar diferit de clemente. elementul de pe nive-
lui k are succesor caca nurnarul i de pe acest nivel est e mal rnic decal m [k] .
-7 Deoarece nu exist a con dit ii interne , nu exista restr ictii nici pentru conditia de conti-
nuare, subprogramul valid () va furn iza valoarea 1.
Implcmentarea itorativa Implemcntar ea recursive
#include<i o s t r e a ln. h>
typedef int s t Ive [ l Ol ; typedef i nt s t i va [1 0 1 ;
int 11, k ,ev, a s , m[l OJ ; i nt n:
t5tiva st ;
vo id .i n.i t t )
)
int sccce so r {
( i f
{s : : < =s t {k ] +li r eturn I ; }
else return C; }
i n t va L'i.d ()
( r e t u r n 1 ; )
int 2-:JLE.":"'e
{return
v oid
{Eo r r Ln t; i=l ;l<"-n ; i. 1-)
c oc t .c-c.s t Lj ] c«" " .
cou t«en dl ; }
v o id b t I: )
{/ (par tes fi;-;a a a Lqori t .mu Lu .i I
void main (,
{ccut.c-c "n> " ; c Lrc- on :
f or i n t
{cout-ccvtcr . de e.lesnente muI t imea "
« i«" ";
cin» m .1 ;}
b r. , ; }
s tiva st ;
vo i d k)
{ .:3 t [ k l=O; }
i n t succeso r{ i nt k)
( i f (s t[ i:]<rc.[k])
Ls r l k l c.s t I kl-e l r return I ; }
else return 0 ; )
int val id{i n t
{return : ; }
i n t so:utie{ i n t k)
{return k:..--r. ; }
void t i pe r t '
(for (i nt i=l ;i<=n ; :+"+)
c out « s t [ i ] «" " .
cout « e nd l; }
voi d Lt f Ln t; k)
{/ I pa r t e a f iza a algor i trnuJ.ui }
void ma in {l
{cou t.c-c"n> "; ci n» n ;
for int i
{cout.ocvnr . de ej.erente mu.Lt imea
« i. « " ";
cr rc->:« ] i i .:
be 1) ; )
Algoritmul de generare a produsului cartezian peate f folosit in alte probl eme. De exemplu,
pentrugenerarea tuturor subrnultirnllcr unei rnultimi .
18
Tchnici de programarc
Imolementarea rocursiva
Submull imile Sl i va
0=0
0 0 0
{3}
00 1
{2}
o1 a
{2,3}
a 1 1
{1}
1 0 0
{1,3}
1 a 1
I
{1,2}
1 1 a
(i,2.3\ 1 1 1
o su brnut tirne este fermata din elemente ale rnultirnii A. Pentru simplificarea algoritmului,
vom considera rnultimea A={1,2,3,....n}. Considerarn multirnea B={0,1}. Pentru construirea
submultimilor, pentru frecare subrnultirne S8 defineste functia
I:A->B, astlel: daca elementul i din multimea A apartine sub-
multirnii, atunci l (i)=1; altl el, l (i)=O. Problema se reduce la
generarea produsu lui cartezian a'' . Solutia va fi rnemorata i n
suva si va avea n elemente , fiecare element k at solut rei avanc
valoarea 0 sau 1, cu sernnificatia ca elementul k din rnultirnea
A apartine, respect iv nu apartine submultirnii. Alaturat, sunt
prezenlate toate subrnultimile multimii {1,2,3} continutu
stivei pentru fiecare dintre ele.
de programul anterior, apar urmatoarele rnodificari :
-7 Deoarece rnultirnile produsului cartezian sunt identice (B={O,1}), s-au modificat: sub-
programul ini t () - initial izarea nivelului k at stivei S8 face cu valoarea -1 , CU 1 mai
mic decat a- si subprogramul suc cesor () - elementul are succesor numai daca
este mai mic decat ultirnul element din multime , 1.
-7 in subprogramul de afisare a sciutiei, va Ii afi sat nurnarul nivelului i pentru care, i n
stiva, se mernoreaz a valoarea 1.
Imol ementarea iterativa
#incl ude<i o s t r e a m. r. >
t ype de f int s:iva[lOO} ;
int f:,k,ev,as ;
s t Lve s t .
v oid Ln t t j )
I
int s u c c e so r ()
{if ( s t [ k ]<I )
( s t I k ] <s t [k] +1 ; return I ; )
el s e return O; l
int valid ()
{r e t u r n t ; l
int solu:ie I.)
{retur n ;:""-"'!1; }
v oid t i pe r ()
li n t i ,x=O; cout« " { ";
for (i=l ;i<=n ; i++)
if
{c out c c i c c" t" ; x=l ; }
i f ( x) ccu ccc ' \ b ' ;
o o u t c-c" I "«endl; }
v oid b t ()
{/ I p d r t e u : ixa a alg8ritmu!ui }
void mc i r. \
(cout«"n = ". c i n o o -n :
bl,) ; }
#include < i o s t r e a m. h >
typedef i nt s t i ? a [ : OO] ;
int n ;
s t i ve s t, •
v o i d 'i n.i t ( i n t k)

i n t 3uccesor( i n t k)
{i f ( s t [l: ]<s t.[ k- l ]+ I )
{s t [k ] <s t [ k ] + 1; return I ; }
e l s e ret u r n O; }
int valid() {r etu r n l ; }
i n t 301utie( i n t k}
{r eturn k==n ; }
v oid t i par')
l i n t i , x=O ; c o ut« " {" ;
f or (i='1. ;i<=n ; i++)
if
{c out « i «" I "; x=l ; }
if (x ) c out« ' \ b ';
coo t .c-c'" ) " <cen cn , }
cout«endl ;}
void bt ( i n t
{/ / p a r c. e a a algor i tmelui }
v oi d main l)
{cout«"n ="; c i n» n ; bt. r Lj r }
Ob s e r vat i e. Caracterul escape
' \ b ' c a ract0rul Backspace
($ terae u ltimul caracter
111 fo1"111 a t ieli 19
Scrieti urmatoarele programe, i n 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, cuvantul 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 trei prepa-
rate culinare pent ru felul 3. Sa se genereze toate meniurile 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 depaseasca 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 rnultime oarecare A, cu n eiemente, sa se genereze toate submu ltirnile care au
suma elementelor eqala cu s. Numarul de elemente ale rnultimii, elementele rnultimii A
si valoarea pentru suma s se citesc de la tastatura.
5. Sa se afiseze toate numerel e cu n cifre (1 0) care au proprietatea ca sunt formate
numai din cifre pare, in ordine descrescatoare.
6. Sa se afi seze toate numerele format e din cifre distincte cu propri etatea ca suma
cifrelor este S. Valoarea variabilei S se citeste de la tastatura.
Sa se afiseze toate secventele de n Iitere (n nurnar natural par , citit de la tastatura)
din rnultirnea {A,B,C,D}, secvente care se construiesc astfel: nu se asaza doua litere
identice una langa alta trebuie sa se fol oseasca exact n/2 litere A.
8. Se ci tesc de la tastatura un nurnar na ural n 0) apoi n numere naturale a"
a2, a3, ..., an. Sa se afiseze pe ecran toa e posibilitatile de a in ercala intre taa te cel e n
numere opera orii + - astfel l ncat, evaluand 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 y. Ele pot lua valori in intervalul (0,16]. Limita inferioara a
intervalului este 0, pentru ca numerele 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 AxA - solutia contine
o conditie intema su pl imentar 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 aceste cifre sunt mai mici decal nurnarul x De exemplu, pentru cifrele 0,
1 3 nurnarul x=157, se genereaza 1, 3,10,11 ,13,30,31 ,33,100,1 01,103, 110,
111, 113, 130, 131, 133. Indicalie. Se calculeaza nurnarut de cifre male nurnarului x.
Pentru rnultirnea A fermata din n cifre, se qenereaza produs ele carteziene A
P
, cu
t spsm. Elementele produsul ui cartezian sunt cifrele nurnarului care se forrneaza.
Pentru ca un element al produsulu i cartezian sa fie solutie, trebuie ca primu l element sa
fie diferit de 0 (cifra cea mai sernnificat iva din nurnar nu rebuie sa fie 0), iar numarul
format cu m cifre sa fie mai mic decat nurnarul x.
1.Sa se genereze toate numerele naturale , cu cel mult n cifre 0), care sunt formate
numai din cif re pare, in ordine strict crescatoare.
20 Tehnici de programare
12.Sa se genereze toat e numerele naturale , cu n cifre, care cont in p cifre k. Valorile pentru
n, p k se citesc de la tastatura.
13. Se citeste un nurnar natural n. Sa se genereze toate numerele naturale care, reprezen-
tate i n baza 2, au acelasi nurnar de cifre de 0 acelasi nurnar de cifre de 1 ca
reprezentarea in baza 2 a nurnarului n.
14. Pe un bilet exista 12 pozitii care pot fi perforate. aranjate pe 4 linii si 3 coloane. Sa se
genereze 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, atunci f (i)=1: altfel, f(i) =O.
Problema se reduce la generarea produsului cartezian B12 - solut ia coni ine 0 conditie
interna supl irnentara: 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).
1,3.3.3. Generarea aranjamentelor
Implementarea recursiva
Se qenereaza toate aranjamentele de m efemente ale rnultirnii {1, 2, 3, " ' ! n}.
o solutie a problemei va fi un aranjament - va avea m elemente. Fa\a de algoritmul
pentru generarea perrnutarilor , se rnodifica doar condi tia pri n care se ver ifica daca s-au
obtinut toate elementele solutiei.
Implementarea iterati ve

t ype d e f i n t stivu[lOO] ;
#include< i stream.h>
typedef i n t stiva[ 00] ;
int n , I1l , }:, e"" ,as ;
s: : .ra st ;
void .i n i t {I
{s t [}: 1=0 ; }
int s i ceesor ()
., r v : . ,
t s : 1-: • '.. -+ 1; r eturn =- ; }
el s e r e t u r n o ; }
i n t v a id ( )
{for int :-: ; i< k ; i+·;
i f ==S ' ':'JI return C;
return . ; }
int SUe ::l':()
{ret u r n y.-'=-m; }
voi d ti J'l:- )
{f o r i n t . = .; i ·. =· , .
c ou t c -cs t, i «" ";
cou t« e nd l ; }
voi d bt ()
{ 3 31
v o i d ' a i. r;
" .
,
cin» r. ;
ci n» rn; b t (1) ; )
voi d !1",in
{c ou t«" = " .
c o u t « " m= ";
i n t 11, :n;
S t1',3 S :: ;
void ';'r. it i n t 'j
{s t [ :':J =0 ; }
int suecesor( i n t k)
(if s t j k l cn)
{ . ' I ,: =,0 ::' .--1 ; r e t urn ; }
e l se return O; }
int valid( i n t k )
( f o r li n t i-1 ;: k ; ill)
if TjJ return "
return _ ;}
int k )
{return k=- l ; }
void Llp"r I
{for int _ t-
cout. c-c s t, • 1« "
cou t «endl; }
void b t (i n t J.: )
a ffiJl_: }
c in» r ;
c i n» m; b t () ; }
(cout« " r.= ";
cou t «"m= ";
21
Afisarea
12

f{x) 1 2
13
12
f{x) 1 3
21

f {x) 2 1
23
-ilH+
f{ x) 23
3 1 1 1 2
3 1
32 1 2
32
c i. n>'>: ;
c in» n; b t:. ( ) ; }
I nfor mutica
Algoritmul de generare a aranjamentelor poate fi folosit si in alte
probleme. De exemplu, pentru gcneraraa tuturor functillor injective.
Se genereaza toate functiile injective unde card(A)=m si
card(B)=n. Pentru simpl ificarea algoritmului vom consid era multi-
mile A={1,2,3,.. . ,m} :;; i B={ 1,2,3,.. ..n}. 0 solutie este fermata din m
elemente. Elementul k al solutiei reprezinta valoare a functiei f(k) .
Deoarece valoarea functiei f (k) apartine rnult imi i B, in stiva se vor
genera numere din multirnea {1,2,3,... .n}. Din definitia funct iei
injective. f (i);:f(j ). pentru or ice i;toj . Rezulta ca. pentru ca functia sa
fie injectiva, trebuie ca rnsn. Prob lema se reduce la generarea i n
stiva a uturor aranjamentelor de n elemente luate cate m. Solutiile
vor fi afisate sub forma tabelului de variati e al funct iei . De
exernplu, daca A={1.2} :;;i B={1,2.3}. solutiile :;;i modul i n care vor fi
afisate sunt prezentate ataturat .
Fa\ a de programul anterior. nu se va mod ifica deca t subprogramul
de afisare a solutiilor tipar () .
v o id t i.pa r ( i
{int . i; o outi-cc " x I ";
for (i =1 ; i <=m; L++) c o u t « i «" "; cout « end l;
f o r ( .i =l ; i<=m; i ++) cout«" - - - - - "; c ou t« e ndl« " [ (x ) I n •
f o r ( i =1 ; i <=m; i ++ ) cout« s t [ i ] «" "; cout«endl«endl ; }
void mai n ()
(cout«" n uma l:1... J de elemente ale mu l t.Lru .i i l-.= ";
couc-c-cvnums r t.I i e e Lernen t.e a e In'J t":'mii E= ";
Scrieti urmatoarele programe. i n care sa folositi metoda backtracking pen ru
generarea tuturor aranjamentelor.
1. Sa se genereze toate posibilitat ile de aranjare pe m scaune an per-
soane (rnsn). Valorile pentru n :;;i m numele persoanelor se citesc dintr-un fisier text.
2. Se citesc de la tastatura n ci fre distincte . Sa se genereze toate numerel e de m cifre
(msn) care se pot forma cu aceste cifre - care contin toate cele n cifr e.
3. Sa se genereze toate anagramel e unui cuvant , din care se efirnina p litere oarecare.
Valoarea minima a nurnarului p este 1. iar valoarea maxima este cu 1 mai mi ca decat
lungimea cuvantului, Se citesc de la tastatura cuvantul :;; i valoarea nurnarul ui p.
4. Se citesc de la tastatura n caractere distincte. Sa se genereze toate cuvintele de m carac-
tere (msn) care se pot forma cu aceste caractere si care contin toate cele n car actere.
5. Se citeste un nurnar n care are m cifre. Sa se genereze toat e nurnere le, cu cel mult m
cif re, care se pot forma cu cifrele nurnar ului initi al.
6. Dintr-o rnultirne de n persoane, aranjate intr-un sir, se elirnina p persoane. Sa se genereze
toate posibilitatile de aranjare intr-un sir a persoanelor rarnase. astfel tncat fiecare persoana
sa nu alba aceiasi vecini ca i n sirul initial. Valorile pentru n si p se citesc de la tastatura.
7. Sa se genereze toate aranjamentele. de m numere, ale unei multirni de n numere oarecare
asUel l ncat suma elementelor generate sa fie egala cu s. Nurnarul de elemente ale rnultirnii,
n. elementele rnultirnii, valoarile pentru m :;;i pentru suma s. se citesc de la tastatura .
8. Sa se genereze toate drapelele cu trei culori care se pot forma cu sase culori: alb, gal-
ben, rosu , verde, albastru neqru , care au in mij loc culoarea alb. verde sau rosu.
lndi cati e. Solutia are 3 elemente. un element al solutiei fiind indicel e di n vector al unei
22
Tc hnici de programarc
culori. Se genereaza aranja mente cu condi tie de 6 obiecte luate cate 3 - solutia confine 0
co nditle i nterna su pll rnentara fa!a de cea impusa de aranjamente: elementul 2 al solutiei
trebuie sa fie indicele culori i alb, verde sau rosu.
9. Se considera n cuburi. Fiecare cub i are latura Li culoarea Ci. Sa S8 construiasca toate
turnuri le stabi le, formate cu m cuburi, astfel tncat dOU8 cuburi vecine in turn sa nu eiba
aceeasi culoare. Val orile pentru n "i m "i atributele celor n cuburi se citesc de la tastatura.
lndicatl e. lnforrnatiile despre cuburi S8 mernoreaza intr- un vector de l nreqistrari cu n ele-
mente. Solutia are m elemente. Un element al solutiei este indicele din vector al unui cub.
Se genereaza aranj amente cu condi tie de n obiecte luate cate m - solutia contine 0
con ditie interna suplimenlarii fa\a de cea irnpusa de aranjamente: cubul k care se adauqa
la tum trebuie sa alba latura mai mica decat a cubului k-1 "i culoarea Menta de acesta.
1.3.3.4. Generarea cornbinarilor
Se genereaza toate combinariie de m elemente ale rnultimii (1, 2, 3, . .. , n} .
o sotutie a problemei va fi 0 combinare "i va avea m elemente. Fa\a de algoritmul pentru
generarea aranjamentelor, apare 0 conditie suplimentara: aceea ca sol utiile obtinute sa fie
distincte , adica doua solutii sa nu cantina acel easi numere. Pentru aceasta. se va adauqa 0
co nditie de cont inuare suplimentara: valoarea de pe nivelul k trebuie sa fie strict rnai
mare decat orica re dintre valorite de pe nivelele inferioare. Aillel spus , elementele solutiei
trebuie sa fie ordonate: st [1]<st[2]< ... <st[k-1]<st[k]. Conditia de continuare este indepllni-
ta daca elementul de pe nivelul k va avea 0 valoare strict mai mare cecat valoarea elemen-
tului de pe nivelul k- 1 (se irutializeaza cu 0 valoare egala cu cea a elementului de pe nivelul
k-1) si 0 valoa re mai mica decat n- m+k (se cauta succesorul pana la valoarea n-m+k).
rc,_-:--:", Im.".p.: l ementarea iterativa Imnlemcntarca recursiva
#include<i o s t r e arn . h>
typedef i n t sLiva (l OO] ; type d ef int s tivD[ l OO] ;
int rl, lll, k, e v, a s;
bt ( 1 ) ; )
cin» n ;
__
i nt n ,f:\;
s t i.va s t :
void init ( i n t k )
{ if { k == lj st [k ] =O;
else s ::[ kJ=st[k-12 ; }
int k)
(if ( s t l k j <n - m+ kl
( SL [ k ] - s : [ k J· 1; r e t urn 1 ; )
e lse return O; }
i nt ve Li d t ) {return 1;}
int soluti c (i n t k)
{return k==m; }
void tipar ()
{for (int
couc-cc s t l i l c-c" It.
cout«endl ; }
void b t (i n t .K.)
{/ / p a r t e a fi xa a
void main ()
{cout.cc "n> " .
c c u t.c-cv n;-. ": b t () ; )
cin» n;
c i n» m:
s t dv a s t .
voi d ini:: ()
{i f ( k==l) s t[k]=O;
else s t[k]=st[k-l] ; }
int succescr ()
{if (sL[k l<n-m.kj
{s t [ k ] =s t [ k] +1; r eturn I ; }
el s e r eturn O; }
i nt val i d ( ) {return 1; }
int s o Lwt Le t )
{r etur n k==m; }
v oi d t.Lpa r ()
{for (i nt i = l ; i<=m;i++)
cout« s t [ i ]«" " :
c o u t « e ndl ; }
void btl }
( I l pa r t e a f ixa a
void ma i n (l
{cout« " n= " ;
cout« " m=
Informutica 23
c in» :n;
cin» q i
Algoritmul de generare a combinarilor poate fi folosit i n problemele de generare a
tuturor posibilitatilor de a forma din n obiecte grupuri de m obiecte care sa aiba
anumite proprtotati , De exemplu, din n obiecte trebuie sa se distribu ie unei persoane m
obiecte, care sa conti na obligatoriu obiectul p sa nu cont ina obiectul q. Sa se genereze
toate posibilitatile de a forma grupuri de m astfel de obiecte. Pentru simplificare vom
considera rnultimea obiectelor ca fiind {1, 2, 3, ... , n} . Valorile pentru nurnarul de obiecte
n, nurnarul de obiecte din grup. rn, indicii obiectelor p 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 conditia de continuare a construirii solutie: (subpro-
gramul val i d () ), deoarece obiectele p si q nu pot fi elemente ale solutiel.
#incl ude<i o s t r e a m. h >
t ype d e f int s t i va Ll Ou l .
i n t , m, p, \ , k , e v ,as ;
s ti v a s ;
void Ln i r t ) {if ( k==2 ;: [ k ] = Oi else
int s accesor () {! 11 - tel ca :'n exernpLu I an e r i o r }
int va lid ()
(return s t I k ] ! =p && st [ k] ! = q; )
int sol utle() ( l il a .el c a in e xemp LuL an t e r i.or l
void : :'?ar ( ) { Ilia f e L c a :'!1 e xemp Lu I anter ior }
voi d bt (I
{k=2; an i t . ;
wh i le (k>l .
IlIa :-e : ca ::1 e xe rnp Lu an t e r i.o r }
voi d mai n ()
{cout«"n= " ; c i n» n; cou t «"m=- " ;
cout«" p= " ; c in» pi c out « " q = " ;
s t [ l ]=p ; bt(1 ; }
Scrief urmatoarele programe, in care sa folositi metoda backtracking pentru
generarea tuturor cornbinarilor.
1. Sa se genereze toate grupurile de p persoane care se pot forma din n
persoane. lnformatiile se citesc dintr-un fisier text unde, pe primul rand, sunt scrise
valorile pentru p n, despartite printr-un spatiu, iar pe urrnatoarele randuri numele
persoanelor. cate un nume pe un rand.
2. Ooua persoane i mpart n obiecte astfel: prima persoana ia m obiecte, iar cealalta
persoana - restul obiectelor. Sa se genereze toate posibilitatile de distribuire a celor n
obiecte intre cele doua persoane.
3. Doua persoane i:;;i i mpart n obiecte. Fiecare obiect are 0 valoare Vi . Sa se genereze
toate posibilitatile de distribuire a celor n obiecte. i ntre cele doua persoane, astfel i ncat
fiecare persoana sa primeasca obiecte, care sa aiba aceeasi valoare totala.
4. Doua persoane impart n obiecte astfel: prima persoana ia m obiecte, iar cealalta
persoana, restul obiectelor. Fiecare obiect are 0 valoare Vi . Sa se genereze toate
posibilitatile de distribuire a celor n obiecte, i ntre cele doua persoane, astfel Incat fiecare
persoana sa primeasca obiecte care sa aiba aceeasi valoare totala.
24
Tch nici dc progrn marc
5. Sa se genereze toate numerele binare de n cifre care au m cil re de O. lndlcatl e. 0
solutie este fermata din m elemente. un element fiind pozitia din numar in care S8 poate
gasi cil ra 0 - exceptand prima pozitie.
6. Din n obiecte date. sa se genereze toate grupurile de m obiecte care in deplinesc
urrnatoarele condi tii:
8 . contin exact p obiecte preciza te;
b. nu conti n nici unul din p obiecte precizate;
c. con tin numai un obiect din p obiecte precizate:
d. contin cel putin un obiect din p obiecte precizate;
e. contm exact q obiecte din p obiecte precizate;
f . contm exact q obie cte din p obiecte precizate ~ j nu contin r obi ecte precizate;
g. connn exact q obiecte din p obiecte precizate ~ i nu contin 5 obiecte din r obiecte
precizate.
1.3.3.5. Generarea tuturor partitiilor unui numar natural
4- 1+1+1+1 (m=4)
4=1+1+2 (m=3)
4=1 +3 (m=2)
4=2+2 (m=2)
4=4 (m=1)
o partitie a unui nurnar natural nenul n este 0 descompunere a nu-
marului n in surna de m numere naturale nenule. Solutiile care nu
difera dedit prin ordinea termenilor nu sunt considerate distincte.
Ataturat sunt prezenta te toate partitiile numarului 4.
o sol utie a problemei va fi fermata din m elemente a carer surna este
eqala eu nurnarul n. Elementele solutiei reprezinta termenii unei descompuneri. Numarul de
elemente ale unei solutii (m) est e egal cu valoarea varfului stivei k atunci cand s-a obtinut
solutia Solutia se obt ine atunci cand suma elementelor din stiva este egala cu n. Altl el
spus, solutia se obtine atunci cane suma s=sl[1]+sl[2]+ ... +sl [k-1]+sl[k] are valoarea n.
Pentru a evita repetarea aceleiasi descompuneri, valoarea de pe nivelul k trebuie sa fie mai
mare sau ega la eu oricare dintre valorile de pe nivele!e inferioare. Altfel spus, elementele
solut iei trebuie sa fie ordonate: st [1]->sl[21-> ... ->sl [k-1] ->sl [ k] . Aceasta conditie este
l ndeplinita daca elementul de pe nivelul k va avea a valoare mai mare sau eqala eu
valoarea elementului de pe nivelul k-1 ( S8 initializeaza eu 0 valoare rnai mica eu 1 decat
cea a elementului de pe nivelul k-1) ,i 0 valoare mai mica decat diferenta dintre nurnarul n
,i suma termenilor descompunerii gasi\i pima la nivelul k, s=st [1]+sl [2]+ ... +st[k-1] .
Condi tia de conti nuare este ca suma termenilor genera\i, S , sa fie mai mica sau egal a
eu n (ssn) , a solutie cornpleta obunandu-se atunci cane s=n. Initial , suma s are valoarea
o~ i ea trebuie actuatizata in perrnanenta. Exista coua cazuri de actualizare:
-7 Atunci cane se adauqa i n stiva un nou termen. acesta se adauqa si la surna. AIHel
spus, cac a succesorul qasit poate fi element al sol utiei (prin adauq area lui la surna
aceasta nu va depasi valoarea nurnarului n), atunci el se adauqa la surna. Actuali-
zarea sume i se va face i n subprogramul val id () (termenul se ad auq a la surna
numai daca l ace parte din descompunere): s+=st [ k] .
-7' Atunci cane se coboara i n stiva, trebuie scazute din surna doua val ori: valoarea
eleme ntului din varful stivei (k) ,i valoarea elementului de pe nivelul precedent (k-1).
Deoarece in st iva se coboara intotdeauna dupa ce s-a obt inut 0 solutie cornpleta si nu
se mai poate gasi un element pentr u nivelul k cu care sa se continue dezvoltarea
solutiei, scaderea din surna a termenului curent se va face dupa ce se afiseaza 0
solutie comp lete i n subproqrarnul tip ar () : s - =st [kJ, iar scacerea din surna a
[II f urmaticii 25
termenul ui precedent S8 face in subprogramul succesor () , atune! cand nu S8
succesor pentru elernentuJdin varful stivei : - s-=st[k-l ) .
Implementarea iterativa Implementarea recursiva
#i n c lude <i o s t r e am. h> #include<l o s t r e a m. h>
typedef int at iva[lOO] ; typedef int s tiva fl00 J ;
int n ,s=O,k ,cv,a s ; int n ,s=O ;
s t iva s t ; stiva 3t ;
void init () void .i.ni. t; (i n t k)
{if (if
else else
int suc c e s c r () i nt succe s c r (i n t k )
{if (st[k]<n -s) {if ( s t Lk l c nv s )
return 1 ; ) return l; )
else { s - =;5t l k - lj; return OJ } } else {s - = s t [ k .,.- l ] ; r e t u r n Ov J}
int v a .l i d t ) int v al i.d ( i n t k )
{if (s+st [ kJ<=n) {if ( s+st [k]<""n)
{s += s t [ k ]; return I ; } {s +=s t [ k]; return 1; }
e l s e return O; } e lse r e t urn O; }
int s o l u t i e U int s o Lu t i.e ( i n t k.)
(retu rn s=,::=n; ) (return s "" =n i }
v oid t. i p a r () v o i d r i p a rj i.nt; Yo)
( for{int (for(int i=li <ki i++ )
cout.cc s t Li l -cc" } " ; cou t cc a r j i l c«" - " i
cout« st [ k ]«endl;

void bt () void bt : i n t k)
{/ / pa r t e a 3 algoritmul ui } ( / I p a r t e a a alg o ritmul u i )
void ma i.n () void rna i n ( )
{ccu t.c«".n> "; c i. noc-n : bt() r I (cout«" n =!l
i
c i. ncc- n , bt (l j ; }
25 = 5+5+5+5+5 (01=5)
25 = 5+5+5+10 (01=4)
25 = 5+10 +10 (01=3)
A!goritmul de generare a tuturo r partiti ilor unui nurnar natural poate fi folosit 'Ii in alte
probleme. De exemplu , gcnerarea t uturor post bitl tati lor de plata a unei sume cu
banc note de va lori date.
Problema se reduce la generarea tuturor partitiilor unui nu-
mar natural nenul suma, a partitie fiind 0 descompunere a
numarului suma in surna de m numere naturale, nenule, cu
valari apartinand rnultimii A={a1,a2, _. ., an}. Alaturat , sunt
prezenta te toate partitiile sumei 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 element 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
Condit i a de co ntinuare este ca suma valorilor termenilor qenerati, 5 , sa fie mai mica
sau eqala cu surna (sssurna). 0 sclutie cornpleta obtinandu-se atunci cane s=suma.
Atunci cand S8 urea In stiva, S8 aduna la surna valoarea bancnotei cLJ indicele k:
st e e Est [k ) ] , iar cand S8 coboara i n stiva, 58 scade din surna valo area bancnotei
cu indicele k: s - =a [s t [ k] ] si valoarea bancnotei cu indicele k-1: 5+= a [s t [ k -1] ] .
-7 Deoarece este posibil ca - pentru anumite valori ale sumei suma ale valorilor
bancnot elor - sa nu exi ste nici 0 solutie, 5 8 foloseste variabila de tip logic este, care
are valoa rea 1 (true), daca exista cel putin 0 solutie , 0 (false), In caz contr ar
#includ e <l o s t r e a m. h >
t ype d e f int s t iva [ lOO ] ;
int
stiva st;
void .i n i.t; (i
{i f
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 uma ) { s +=a [ s t [ k ] ]; r etur n I ; }
e l se ret urn O; }
int s ol ut i e ( )
{retu rn s==suma ; }
void t Lpe r L)
{int i , j ,p,es:e=i ;
for ( i=l ;i<=c: n ;i+l· )
if P++ ;
if (p !=O) cou t «p«" "'''« a [ i J«'' + ";}
cout« ' \ b '«' \ b '« " " «endl; s -:- =a [st [k] ] ; }
void bt( ) {l l p b c t e a a al go r i trnu l ui }
void mai n ( )
{cout « " n = " ; ci n» n;
for (i nt
{cout .c-c vv c Iocr c bencnota "<ci c-c'": II . cin» a [ i ];}
coun-ce " suma« " ; cin» s uma; b t () ;
if ( !este) oout-c-c vI mpo 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 descompunerile 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 folosi te Se
citesc dintr-un fisier text, de pe primul rand, lungi mea barei - L si numarul de repere - n.
iar de pe urrnatorul rand, reperele . Numerele de pe un rand sunt separate prin spatiu.
Informat icii 27
5. Pentru realizarea unui chestionar exists n Intrebari , fiecare int rebare avanc un punctaj .
Nurnarul de i ntrebari ll i punctajul fiecarei Intrebari S8 cttesc dintr-un fisier text. Sa S8
genereze toat e chestionarele care au i ntre a b Intrebari distlncte un punctaj total
i ntre p si q puncte. Valo rile pentru a, b, p q se citesc de la tastatura.
6. Sa S8 gaseasca modalitatea de plata a unei sume cu un numar minim de bancnote cu valori
date.
1.3.3.6. Generarea tuturor partitiilor unci rnultimi
o partitie a unei rnulti mi A este forrnata din rnultimile nevi de disj uncte Ai a carer reuniune
este rnultirnea A: U,\;=" "; n"j =IZI pentru orice i,j =t -m.
;", 1
Parti!iile Sliva
(1, 2, 3} 1 1 1
(1,2}{3) 1 1 2
(1,3}{2) 1 2 1
. {1}{2, 3) 122
I _(1) (?H3 ) 123
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 va avea n elemente,
fiecare element k al solutiei reprezentand rnultirnea i (1,;i'; n) careia ii apartine elementul k din
multirnea care se partifioneaza : sl[k]=i Insearnna eli elementul k din rnultirnea A face parte
din rnultimea i a part itiei . incadrul unei partitii nu intereseaza ordinea in care apar elementele
rnultimii A. Cel mai mare nurnar care va fi generat i n stiva reprezinta nurnarul de rnultirni m i n
care a fast descornpus a rnul tirnea A. i n plus, numerele generate i n stiva trebuie sa apartina
unei multimi de numere consecut ive care i ncepe eu 1, deoarece
partitia nu conune rnultimi vide. Alaturat , sunt prezentate toate
partitnle multimii ( 1,2,3) si continutul stivei pentru fiecare dintre ere. i n
exemplu, nu exist a solutia 1 3 3 deoarece aceste valori nu apartin
unei multirni de numere consecutive (nu se poate ca un element din
multimea A sa apart ina rnultirnii A1, alte doua elemente rnultirni
A3, deoarece ar i nsemna ca rnultimea A2 este vida).
lmnlornentarea recursiva
Conditi a de conti nuarc este asiqurat a pr in modul in care este ales succesor ul st [ k]:S;k,
ceea ce Insearnn 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 elementului. Altfel spus, daca
pana la nivelul k numarul maxim atribuit pentru 0 part itie este i, acest nurnar reprezentand
nurnarul de rnultimi ale partitiei care exista i n solutia part iala, pe nivelul k+1 elementul poate
avea una dintre urrnatoarele val ori :
-7 Orice valoare de la 1 la i , ceea ce tns earnna ca elementul k+1 din rnultirnea A se
adauqa la una dintre multirnile care exista deja.
-7 Valoarea i +1, ceea ce insearnna ca elementul k+1 din rnultirnea A va genera 0 noua
rnultirne i n part itie.
Imolcmentarca iteratlva
#incl ude <i o s t r e a m. h>
typedef i nt s:iva[lOO] ;
int n ,k ,e'l ,as ;
#include <i os c =e a m. h>
t ype def int sc iva[ lOO] ;
i n t n ,
sLivd st ;
v o i d Ln i tt j { s t l k l = ();}
int s uc c e s o r ()
( if (st[ <]<3t[k-1J+ll
{ s : [k]=-st[ k) +l ; r eturn :. ; }
e lse return Oi l
s tiva s c ;
v oi d .i n .i t. ( i n t k )
int suc c esor ( i n t k )
(i f (st[k]<s:[ J:-l] +l)
I ; }
el s e ret urn O; }
28
int va Li, () {retur n 1; l
i n t s oLu t i.e r )
(retur n :: ==:l ; )
voi d ::i;:;ar {\
lint
. j
if m x "-s t [ : j ;
for 'i=l ;i<=max ;iTT )
{cout« " {" ;
f or (j =l ; j<=n ;j l+)
i f (s t l. j j==i) cou t« j« " , " ;
cout« ' \ b '« " ) " ;l
cout«end l; )
void bt ( )
{! fi x5 a a ! gor i : rnul ui l
void .na i n I;
"; cin» n; bt:. ( ;)
Tehnici de progrumare
int va l i d ( ) {return : ; )
int k )
{retu r n k==n ; )
vo id t i par ( )
{i nt
for (1=2 ; i <=n ; i
4
1 )
i f Is [i l>max)
for (i =l ; i <=m x ;i++)
{cout« " [ " ;
f o r I j =l ; j <=n ; j 1 +)
if I st [ j] == i) cou t« j « ", ";
c out -c-c' \b ' «" l "; )
c o ut«end l; )
vo id bt ( i n t k )
I I / pa r t e a f i xa a 'i l
void ma in ()
{cout«"n = "; cin» n; bt l: ) ; )
Scrieti urrnatoarele programe. i n care sa folosif metoda backtracking pentru
generarea tuturor part itiilor unei rnultirni . Se cons idera rnultirnea A. cu n
numere i ntregi. Valorile pentru n m pentru elemen tel e rnultirnii A se
citesc de la tastatura.
1. Sa se genereze toate part itiile rnultirnii A formate din doua subrnultirni care au suma
elementelor egale.
2. Sa se genereze toate partitiile rnultirnii A formate din m subrnultirni.
3. Sa se gene reze toate partitii le rnuttimii A formate din subrnultirni care au ace lasi nurnar
de elemente.
211
221
122
1.3.3.7. Generarea tuturor funct iilor surjective
Se genereaza toate fun ctilte surject ive f:A-tB unde card(A)=m
card( B) =n. Pentru simplificarea algoritmului vom consider a multi-
mile A={1.2.3.... .m} B={1.2.3..... n}. 0 solutie este fermata din m
elemente. Elementul k al solutiei reprezinta valoarea functlei; f (k) .
Deoarece valoarea functiei f(k) apartine mult irnii B. in stiva se vor
genera numere din rnultirnea {1.2.3..... n}. Din defini tia funct iei
surjective. trebuie ca. pent ru orice j EB. sa existe i EA. astfel tncat
f(i)=j . Rezulta ca - pent ru ca functia sa fie surject ive - trebuie ca
nsm. Problema se reduce la generarea i n stiva a tuturor elemen-
telor produsului cartezian B
m
din care vor fi considerate solutii
numai cele care contin toate el ementele din mul timea B. Solutiile
vor fi afisate sub forma tabe lului de variatie a functiei . De
exemplu, daca A={1.2.3} B={1.2}. solutille modul i n care vor fi
afisate sunt prezentate alatur at.
Conditia de continuare este asiqurata prin modul in care este ales
succesorul ca element din multirnea B, singurul caz special fiind al
element ului care se adauqa pe ultimul nivel din stiva (m) . Prin adau-
garea acestui element, trebuie ca in stiva sa existe toate elementele
Solutia Aflsarea
112 x j1 23
f (x) 1 1 2
121 . x _-' 1 2 3
f(X)]1 21
x 1 23
f (x) 1 2 2
x 1123
f(X)1211

f(X)l221
21 2
x /123
f (x) 2 2 1
Informatica 29
t ype d e f i nt s tiva [100] ;
Implementarea rocursiva

#inc lud e <i o s t r e a m. h >
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, 0 (false), i n
caz contrar.
Implementarea iterativa
#incl ud e <i o s t r e a m, h >
typedef int s t i va [100] ;
int n,Hl ,k , e v , as i
s tLve s t ;
i n t 2u r ject iva()
lint l ,j , x ;
for (j=l ;j<=n ; j++ l
(for (i= l ,x=O;.i<=m && ! x; i++ l
if ( s; [ .i J== j ) x >1;
if (! x ) return O; }
return 1 ; }
voi d Ln i c t ) { s L [ k ] =O;}
i n t succe sc r ( )
j if (st[k]<st[k- lJ +1)
( s ;: [ k ] =s t [ k ] +1; return 1 ; )
e l se r eturn O; }
i n t v a lLd t )
( if
i f ( !surject i va()) return 0 ;
r eturn :.. ; )
i n t s o Lu t i.et )
( ret urn
voi d ti pa r t )
( int .i : c out« " }: I " ;
f or cou t« i« " " ;
cout«endl ;
for (i=J ; i<==rll ; i -H ) cou t« "-- - - - " ;
cout«endl «" l (x) I ";
for (1=1 ; i<.=m; i++) cout« s t l i l« " II ;
cout«endl«endl; )
void bt ()
( / / p a r t e et fL-:5 a oLq o r i t mu Lu i. }
void main ()
{cout«" e l e me r. t e mu l.c.Lme a 7\= ";
c i n .» m;
cout«" e l e mc n t c mul t i me a B= " ;
cin» n; o.t; (i ; )
i nt D,m ;
s t i va e z ,
i n t sur jectiva( )
{int l ,j , x ;
for ( j =l ; j <=n ; j ++ l
(for &f, I >: ; l++)
if x=l ;
if ( ! x) r e t urn 0 ; )
r e t u r n l ; }
v o i d in Lt ( i n t k) { s t [ k ) = O; }
i n t 3uccesorl i n t k )
(if (sL[ kJ<SL[ k- l J +l)
{s t [ k ] =s t [ k ] + I ;return I; }
el s e r eturn O; }
int va lid( i n t k )
(if (k==n:)
i f ( !su rjecti va () ) ret urn 0 ;
r etu r n 1 ; )
int k )
( r e turn k==n ; )
voi d t i. car ()
(i nt i: cou t«" x I " ;
for (i=l; i.<-m;i++ ) cou t.c-cLc -c" " ;
c o ut« e n d l ;
f or (i =:: ;i.<"'ll' ;i..I;) c o ut«"--- - -" ;
c o u t-c-cend.l c-c " f (x ) i " ;
for (i=1; i<=m;l++) = ut« s t [i ]« " " ;
c o u t « e ndl « endl ; }
v o i d b t ( i n t k )
( / / p a r t e a fixa a
v oid rna in ()
(cout« " c l e me n -_e mu Lti me a 7\= ";
ci n » m;
c out-cc v e Lernen t e mu I t.Lrue a 5"" " ;
cin » n; bt ( 1) ; )
Scrieti urmatoarele programe, i n care sa folositi metoda backtracking pentru
generarea tuturor functiilor surjective.
1. Se citesc de la tastatur a n cifre distincte. Sa se genereze toate nu-
merele de III cifre (nsrn) care se pot forma cu acesle cifre care contin toate cele n cifre.
2. Se citesc de la tastatura n caractere distincte. Sa se genereze toate cuvintele de In carac-
tere (nsm) care se pot forma cu aceste caractere care contin toate cele n caractere.
30 Tehni ci de programarc
e
®
®
®
®
®
®
®
,................. ..
C
i +p""k
~ .
.'
..
....
,
A
.'
i ; ~ j
.........
i,i
."
......... ......... ...
<.
"
i-p, k
3. Profesorul de infor matica a preqatit m teme, pentru proiecte pe care trebuie sa Ie repar-
tizeze celor n elevi din clasa (rns n), astfel l ncat nici 0 terna de proiec t sa nu rarnana
nerepartizata. Sa S8 genereze toate solutiile de repartizare a temelor pentru protect.
4. 0 bara are lungimea L. Se considera n repere de lungimi difer ite. Sa S8 genereze toate
posibilitatile de a tala bara dupa reperele existente, fara sa rarnana rest la taiere, fiecare
reper fiind folos it cel putin a data. Se citesc dintr-un fisier text, de pe primul rand,
lungimea barei - L si numarul de repere - 0 , iar de pe urrnatorul rand, reperele.
Numerele de pe un rand sunt separate prin spatiu .
5. Sa se genereze toate constructiile corecte de paranteze ( si ); n este nurnar par ~ i se
citeste de la tastatura, De exemplu, pent ru n=6, construcjii le (0l0 si O(()l sunt corecte,
iar constructia 0)(0 nu este corecta . tndtcati o. Se qenereaza functiile surjective f :A->B
unde A = {1.2,3,.. .,n} = multimea pozitiilor ocupate de paranteze, ~ i B = {G .1} = multimea
parantezeJor - (=0 si )=1 - care i ndeplinesc urrnatoarele conditii:
-7 1(1)=0 ~ i l(n)=1 (expresia i ncepe cu paranteza deschisa ~ i se terrnina cu a paranteza
inchisa)
-) Numarul de valori a ale functiei si nurnarul de valori 1 ale functiei sunt egale cu n/2
(nurnarul de paranteze deschise este egal cu nurnar ul de paranteze i nchise).
-7 In timpu! construirii solutiei , nu trebuie ca nurnarul de valori 1 ale functiei sa fie mai mare
decat nurnarul de valori 0 generate pana la acel moment (numarul de paranteze inchise
este intotdeauna eel mult ega1cu numarul de paranteze deschise).
1.3.3.8. Problema celor n dame
Se qenereaza toate posibilit atile de aranjare, pe 0 tabla de sah, cu dimensiunea nxn , a n
dame care sa nu S8 atace lntre ele. Damele S8 pot ataca lntre ele pe linie , pe coloana ~ i
pe diaqona.a.
8
Se observa ca fiecare darna t rebuie sa f ie plasata sinqura 7
pe 0 colcana, ca sa nu S8 atace intre ele. Solutia preble-__ 6
mei este data de multi mea cu n elemente { X1, X2, . . ., xn}
care S8 mernoreaza in stiva. Elementul solutie i Xk 5
reprezinta nurnarul liniei in care S8 asaza dama din 4
coloana k, si se rnernoreaza pe nivelul k al sti vei st. De 3
exemplu, pentru n=8 , 0 solutie este S={4,8 ,1,5,7,2,6,3j si 2
damele sunt aranjate pe tabla de sah ca in figura 1
alaturata. 1 2 3 4 5 6 7 8
Date fiind coordonatele i .j , de pe tabla de
sah ale pozinei unei dame care a fast
asezata anterior (lini a i este mernorata pe
nivelul j in stiva - i =sIO] ), ca ea sa nu atace
dama care urrneaza sa fie pusa i n coloana k
- trebuie sa fie indeplinite urrnatoarele
conditii i nter ne:
-;. Dama din coloana k nu trebuie sa S8
qaseasca pe linia i .
-;. Dama din coloana k nu trebu ie sa se g<3-
seas ca pe diagonala cu dama din coloa-
na J. ad.ca triung hiul ABC nu trebuie sa
fie isoscel. Pentr u ca triunghiul ABC sa
Informaticii
31
nu fie isoscel , conditia pe care trebuie sa 0 i ndeplineasca dama din coloana k se
poate exprima astf el: oricare ar fi j<k, Xj *- Xk IXk - xjl *- k-j .
Aceste conditii interne ale solutiei trebuie sa se reqaseasca in conditia de continuare a
solutiei - care se verifica i n subprogramul valid (} : stUJ*-st[k] abs(st[k]-stUJ)*-k-j ,
pent ru orice j *-k.
#includ e < i o s l r e a m. h >
#inc l ude<ma t h . ! >
typede f i n t
i nt !1 ,
s t i : - st. ;
void .i n i. t; 'J< { !< r I:, -0 ; }
int succesor
{i f return :. ; }
else r e t urn .: ; }
int va Li.d M.
{for (i n t i= . ;i<k; 'H)
if (s c[ k]==ac[i] II a b s ( s t l k ] - s c [ i ] ) ==k - i ) return 0 ;
return I ; }
i n t sol u tie i<l {r e turn I:==n ; }
voi d t.Lpar ( )
{for (i nt i=1; i <=, n ; .i + ) c out .c-cs t l i l c-c" " ; c o u t « e ndl; }
v o i d bt (( {1 / p a r ce 3 a }
v oid ma i n () {cou t«"n = "; c i n » n ; be ,:1\' ; }
Sa se genereze toate posibilitatile de aranjare, pe 0 tabla de sah, cu
dimensiunea nxn, a n nebuni, care sa nu se atace i ntre ei. Nebunul se
poate deplasa numai pe diaqonala.
1.3.3.9. Parcurgerea tablei de sah cu un cal
Se cauta toate posibilitatile de parcurgere a tablei de sah prin saritura calului, fara a trece
de doua ori prin aceeasi pozitie. Tabla de sah are dimensiunea nxn , iar pozitia inili ala a
calului este data de i - nurnarul liniei si j - numarul coloanei. Se citesc de la tastatura
valorile pentru n, i j .
Solutia problemei este data de multirnea cu nxn elemente {X1, X2• . . . , x
nxn
} care se
rnernoreaza in stiva. Element ul solutiei Xk reprezinta coordonatele i j ale patratului in
care se deplase aza calul la mutar ea k - se rnernoreaza pe nivelul k al stivei 51. Pentru
a i nregistra traseul strabatut de cal, elementele stivei vor fi de tip i nregistrare cu doua
carnpuri, x y, corespunzatoare celor doua coordonate ale patratului .
struct element {i n t x , y; };
typedef e 2.eIi,en t sri " r 1 I 1;
Stiva va avea dimensiunea nxn, corespunzatoare parcurge rii i ntregii table de san
(kmax=nxn) , va cont ine. i n ordine. coordonatele tuturor patratelor de pe traseul de
parcurge re: s t [ 1] . x s t [1] . Y corespund primei pozitii de pe tabla, s t [2] . x
st[2]. y corespund celei de a doua pozitii de pe tabla, ... , s t [ n *n ] .x s t [ n *n ] . y
corespund ultimei pozitil de pe tabla.
32
Te huici de programarc
De exemp lu, pent ru n=5 - ea pozitie de pornire pat ratul de pe linia 1 eoloana 1 - 0
sol uti e va avea 25 de elemente. Prima dint re solutiile obt inute este prezentata mai jos :
Sol ut ia
1, 1 3,2 5,1 4,3 5,5
3,4 4,2 5,4 3,5 1,4
2,2 4,1 5,3 4,5 2,4
1,2 3, 1 5,2 3,3 2,1
1,3 2,5 4,4 2,3 1,5
Ordine
1
2
3
4
5
a de ocuoare a tablei de
1 16 21 10 25
20 11 24 15 22
17 2 19 6 9
12 7 4 23 14
3 18 13 8 5

1 2 3 4 5
;+1, j- 2
i -1, j-2
r-z, j -1
i-z, j +l
Coord onate
4
.....
3
i+2, i-l ;
r..
i +2, i+l
5
,
2
i +1, j -2 i+1, ;+2
........... ................--.. i ,J
1::::::::::::::::::::
.........
....... .... ......
6 1
i-l , j-2
,
i-1, j+2
7 8
i -2, ;-1
...... ......
r- z, j+l
5
6
7
8
1 i -l ,j+2
2 i+1, j +2
3 ;+2, j +l
4 i+2, j -1
Varianta Co ordonat c Va rlanta
Se observa ca exis ta 8 variante
posi bile pentru continua rea dru-
mului. Coordonatele urmatoru-
lui pat rat de pe tabla de san in
care poate sari calul , pentru
fiecare dintre cele 8 variante,
sunt prezentate in tabel.
Data fiind 0 pozitie curenta i,j a
traseului , variantele posibile
pentru urrnatoarea pozit ie a
ealului pe tabla de sah sunt
prezentate alat urat .
i n vectorul p, de di mensiune nxn
S8 pastreaz a varianta care s-a ales
pentru continuarea drumului . Ele-
mentele sale sunt de tip i ntreg.
Elementul k di n vector arata care
dintre cel e 8 vari ante s-a ales
pentru a ajun ge de la pozitia k-1 la pozi tra k Oriee element k al veetorului trebu ie sa
Indeplineasca urrnatoarea conditie: 1:> P [ k] s 8.
Fieeare dintre cere 8 variante de deplasare din patratul k-l i n patr atul k tnsea rnna
adauqarea unei constante de deplasare la coord onata x, respectiv v, a patratului k-1.
Aceste constante sunt memorate i n vectorul d (pentru variant a 0, care nu exista, depla-
sarea cste 0):
t::l!t.l:e;,t: d , 9
1
= {{ 0, }, { - 1, " } . fl, 2 L I }, {2, - 1}, {l, - 2J, { - ,l., - L ), {-2, - l }, {- 2, I }};
Vanabila logiea es te se Iol oseste pentr u a sti daca s-a gasit eel put in 0 solutie (de
exernptu, pentru 11=4 problema nu are sol utii) . Este initializata eu valoarea 0 (nu s-a gasi t
i nca nici 0 soluti e), Va Iua val oarea 1 (s-a qasi t 0 solutie) i n subproq ramul tipar () care
S8 execut a numai daca S-3 gasit 0 soluti e a problemei .
Subprogramel c
7 Subprogramul ini t () . Se lnitial lzeaza varianta eu care S8 trece di n patratul k-1 i n
patratul k. adi ca elementul k di n veetorul p: p [k1
lnfurmat icii 33
" .
return C;
-) SUbprogra mul succesor () . Se considera ca mai exists 0 posibilitate de continuare a
cons truirii soluti ei pe niveJul k daca mai exista 0 varianta de mutare di n pat ratul k-1 i n
patratu l k, adica daca p [k] <8 . Daca mai exista 0 varianta de mutare , pe nivelul k din
stiva, S8 trece la aceasta variants (p [k] =p [k] +1) S8 i nregistreaza coordonatele
patratul ui k, care S8 vor obtine prin adauqa rea, la coordonatele patratului k-1, a
deplasarilor corespunzatoare acestei variante (st[k] . x=st[ k-l ].x+d[p [k]] . x
st[k] .y=st[k-l] .y+d[p[k]] . y ).
-7 Subprogramul valid () . Se considera ca patratul k In care s-a ajuns poate fi cons ide-
rat ca este bun pentru a continua construirea solut iei , daca coordonatele sale nu sunt
I n afara tablei de sah (coordonatel e st[k] .x st[k].y iau valori In intervalul [1,n] )
prin pat ratul k nu s-a mai trecut (S8 ver ifica daca i n stiva, pe nivelurile ante rioare , nu
mai exista un patrat cu coor donatele patratulu i
-7 Subprogr amul soLu t i.e () . Se verifies daca a fast parcursa toata tabla de sah, adica
caca varf ul stivei k are vaJoarea n- n.
-7 Subprogramul bt () . Deoarece coord onatele primului patrat nu trebuie modificate ,
primul ui element al solutiei (k=1) i se atribuie coordonatele in subprogramul main ( ) ,
iar in subprogram se va i ncepe cu initializarea nivelului 2 din stiva (k=2); cautarea
tuturor solutiilor se va face pana cand varful sti vei coboara pana la primul element al
solutiei : while ( k > l ) .
#incl ude-c Los Lr-c am . h >
stru ct e l e me nt {i n t x , y ; ) ;
el ement. d[ 9]={{O, O}, {- 1, 2 }, {l ,2 }, 12, 1 }, {2, - 1 j, {1, -2}, {- 1, - 2}, {- 2 , -r l },
int D,k , ev ,us ,p [ lOOJ ,este=O;
typedef e Leme rrt st ivu [ l OO J;
.st i v a s t ;
void i ni t-t) {p [ k J = O;}
int succesor()
{if (p [k l<8 1
{p l k l vp j k ] 11; s t.j k ] . x +d [ p [ k J ] . x ;
.st j k ] . y ;' d [p [ k J ] . y ; return 1.; )
else return O; }
int va Li d L)
{if Ls t j kj v x c I II s t j k ] . y<l I I s t Lk ] .x>n II s r j k ] . y>n )
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 ()
{int i ; e s t e '<L :
for ( i = l ; i<=n""' n ; iH) cout cc s t Lt ] . :·:«", "« s t [ i ] . y«"
cout«endl; }
void bt ()
Lni t t j •
while ( k> i )
{a s =l; cv=O ;
while ( a s && l e v )
{e s e s uc ce s o r I ) ;
i f ( a s l ev=val id ( ) ; }
34
Te hnici de prog rama re
i f (.:i s )
i f (solutie ()) t i par () ;
else ( .: - T; initr) ; }
el se k- - ; } }
void main ( )
lint i ,j ; cout« " n= " ; c in» n ;
cout« " l i . , i a de : o r ni 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 ( ! e s ~ e ) cout« " Nu e xis t a solucii " ; }
Observatie. Daca se doreste numai afisarea primei solutii , cautarea solutie: se face
pana cand variabi la 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 wruLe (k>1 1 sevascrie whi l e ( k > l && ! estel ) .
Sa se genereze toate posibititatile de aranjare pe a tabla de sah, cu
dimensiunea nxn, a n cai care sa nu se atace i ntre ei.
1.3.3.10. Generarea uturor solutulor d iesire din labtru t
Sosi re
doua coordona e ale
10-10---1
~
INord
i -1, j
f
Vest Est
4--
L- .. ,...,..
...

I,J
i, j -1
I
i , j+1
t
3
i+1, i
Sud
Se cauta toate posibilitatile unui traseu printr-un labirint, intr e doua pozitii, initiala ~ i finala,
fara a se trece de doua ori prin aceeasi pozitie. Labirintul are dimeniunea nxm. Pozitia
initiala este data de X1 - numarul liniei - si Y1 - nurnarul 1Plecare
coloanei - care se cornunica de la tastatura. Pozitia finala ..
corespunzatoare iesirii din labirint este data de X2 - nurnarul
liniei - si Y2 - nurnarul coloanei - care vor fi determinate in
urma qasini traseului. Deplasarea in labirint se poate face
numai ortogonal (pe verticala si orizontala), nu ~ i pe oiaqonala.
Solutia problemei este data de rnultimea cu t elemente {X1 , X2,
... , Xu care se mernor eaza i n stiva. Nurnarul de elemente ale
solutiei depinde de solutia gasita. Elementul solutiei Xk repre-
zinta coordonatele i ~ i j ale patratului in care se deplaseaza a
persoana in labirint ~ i se mernoreaza pe nivelul k al stivei st .
Pentru a i nregistra traseul strabatut, elementele stivei vor fi de
tip i nregistrare cu doua carnpuri, x ~ i y, corespunzatoare celor
patratului, Stiva va avea dimensiunea t
corespunzatoare parcurgeri i i ntregului traseu,
de la patratul de plecare pana la patratul de
sosire, si va cont ine, i n ordine. coordonate le
tuturor patratelor de pe traseul de parcurgere:
s t [ 1 ] . x ~ i s t [ 1] . Y corespund patratului de
plecare, st[2]. x ~ i st[2].y corespund celui
de al doilea patrat in care se trece, ... ,
st [t ] . x si st [ t ] . Y corespund patratului de
sosire, prin care se iese din labirint.
Data fiind 0 pozitie curenta i ,j a traseul ui,
. a antele posibile pentru urrnatoarea pozitie
Su": orezentate alaturat.
35
Illr(1!:!!m!ic" ii ~
i+1, j
i, j+1
i+1, j
i , j-1
Coordonate
1
2
3
4
Varl anta
Se observa ca exista 4 variante posibile pentru continuarea drumului. Coordonatele
urrnatorului patrat de pe traseu in care poate sa treaca persoana, pentru fiecare dintre
cele 8 variante, sunt prezentate i n tabel.
in vectorul p . de dimensiune nxm, S8 pastreaza varianta
care s-a ales pentru continuarea drumului . Elementele sale
sunt de tip intreg. Elementul k din vector arata care dintre
cele 4 variante s-a ales pentru a ajung e de la pozitia k- 1 la
pozitia k Orice element k al vectorului trebu ie sa in de-
plineasca urrnatoarea conditi e: 1;; p [k) ;; 4.
Fiecare dintre cele 4 variante de deplasare din patratul k-1 i n patrat ul k insearnna
adauqarea unei constante de deplasare [a coordonata x, repsecti v y, a patr atului k- 1.
Aceste constante sunt memorate in vectorul d (pentru varianta 0, care nu exista,
deplasarea este 0):
etenent d [ 5 J~ {{0 , OJ. {- I, 0 J. {O, 1 J. II, 0 J. {0 , - 1 ) ) ;
l
Sud ; cale blocata:
a doua citra: a
Nord : cale blocata:
a patrl cifra: 0
Est :
--.... cate tioera;
a treia crrra: 1
Vest :
cale ribera: ......
prima citra: 1
Fiecare element al matricei L corespunde
unui patrat din labirint l?i rnernoreaza infer-
ma\ii despre rnlscarile care pot fi executate
in patrat. Fiecarui patrat i se atri buie un sir
de patru citre binare, care va fi construit
dupa urrnatoarele reguli:
~ prima citra: are valoarea 1, caca se
poate executa un pas spre Vest ;
~ a doua citra: are valoarea 1, dace. se
poate executa un pas spre Sud;
~ a treia cifra : are valoarea 1, daca se
poate executa un pas spre Est ;
-7 a patra citra : are valcarea 1, daca se poate executa un pas spre Nord .
Deoarece din patrat ul k-1 se poate trece in patratul k, qasit pe una dintre cele patru
directii de depla sare numai daca cere doua patrate cornuni ca (exlsta un culoar i ntre ere)
trebuie gasita 0 metoda de descriere a labirintului printr-o matrice L cu dimensiunea nxrn.
Vor fi prezentate doua metode de reprezentare a labir intului .
Varianta 1
Pentru patratul din exemplu este
prezenta ta alaturat valoarea ete-
mentului care i se asociaza in rna-
tricea L. Sirul de patru cilre binare
tormeaza un nurnar binar, care va fi
transformat intr-un nurnar zecimal.
Elementul matricei co res punzat or pa t ra tu lul
prima ~ J \ : ~ t r a afra
a doua cifra a treia citra
0011 1110 1010 1010 1010 1010 1100 0100 3 14 10 10 10 10 12 4
0100 0101 0010 1010 1010 1100 0111 1001 4 5 2 10 10 12 7 9
0101 0111 1010 1010 1100 0101 0011 1100 5 7 10 10 12 5 3 12
0111 1001 0010 1100 0101 0011 1110 1001 7 9 2 12 5 3 14 9
0111 1110 1000 0101 0111 1100 0011 1000
f---.
7 14 8 5 7 10 3 8
0111 1001 0010 1101 0111 1011 1010 1000 7 9 2 13 7 11 10 8
0011 1000 0010 1011 1011 1010 1010 1100 3 8 2 11 11 10 10 12
36 Tchnici de programarc
8 7 6 5 4 3 2 1
1 2
C""7
3
,,;;..
--
;;..+
4 5 6 7

8
I
9 i
I
10
Ie 11 12 13 14
1
2
3
4
5
6
7
Sol uti a
1,1 1,2 2,2 3,2 3,3
3,4 3,5 4,5 5,5 6,5
7,5 7,6 7,7 7,8
Subprogram el e
7 Subprogramul i ni t ( ) . Se initiatizeaza varianta
cu care se trece din patratul k-1 in patratul k, adica elementul k din vectonul p: p [ k] =0.
-7 Subprogramul suc c eso r () _Se consid era ca mai exists a posibilitate de continuare a
construirii solutiei pe nivel ul k daca mai exi sta 0 varianta de deplasare din patrat ul k-1
i n patratul k, adica daca p [ k ]<4. Daca mai exi sta 0 variants de deplasare, pe nivel ul
k di n suva, se trece la aceasta variants (p [ k ] =p [ k ] +l) se i nregistreaza ccordo-
natele patratul ui k, care se vor obtine prin adauqarea, la coordonateIe patratului k-1, a
deplasarilor corespunzatoare acestei var iante (et [k] t [k- 1 ] . x +d [p [k ] ] . x
st [ k ] . y =s t [ k - l ] . y +d [ p [ k ] ] .y).
-7 SUbprogramul valid ( ) . Se considera ca patratul k, i n care s-a ajuns , poate fi
considerat ca este bun, pentru a continua construi rea solutiei, numai daca exista culoar
de trecere i ntre patratul k-1 patratul k - pe directia de deplasare aleasa (daca i n
matricea L, i n elementul asociat patratului k-1, bitul corespunzator directiei de deplasare
are valoarea 1) - daca prin patratut k nu s-a mai trecut (se verifica daca in stiva. pe
niveluril e anterioare, nu rnai exi sta un patrat cu coordonatele patratutui k).
-7 Subprogramu l soLu t.i. e ( ) . Se verifica daca patrat ul in care s-a ajuns S8 afla i n afara
mat ricei (elementul asociat lui in matricea L are valoarea cu care a fast bordata
mat ricea: L [st[k] .K] [ st[k] .y]=16). Pentru a evita solutia prin care se iese din
labirint prin patratul prin care s-a intrat, in stiva trebuie sa existe eel putin doua elemente
(k>2). Deoarece ultimul patrat din stiva nu face parte din solutia problemei (este ca un
terminator al solutiei), coordonatele lui nu vor fi afi sate i n subpr cqrarnul t ipar ( ) .
-7 Subprogramul bt () . Deoarece coordonatele primului patrat nu trebuie modificate, primu-
lui element al solutiei (k=1) i se atribuie eoordonatele in subprogramul main () . iar i n sub-
program se va incepe cu inilializarea nivelului 2 din stiva (k=2); caut area tuturor solutiilor se
va face pima cand varful stivei coboara pana la primu! element al solutiei: wh ile (k>l ) .
Pentru a simpli!ica veri!icarea conditiei de iesire din labirint, matricea L este cordata cu 0
valoare pe car e nu 0 poate lua nici unul dintre elementele ei (de exemplu, valoarea 16).
Matncea L are 7 linii 8 coloan e.
Solutia obtinuta va afi sa coordonatele patratel or
prin care S8 trece:
Ui ncI ude < f s Lr e a m . h >
str uct e lement ( i n t :-: ,y; } ;
elemen t d [ 5 J {{O, 0 J , l -l ,O } , i 0 , 1 ) r 11 ,0) , 10 , -1 } J ;
int !l , lll,k,ev, as ,p[100] , e s t e =O, :./10J [IO} ;
typed ef e l ement stiva[ lDO] ;
sLiv a st ;
f s t ream f( " l abiri ntl . tzt " ,ios : : i n );
void i n i t () { p I k]
int suc c esor{}
( i f I p[ k J < 4) . x e d Lp l kl l . >: ;
. y +d [ p [ k ] ] . y ; r e tur n 1; )
Inform atic a
37
& 1 ) r e t u r n 1 ; break; I ispre N
& 2) return 1 i break; Ii s pre E
& 4 ) return 1 ; break; / / s p r e S
& 8) return 1 ; } I i spre V
else return O; }
int vali d ( )
tint xe s t jk-r l ] . x, y =s t l k- 1 J . y ;
for (i n t i=l ; i<k ; i ++ )
if I s t[k] && st[k] . y ) return 0 ;
switch { p l k ] )
{case 1 : if IL[ x} [y}
case 2 : if IL [x ) [y}
case 3 : if (L[x ] [y}
case -l : if { L j x l j y ]
return 0 ; }
int s o Lu t i.c I') {return k>2 && Lj s t I k ] . x } [ st [k ]
void tipar ()
{i n t i; e s .te -eL:
for (i=l ;i<k;i ++J cout« s t [ i ] .x« ", "« st [i ] . y«" " .
c out «endl; }
voi d bt() { / l p a r t c iJ fixE! a a l cor Ltmu l u i. co in e xempLu L a n t e r i o rI
voi d ma in ()
ti n t i ,j; f» n»lH;
f or (i;;; l ;i<=n ; i+-::")
f or f » L [ i l f j] ;
ccu t.c-cv In t ra rce in .Lab.i rLn t : "<cendl :
c out.x-c ".»> " ; c Lrc-oi • s t [ L] .z=l ; cout c cvy> " ; cin» j; st j L] . y:=:j ;
f o r (i =1;i<=n ;i++) {L [i ] [ OJ=1 6; L [i ] [m+l ]=1 6 ; }
for ( L [ O) L [n+l )
bt {) ; if ( ! c c t c ) oou t c -C'Nu existasolut ii " ; }
Varianta 2
Fiecare element al matricei L corespunde unei pozitii din labirint
tli , j) { 1, se poate treee prin pozitiaO,j} :-este euloar
. 0, daea nu se poat e treee pnn pozitia (i.j) - este zi d)
Matricea L are 15 llnii si 17 coloane. Punctul de intrare In labirint 58 qaseste pe Ji nia 1 $i
i n coloana 2
H +-1--1 -1-1- 1-1-++-1 I I I-++--
-- . . , ."., ' , ," - .. '- ' T'·.. 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
r-',--, ...."' 1- ,.. 'hHI+t "b"b'H
o 1 0 1 0 1 1 1 1 1 1 101 0 00
I-·.. -I"· - k,'..,.. ,.. _.... I' " "" 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0
J 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 10
•__cl- .... I 0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0
I' 011101110 10 11111 0
1+ "- 1'_ .. f- f- - h ' -r- - "" "" 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0
..!J 0 1 0 1 1 0 1 1 1 1 0
0 11000010 1 10 0000 0
f- - 011 01 1 11 01111 1 1 1 0
1--' -I .. '-' 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0
01 10 111111 1 1111 1 0
0 0000 0 0 0 0 0 0 00 0 01 0
38 Tehnici de programare
" .
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0
0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0
0 1 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0
0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0
0 1 1 1 1
- .__.
0 1 1 1 0 1 1 1 0 1 1 0
0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0
0 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0
0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0
o 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 0
ll- 1
1 0 0 0 0 1 0 1 1 0 0 0 0 0 0
o 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0
o 1 0 0 0 0 0 1 0 1 0 0 0 0 0

o 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0
o 0 0 0 0 0 0 0 0 o 0 0 0 0 0 1 0
3,4
6,6
7,10
11,11
14, 11
14,16
2,4
6,5
6, 10
10,11
14 ,10
14 ,15
2,2
5,4
6, 8
9,10
12,10
14,13
1,2
4,4
6,7
8, 10
12,11
14,12
15 ,16
Solutia obti nuta va afisa coo rdonatele punctelor prin care se trece:
So lutia
2, 3
6,4
6,9
10,10
13,10
14,14
SUbprograme le (sunt prezentate numai
rnodiflcarile de varianta antericara) :
-7 Subp rogramul valid() . Se consi ders ca
pozitia k, in care s-a ajuns. poate fi consi-
derata ca este buna, pentru a continua
constr uirea solutiei, numai daca ea este culoar de trecere (L [s t [k] . x ] [s t [k] . y]
si daca prin pozitia k nu s-a mai trecut (S8 verifica daca in st iva, pe nive lurile anterioare,
nu mai exista 0 pozitie cu coordonatele pozitiei k).
-7 Subp rogramul sol u t i.e ( ) . Se verifica daca pozitia i n care s-a ajuns nu S8 afla la i8$ i-
rea din labirint, adica S8 gase:;;te pe marginea matricei (s t; [k ] . x==l sau
st[k] .x= = n sau s t[k] .y==1 sau st[k] .y==m) .
#i nc l u de<f s t r e a m. h >
str uct element {i n t x ,y; };
e 1 ement d [ 5 I ( ( 0 , 0 ) , ( -1 , 0) r ( 0 , 1 ) , {1 , 0 } , {O, - 1 } };
i n t fl ,m,k,ev , as , p [l OOl ,cste=O,1 [l O] l-l OJ;
typedef e leme nt stiva [l OO ] ;
s t ivi'i st: ;
fstream f ( " 1abi r int l .txt " ,ios : : i n );
void ini t ( 1
int s u cce s o r ()
{i f ( p[ k l <41 {p l kl e-p j kl t -L r s t j k ] . x +d [p l k l ] . x;
s t j k] . y+ d l p [ k l I . y; return 1; J
else return O; }
int valid ()
{if (LIs t [ k] . x ] l s c l k l return 0;
for (int i =l ;i<k;i++ )
if (st[k] .x"' =st" [ i] . x && s t[k] .y==st (il .y) return 0 ;
return I ; }
int s ol u t Le I )
{return s t j k ] I I s t[k ] I t st [ k ] II s t j k ]
void tipar ( )
{for (i n t i=l ,este=l ;i <=k ;i++) cout« s t [ i ]. x«","« s t [ i ] . y«"
cout«endl; }
void bt() { / / p a r t e a f i x E! a algoritmului ca i n exemplul anterior }
void mai n ( )
{int i, j; C»n» m;
for
for f »L[i ] [ j ] ;
Informat icii 39
c cue-ccv r nt rcr e c in Lab.i r i. n t : "«endl;
oou t-c-c" >;« ",' cin» i; .':ltfl ] .x=i ; cout-cc vy-. " ; cin» j; s t r j j . y=j ;
bt() ; if t I es t ej cout«" Nu e x is ta s o.l u t ii " ; )
Observatie, Alqoritrnul folosit pentru generarea tuturor traseelor de iesire dintr-un labirint poate
fi folosit in orice problema de gasire a unui traseu pe a supratata imparjita in patrate pentru
care exista restrictii de deplasare de la un patrat la altul,
------- ".-..... 1. Problema bilei . Un teren este l rnpartit i n mai multe zone, fiecare
zona avand 0 lnattirne h. Pent ru simplificare, vom considera fiecare
zona ca fiind un patrat cu aceeasi dimensiune. Terenul poate fi
reprezentat sub forma unei matrice cu n linii m coloane, fiecare element al matricei
reprezentand ina1timea unei zone de teren. 0 bila S8 gase!?te intr-a zona cu coordo-
natele x (nurnarul liniei) si y (nurnarul coloanei). Ea se poate rostogoli numai catre a
zona care are i nfHtimea mai mica decal cea a zonei in care S8 gase!?te. Sa S8 genereze
toate posibilitatile de rostogolire a bilei - pana la marginea terenului. lndi cat i e. Construi-
rea solutiei traseului are urrnatoarele caracteristici:
0 soiut ie este fermat a din coordonatele zonelor prin care se rostoqoteste bila.
7 Fiecare solutie are un numar variabil de elemente. Primul element al solutiei contine
coordonatele zonei de plecare a bilei, iar ultimul element al solutiei contine coordo-
natele unei zone de la marginea terenului.
Bila se poate rostogoli in 8 directii (corespunzatoare celor 8 patrate adiacente patra-
tului i n care se fiecare directie de deplasare corespunzand unei canstante
de deplasare care se adauq a la coordonata x, respe ctiv v- a patratul ui i n care se
bila.
7 Condi tia de cont inua re a construirii soluliei este ca patratul i n care a ajuns bila sa
aiba lnaltimea mai mica cecat a patratului anterior.
2. Problema capcanelor . Un teren este lrnparttt i n mai multe zone. Pentru simplificare
vom considera fiecare zona ca fiind un patrat cu aceeasi dimensiune. Terenul poate fi
reprezentat sub forma unei matrice cu n linii m coloane, fiecare element al matrjcei
reprezentand un patrat de teren. Anumite patrate contin diverse capcan e ascunse. 0
persoana se in patratul cu coordonatele X1 (nurnarul liniei) y, (nurnarul
coloanei) trebuie sa ajunqa i n patratul cu coordonatele xz yz deplasandu-se orto-
gonal si fara sa calce i n patratele cu capcane. Datele se citesc dintr-un fisier text, astfel:
de pe primul rand, n, rn si coordonatele patratului de pornire al e patratului destinatie,
iar de pe urmatoarele randuri - perechile de coordonate ale patratetor cu capcan e. Sa
se qaseasca traseele pe care trebuie sa Ie urmeze persoana respective. lnd icat le.
Construirea solutiei traseului are urrnatoarele caracteristici:
7 0 solutie este fermata din coordonatele zonelor prin care trece persoana.
Fiecare solutie are un nurnar variabil de element e. Primul element al solutiei contine
coordonateIe patratului din care pleaca persoana, iar ultimul element al solutiei
contine coordonatele patratului i n care trebuie sa ajunqa,
Persoana se poate deplasa in 4 directii (corespunzatoare celor 4 patrate aftate pe
diagonala patratului in care se qaseste), fiecare directie de deplasare corespunzand
unei constante de depl asare care se adauqa [a coordonata X, respectiv YI a
patratului in care se persoana.
Condit ia de continuare a construirii solutiei este ca patratul in care a ajuns per-
soana sa nu cantina capcane.
40
Tehnici dc programarc
1.4. Metoda "Divide et Impera"
1.4.I. Dcscricrca mctodci .Divide et Impcra"
Metoda divide et impera se paate folosi pentru prablemele care pot Ii descompuse in
subprobleme similare cu problema ini\ial;; (care se rezolva prin aceeasi metoda) care
pretucreaza rnultirni de date de dimensiuni mai rnici, independente uncl e de altele (care
folosesc multimi de date de i nt rare disjuncte).
[ Sm.dJJiu de caz I
Seop: identificarea probleme lor care pot fidescompuse i n subprobleme simil are care
folo sesc rnultimi de date de intrare disjuncte.
Enuntul probl cmei 1: Sa se caJculeze suma elemente/o r dintr-un vect or v cafe cotuine
numere intregi.
Multimea datelor de intrare 0 reprezinta cel e n elemente ale vectorului v. Ele pot fi divizate
i n cate doua submultimi disjuncte, prin divizarea multi mii indicilor i n doua subrnuttimi,
Mul\imea iniliala a indicilar este determinata de primul indice (s) de ultimul indice (d) , iar
intervalul indicilo r care S8 divizeaza este [s,d]. EI se divizeaza in doua subrnult irni disjuncte,
[s,m] [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 constanc i n calcularea
surnei numer elor dintr-o subrnultime de elernente (care corespunde unui subinterval al
indicilor). Descompunere a continua pana cane fiecare subrnultime cont ine un singur
element - se poate calcula suma, obtinandu-se solutia subproblemei .
Enuntut probl emei 2: Sa se cetcotoze suma 1x2+2 x3+ ... +nx(n+1).
Multirnea datelor de intrare a reprezi nta primele n numer e naturale. inifiala este
determmata de primul numar (s=1) de ultirnul nurnar (d=n), iar intervalul care se divi-
zeaza este [s,d] . EI se divizeaza i n doua submultimi di sjunct e, [s ,m] [m+1 ,d] , unde m
este nurnarul din mijlacul intervalului: m=(s+d)/2. Astle l, problema initiala esle descornpusa
i n doua subprobleme, fiecare dintre ele constand in calcularea sumei produselor dintre
doua numere consecutive dintr-o subrnultime de elemente (care corespunde unui subinter-
val al numerelor). Descompunerea continua pana cand fiecare subrnuttime contine un
singur element - se poate calcula produsul , care se va adauqa la surna, pentru a obtine
solutia subproblemei.
Enuntul probl emei 3: Sa 58 genereze termenuf n al suului lui Fib onacci.
Sirul lui Fibonacci este definit recursiv: 1,=1, 12=1 I
n
= I
n
-2+ I
n
.1, pent ru n;,3. Problema
determinarii termenului n al sirului lui Fibonacci se poate descompu ne Tn doua subpro-
bleme : determinarea termenului n-1 si determinarea termenului n-2. Descompu- *.
nerea continua pana cand trebuie deterrninati termenii f1 si Iz. a carer valoare
cunoscuta.
Metoda Divide et impera se bazeaz a pe descompunerea unci probleme i n
subprobleme sirnilare, prin intennediul unui pr oces recursiv. Procesul recursi v de
descompunere a unei subprobl eme i n alte subproblcme co ntinua pana se obtine
o subprobl ema cu rezol varea irnediata (caz ul de baza), dupa care se com pun
solutiile subprobl emel or pana so obtine solutia pro blemoi initi ale.
III Iorill ati ciI 41
Pasii algoritmului sunt :
PAS1 . Se des compune problema in subprobleme similare problemei initiale, de dirnen-
siuni mai rnici, independente unele de altere (care folosese multimi de date de
intrare disjuncts - d.).
. PAS2. Dac a subproblema permite rezolvarea irnediata (corespunde cazului de baza),
atunci S8 rezolva obt inandu-se solutia s: altfe l , S8 revineIa Pas 1.
PAS3 . Se cornbina solutiile subproblemelor in care a fost descornpusa (5,) 0 subproble-
rna, pana cand S8 obtine solutia probleme i initiate.
1.4.2. Implementarca metodei Divide et lmpera
Deoarece subproblernele i n care S8 descompune problema sunt sirnilare cu problema initi-
ala , algor itmul divi de et imper a poate fi implementat recursiv. Subprogramul recu rsiv
divide_et_im pera( d,s), unde d reprezinta dimensiunea subproblemei (cores punde multirnii
datelor de intrare), iar 5 soluti a subproblemei, poate fi descris in pseudocod astfel:
divide_et_impera(d, s)
i nc e p u t
daca d i.me ns iunea drco r capuridc UfL.:.i.C£:l Z d e t. a aa
atunci s e S a
altfel
pentru i=l , r. execu ta
c e det e r m.ina d imens i unec d i a s uopzob Leme L p.;...i ;
s oLut i. a i:l aubpr-obLeruc i p.ri.n
ape Lu I (d_ i , s _ i ) ;
s t ar s i.
s e c omb i na s o Lu tLj. Le 5_ 1 , 5_2, 5_3 , . . , 3_ n;

s f ar-s i. t;
Imptomentaroa acestui algoritm in limbajul C++ se face astf el:
/ 7dcclarar;-.ij c;lobaJe pent r u dat e Ie de i nt r a r evcc vor- fj d ivi ze t.e vi n sub-
mu . Lt.dm.i oisj un c t e pent r u ts ubprobLemcLe In care se descornpune prcbl cme v Z
vo id di vizeaza {cp e r-ame t.r-L : s ubmul t.i.m.i Le> -s.
{/ / .s>2 d1.\r1::ea7.0 mul timca eke' date de dn t ra re i n sucmuLtimi di s jpncte d_ i}
solutllle 5_1 care s e comblna? )
{ '/
38
comb i na cbt .inut;e S_l.}
void dei « pa r a me t r i : multimea de date d $i 501uti a s> l
de vari abi le
i f (c os te ca z de be za> {,lI s e obt i ne so lut.La cor.espunaaroare eubprob.lcmei I
e lse
{d ivizeaza «parametri: k submultimi » ;
for ( 1. =1 ; .i e-k: i-II)
dei «parametri: multimea d e date d_i $i s olutia s_i»;
combina «parametri : soluti i 1e s_i>l ;} }
voi d mai n ()
( j l de c l a r a t i i de variabil c lQcsle
/Isco c i t c s c dat.cLc d e i.nt r e re ale pr-ob l eme i. - mul timea d
dei « pa r ame t r i : multimea de date d $i soluti a s » ;
lise a f.i$ea::5 s ol ut i.e p robl eme i - s }
42
Tchnici de programarc
Exemplul 1. Sa 5 8 calculeze suma clementelor pare dintr-un vector v care contine nurne-
re intregi. Nurnarul de elemente ale vectorului (n) 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 Id=3 s=41 20 I 25 Id=5
m-(1+3)/2-2 m-(4+5)/2- 4
z123= z12+ z45= z4+ z5=20+0=20
..------"" z3=10+0=10, »
1 2 3 4 5
s=1 1 5 1 10 Id=2 1 15 1 1 20 I 25
m=(1+2)/2- 1 s=d=3 s-d=4 s=d-5
z12= z1+ z2=0+10=10 z3=0 z4=20 z5=0
»
1 2
s=d=11 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 subrnultirni disjuncte, prin
divizarea multimii indicilor in doua submultirni disjuncte de indici, adica rnult imea indicilor
[s,d] (unde 5 este primul indice, jar d ultimul indice) este divizata in coua submultirni 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
Subproqramul combina ( ) - Combinar ea solutiei insearnna adunarea celar doua sume
obtinute prin rezolvarea celor ooua subproblerne. in subprogram sunt combinate cele
doua valori obtinute din prelucrarea celor doua intervale, adica S8 aduna cele doua
valori x si y , obtinandu-se solutia z.
-7 Subprogramul dei ( )- 0 subproblerna corespunde cazului de baza atunci cane sub-
multi mea contine un singur element (se peate calcula suma, oblinandu-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, corespunzatoare solutiei , astfel: oaca numarul v [s] este par,
atunci suma va fi chiar nurnarul: altfel, are valoarea 0); altfel, se apeleaza subproramul
pentru divizarea intervalului, se apeleaza subprogramul dei () pentru primul interval, se
apel eaza subprogramul dei () pentru al doilea interval se combina cele doua rezultale.
#include <l o s t r e am. h >
int v[lOO] ,n;
void divizeaza { i nt s , i nt d , i nt &m) {m= ( s +d l / 2 ;}
void combina ( i nt x , i nt Y, i nt &z )
v o i d dei ( i nt s , i nt d, i nt &z )
tint m,xl ,x2;
if I d==s)
I nfor ma tica
43
i f (v[s ]%2 :; =;:O) zev l s l , e lse z.:;;.O ;
else
{d i v i ze a za ( s, d, m) ; de i(s, m,xl); ;dei (m+l ,d, x2); cOmbina (xl , K2, z ) ;} }
void ma i n()
{i n t i,z ; cout c cvne ";cin»n;
for {i =l ; i <=n; i ++ ) ( c out. 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 uma = "<:<z; }
5
s=d=5
z5=5x6=30
5 4 2
1
1
s=l l I 1 1 1 1
m=(1+5)/2=3
z=z12345= z123+ z45=20+50=70
/" "-
s=11-----;---'- 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 I ~ r--'--::-----,
m=(l +2)/2= 1 s=d=3 s=d=4
z12= zl+ z2=2+6=8 z3=3x4=12 z4=4x5=20
;t ~
s=d=l l 1 1 1 - - - ~ 2 - - - l s = d = 2
zl -1 x2-2 z2-2x3- 6
Implementarea metodei divide et impera i n acest exemp!u S8 face astfel:
-7 Subprogramul divizeaza() - Nurnarul de subprobleme in care S8 descompune pro-
blema este 2 (k=2). Mul\imea datelor de intrare este divizata in doua subrnultirni disjune-
te, prin divizarea rnultimii primelor n nume re naturale in dOU3 subrnultirni disjuncte, adi-
ca multirnea [s.d] (unde s este primul numar din multime, iar d ultimul nurnar din
rnuttirne) este divizata i n doua subrnultirni disj uncte, [s,m] si [m+1 ,d] , unde rn este nu-
marul din mijlocul intervalul ui: me (s+d) /2. in subprogram , procesul de divizare consta
i n determinarea mijlocului intervalului, In.
~ Subprogramul combina ( ) - Combinarea solutiei lnseamna adunarea celor doua sume
obtinute prin rezolvarea celor doua subprobleme. i n SUbprogram sunt combinate 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 cazulul de baza atune; cane sub-
muttirnea contine un singur element (se poate calcula termenul sumei - produsul celor
doua numere consecutive - obtinandu-se solut.a subproblemei). Daca s-a termi nat
procesul recursiv (prin procesul de divizare, cele cou a capete ale intervalului au ajuns
sa fie ident ice), atunci se prelucreaza cazul de baza (se calculeaza produsul i n variabila
z, corespunzatoare solutiei): altfel , se apeleaza subprogramul pentru diviza rea inter-
valului, se apeleaza subprogramul d ei () pentru primul interval, se apeleaza subpro-
gramul de i () pentru al doilea interval si se cornbina cele doua rezultate.
#ioclude <i o s t r e am . h >
i n t n ;
vo i d divi zeaza {i n t s, i n t d, i n t &m} {m= ( s +d ) / 2 ; }
void combina (int X, int y , i n t &z) {z e xtyr )
44 Tchnici de pr ogramarc
0 6 C - -j
z=5+3=8 / 1(3)
----..... LJillJ z=1+1=2
z=2+1=3 '-",. I 2 =1
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 " cc Lno xn : dei (1 , n ,z ) ; c out « " s uma e ve c a : }
Exemplul 3: Sa se calculeze termenul n al sl rului lui Fibonacci.
f 2 =1
/ 1 1(3) 1/
__ / z=1+1=2 '-",. O ULJ =1
\ 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
D GLJ=l
Implementarea metodei di vide at impera i n acest exemplu 58 face astfel:
-7 Subprogramul divizeaza () - Nurnarul de subprobleme in care S8 descompune
problema este 2 (k=2): determinarea termenu lui n-l determinarea termenu lui n- 2.
Descompunerea S8 face implicit , prin paramet rul cu care S8 apeleaza subprogramul
dei ( ) , si subprogramul de divizare nu mal este necesar .
-7 Subprogramul combina () - Combinare a solutiei inseamna adunarea celor doi termeni
ai sirutui (x l x2 ). obtinandu-se solutia z.
-7 Subprogramul dei ( ) - 0 subproblema corespunde cazul ui de baza atune; cand s-a ajuns
la un termen direct calculabil. Daca s-a terminat procesul recursiv (prin procesul de divizare
s-a ajuns la termenul 11 sau (2), atunci se prelucreaza cazul de baza: altfel , se apeleaza
subprogramul dei () pentru primul termen al descompunerii, se apeleaza subprogramul
dei ( ) pentru al doilea termen at descompunerii se cornbina cele doua rezultate.
# i nc l ude<ios t r e um. h >
i n t n;
void combi na ( i n t x l , i nt &7. ) {z=x l +x2 ; }
void dei i i n t n, i n t &z )
{int :-:::, x2 ;
if (,,==1 II n==2i z=l;
else {d e i (n - l , x l ) ; dei {n - 2 , x 2 ) ; combina (xl , x 2 , z ) ; } }
void main ( )
{int Z ; couti c cvne " ; c Ln c >n : d e i ( n, z ) ; couuc c z r }

i n acest exemplu, problema a l ost descornpusa in probl eme care nu
Atcntie sunt independente unele de allele 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 probl ema nu se recomandii metoda divide et impera deoarece
nu este eficlenta
Informaticii
45
Exemplul 4: Sa S8 determi ne simultan valoarea minima 9i valoarea maxima dintr -un
vector v care contine nume re intregi . Nurnarul de elemente ale vectorului (n) elementel e
lui se citesc de la tastatura.
l mplementarea metodei di vi de et i mpera i n acest exemplu S8 face astfe l:
Subprogramul divizeaza ()- Nurnarul de subprobleme in care S8 descompune pro-
blema este 2 (k=2). Divizarea rnultimii datelor de intrare se face la fel ca la exemplul
pentru calcularea sumei elementelor unui vector ;;i subprogramele sunt identice.
-7 Subprogramul combina ( )- Combinarea solutiei l nsearnna determinarea minimului [ zL)
a maximulu i (zz} dintre cele doua valori minime (x l y l ), respectiv maxime (x2 si y2 ),
obtinute prin rezolvarea celor doua subprobleme. in subproqram sunt ·combinate cele
doua perechi de valor i obtinute din cele doua intervale . Daca x1>y1, atunci minimu l (z r.)
este y L, altfel , este x l. Daca x2>y 2, at unci 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 minimul maximul; atat minimul
cat maximul vor avea valoarea elementului) . Daca s-a terminat procesul recursiv (prin
procesul de divizare cele doua capete ale intervalului au ajuns sa fie identice) , atunci se
prelucreaza cazul de baza (se calculeaza minimul maximul In variabileJe z l si z 2
corespunzatoare solut iel): altfel , se apeleaza subproqrarnul pentru divizarea interva-
lului, se apeleaza subproqrarnul d e i () pentru primul interval, se apeleaza subpro-
gramuJdei () pentru al doi lea interval si se cornbina cele 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 ceaa 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 >yl ) z1c:;yl ; el s e z l =x l ;
if (x2>y2) z2;::x2 ; el s e z2 =y2 ; }
voi d dei Ci nt s , i nt 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 Zv-v l.sl :
e lse {d.i.vLae aze ts , a ,m);
Ilxl - mini m, x2 - max im
d ei (ml-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 ) ; } }
void ma i n C)
{int c ou 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 out « ":ni n i mu l =" «zl « e nd l «"maximul = "« z2« e ndl ; }
Exemplul 5: Sa se calculeze suma a doua polinoame. Gradele celo r doua polinoame, n
m, si coeficientii celor doua polinoame se citesc de la tastatura. Coeficientii celor doua
polinoame se mernoreaza In vectorii p si q, iar coeficientii polinomului surna se memoreaza
In vectorul r.
l mplementarea metodei divide at im pera In acest exemplu se face astfel:
-7 Subprogramul divizeaza ()- Nurna rul de subproblems i n care se cescornpune pro-
blema este 2 (k=2). Deoarece exist a doua mul tirni de date de intrare (vectorii P q care
mernoreaza coeficientii celor doua polincarne), se va lua ca reper mul tirnea cu cele mai
mul te elemente. Multirnea datelor de intrare este divizata In doua subrnultimi disjuncte,
46
Tc hnici de programa rc
prin divizarea rnultimii indicilor in doua submultimi disjuncte de indici, adica rnultimea
indicilor [s,d) (unde s este primul indice, iar d este ultimul indice - d=maxi m( n,m) +1)
este divizata in doua subrnultirni disjuncte [s,mij l) si [mijl+1 ,d) , unde mijl este indicele
din rnijlocul intervalul ui: mi jl= ( s+d) / 2. Procesul de divizare este identic cu eel de la
exemplele anterioare.
-7 SUbprogramul cornbina ( ) - Deoarece i n cazut de baza S8 determina unul dintre coe-
ficientii polinomului surna care S8 scrie direct in vectorul r , acest subpro gram nu mai
este necesar.
-7 Subprogramul dei () - 0 subproblemacorespunde cazului de baza atunci cand submul-
\imea contine un singur element (se poate calcula coeficientul polinomulu i surna). Oaca
s-a terminat procesul recursiv (prin procesul de divizare, cete doua capete ale intervalului
au ajuns safie identice), at unci 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; altfel , 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
polinomului p); allfel , se apelea za subprogramul pentru divizarea intervalului, se apelea-
za subprogramul dei ( ) pentru primul interval 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 x, i n t yl {if ( x>y ) r eturn X; e lse r e t u r n y; }
iot x, i o t y ) {if (x >y) r e turo y; el s e r e t u r n x; }
void divize a za {i n t d , i nt &mi j l ) {mi j l = ( s +d } / 2 ; }
voi d dei ( i nt s, i nt d)
{int mi j l ;
i f (d , =s)
i f (d<=mi n im(n,m))
e l s e if (Il<m) r l d l=q ld J ;
e lse r l dl e p Ldl :
else {d i v i ze a za ( s , d , mi j l }; de i {s , mi j l l ; dei (mijl+l,d); } }
voi d mai n ( )
{iot i ; cout« "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 vc c L-Lc c "}» " . cin» p [ i ] ; }
for 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. rnI ni m) I-I } ;

if rr l i l ' =0 1
{i f (r[iJ ! = l) t couuc c r Lil : if (i l=l) cou t.c c vvvr j
if ( i>2 ) c ou t.c cvxr vc c i c l : e l s e if ( i ==2) oou c c cvxv,
i f (i !=l} c out;-cc " t " ; } }
1. Programul urrnator afi seaza. In ordine inversa. elementel e unui
vector. Explicati cum a fost folosita metoda di vi de et impera pentru a
rezolva problema .
#ioclude<i c s t r e am. h >
int v[-:OO],n ;
void d i v i ze aza( i nt 5 . i n t d, i nt &m)
( m= ( s+d ) / 2 ;)
Informatica
47
v o i d d ei( i n t s , i n t d)
l i n t m;
i f ( d==s) cout.c c v l s l c c " ";
e lse ( d i v i ze a z a ( s , d , m) ; dei(m+l,d); d eils/ill) I }}
voi d mai n()
lint i ; cout « "n= ";ci n»n;
f or ( i =l ; i <=n ; i ++) ( c out « "a ( " « i « " ) = cin» v [ i ] ;}
de i ( l , n ) ; )
2. Deterrninati ce calculeaza programul urrnator. Explicati cum a lost folos ita metoda
divide et impera pentru a rezolva problema
#i nc l u d e<i o s Lr e am. h >
Lnt; n :
vo id d i v i. z e.a z a I Lrrt; s , i n t d, i o t &In) {m= ( s +d ) / 2 ;}
voi d combi n a {i n t x , i n t y, i n t &z ) {z=x +Y;}
void dei (int s , i n t d , i n t & 2 )
l i nt m, xl , x2 ;
if (d=:;::s) (if ( s %2==O) z =-5* 5; e 1 5e 2= s * 5; }
el s e
( d i v i ze a z a (s , d , m) ; dei {s ,m, xl) ; d ei(m+l,d, x2) ; combi na( x l , x2 , z ) ; } }
void main ( )
lint :0::: ; dei ( l , 2 0 , z ) ; c out c c vu uma :;:: " c c a i }
Scriet i urmatoarele programe, in care Iolositi metoda divide et impera.
Valorile pentru datele de intrare se citesc de la tastatura,
1. Sa se calculeze nl .
2. Sa se calculeze simultan produsul si suma a n numere memorate intr-un vector.
3. Sa se calculeze suma 1+1x2+1x2x3+...+1x2x3x...xn.
4. Sa se numere elementele pare dintr-un vector.
5. Sa se verifice daca un vector coniine numai numere pozitive sau numai numere negative.
6. Sa se calculeze c.m.m.d.c. a n numere memorate intr-un vector.
7. Sa se determine nurnarul de aparitii ale unei valori x intr-un vector.
8. Sa se calculeze valoarea unui pol inom PIx) intr-un punct x preciza t.
9. lntr-o matrice cu n linii si m coloane, sa 58 interschimbe coloana p cu coloana q.
10.i ntr-o matrice patrata cu dimensiunea n sa se interschimbe linia p cu coloana q.
t t .Intr-o matrice patrata cu dimensiunea n sa se interschimbe diagonala principala cu
diagonala secundara.
12. Sa S8 determine simultan valoarea minima ~ i valoarea maxima, dintr-o matrice cu n linii
~ i m coloane.
Complexitatea algoritmului divide et impera
Metoda divide et impcra se bazeaza pe rezolvarea recursiva a subprobl emelor in care
este divizata problema initiala.
Atunci cand un algoritm contine un apel recursiv, timpul sau de execute este dat de 0 formula
recursive care calculeaza timpul de executie al algoritmului pentru 0 dimensiune n a datelor
de intrare, cu ajutorul timpilor de executie pentru dimensiuni mai rnici Timpul de executie al
unui algoritm care foloseste metoda divide et impera se bazeaza pe calculul tirnpilor de exe-
cuue ai celor.trei etape de rezolvare a problemei. Daca:
48
Teh nici de
-7 problema initiata S8 divizeaza in a subprobleme , pentru care dimensiunea datelor de
intrare reprezinta 1/b din dimensiunea problemei initiale:
-7 timpul de executie a problemei initiale este T(n);
-7 timpul necesar pentnu a divide problema in subprobleme este D(n);
-7 timpul necesar pentru combi narea solutitlor subproblemelor, pentru a obtine solutia
problemei, este C(n) ;
-7 timpul necesar pentru rezolvarea cazului 0(1) pentru cazul de baza
de baza este 0 (1); T(n) =
atunci se obtine functia pentru timpul de exe- axT(n/b)+D(n)+C(n) in caz contrar
cutie care este prezentata alaturat.
De exemplu, pentru a calcula suma elementelor unui vector cu n elernente, problema S8
descompune in doua subprobleme (a=2) l?i dimensiunea dateJor de intrare pentru 0 subpro-
olema reprezinta jurnatate din dimensiunea datelor initiate (b=2) . Pentru divizarea problernei
in subprobleme, se calculeaza mijlocul intervalului de indici 0 (D(n))=0(1)) . Pentnu combi-
narea celor doua solu\li ale fiecarei subproblerne, se aduna cele doua valori, 0(C(n))=0(1) .
Considerarn ca n=2
k
. Rezulta ca:
= 2x(T(2
k
-
1)+22
x0(1) =
2x(2xTl2 - \+2x0(1))+2
2
x0(1 )=2
2
xT(2 - )+2
3
x0 (1) = ... =
kO 1<+1 k k+1 k
2 xT(2 )+2 x0 (1) = 2 x0 (1)+2 x0 (1) = 2 x3 = nx3.
Ordi nul de complexitate al algoritmului este O(n). Al goritmul iterativ pent ru rezolv area
acestei probleme are ordi nul de complexitate O(n) .
Observatie. Pentru acest gen de probleme. metoda iterativa este mai eficienta. Rezolvarea
acestui tip de probleme cu ajutorul metodei divide et impera a avut numai un rol scol astic,
pentnu Inteleqerea metodei a irnplernentarii ei.
Metoda divide et impera sa recomanda in urmatoarele cazuri:
-7 algoritmul obtinut este mai efi cienl dedit algoritmul clasic (iterativ) - de exemplu, algo-
ritrnul de cautare intr-un vector sortat si algoritmii pentru sortarea unui vector;
7 rezolvarea problemei prin divizarea ei in subprobleme este mai sirnpt a decat rezol-
varea ciasica (iterativa) - de exemplu, problema turnurilor din Hanoi generarea unor
modele Iractale.
1.4.3. Cautarea binara
Sa se caute, l ntr-un sir de numere intregi ordonate strict crescator (sau varianta strict des-
crescator), pozitia in care se in sir 0 valoare x citita de la tastatura. Daca valoarea
nu se in sir , sa S8 afiseze un mesaj de informare.
Aigoritmul de cautare secventiala intr-un vector are ordinul de complexitate O(n) . Pornind
de la faptul ca vectorul este un vector particular (este ordonat strict crescator sau strict
descrescator ), se poate folosi metoda divide et impera. Pentru un vector ordonat strict
crescator. pasii al gor itmului sunt:
PAS1. Se divizeaza vectonul v in doi subvectori, prin divizarea rnullimii indicilor [s,d] (unde
5 este indicele primului element iar d indiceIe ultimului element) in doua subrnultirni
disjuncte, [s,m] [m+1,d] , unde m este indicele din mijlocul intervalului: m=(s+d) /2.
PAS2. Dad elementul situat pe pozitia din mijloc (v[m] ) are valoarea x, alunci proble-
ma este rezol vata ;;i pozitia este rn: altfel , daca elementul din mijlocul vectorului
este ma i mic decat valoarea x, atunci cautarea se face printre elementele cu
indicii in muttimea [s,m]; altfel, cautarea se face printre elementele cu indicii din
III form at ira
49
rnultirnea [m+1 ,d] . Pasul 2 se executa pana cane se elementul sau pana
cand vectorul nu rnai poate f i i rnpartit i n subvector i.
#include<i o s t z- ezim. h >
int v[lOOl , n ,x;
v oid d i v i aea z a t Lnt; st i n t d , i n t s m) {m= ( s +d ) / 2;}
void cauta {i n t s , i n t d , i n t &z )
tint m:
if (d>s) {d ivizeaza(s,d,m) ;
if Iv[ml ==xl z=m;
el s e if {xc-v Iml ) c a uta (m+l, d , z l :
else ccu e e t s .m. z) ; } }
v oid main{ }
t i nt i,z==O ; CQut « " n ::: "; c i n »n; cout « "x::: " ; c i n » x ;
for ( i =l ; i <=n ; i T+) {c out « "v [ "« i « " ] =" ; cin» v [ i ] ;}
cauta ( l , n , z ) ;
i f {z:::::::O} cout« "nu cxi a t.a c Lemcnt.u I " <xx-c -c " in. vecLor" ;
e lse cout « "e x i s t a pe pozit.:ia " « z ; }
Complexitatea algoritmului de cautare binara . Pentru divizarea problemei In subpro-
bleme, se calculeaza mijlocul intervalului de indici si 0(D(n))=0(1) . Deoarece cautarea se
face numai i ntr-unul din tre eei doi subveetor i (prob lema ini1ial a se rezol va prin rezolvarea
uneia dinlre cele doua subprobleme) a=1, formul a recuren ta a l impului de executie
este T(n)= T(n/Z)+0 (1). Considerarn ca n=Zk (k=l og2n). Rezulta ca:
T(n)=T(Zk)+0(1) = (T(Zk-') +0(1)) +0 (1)= T(Zk-' )+Zx0 (1)) = ... =
o
T(Z )+(k+1)x0 (1) = 0 (1)+ (k+1)x0( 1) = (k+Z)x0(1)= 1092n x 0 (1).
Ordi nul de cornplexitate al algontmului este 0(log2n) .
Aplicarea algoritmuiui de cautare binara
Exempl u Sa se determine, cu a precizie de 4 zecimale, radacina reala , din interva lul J
ecuatiei x
3
+x _1=O.
S-a identficat pentru aceasta ecuatie 0 radacina in mtervatul [0,1] ne propunem sa locali-
zarn aceasta radacina, i n limitele unei preciz ii de 4 zecimale, print r-o valoare x . Pentru cauta-
rea valorii x se va folosi metoda bisectiei - care consta i n reducerea intervalului de cautare
prin inju mata1irea repeta ta selectarea subinterv alul ui in care se radacina, l ntervalul
[s,d] este lmpartit in doua subinl ervale, [s,m] [m,d], unde m= ( s +d) / 2. Cautarea radacinii
se va face In subintervaluJ In care functia +x-1 i si schirnba semnul, astf el: daca
f(s)'l(m)<O, atu nci cautarea continua i n intervalul [s.m] . altlel , cautarea continua i n subinter-
valul [m,d). Procesul recursiv este intrerupt cand se ajunge la intervalul [s,d] pentru care
d-s <r , unde r este eroarea acceptata pentru a precizie de 4 zecirnale are valoarea 0,0001.
#i n c l u d e< i o s t r c arn. h >
# i n c l u d e <iosmanip.h>
cans t fl oat
fl o a t f( f l oa t x l {return x rxrx·.x-·l; }
voi d divizeaza ( f l o a t s, f l o a t d, f l o a t &m) {m= ( s f d ) / 2 ;}
vo i d radacina( f l o a t s, f l oa t d, f l o a t &z )
{f l o a t m:
i f (d-s<r) z = ( s l d ) / 2 ;
e lse
50
{d i v i z e a z a {s , d , m) ;
if (f( s) *E{m) <O) r a d a ci.na (s.m,z) ;
el s e radacina {m, d, z ) ; }}
Tehnici de programarc
voi d main ( )
{float z=O ; radaci na(O ,l , z ) ; c out « " r a da c i na = "«z« e nd l ;
c out« " f (x ) = "« set i o s f lag s( ios : : f i xe d)«f (z); }
1. Sa S8 caute, intr-un de numere i ntregi , i n care mai lntai S8 gasesc
numere le pare !ii i apoi numerele impare, pozitia in care S8 i n
sir, 0 valoare x citita de la tastatura.
2. Sa S8 calculeze radicalul de ordinul 2 din nurnarul a, cu 0 aprox irnatie de 4 zecimale,
lara a folosi functia maternatica de sistem sqrt (). Sa se compare rezultatul obtinut cu
rezultatul furnizat de functia mat ernatica de sistem. Indi catie. Pornind de la ecuatia
x
2
-a=O, S8 va identifica i n care S8 gas8:}te solutia apoi S8 va localiza, cu 0
precizie de 4 zecirnale, radacina reala din acest interval.
3. Sa se calculeze partea lntreaqa a radicalului de ordinul 3 din numarul a tara a folosi
funct ia rnaternatica de sistem.
4. Sa se calculeze radicalul de ordinul 3 din nurnarul a, cu 0 aproxirnatie de 4 zecimale.
\..tA. Sortarca rupida (QuickSort)
Prin aceasta metoda de sortare se executa urmatoarele operatli prin care sunt rearanjate
elementele din cadrul vectorului :
I X,
Pivotul
x, x,
I X;., X; I X;. , I
Vectorul lnitial
I X, ., I X,
-7 Primul element din vector, numit pi vot. este mutat in cadrul vectorului pe pozitia pe
care trebuie sa se gaseasca i n vectorul sortat.
-? Toate elementele mai rnici decat el vor fi mutate in vector i n tata sa.
-7 Toate elementele mai mari decat el vor fi mutate in vector dupa el.
I X, I X,., I X, . , I
<::
""V"
Subvcct orul di n stanqa pi votului
(clemente mai mici dccat pivotul)
De exernplu. daca vectorul contine elementel e { 3. 4, 1, 5, 2}, dupa executarea operatiilor
precizate vectorul va fi (2, 1, 3. 5, 4} .
Folosind metoda di vide et impcra problemaini\iala va fi descompusa in subprobleme, astlel:
PAS1, Se rearanjeaza vectorul , deterrninandu-se pozitia in care va fi mutat pivotul (rn).
PAS2. Problema initiala (sortarea vectorului initial) se descompune in doua subprobleme,
prin descompunerea vectorului in doi subvectori: vectorul din stanqa pivotului si
veetonul din dreapta pivotului, care vor fi sortati prin aceeasi metoda. Acesti sub-
vectori, la randul lor, vor fi ei rearaniati imparli\; de pivot in doi subvectori etc.
I nform at icii
51
PAS3. Procesul de descompunere in subprobleme va continua pima cand, prin descom-
punerea vectorului in subvectori , S8 vor obtine vectori care contin un singur element.
Subprogramel e specifice algoril mului divide et impera vor avea urmatoarea sernniflcatie:
-7 i n s ubprogramuld i v i z e a z a ( ) S8 va rearanja vectorul S8 va determina poziua pivotului
xm. care va fi folosita pentru divizarea vectorului in doi subvectori: [x
s
• Xm.1] [Xm+1, xdl
7 Subprogramul combina ( ) nu mal este necesar, deoarece combinarea solutiilor S8
face prin rearanjarea elementelor in vector.
in subprogramul divi zeaza () vectorul S8 parcurge de la ambele capete catre pozitia in
care trebuie rnutat pivotul. Se vor folosi doi indiei: i - pentru parcurgerea vectorulu i de la
i nceputullui catre pozitia pivot ului (i se va incrementa) si j - pentru parcurgerea vectorului
de la sfarsitul lui catre pozitia pivotului (j se va decrementa). Cei dol indici vor fi initializati
cu capetele vectorului (de s, respectiv j =d) si se vor deplasa pana cane se l ntalnesc, adica
atat tirnp cat i <j . in momentul i n care eei doi indici s-au Intatnit inseamna ca operatiile de
rearanjare a vect orului s-au terminat si pivotul a fost adus in pozitia corespunzatoare lui i n
vectorut sortat. Aceasta pozitie este i (sau j } ;;i va fi pozitia mde divizare a vectorului.
in exemplele urmatoare sunt prezentate coua versiuni pentru subprogramul d i vi z eaza ( ) :
Versiunea 1 . Se folosesc variabilele logice: pi , pentru parcurgere a cu indicele i , pj ,
pentru parcurgerea eu indicele j . Ele au valoarea: 1 - se pareurge vectorul cu acel indice,
a- nu se parcurge vect orul cu acel indice: cere doua valori sunt complementare.
#incl ude <i o s t r e am. h >
i nt x[lOOJ,n;
vo i d schimb( i n t &a , int &b ){int
v o i d divizeaza( i n t s, i n t d, i n t &m )
( i nt
1/ pivotul fiind pe po z i t ia 5 , parcurgerea i ne e pe eu indice le j
whi l e ( i <j)
{if (x [ i ] >x [jj I {s c h i rnb (x [ i ] ,x[j]l; scb i mb tpi i p j j r j
.i e i ep i : j=j-pj ; }
m=i; }
void Qui ckSort ( i nt s, i n t d)
{int m;
i f (s<d) {d i v i z e a za ( s , d , m};
Qui c kSort ( s , m- l ) ;
Qui ckSort (m+l ,dJ ; }}
void main()
{int i ; c out « "n = " ; c i n » n ;
f or ( i =l ; i <=n ; i ++ ) {oout c cv x lv-c-ci c-c"} e " ; c i n »x[i]; }
QuickSort ( 1, n ) ;
cout « " ve c t o r u l sorLat" « e nd l ; f o r ( i =l ; i <=n ; i ++l cout'« x [ i ] « " "; }
Cei doi indict i j sunt initializati cu extrerrutatne vectorului
(i=1; j=5) parcurgerea incepe cu indicele j (pi=O: pj=1)
Se compere pivotul (3) cu ultimul element (2). Deoarece
pivotul este rna! mic, cele doua valori se interschimba.
se scturnba modul de parcurgere (pi=1; pj=O -
avanseaza indicele i ).
52 Tc huici de programarc
Se compara elementul din pozitia i (4) cu elementu l din
i
J
pozi tia j (3). Deoarece 4 este rnai mare decaf 3, cele
1 2 3 4 5
doua valori se interschimba. se schirnba modu l de
1T s=J 4 I
parcu rgere (pi-D: pj=1 - avanseaza ind.cele j ).
Se compara elementul din pozina i (3) eu elementul din
i j
pozitia j (5) . Deoarece 3 este mai mic ceca t 5, cele doua
1 2 3 4 5
valori nu se interscbimba.

se pastreaza modul de
I 2 I 3 I
1
I 5 I 4
I
parcurgere (pl-O: pj =1 - avanseaza indicele j ).
Se cornpara e!ement ul din pozitia i (3) eu elementul din po- i j
zitia j (1). 3 fiind mai mare decat 1, cele doua valori se in-
1 2 3 4 5
terscrurnoa se schimoa modul de parcurqere(avansea-
I
2 I f
I
3
I
5 I 4 I
za indicele i ). Cei doi india fiind egali , algoritmul se termina .
Versi unea 2
void divizeaza( i nt s, i nt d , i nt &m)
{in t pivot =x [s],i =s,j =d ;
wh i l e (i <j) {while ( x {i j <p i v o t ) i++ ;
wh i le l x [ j j >p i vo t ) j - - ;
if t i c j } schimb (x [i ],x[j ] ); )

lnitial, cet doi indiei i j sunt inii ializa1i eu extremitatile
vectorul ui (i= 1, j=5) s! pivotul are valoarea 3
ElementuJdin pozitia i (3) nu este mai mic decat pivotul:
indicele i nu avanseaza (i =1). Elementul din pozitia j (2)
nu est e mai mare decat pivotul. indice le j nu avansea za
U=5). Valorile di n pozitiile i j se interschim ba.
Elementul din poz itia i (2) este ma i mic decat pivotul;
indicele i avan seaza pana la primul element mai mare
decat pivotul (i =2). Elementul din pcz ftia j (3) nu este ma i
mare decat pivotuf. indicel e j U=5) nu avansea za. Val orile
din pozttiile i si i se interschimba
Elernentu l din pozitia i (3) nu este mal mic decal pivotul.
indicele i nu avanseaza (i =2) . Elementul din poziua j (4)
este mai mare cecat pivotu! ind.cele j avanseaza pima ta
pr imul element mai mic decat pivotul 0=3). Valonle din
pozitiile i se interschirnba
Elementul din pozuia i (1) est e mal mic oecat pivotul. indi-
cele i avanseaza la primul element rna; mare decat pivotul
(i=4). Elementul din pozitia j (3) nu este rna! mare decat
pivotu! indicele j nu avanseaza U=3). Indicele i fiind mai
ma re deca l indi cele l. algoritmul se terrnina.
j
1 2 34 5
I ::q --1 4- 1
Observatie. i n ambele cazur i algoritmu l continua cu divizarea vectorului i n subvecto rii eu
mdicii [1,2] [4,5] rearanj area elementelor i n eei doi subveetori .
Complexitatea algoritmului de sortare rapida Pentru divizarea problemei in subpro-
bleme se calcuteaza mijloeul intervalului de indiei Pentru comb inarea
sol utiilor se pareurg e vectorul cu ajut orul celor doi indici, de la primul element pana la
ultimul element , 0 (D(n))=0(nx0(1 ))=O(n) Timpul de executi e este 2xT( n/2)+n.
Considerand ca n=2
k
, 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
2x2 x(T(2 )+ 2 ) +2 +2 = 2 x(T(2 )+ 2 ) +2 +2 +2 = kx2 = log2n xn.
Ordi nul de comp lexitate al algoritmulu i este 0(nxlog2n) .
1.4.5. Sortarea prin interclasare (McrgcSort)
Algoritmul de interclasare se executa pe doi vectori, ordonati dupa acelasi criteriu, pentru a
obtine un al treilea vector, care sa contina elementele primilor doi vectori, ordonate dupa
acelasi criteriu. Algoritmul de sortare prin interclasare S8 bazeaz a pe observatia ca orice
vector care contine un singur element este un vector sortat. Algoritmul de interctasare S8
poate foiosi pent ru sortarea unui vector cu ajutorul metod ei di vi de et impcra, asUel:
PAS1. Se descompune problem a in subprobleme I __ I I i r-;
sirnilare, prin lrnpartirea vectorului in doi sub-
vectori , avan d rnultimea indicilor [s,m]
[m+1 ,d] , unde m este indicele din mij locul
intervalului: rn= (s+d) /2.
PAS2. Daca subv ectorul contine un singur element,
atunei S8 consicera sortat (cores punde
cazului de baza) : al tfe l, se continua descom-
punerea lui in subvectorii care au mult irnea
indici lor [s ,m] si rnultirnea indicilor [m+1 ,d] .
PAS3. Se cornbina solutiile celor doua subpro-
bleme. prin intcrclasarea celor doi vectori
sortati, obtinandu-se un vector sort at.
Vectorul care S8 sorteaza este K . Prin subprogramul
interclaseaza () S8 real izeaza combinarea solutii-
lor prin interclasarea subvectorului x , care are multi-
mea indicilor [s,m] . cu subvectorul x , cafe are mult i-
mea indicilor [m+1,d), in vectorul auxiliar v . Vectorul v
S8 copiaza in vectorul x , cafe are multirnea indicilor [s,d).
#include<i o s t r e am . h >
i nt x l l OO] ,n;
void d.l v Lze aza t Ln t; s , i n t d , i nt &m) {m= ( s +d ) / 7. ;}
voi d interclaseaza f i n t s, i nt d , i n t m)
lint i =s , j=m+l, k =l ,v [ lOO] ;
while && j <=d )
lif t x l i l c x l i J} { v l kl e x li L: i ++ ; )
e lse l v [ k ] =x [ j ]; j ++ ; }
k l I-; }
if t i c e m] whdLe (i<=m) {v [ k ] =x {i ] ; iH; k ++ ; }
e lse whi le (j<;:;d) {v {k ] =x [ j l; j++; k ++ ; }
for (k= l , i=s ; i <=d ; k ++ , i ++ )
void MergeSort ( i n t s, i n t d)
{int m;
if ( s <d ) {d i v i z e a z a {s , d , m) ;
HergeSort (5, m) ;
HergeSort (m+l, d );
irltcrc]ascaza{ s ,d,m); } }
54 Tc hnici de programarc
vo i d main ( )
tint 'i : c oue c cv ne "; c i n » n ;
for (i =l ; i <=n ; i ++J { CQu t « "x [ "« i « "J= ";c i n»xl iJ ; }
MergeSort ( 1 , n ) ;
cout « "v e c t o ru l s ortat "« e ndl ; f or ( i =l ; i <=n ; i ++l cout « X[ i ] « " "; }
Comp lexitatea algoritmului de sortare prin interclasare. Pentru divizarea problemei in
subprobleme se calculeaza mijlocul intervalului de indici si 0(0(n))=0(1) . Pentru combi-
narea soluti ilor se executa interclasarea a doi vectori ~ i O(O(n))=O(n) . Timpul de executie
este T(n)= 2xT( n/2)+n . Ccnsiderand ca n=2
k
, rezulta:
k k k· 1 k·1 k k-1 k k
T(n)=T( 2 ·1+2 = 2x(T(2 )+ 2 ) +2 = 2xT(2 ) +2 +2 = ... =
1<' -2 k. t. k k 2 k·2 k-2 k k k k
2x2x(T(2 )+ 2 ) +2 +2 = 2 x(T(2 )+ 2 ) +2 +2 +2 = kx2 = 1092n xn.
Ordi nul de comp lexitate al algoritmului este 0(nxI092n).
Observatie. in cornparatie cu algoritmii de sortare prin metoda selectiei directe si prinmetoda
bulelor, care au ordinul de complexi tate O(n\ algoritmii de sortare care folosesc strategia
divide et impera sunt mai eficienti .
1. Sa S8 rearanjeze elementele unui vector astfel incat in vector sa S8
gaseasca mai Intai numerele impare ~ i apoi numerele pare. Se vor
realiza doua versiuni ale programului, cate una pentru fiecare meto-
da de sortare care toloseste strategi a divid e et impera.
2. intr-un fisier text sunt scrise urrnatoar ele informatii: pe primul rand nurnarul de elevi din
class - n, iar pe urrnatoarel e n randuri urmatoarele tnformatii despre un elev: nurnele,
prenumele .!ii i mediile semestriale la disciplina informatica. in cadrul unui rand dateIe
sunt separate prin spatiu. Sa se scrie un program care sa realizeze urrnatoarele cerinte,
Fiecare cerinta va fi rezolvata printr-un subproqrarn. Ordonarea elementelo r vectorului ~ i
cautarea unui elev in vector se vor face falosind algaritmii cei mai eficienti.
a. Se citesc datele din fisierul text ~ i se calculeaza media anuala a fiecarui elev.
b. Se rearanjeaza datele i n ordi nea alfabetica a numel ui ~ i prenumelui elevilor.
c. Pentru numele si prenumele unui elev, eitite de la tastatura, se afiseaza mediiIe
semestriale .!?i media anuala .
d. Se seriu inforrnatiite obtinute in urma prelucrarilor intr-un alt fisier text.
1.4.6. Problema turnurilor din Hanoi
Pe trei tije notate cu A, B ~ i C se pot monta discuri perf orate de dile rite dirnensiuni , lnitial
pe tija A (tija sursa) sunt asezate unele peste altele n diseuri in ordinea descrescatoare a
diametrelor, iar cel elalte tije sunt goaIe. Sa se afisez e toate rnut arile care trebuie lac ute
ca discurile de pe tija A sa fie aranjate pe tija B (tij a destinatie) in aceeasi ordine in care
erau pe tija A, l olosind tija C ca tija de manevra. 0 mutare nu se poate l ace decat cu un
di sc si el nu poat e II asezat pe 0 tija decat peste un disc cu diametrul mai mar e.
Sa analizam mutarile care trebuie l acute pentru n=3:
~ Se rnuta discul de pe tij a A pe tija B (1).
~ Se rnuta discul de pe tija A pe tija C (2).
~ Se rnuta discul de pe tija B pe tija C (3).
~ Se rnuta discul de pe tija A pe tija B (4).
~ Se muta discul de pe tij a C pe tija A (5).
~ Se rnuta discul de pe tija C pe tija B (6) .
~ Se rnuta discul de pe tija A pe tija B (7).
III fnrrn nlicu 55

c
6
B

A
c>
...... : • • • . _._ _Mi'
cI
3

II C 6
\- 1-
6
1

c
I
r-
L
-3=J
2
B

la ell edo . I
diseurij>(lij 5' .· -L
di>!!!lnalie
..... ...
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 mul a diseul eu diametrul eel rnai mare de pe tija sursa pe lii a destinatie.
PAS3. Se mula eele n-1 discuri de pe tiia de rnanevra pe Iiia destinatie.
#inclu de<i o s t r e arn . h >
voi d hanoi ( i n t n , c h a r a , c h a r b , c har c )
{if (nee L) cout « "t1u t a r e a : " <ca -c cv -o- vc cb-cce nd.L :
e l s e
{hanoi (n - l , a , c , b ) ;
cou t ;c "tdut a r ee : " «a«" - >" « b< <e nd ! ;
hanoi (n - l , c , b , a ) ;)}
void mai n()
{int n ; char a='A' ,b='B' .c= ' C'; c out « "n = " ; cin» n ;
hanoi< n , a , b , c ) ; }
56
Tc hnici de programarc
4
~ ' 4
3+1 2+2
~
A
1
1 1
1. Sa se determine nurnarul de partit ii distincte ale
unui nurnar natural n. tndicati e. Se descompune
numarul n in dOU3 numere 01 si " 2, dupa care
fiecare nurnar nou obtinut S8 descompune in alte
doua numere. Proce sul de descompunere continua pima cand "1 <n2.
Nurnarul de partitii este ega1cu nurnarul de descompu neri obtinute.
2. intr-un parc cu 0 suprafata dreptunghiulara care are coordo natele coltului din stanqa sus
(X, .Y,) ~ i ale coltului din dreapta jos (X2,Y2) se gasesc n copaci. Pozitia fiecarui copac
pe teren este data de coordonatele (Xi.Yj). in pare trebuie amenajat un teren de joaca
pentru copii , de forma dreptunghiulara. cu laturile paralele cu laturile parcului . Sa se
determine dreptunghiul cu arie maxima pe care S8 poate amenaja terenul de [oaca fara
sa S8 tale nici un capac . lndica tie . Considerand ca un capac i imparte dreptunghiul
initial in patru drept unghiuri cu laturile paralele cu dreptunghiul initial, problema se
descompune i n patru subprobleme, fiecare subproblems rezolva nd cazul unuia dintre
cele patru dreptu nghiuri, care au coor donatele colturilor ((x " Y,) ; (Xi, Y2)). ((Xi, V, );
(X2.Y2)), ((X"Y,) ; (X2,Yi)) si ((X,. Yi); (X2,Y2)). La cazul de baza se aj unqe atunci cane
dreptunghiul nu contme nici un capac. Pentru fiecare dreptunghi care nu confine nici un
capac se calculeaza aria ~ i se mernoreaza caordonatele colturilor, Din combinarea
solutiilor obtinute se identifica dreptunghiul care are aria cea mai mare.
3. Intr-un vector sunt memorate mai multe numere intregi. Sa se plieze repetat vectorul,
pana cand ramane un singur element , ~ i sa se afiseze valoarea acestui element. Pli erea
unui vect or Insearnna suprapunerea unei jurnatati (nurnita donatoare) peste cealalta
jumatate (nurnita receptoare). Daca nurnarul de elemente ale vectorului este impar,
elementul din mijloc se elimi na. De exemplu , pentru vectorul {1,2,3.4.5.6.7}. considerand
prima jurnat ate ca fiind cea receptoare, vectorul obtinut dupa prima pliere este {5.6.7}
1.4.7. Gencrarea modclclor fractale
Modelele fractale sunt modele mat emati ce care descriu fcnomene sau obiect e care au 0
structura periodica . Ele pot fi folosite si in qrafica, pentru desenarea unor forme geometrice
complexe.
in descrierea rnaternatica a forrnei geometrice se porneste de la un nucl eu, care, in urma
unui praces iterativ. este generat succesiv la scan diterite. Nurnarul de iteratii reprezinta
ordinul curboi . Un exemplu ciasic este forma geometrica cunoscuta sub numele de curba
lui Kocl] care se qenereaza astlel:
PAS1 . Se porneste de la nucl eul care este un triunghi echilateral , cu latura avand lungi-
mea finita L.
PAS2. Fiecare latura a triunghiului este impartita in trei segmente egale. Segmentul din
mijloc este eliminat ~ i i nlocuit cu un unghi car e are latur ile egale cu e1.
PAS3. Pent ru fiecare iteratie se repeta Pasul 2. pentru fiecare segment al figurii obtinute.
Informatidi 57
Se obtine 0 constructie perfect requlata. Dupa fiecare iteratie cresc: nurnarul de unghiuri ,
numarul de laturi ale poJigonului si perirnetrul poligonului. Notarn eu p perimetrul nucleu
(triunghiul eehilateral de la care se porneste). in procesul de constructie a curbei , la fiecare
iteratie, fiecare latura Lj a triunghiului echilateral este impartita in trei segmente de lungime
egala (L,I3) ,i este lnlocuita cu 4 astfel de segmente (4xL;/3). Dupa n iteratii, perimetrul
pol igonului va fi px(4/3)".
Pentru realizarea constructiei se folosesc urrnatoarele 3 elemente:
initiator
(n= O)
~
generator
(n=1)
6
nucleu
Pentru construirea poligonului trebuie desenata fiecare latura. Pentru fiecare latura se
cunosc: coordonatele X1 si Y1, lungimea segmentului L si ,
unghiul a. Coordonate!e X2,i Y2 se pot determina: L ,X2,Y2
X2=X1 +Lxcos(a) ,1 Y2=Y1+Lxsm(a) i
. " X1,Y a 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!. Generatorul 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 i mpera 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.
PAS3. Se qenereaza al treilea segment , prin rotirea segmentului obtinut cu 120
0
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 nucleul (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 nu cle u _ Koc h (») .
#inc l ude <.i o s Lr e am. h >
# include<mut h.h>
# include<gruphi c s. h>
int x, y;
fl oa t a lfa ;
vo id s r.e n oe ( f l o a t u nqh i )
{al [<:1-1 <uraqh i. -J.: t,CPI I 180 . ; }
58 Tehnici de programare
voi d unghi)
( a l f a - =u ngh i'M_PI / 180 . ; )
void deseneaza( f l oa t L)
{x l =x; y l =y; x +=( i n t) (L *c o s(alfal; y+=( i nt) (L* s i n( a lfal ;
line i x , y , x l , y l ) ; }
voi d Koch (i nt D , float L)
{if (n==O) dcsonoaaa t t. j •
else
( Koch (n - l , L/ 3 ) ; stanga(60) ;
Koch (n - l , L/ 3 ) ; d reapta(120) ;
Koch ( n - l , L/ 3 ) ; stanga(60);
Koc h (n - l , : ,I3 ) ; }}
voi d nuc l eu_Koch ( i nt (1 , float L)
(Ko c h (n , L) ; dr eapLa(120) ;
Koch (n , L I; dreap ta (120) ;
Koch (n , LI ; dreapta(120 ) ; }
vo i d main ( )
{int n.L;
CQu t« "n= " ; cin» n ; cout« "L= " ; cin» L;
nucleu_Koch (n . Ll ; }
nucleu
nucleu
u-
curba de
ordinul n=2
generator
(n=1)
<:
initiator
(n=O)
initiator
(n=O)
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 - se
repeta acest proces de n ori pentru fiecare segment rarnas.
2. Desenati curba lui Koch , definita prin urrnatoarele trei elemente, i n care fiecare
segment al generatorului are lungimea L/4, unde L este lungimea segmentului initiator.
D
generator
(n=1)
3. Desenat i curba dragonului , definite prin urmatoarele trei eJemente, in care fiecare seg-
ment al generatorului are lungimea Usqrt(2), unde L este lungimea segmentului initiator.
D
4. Sa se deseneze figura geometrica obtinuta astfel : se deseneaza un patrat cu latura L,
se deseneaza un patrat care uneste mijloacele laturilor patratulu i initial se repeta
acest proces de n ori pentru fiecare patrat obtinut.
5. Sa se deseneze covorul lui Si erpin ski , astfel : se deseneaza un patrat cu latura L, S8
i mparte acest patrat i n 9 patr ate egale , se hasureaza patratul di n mij loc si se repeta
acest proces de n ori pentru fiecare patrat nehasurat.
In formal ieu
59
I. 5. Metoda greedy
1.5.1. Dcscricrea mctodei greedy
Metoda greedy se poate folosi pentru problemele i n care, dandu-se a multi me finita A
trebuie deterrninata a multime ScAcare sa indeplineasca anumi te conditi;' Metoda furni-
zeaza a sinqura solutio reprezentata prin elementele rnultirnii S. Ca ~ i in cazul metodei
backtracking, sol utia problemei este data de un vecl or S = {X" X2, .. ., xn} ale carui element e
apartin Insa unei singure multimi A. Spre deosebire 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!llZI
Scop ident ificarea problemelor in care solutia optima este a submultirne inclusa i nt r-o
multime data, care trebuie sa i ndeplineasca anumite conditii,
Enuntul problemei 1: Sa se repartizeze optim 0 res ursa (de exemp/u, a sa/a de specta-
cole, a set« de contetinte, a sa/a de sport) mai mul tor activita!i (spectacole, ptezentiui de
produse, respectiv meciuri) care Gancuraaza pentru a ouine resursa respective.
Mul\imea A este forrn ata din cel e n activi tati. 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 li mp
[1;,1;]. Dou a activit ati i si j sunt campatibile daca intervalele 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 folosi resursa, iar conditia pe care trebuie sa 0 Indeplineasca elementele rnultirnii S
este ca ele sa fie act ivitati compatibile. inplus, pentru ca repart izarea resursei sa fie optima,
trebuie ca multimea S sa cant ina maximul de elemente car e i ndeplinesc aceasta conditie.
Enuntul problemei 2: Sa se ocupe optim un mijloc de transport (de exemplu, UIJ ruc-
sac, li n autocamion) care are a capacitate maxima de ocupare (care poale Iransporta a
grell/ate maxima G) Cll n obiecte, fieeare obiect avand qreutetee 9j §i lin profit obtinut in
urma transport ului ct. ier din fiecare object plltand sa se ia a tt ectiune XjE[G, IJ .
Mul\imea A este fermata din cele n obiecte. Fiecare obiect i (t sisn) are a efic ienta a tr ans-
portului e; care reprezinta profitul pentru a unitatea de greutate. Cerinta problemei este de a
selecta a rnultirne de obiecte astlel incat eficienta transportului sa fie maxi ma Mul\imea S
este fermata 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
efi cienta transportului , sa se obtina 0 eficienta maxima, iar greutatea obiectelor selectate sa
fie eqa la cu greutat ea maxima a transportulu i.
Enuntul probl emei 3: Pentru aou« tnuttkn! de numere i ntregi nonute: C cu n e/emente,
C = lci.c: .. ., cn} §i A cu m eiemente , A = {al,a 2, ... , arnJ, §i nsm, sa se seleeteze a
submuttime de n numere din tnununee A. astfel incat 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 = {X1,X2, . . . , x- }, i n car e x.eA. trebuie sa i ndeplineasca conditia:
E = C1 x x1 + C2 x X2 + ... + c
n
x x
n
=E
max
Criteriul de alegere a elementel or Xi este urrnatorul: daca in rnultimea A mai exista elemente
care au acelasi semn cu coeficientul c i , se va alege elementul aj pentru care termenul Cj x Xj
60 Tehnici de programarc
are valoarea maxima (deoarece acest termen S8 aduna fa valoarea expresiei), iar daca in
multimea A nu mai exista elemente care au acelasi semn cu coeficientul Ci, S8 va alege
elementul aj pentru care termenu! Cj x Xj are valoarea mini ma (deoarece acest termen S8
scade din valoarea expresiei) ,
Enuntul problemci 4: Sa S8 plateasca 0 suma 5 cu un numar minim de bancnote cu
valori date. Se conski ers cil din fiecare tip de bencnote 58 paate totosiun numar nelimitat
de boncnote, iar pentru ca problema sa aiNi solutie, varn considera ca exist« §i bancnote
ell veioeree 1.
Multirnea A est e fermata din cete n valori distincte ale bancnotelor. Cerinta problemei est e
de a selecta 0 multirne minima de bancnote pentru plata sumei s. inacest caz, rnultirnea S
este torrnata din valorile cu care se va face plata, iar conditia pe care trebuie sa 0 inde-
phneasca elementele rnultirnii S este ca, prin adunarea sumelor partiale platit e 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 rnai mario
Meto da greedy co nst ruiosto soluti a prin select area, di nt r-a mul time de el emente,
a elementelor care i ndepli nesc 0 an urnita conditio. Pentru ca clementele
care se selecteaza sa apart ina solutiei optime , la pasul k se alege candidatul
optim pentru elementul Xk al sol uti ei.
Spre deasebl re de metoda backt racking, la met oda greedy, alegerea elementului Xk al
solutiei este l revocabi 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 datelor de
intrare co nti no sol ut i i!e optime ale subproblemelor similare cu problema initiala, dar de
dimensiune mai mica. Metoda greedy se mai nurn este ~ i metoda optimului local .
Pas!l al go ritmului gre edy sunt:
PA51 . Se init ianzeaza rnult imea S cu multtrnea vida: 5+-0 .
PAS2, Cat t imp S nu este solut ie a problemel 'Ii A,.0 , executa:
: PAS3. Se alege din rnultimea A elementul a care este candi datul optim al solutiei.
: PAS4, Se elirnina elementul a di n mult irnea A.
: PAS5. Daca el poate fi eleme nt al solutiei , atunci elementul a se adauqa la
: multimea S. Se revine la Pasul 2.
PAS6 , Dace multimea S este solutla problemei , at unc i se afiseaza solutia: al tfe l , se
afis eaza mesajul "Nu s-a gasit sotutie"
Algaritmul greedy este un algoritm it erativ , care determina solutla optima a problemei in
urma unor succesiuni de alegeri care reduc dimensiunea problemei respective: se alege
elemen tul x, al solutiei, apoi element ul x, al solutiei , s.a.m.d. Altfel spus, elementul Xk al
solutie i este determinat prin alegerea, dinelementele rarnase in rnuttirnea A, a candidatului
opt irn pentru elementul x, al solutiei , iar determinarea urmatoarel e n-k elemente ale solutiei
(rezalvarea subproblemei) se face numai dupa ce a fast determinat elementul 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 algaritmul greedy sa conduce la obtinerea solutiei aptime, trebu ie sa fie i ndepli-
nite doua conditii:
I nfor mat icii 61
1. Alegerea optirnulu i local pentru fiecare element al solutiei duce la alegerea solut iei
optime globale.
2. Solutia optima a problemei contin e solutiile optirne ale subproblemelor.
Aceas ta lnseamna ca, pentru a fi siquri ca algoritmul greedy construieste 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 l tim ea A este ordonata dupa cri teri ul
candidat ului opt im. Ordonarea multimii dupa criteriul candi datului optim inseamna rearan-
jarea elementelor rnultimii A astfel lncat, dupa extragerea unui element, urrnatorul element
din multimea A sa reprezinte elementul care este eel mai indreptatit sa fie ales ca element
al multimi i S. De exemplu:
~ In cazul repart l zarii opt i me 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 multe
act.vitati. Din multirnea activitatilor se alege Tntotdeauna act ivitatea care are tirnpul de
terminare cat mai mic . in acest caz, candidatul optim este activ itatea care are timpu l de
termi nare cel mai mic, iar ordonarea activitatito r dupa criteriul eandidatulu i optim
inseamna ordonarea crescatcare dupa timpul de termin are.
-7 in cazul ocuparil opt i ma a mi jl oeului de tr ansport , trebuie ea eficienta transportul ui sa
fie max ima. Din multimea obiectelor, se aleg obieetel e care au eficienta de transport 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 criteriul candidatului opt im lnsearnna ordo-
narea descrescatoare dupa eficienta transportului.
-7 in cazul plal i i un ei s ume eu un nu mar mini m de banenotc ell va loarc data, ca sa se
Ioloseasca cat mai putine bancnote, trebuie ea plata sa se faca i n cat mai multe
bancnote eu valcare foarte mare. in acest caz. candidatul optim este bancnota cu valoa-
rea cea mai mare , iar ordonarea dupa criteriul candidatului optim Inseamna ordonarea
descrescatoare dupa valoa rea bancnotelor .
1.5.2. Implementarea metodei greedy
Pentru implement area metodei greedy se vor folosi doua subprograme:
-) subprogramul sort () - care ordoneaza rnultimea A dupa criteriul candidatului optim:
-7 subprogramul greedy ( ) - care implementeaza metoda propriu-zisa.
i n exemplele urrnatoare, dateIe de intrare vor fi citite dintr -un fisier text.
Exemplul 1. Problema planificarii oplime a activitatilor.
Se folosesc urrnatoare'e date si structuri de date:
-7 Pentru nurnarul de elemente ale celo r doua rnultirni se folosesc var iabilele n - numarul
de activitati (nurnarul de elemente ale multimii A) ~ i m - nurnarul de activitati selectate
pent ru a forma solutia problemei (nurnarul de elemente ale multirnii S).
-7 Pentru mult irnea activitatilor (rnul tlrnea A) se foloseste vectorul a, ale carui elemente
sunt de tip i nregist rare activitate - care contine trei campu ri. x ~ i y pentru era la
car e i ncepe activitatea, respectiv ora la care se term ina activi tatea - si k pentru numa rut
acti v.tatii (este folo sit ca un identifieator al activitati i).
-7 Sol utia (multirnea S) va fi rnernorata In vectorul s . i n fiec are element al vecto rului s se
memoreaza indicele elementului selectat din vectorul a. oupa ce a fost sortat dupa
criteriul candidatului optim.
Se folosesc urrnatoarete subprograme:
62 Tc hnici d e programarc
~ Subprogramul citeste () - pentru citirea datelor din fisierul text. in fisierul text, pe
primul rand este scris nurnarul de activitati n, iar pe urrnatoarel e n randuri - perechi de
numere intregi , separate prin spatiu, care reprezinta ora de i nceput ~ i ora de sfarsit ale
unei activitati. Fiecarei activitati i S8 atribuie ca identificator nurnarut de ordine de la citi-
rea din fisier. in urma executiei acestui subprogram, S8 creeaza vectorul activitatilor - a.
~ SUbprogramul sort ( ) - sorteaza vectorul a crescator oupa timpul de terminare a
activitatilor (carnput y ).
~ Subproqrarnul g r e e d y ( ) - implementeaza strategi a greedy pentru aceasta problema.
~ Subprogramul a fiseaza ( ) - afiseaza solutia problemei l olosind informatiile din
vectorul s - indicele fiecarei activitati selectate.
Strategia greedy este irnplernentata astfel:
PAS1. Se irutializeaza vectorul s cu indicele primului element din vectorul a (se selec-
teaza , ca prima activitate, activitatea care are ora de terminar e cea mai mica).
PAS2, Pentru urmatoarele n-1 elemente ale vectorului a, executa
PAS3. Daca ora la care i ncepe activitatea din el ementul curent al vectorului a
este mai mare sau eqala cu ora la care se terrnina ultima activitate adau-
gal a la solutie (i n vectorul s), atunci activitatea este adauqata la solutie.
Mullimea activltatllor
9 12 8 10 16 14 20 19
11 13 10 12 18 16 22 21
Acti vitat ea
Or a de incepere
Ora de terminare
1 2 3 4 5 6 7 8
Mu1limea
Acti vi t atea
Ora de incepere
Ora de t ermi nare
activitatilor~ a ce a fast sortata
~ -
3 1 4 2 6 5 8 7
8 9 10 12 14 16 19
~
10 11 12 13 16 18
21
22
8 10 12 14 16 19
10 12 13 16 18 21
Solutia problemei
Ac tivitatea 3 4 2 6
Ora de in cepere
Ora de t erminare
5 8
Pr ogramul este:
#i nclude < [ s t r e a m. h >
struct a c tiv i t a t e {int x, y , ki }i
activitat e a[ 20j ;
int n ,m, s[201 ;
fstream f ( II g r e e dyl. t x t" , ios: : in) ;
void citeste()
{int i ; f » n;
for 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 sort ( )
{i nt i ,j ; act i vitdte aux ;
for (j:::;l ;i<n;i++)
f or ( j:::;il·l; j <::n; j I I)
if (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 l j l e t i j
m=j ; )
void c f i s eazc ( )
{cout.c c " Plani fica r ea acti vi t a r i j.or- : " « e nd l ;
for (i nt i =l;i<=m;i ++ )
cout«" Ac t i vi t a t e a ''c a [s[ i]] . k«" 'i n c epe la ora " ;
couti c c a I s L'i l j c x <c" s i se termina l a or a "« a [ s [ i ] ] . y«endl ;}
void main( )
{ci t e s t e ( ) ; sart() ; greedy( ) ; af i seaza () ; }
------.--.. i ntr-o sala de spectacole trebuie planificate n spectacole care au lee In
aceeasi zi, fiecare spectacol avand 0 orala care trebuie satnceapa ~ i 0
durata de desfasurare. Scrieti un program care sa planifice optim OCUw
parea salii de spectacol e.
5
-
4 4 10 5 8
20 10 22 10 10
5 2,5 2,2 2 1,25
-
5 4 4 8 10
10 20 10 10 22
2 5 2,5 1,25 2,2
- - -
1 4
4 4 10 5 8
1 1 1 0,2 0
4 4 10
2 0
Solutia problemei
Mul!imea obiectelor - G=20
Obiectul 1 2 3 4
Gr eutatea
M u l ~ i m e a obiectelor dupa ce a fast sortata
Obiectul 2 3 5 1 4
Greutatea
Exemptul 2. Problema ocuparil optime a mijlocului de transport (problema rucsacului ).
Se folosesc urrnatoarele date si structuri de date:
-7 Pentru nurnarul de elemente ale celor
doua rnultirni se folosesc variabilele n-
nurnarul de obiecte (nurnarul de element e
ale mult irnii A) ~ i m - numarul de obiecte Greutatea
selectate pentru a forma sotutia problemei Profitul
(nurnarul de elemente ale multimii S). Eficl t
~ P . _ ' IClen a
~ entru greutatea maxima care S8 poate '
transporta, S8 Iolosest e variabila G, iar
pentru greutatea obiectelor care se mai pot
selecta, se foloseste varlabila Gr (greuta-
tea rarnasa). Variabila Gr este initiatizata
cu valoarea G (initial, greutatea obiectelor Profitul
care se pot selecta este greutatea maxima Eficient a
de transport), iar dupa ce s-a construit '
solutia, variabila Gr are valoarea 0 (nu se
mai pot selecta obiecte, deoarece a fost ObJectu l
ocupata toata capacitatea de transport).
-7 Pentru multirnea obiectelor rA) se folo- .
seste vectorul a t ale carui elemente sunt Fractiunea
de tip inreqistrare obi e ct , care contine Greutatea
patru carnpun: g - greutatea obiectului, c
- profitul obt inut In urma transportului. e - eficienta transpartului ~ i k - nurnarul
obiectului (este folosi t ca un identificator al obiectul ui)
-7 Solutia (rnultirnea S) va fi rnemorat a In vectorii s si x in fieeare element al vectorului s se
rnemoreaza indicele obiectului selectat din vectorul a, dupa ce a fast sortat dupa criteriul
candidatu!ui optim, iar I n elementul din vectorul x care are acelasi indice eu cel din
vectorul s se mernoreaza fractiunea de eantitate care se va lua din obiectul selectat.
Elementele vectorului x sunt initializate cu valoarea 0 (vectorul este declarat global).
64 Tchnici de programa r c
Se folosesc urmatoarel e subprograme:
Subprogramul citeste ( ) - pentru citirea datelor din fisierul text in fisierul text. pe primul
rand este scris nurnarul de obiecte n greutatea maxima a transportul ui G, iar pe
urrnatoarele n randuri - perechi de numere reale, separate prin spatiu, care reprezinta
greutatea si profitul transportului unui obiect. Fiecarui obiect i S8 atribuie, ca identificator ,
nurnarul de ordine de la citirea din fisier. Pentru fiecare object S8 catculeaza eficienta
transportul ui. In urma executiei acestui subprogram S8 creeaza vectorul obiectelor , a.
-7 Subprogramul sort () - sorteaza vectorul a, crescator dupa eficienta transportului
obiectelor (carnpul e ).
Subprogramul greedy ( ) - implementeaza strategia greedy pentru aceasta problema.
-7 Subprogramul afiseaza () - afiseaza solutia problemei folosind inforrnatiile din vectorii
s si x - indicele fiec arui obiect setectat fractiunea din greutate care se va transporta.
Strategia greedy este irnplernentata astfel:
PAS1. Se initializeaza greutatea Gr cu valoarea G !?i selectarea obiectelo r incepe cu obi-
ect ul cu cea mai mare eficie nta a transportului (pri mul obiect din vectorul a).
PAS2. Cat timp rnai exista obiecte care nu au fost selectate greutatea obiectelor
selectate nu este greutatea maxima, executa
PAS3. Daca greutatea obiect ului din elementul curent al vec tor ului a este mai
mi ca sau eqala cu greutatea ramasa, Gr, at unci obiect ul este adauqat la
solutie, luandu-se i ntreaga cant itate dispo nibila din obiect : altfel , S8 ia din
obiect fractiunea eqala cu greut atea rarnasa Gr. Se actualizeaza greutatea
Gr dirninuand-o cu greutatea obiectului care a fast adauqat in rucsac.
Programul est e:
#include<t s t r c a m. h >
struct obi eeL {int r:. ;
float 9 ,c ,e ; } ;
obi e c t a [ 2 0] ;
int n ,m,s [20 l;
fl oa t G.Gr. xI20) ;
fstream f ("grccdy2 . LXL", i os: :in) ;
void citeste ( l
{int. i; f »n» G;
for ( i l;i<=n; i ++ l
{f» o l i ] .g»a l i J . c : a l i ] . k- i ; a[i ] . c ea l i l .c/a [i J . g; } f . c l o s e (); }
v o id oo r t. ( )
{in t i ,j ; ob i e c L a ux;
for (i =l ;i<n;i , +)
for
if (ali] . c c a l i l . e l t aux va l i j : a l i.Lva l jj : a l j l e a u x r L)
v o i d greedy ( )
{i n t i, j =O; Gr=G;
for (i=l ; i <=n && Gr ! =O ; i l-t)
if (cc-e-e l a l . g ) { j + + ; s l j l e i : x I j l e L:
else x [ j ] =Gr ali] .g; Gr=O ; }
m=J; }
void a Li s eaz a ()
{for ( i n t i=l;i<=m;i ++)
Iufurrnat icu
65
{c out « "Ob i ec t u l ''c a l s l i l I . k c c" i n c a n t i t .at ea
cout«x [ i J * a [ s [1 J J . g< <endl; } }
v o i d main ( )
{c i t e s t e ( ) ; sort () ; gre e dy( }; afi seaza{ ); }
Observa t ie. In problema rucsacului exista doua situatii:
1. Obiectele pot fi fractionate - problema continua a rucsacului ;
2. Obiectele nu pot fi fractionate - pr obl ema discreta a rucsacului. .IJI14
Algoritmul greedy furnizeaza sol utia optima numai in cazul probl emei continue a
rucsacul ui . De exemplu, pentru patru obiecte: a (20 kg, 110 lei), b (9 kg, 45 lei), c (9 kg, 45
lei) 'ii d (6 kg, 30 lei) 'i i greutatea maxima de transport 25 kg'
-7 Solutia greedy: obiectul a - profitul transportului = 110;
-7 Solutia optima: obiectele b, c 'ii d - profitul transportului = 120.
------.,.--..... intr-un rucsac S8 pot transporta maximum G kg. Exista n obiecte, fieca-
re obiect avand greutatea g; 'ii valoarea Vi. Obiectele pot fi fractionate.
Scrieti un program care sa gaseasca obiec tele care trebuie t ransportate
in rucsac, astfel inc at sa S8 obtina cea mai valoroasa incarcatura.
Excmplul 3. Problema expresiei de val oarc maxima.
Se folose sc urrnatoare.e date si structuri de date:
-1- Pentru rnultimea coeficientilor C se foloseste vectorul c cu n elemente, iar pentru
multimea numerelor A se foloseste vectorul a cu In elemente. Elemente!e vectori lor sunt
de tip i n t
-1- Pent ru calcularea valori i expresiei se foloseste variabila exp, car e este init ializata cu
va/oare a 0 (este variabila qlobala) , iar pentru a nurnara elementele selectate din
mult imea A se foloseste variab ila k . care este initializata cu valoa rea O.
Se folosesc urmatcarele subprograme:
-1- Subprogramul c i teste ( ) - pentru citirea datelor din fisierul text. i n fisierul text, pe
primul rand sunt scrise doua numere intregi , n si In, care reprezinta nurnarul de
elemente ale celor doua rnultimi , pe randul al doilea cei n coeflcienti, iar pe randul al
treilea cele m numere intregi din rnultirnea A. Valorile numerice de pe un rand sunt
separate prin spatiu. in urma executiei acestui subprogram se creeaza vectorii C si a.
-1- Subprogramul sort ( ) - se foloseste pentru a sorta crescator cei doi vectori c ~ i a.
-7 Subprogramu l greedy ( ) - implernenteaza strategia greed y pentru aceasta problema si
afiseaza solutia i n timp ce 0 cons truieste.
Strategia greedy este irnplernentata astfel :
PAS1. Se calculeaza termeni i pentru care valorile coeficientului cs si ale nurnarului aj sunt
pozitive. Pentru ca expresia sa fie maxima, parcurgerea celor doi vectori se face de la
ultimul element catre primul element (de la cele mai mari numere pozitive, catre cele
mai mici numere pozitive). Se rncmoreaza, in variabila p, indicele elementu!ui din
vectorul C care urma sa fie selectat la terminarea parcurgerii, lar i n variabila r - indi-
cele elementului din vectorul a care urma sa fie selectat fa terminarea parcurgerii.
PAS2. Se calculeaza termenii pentru care valorile coeficientutui c i si ale nurnarului aj
sunt negative. Pentru ca expresia sa fie maxi ma, parcurgerea celo r doi vectori se
face de la primul eleme nt catre ultirnul element (de la cele mai rnari numere nega-
tive, catre cele mai rnici numere negative).
66 Tchnici de programarc
7
7
7
-2 -1 3 4 5 5
-6 -5 -4 -3 -1 1 2 I
-6 -5 -3 -1 1 2
-5 -4 -3 -1 4 5
151 -5
-4 1 2 3 4
-5 -4 1 2 4 6
-2 -1 3 4 5
-5 -4 -1 2 5
7 181
-5 -4 5 7 8
Cj
S j
S j
C,
Cj
S j
a,
a,
a,
n=6 si m=7 -> Emax = 21
lndi cl 1 2 3 4 5 6
n=5 m=7 -> Emax = 97
lndlc i 1 2 3 4 5 6
n=6 m=7 -> E
m

x
= 77
Ind ici 1 2 3 4 5 6
// indici : i-vector c, j-vector a, k-vector b
PAS3. Coeficient ii ramasi pot fi numai pozitivi
sau numai negat ivi. in cazul in care sunt
numai negativi, in rnultirnea A au rarnas
numai numere pozitive. Termenii care S8
catcuteaza fiind negativi, pentru ca
expresia sa fie maxima vor trebui sa aiba
valoarea cat mai mica vector ii S8 vor
parcurge i n continuare, catre ultimul
element (coeficlentii sunt numere negati-
ve din ce i n ce mai mici, iar numerele din
vectorul a sunt numere pozitive din ce in
ce mai mari ). in cazul i n care coeficientii
rarnasi sunt numai pozi tivi, in multirn ea A
au rarnas numai numere negative.
Termenii care S8 calculeaza fiind nega-
tivi, pentru ca expresia sa fie maxima vor
trebui sa aiba valoarea cat mai mica !iii
vectorii se vor parcurge astfel: vectorul c
Incepand de la elementul p catre prirnul
element, iar vectorul a incepand de la
elementul r catre primul element (coeficientii sunt numere pozitive din ce i n ce mai
rnici, iar numerele din vectorul a sunt numere negat ive din ce i n ce mai mari ).
Programul este:
#i ncl ude< f s t r e arn . h >
int n,m,p,r , c [ 2 0 J ,a [2 0 J , Cxp;
fst r e am [ ( . t x t: " , Lo s e : in) ;
voi d c i t e s t e(}
{int i; f » n »m;
f or ( i ::= l ; i <=n ; i ++ J f » c [ i] ;
f or ( i =l ; i <=m; i ++ ) Ec- c-al i.L:
f . c l o s e ( ) ; )
voi d s o r t ( i nt v[], int n)
{i nt i , j , a ux ;
f or (i=l;i<n;i++)
f or
if Iv[i]>v[j)) {a u xev l i.L: v l i Lev l j l : v l j l e aux i L}
voi d greedy ( )
{int i =n , j =m, k=O;
cou t« " E= ";
whi le (cli]>O && a[j] >O && k<nl
{ k ++ ; cout« " {" « c[ i] « "l * (" « a[jl «") + " ;
expsec l i l e a l jl : i - - ; j - - ; )
p =j ; i =l ; j =1;
whi le (c [ i] <O && a[ j ] <O && k<n )
{k ++ ; c out « " ( " « c l i ] « " ) * ( " « a [ j }« " ) + " ;
ex p ee c l i.L ' a l j l : i ++ ; j ++ ; }
if Ic[i)<OJ
whi l e (k<n)
r..
III furmatica
67
{k++ ; c out « " ( " « c [ i ] « " ) " ( " « a [ j ]« " ) + " ;
e xpe e c l i ] *a [ j J; i++ ; j + + ; }
else
{i =P i j =r ;
while (k<n)
{k + + ; cout « " ( " « c f i ] « " ) * ( " « a [ j ] « " ) + " ;
exp+=c[iJ "a l j l : i--; j--; } }
cout« ' \ b ' « " = " «exp; }
v oid main{ )
{c i t e s t e ( ) ; sort(c,n); s ort (a,rn); g reedy ( } ; }
Justificarca criteriului candidatului optim Consi derarn cazul in care cceficientii sunt
numere intregi pozitive care au fast ordonat e crescator si exista eel puti n n numere pozitive
i n rnultirnea A. Conform criteriului candidatului optirn, rnultimea A a fost ordonata crescator.
Daca C={C1,C2, . .., cn} cu Ci;;Cj, pentru i<j ~ i A={a1,a2, .. ., am} cu 'i;;aj , pent ru i <j , atunci
S={X1, X2• •• .• xn} cu Xj$Xj , pent ru i<j :;; i xn=a
m
, Xn.1=a
m.
1, . . . , x1 =a
m

n
+1. Este evident ca
pentru a obtine val oarea maxima a expresiei trebuie sa S8 aleaqa cele rnai mari n numere
din mult imea A. Trebuie sa demonst rarn daca este corect modul i n care s-a construit
multirne a S cu aceste numere. Pent ru alegere a facuta, expresia are valoarea E1 .
E1 = C1 x X1 + Cz x Xz + .. .+ Cj x Xi + . .. + Cj x Xj + .. .+ Cn x Xn
Sa presupu nem ca exista a expresie Ez a carei valoare este mai mare decat a expresiei E1
(E2 >E1). in cel mai bun caz , in expresie ordi nea nume relor din rnultirnea S difera numai
prin valorile din pozitiile i si j , cu i <j ~ i Ci<Cj ~ i Xi<Xj.
E z = C1 x X1 + Cz x Xz + . .. + Ci x Xj + . ..+ Cj x Xi + . ..+ C
n
x Xn
Conform presupunerii t acute, Insearnna ca Ez - E1 > O. Dar,
E2- E1 = Ci x (Xj • Xi) + Cj x [xi - Xj) = (c] • c.) x (Xi - Xi) < 0 ~ i E2 <E1
ceea ce contrazice ipoteza de la care s-a plecat. in mod analog se justifica si alegerea
elementelor rnultimii S atunci cand cei n coeficienti sunt negativi ;;i in rnultimea A exists cel
putin n numere negative.
-----...,-..... 1. Justificati criteriul prioritatii de alegere pentru cazul in care coeflcientii
sunt pozitivi ~ i i n multirnea A nu exista decat numere negative.
2. Justificati eriteriul prioritatii de alegere pentru cazul in care coeficientii
sunt negativi ~ i in multimea A nu exista dedit numere pozitive.
3. Refaceti programul astfel l ncat sa se determine val oarea minima a expresiei.
4. Fiind data a multime A eu n numere reale, sa se determine a subrnultirne a sa care are
proprietatea ca suma elementelor subrnultirnli este maxima. lndi cati e. Subrnultimea va
fl fermata din toate numerele pozitiv e. iar daca nu exista numere pozi tive, din cel mai
mare nurnar din rnultirne.
5. Fiind date multirnea de numere reale A = {a"a2, ... , am} ~ i n, gradul unui polinom, cu n-crn,
sa se seleeteze, din multimea A, a submultirne de n+1 numere pentru coeficientii
polinornutui, astfel i ncat valoarea polinomului P(x) i ntr-un punct X preeizat sa fie maxima.
6. La un cabinet medical, in sala de asteptare, se gasesc n pacienti, Timpul necesar
pentru consultarea unui pacient i este t i. Cunoscand nurnarul de pacienti n si timpul
neces ar pentru fiecare consul tatie t i. scriet i un progra m care sa afiseze ordinea de
tratare a pacientilor, astlel inca! timpul total de asteptare al paci entil or sa fie minim.
lndicatie. Deoarece timpul de asteptare al unui pacient este egal cu suma timpilor de
consutt atie ai pacientilor tratati i naintea sa, ordonarea pacientilor dupa criteriul
68 Tehnici de progra marc
candidatului optim Insearnna ordonarea cresca toare dupa timpul de consultatie.
Dernonstrati ca solutia obtinuta astfel este solutia optima.
Exernplul 4. Prob lema platii un ci sume cu un nu mar minim de banenote cu valor!
date.
Se folosesc urrnatoarele date si structuri de date:
-7 Pentru valorile bancnotelor se foloseste vectorul a cu n elemente (n reprez inta nurnarul
de tipuri de bancnote).
-7 Pentnu suma care trebuie platita se foloseste variabila s.
Se Iolcsesc urmatoarete subprog rame: n=4 S=147 --> Nurn ar t otal bancnote= 9
-7 Subprogramul citeste () _ pentru Valoare bancnota Iso[10 I s1 1 I
citirea datelor din fisierul text. In fisierul _
text , pe prirnul rand sunt scrise doua nu- Numar de bancnote 2 4 1 2
mere i ntregi , n 5 , iar pe randul urrnator cele n valori ale bancnotelor. Valorile
numerice de pe fiecare rand sunt separate prin spatiu.
-7 Subprogramul s o r t ( ) - se foloseste pentru a sorta descrescator vectorul a
-7 Subprogramul g r e e d y ( ) - irnplernenteaza strategia greedy pent ru aceast a problema
afiseaza solut ia in limp ce 0 construieste.
Strategi a greedy este irnplernentata astfel:
PAS1 . Selectarea bancnotelor incepe cu bancnota cu valoa rea cea mai mare (prima
valoare di n vect orul a).
PAS2. Cat t imp nu a fost platita toata suma, executa
PAS3 . Daca 0 parte din suma rarnasa poate fi platita in bancnote care au valoa-
rea elementului curent din vectorul a. atunci S8 determina nurnarul maxi m
de bancnote cu care se face plata (catul dintre suma rarnasa valoare a
bancnotei) si S8 calculeaza restul din surna care rnai rarnane de platit.
PAS4. Se trece la urrnatoarea valoare a bancnotei si S8 revine la Pasul 2.

i nt n,m,S, a{ 2 0 ];
f stream f ("grcedytl . t x t" . i os: : in ) ;
v o id c i t.e s t e ()
{i nt i ; [ »n»5;
f »a[i); f . c l o s e ( ); }
v oid s o r t. t )
{ i nt i,j,aux;
f or
f or ( j=i -Il; j<=n; j+')
if {a l Ll c a l jl ] t auxe a l i l : a Li l e e l jl : a[ jJ =aux; }}
v oid greedy ( )
{int i =1;
whi le (S ! =O)
( if (S/ ali) ' =0 )
{c out « S / a [ i ] « " bilnenote eu valoarea " «a fi] « e n d l ;
S=S%a[ i l; }
i ++ ; } }
void ma in ( }
( c l t.e s t e t j : a o r t I nl : gre e d y ( ); }
Informatica 69
Obsorvati e. i n plata sumei S cu bancnote de valori date pot sa apar a doua cazuri
(presupunand ca in moneda respectiva exist a bancnote cu valorile precizate marjos):
1. Suma este 48 ,i bancnotele au valorile 15. 5 si 4 (n=3). Algoritmul greedy nu va gas i nici
o solut ie. deoa rece va alege 3 bancnote cu valoarea 15, rarnanand un rest de surna cu
valoarea de 3, pentru care nu rnai exists bancnote ca sa S8 plateasca. in realitate,
problema are a solutie: 2 bancnote cu valoarea 15, 2 bancnote cu valoarea 5, , i 2 bane-
note cu valoarea 8.
2. Suma este 22 , i bancnotele au valorile 9, 7, 5 , i 1 (n=4). Algoritmul greedy nu va gasi
sol utia optima, deoarece va alege 2 bancnote cu valoarea 9, 4 bancnote cu valoarea
1, in total 6 bancnote. Solutia optima este de a plati cu 4 bancnote: 3 bancnote cu
valoarea 7 0 bancnota cu valoarea 1.
Metoda greedy care nu furnizeaza solutia optima a problemci S8 numeste metoda
eurist ica greedy.
Ce relatie trebuie sa existe intre valorile bancnotelor pentru ca solutia
greedy sa furnizeze solutia optima?
2 1 1 3
2 1 2
.r,
,jl. .
0 4 2
3 1 2 3
Compl exi t at ea algoritmului greedy
Algoritmul greedy propriu-zis are complexi tatea O(n), deoarece se parcurg cele n elemente
ale rnultirnii A pentrua alege fiecare dintre cele m elemente ale sol utiei. Aigoritmul de sortare
folosit pentru aranjarea elementelor mult unii A dupa criteriul candidatului optim are complexi-
tatea 0(nxlog2 n) daca se alege un algontm de sortare eficient, cum este de exemplu
algoritmul QuickSort. Complexitatea metodei greedy este O(n) + 0(nxlog2 n)= 0(nxtog2n).
Metoda greedy se rocomanda in urmatoarele cazuri :
-7 S8 doreste numai obtinerea solutiei optime si suntem siguri ca aplicand strategia greedy
S8 obtme solutia optima;
-7 se doreste obtinerea unci SOIU!ii accept abile. nu neaparat optirne, , i aigontmul greedy
este mult mai eficient decal al\i algoritmi - care pot duce la obunerea mai mu tter solutii sau
a solutiei optirne.
1. Un automobilist porneste dintr-un ora, A ,i trebuie sa ajunqa i n
orasul B. Rezervorul autoturismului, daca est e plin, Ii permite sa
parcu rqa n kilometri. Pe harta sunt trecute m stat ii de alimentare
distantele dintre ele. Automobilistul doreste sa opreasca la cat mai putine statii pentru
alimentarea autoturismului. Scrieti un program care sa dete rmine statiile de ben zina la
care trebuie saS8 opreasca pentru alimentare.
2. l ntr-un camping exista k casute care pot fi inchiriate 365 de zile din an. Orice turist poate
inchiria 0 casuta pentru exact m zile consecutive din an. Campingul a adunat solicit arile
a n turisti pe un an intreg , cu un an i nainte. Fiecare turist precizeaza prima zi cu care
dorest e sa i nchi rieze a casuta (1, 2, .. .). Sa se determine nurnarul maxim de turisti care
vor putea fi primiti in camping m$20,
(Concursul Nemes Tiharner, 1998)
3. Un turist trebuie sa strabata un traseu de munte. Pe harta, zona prin Nord
care trebuie sa treaca are 0 forma dreptunqhiulara. care este
trnparuta, prin caroiaje, in subzone, care au fiecare 0 anurnita
ina1time. Zona prin care trece turistul poate fi reprezentata printr-o
matrice ale carei elemente rnernoreaza inaltimea fiecarei subzone .
Turistul porneste din sud, din orice subzona de pe harta, trebuie sa Suo
70 Tchnici de programarc
ajunga in nord, in orice subzona de pe harta, astfel tncat sa urce cat mai putin pe intreg
traseul. EI poate trece dintr-o zona in alta, numai rnerqand i n cir ectiile: Est, Nord-Est,
Nord, Nord-Vest si Vest. Datele de intrare sunt dimensiunile matricei >; i matricea Inaltirnil or
- si se vor citi din fisier.
4. Intr-o fabrica s-a automatizat procesul de producti e si, la sfarsitul zilei de munca, piesele
sunt adunate de roboti industriali. Fiecare robot poate strange un anumit nurnar de piese.
Harta halei a fost lrnpartita printr-un caroia] >;i poate fi reprezentata printr-o rnatrice (nxm)
ale carei elemente pot avea valorile: a(pentru locurile in care nu exista masini) >;i 1 (pentru
locuril e in care exista rnasini). Robotii se deplaseaza in spat iut de deasupra rnasinllor ,
corespunzator aceluiasi caroi aj. Robol ii pornesc din coltul din stanqa sus (1,1) >; i trebuie
sa duca piesele i n colt ul din dreapta jos (n.rn). Robotii sunt proqramati astfel i ncat sa se
depl aseze dear la dreapta sau in jos. Sa S8 scrie un program care sa determine nurnarul
minim de robof care trebuie porniti pentru a strange toate piesele fabricate intr-o zi.
(Concursul Nemes Tihamer, 1998)
5. intr-un depozit al rnonetariei statului sosesc n saci cu monede. Seful depozitului
cunoaste nurnarul de monede din fiecare sac ~ i vrea sa modifice continutut sacilor, prin
mutarea de monede dintr-un sac in altul , astfel lncat, la starslt , sa fie in fiecare sac
acel asi nurnar de monede. Sa S8 scrie un program care sa determine, daca este posi bil,
nurnarul minim de rnutar i prin care fiecare sac sa cantina acelasi nurnar de monede,
altfel sa S8 afiseze un mesa] . Fiecare mutare S8 afisea za sub forma: sac initial, sac final,
f)umarde monede. (n,;2000, iar nurnarul total de monede '; 1.000.000.000)
(ONI Oradea, 1998)
1.6. Metoda programiirii dinarnice
1.6.1. Descricrea metodci prugramiirii dina rn ice
Metoda pr oqrarnarii dinamice S8 poate folosi pentru problemele in care trebuie sa fie
gasitasolutia optima si care au urrnatoa rele caracteristici :
1. Sotutia optima se alege dintr-o rnulti rne de solutii. fiecarei solutii putand sa i se asocieze
o valoare . Alegerea solutiei optime Insearnna alegerea solutiei care are valoarea
optima (minima sau maxima).
2. Problema poate fi descornpusa in subprobleme simil are cu problema i ni tiala ce
respects principiul opti rnal it atii : solutia problemei este optima daca ea coniine solutiile
opti me ale subproblemelor.
3. Subproblemel e i n care se descompune problema nu sunt indep endente
4. 50Iu!i. problemei este data de un vec to r 5 = (x " X2, ... , xml si:
-7 exista 0 multirne finitaA din care se poate alege un element Xi al solutiei:
-7 fiecare etapa de determinare a unui element Xi al solutiei se bazeaza pe rezultatele
etapelor in care s-au determinat elementele anterioare ale solutiei ;
-7 nurnarul de posibilitati de a alege un element Xi al solutiei se reduce din cauza cerin-
telor de optimizare si a restrictiilo r impuse solutiei.
Metoda clasl ca de rezolvare a acestor probleme este de a cauta toate solutiile problemei
si de a alege . di ntre solutille qasite, solutia optima. Algo ritmul de generare a tuturor
solutiilor tnsearnna generarea tuturor subrnuttimi lor de indici ai multirnil A cu n elemente
>; i are ordi nul de comp!exit ate 0(2") . Acest ordin de complexitate este inacceptabil
pentru 0 dimensiune mare a datelor de intrare n.
IIIfnf ill aIicii
71
(Swoon de CalZ I
a 22
a11
a21
Scop : identificarea probl emelor care pol fi descompuse ill subprobl erno similare care
nu sunl i ndependente ~ i care respecta pr incipiul optirnalitati l , solutiilor putand sa Ii se
asocieze 0 valoare, iar solutia optima deterrnin andu-se prin calcul area valorii optime.
Enuntul problemei 1: Se conskiere un triunghi de numere naturale '
8ij ell 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
e/ementelor sa fie maxima. Trecerea to Iinia urmatoare se poate I ..
face nume! mergfmd in jos, direct sau pe diagonala, la dreapta . an1 an2 ann
Metoda clasica de rezolvare a acestei probleme este de a calcula toate sumele 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 elementele aij ale triunghiului.
Valoa rea asociata unei solutii este suma elemcnt el or. Valoarea solutiei optime este valoa-
rea maxima (suma elementelor tr ebui e sa fi e maxima). Sol ut ia problemei este data de un
vect or S :::: {X1 , X2, ' .' , x
n
}, 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 j os sau pe diaqonala, la dreapta, astfel lncat succesorul elementului aij nu poate fi
decat elementul ai+1 ,j sau elementul ai+1,j+1. Problema poate fi descompusa in subprobleme:
subproblema i este alegerea elementului Xi al solutiei de pe linia i a triunghiului. Restricti a
impusa pentru sol utie este ca elementul Xi al solutiei sa se obtina , prin deplasarea in triunghi,
numai pe doua direcni, de la elementul anterior, limitand 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 opnrna titat ii . suma
elementelor alese anterior trebuie sa fie maxima. Subproblemele nu sunt independente
deoarece i n subproblema i alegerea elementului Xi al solutiei se bazeaza pe alegerile Iacute
in subproblemele anterioare.
Enuntul pro blemei 2: Df111du-se un §ir de numere 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 i 1< i z < ... :s:; i k. De exernplu . i n sirul de numere 1, -2, 3, 2, 4, 4,
un subsir crescator este 1,3, 4, 4.
Motoda clasica 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 m e a datelor de intrare a reprezinta rnultirnea fermata din elementele sirul ui: A={a1, a2,
.. ., an} . Val oarea asocia ta unei solutii este lungimea subslrulul crescat or. Valoarea
solutiei optime este valoarea maxima (Iungimca subsirutui trebui e sa fie maxima).
Solut ia problemei este data de un vector S = {X1, X2, .. ., xm}, unde XiEA. Problema poate
fi descornpusa 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) trebuie Sa fie mai mic cecat
numarul de ordine al succesorului (j) , tirnitand rnultirnea elementelor din care se alege
succesorul aj . Metoda cea mai sirnpla de a gasi subsirul de lungime maxima care i ncepe cu
72
Tchnici de pr ogramarc
elementul aj este de a cauta printre subsirurile de lungime maxima descoperite i n
subproblemele rezolvate anterior, eel mai lung subsir care ince pe cu un element a] ce
poate fi succesor in subsir al elementului ar, obtinandu-se un nou subsir, de lungime mai
mare, care i ncepe cu elementul a.. Pentru a respecta principiul opti matitatii , lungimea
subsirurilor descoperit e anterior trebuie sa fie max ima. Subproblemele nu su nt indepen-
dcnte deoarece i n subproblerna i alegerea subsirului care i ncepe cu element ul ai al
solutiei se bazeaza pe alegerile tacute i n subproblemele anterioare.
Enu nt ul probl emei 3: 0 (eava Cll Iungimea L trebuie sa se contectioneze din n bucet! do
(eava. tiecere ouest» avand lungimea ai. 0 bucot« de (eava nu poate Ii tiiiata. Sa sa
gaseasca. 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.
Mull imea dalelor de intrare 0 reprezinta rnultirnea A fermata din lungimile bucatilor de teava
a.. Val oarea asociata unei solutii este lungimea tevii . Valoarea solutiei optime este L
(Iungimea !evi i co nstruite trebui e sa fi e L). Solut ia problemei este data de un vec tor S
= {x, . X2• •• •• 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 depaseasca lungimea L. Aceasta
restrictie lirniteaza rnultirnea tevllor construite anterior. Pentru a respecta pri ncipi 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 sunt independente.
Enuntul pro btemai 4: lntr-un rucsac S8 poate transporta a greutate maxima G $i exista n
obiectc, fieeare obiect avand qreuuitee g; §i un profi t obtinut in urma trenspottutu! c; iar
obioctete nu pot fi fractionate. Sa se setecteze obiectote care vot fi trenspott eto in mesne,
astfel incat sa se obtine profitul maxim (problemadiscrotii a rucsecutui y.
Metoda clas ica de rezolvare a acestei probleme este de a genera toate posibilitatile de a
incarca rucsacul aieqand obiecte din cele n obiecte ~ i de a verifica daca greutatea obiectelor
nu depaseste greutatea de i ncarcare a rucsacului G. Dintre variantele de i ncarcare 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 i n rucsac. Valoarea asociata unei solutii este pr ofit ul t ransportului. Valoarea
solutiei optirne este valoarea maxima (prof itul t rebui e sa fie maxim). Solut i a 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 i n subprobleme: subproblema i este
de a verifica daca obiectul a: poate fi element al solutiei, Restriqi a 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
adauqat in rucsac 3i. 1. Aceasta restrictie lirrnteaza multimea elementelor din care se alege
elementul Xk al solutiei . Pentru a respecta principi ul opt irnalitati i . elementul Xk al solutiei
S8 determine prin alegerea dintre doua obiecte a celui care are profitul mai mare.
Subproblemele nu sunt inde pend ente dcoarece rezolvarea subproblemei i se ~
bazeaza pe rezolvarea subproblemei i-1 (elementul Xi al solutiei este determinat i n~
functie de elementul Xi-1 al solutiei).
lnfur mu t icii 73
Metoda proqramar it dinami ce so bazoaza pc descompunerea unci probleme in
subprobleme simil ar e problcmci initiale, care nu sunt in depc ndc ntc , ~ i
const rui osto so lutia rozolvand fie care subprobtorna, prin selecta rea, di nt r-o
mul t i rne de clemente, a el ementel or ca re indepl i nesc 0 anurnita condit ie. .Pentru
ca elementele care se selecteaza sa apartina sotutiet optima, la pasul k alegerea
se face i n f uncti e de valoarea op tima a unci functii asociate solutl ei ~ i se bazeaza
pe alegerile care s-au facut pana atunci (pe elementele solutl ei care au fost
descoperite anterior).
Etapcle de rezol var e a un ci problema pri n met oda proqrarnar!i di nami ce sunt:
PAS1. Se dernonstreaza ca problema are 0 substructure optima (prin reducere la absurd).
PAS2. Se caracterizeaza structura unci solutii optime (descompune rea problemei in sub-
probleme).
PAS3. Se defineste recursi v valoarea so l ut iol opt ime.
PAS4. Se calculeaza valoarea solutiei optirne intr-o rnaniera "de jos i n sus" ("bottom-up·') .
PASS. Se construieste solutia optima din inforrnatiile obtinute prin calcularea valorii solu-
tiei optime.
Obsorvatio. Valoarea solutiei optime este definite recursiv i n 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" obtinandu-se un
algori t m itorativ :
PAS1. Se rezolva subproblema obti nuta din descompunerea problemei initiate care are
cea mai mica dimensiune ~ i S8 mernoreaza soluti a ei.
PAS2. Cat t imp nu s·a ajuns la rezolvarea problemei cu dimensiunea n, executa : S8
rezolva 0 subproblems de dimensiunea i folosind solutiile obtinute i n subproble -
mete cu dimensiune mai mica decat i.
1.6.2. lmplcmentarca mctodci prugrarnarii dinamice
Pentru implementarea metodei proqrarnari i dinamice S8 vor foi osi subprogramele:
-7 subprogramul ini t () - care initializeaza variabilele de rnernorie ~ i structurile de date
folosite pentru construirea solutiei;
-7 subprogramul p_dinamica () - care calculeaza valoarea solutiei optune;
-7 subprogramul afiseaza ( ) - care afiseaza solutia problemei foJosind intormatiile
obtinute prin calcularea valorii solutiei optime .
in exempJeleurrnatoare datel e de intrare vor fi citite dintr-un fisier text.
Excrn plul 1 . Problema surnei maximo i n tr iunghi.
Cerinta problemei este ca pentru calculul sumei sa se porneasca de la elementul a11 si sa
se rnearqa i n jos, pana la linia n. Trecerea la linia urrnatoare nu se poate face decat direct,
i n jos, sau pe diaqonala , la dreapta, astfel lncat succesorul elementului aij nu poate fi decat
elementul ai+l, j sau elementul ai+1,j+1.
PAS1. Problema are substructure opti ma. Fie un sir de n numere din triunghi , care res-
pecta conditiile de deplasare i n triunghi ale problemei, si care tormeaza suma maxima. i n
subproblema i a fast ales numarul de pe linia i pe baza sumelor maxime calculate in
subproblernele anterioare, altfel se contrazice ipoteza ca sirul forrneaza suma maxima.
74
Tchnici de programarc
o
= { 1 daca 5(1+1 ,j) > S(i+1,j +1)
2 caca 51i+1,j ) ~ 5(1+1,j +1)
{
ai
j
oaca len, h "j si
S(i,j) =
a;j + max(S(i+1,j), Sl i+1,j+1)) daca t stsn-t
PAS2 . Descompuncrea probJemei in subprobleme. Se deterrnina pe rand sumele maxi -
me ale numerelor care apar pe trasee le care pornesc de pe ultima linie n catre varf si ajung
pe linia i (t sisn-t). Pe linia i , suma maxima pentru fiecare element S8 va calcula pe baza
sumelor maxime care s-au calculat i n subpr oblemele anterioar e (sumele de la linia n pfma
la linia i+1). Aceste sume sunt sumele maxime pentru fiecare linie ~ i principiul optirnalitatii
este respectat.
PAS3 . Valoarea solutiei fiind suma ete-
mentelor selectate, functia recursive
care defineste suma maxima pornind
de la elementul au al triunghi ului este
prezentata alaturat,
PASS. Pentru a calcula valoarea solutiei optirne intr-o maniera de "de jos in su s", S8 va
forma un tri unghi al s ume l or maxime, pornind de la baza (Iinia n) catre varf (Iinia 1).
Sumele maxime de pe linia n sunt egate fiecar e cu elementul corespunzator de pe linia n a
triunghiului. Valoarea maxima a sumei elementelor este 51 1.
PASS . Pentru reconstituirea elementelor solutiei,
se foloseste 0 matrice p, i n care se memoreaza p(i,j)
directia de deplasa re (valoarea 1 pentru depla-
sarea in jos si valoarea 2 pentru depiasarea pe
diaqonala). Matricea peste definita alaturat .
Se tolosesc urrnatoarele date ~ i structuri de date:
-7 Pentru nurnaru l de Iinii ale triunghiului se foloseste variabila n.
-7 Pentru memorarea triunghiului se folose ste matricea a, pentru [
memorarea sumelor maxime - matrices s. iar pentru memo- ;1 1t
rarea directiei de deplasare - matricea p. Toate aceste matri - a21
ce sunt patrate , cu dimensiunea n.
Se folosesc urrnatoarele subproqrame : :l n l Hil l
-7 Subprograrnul c i tes te () - pentru citirea datelor din fisierul text. in fisierul text , pe
primul rand este scris numarul de linii, n, iar pe urmatcaree n randuri numerele de pe
fiecare Iinie a triungh iului. Numerele sunt separate prin spatiu . in urma executiei acestui
subprogram se creeaza matr icea triunghiului a.
-7 Subprogramul ini t () - irutializeaza linia n a matricei s cu elementele de pe linia n a
triunghiului.
-7 Subprogramul p_dinamica - calculeaza valoarea solutiei optime (elementul 5 11 at ma-
tricei sumelor).
-7 Subprogramul a f isea z a () - afiseaza suma maxima ~ i solutia problemei folosind infor-
rnatiile din rnatricea p.
Strategia proqrarnar l i di namice este implementata astfel:
PAS1 . Se initializeaza linia n a matri cei sumelor maxime S cu elementele de pe linia n a
matr icei triunghiului a.
PAS2. Pentru urrnatoare ie linii ale matricei sumelor maxi me incepand cu linia n-1 pana la
lini a 1, executa:
PAS3. Se calculeaza suma maxima astfel: daca suma maxima S(i+1, j) - de sub
elementul curer.t din triunghi - est e mai mare cecat suma maxima
S(i+1 ,j +1) - de pe diagonala elementului curent, atunci la element ul
Informatica
75
curent se aduna suma 5(1+1,j) si directia de deplasare este 1; altfel, la
elementul curent se aduna suma 5(1+1 ,j+1) 'Ii directia de deptasare este 2.
Matricea t riunghiului - a
Suma maxima = 20
1 2 3 4
Matricea sumolor
maxime - S
1 2 3 4
Matricea directiei de
doplasaro - p
1 2 3 4
1
2
3
4
5 0 0 0
4 2 0 0
5 4 3 0
4 6 2 5
1
2
3
4
20 0 0 0
15 1 0 0
11 10 8 .s,
4 6 2 5
1
2
3
4
1 0 0 0
1 1 0 0
.z,
1 2 0
0 0 0 0
Programul este :
#include<£ s t r e a m. h>
int n , a [20 J [2 0 1 , p [ 2 0 ) [20) , $[20] [ 2 0J ;
fstream f ( "pdl .txt " , i o s : : i n ) ;
void c.i t e s t e ()
{int i , j ; f » n;
for ( i =l ; i <=n; i ++ )
for F+ ) f» a [i ) [j ) ; f. close () ; )
void .i n.i t ( )
(for (i n t i=l ;i<=n ii++) S ln Jlil""'a[n l [i ] ; }
void p,..cd i n a mi c a U
{int Lj ;
for (i=n-l ;i>=l ;i-- )
for
if ($[i +I ] [j j>Sfi+l j [j+l)1
[ S [ .l J [j ]+S [l+l ) [j ] ; p[ i)
else ( S r i ] [ j ) +s[i+l] [j+1J ; p il l
void a f Ls ee za ()
{int i ,j , q =l, r = l;
cout-c-c't Su ma ma xima= "« S[ l J ll J«"= "« a [ l ] [ 1 ] « "+ " ;
for {i=l ,j=l ;i <n ; i ++}
{if (p [i ] j ++ ; )
cout« a[ q ] [ rJ « " + " ; }
cout;c-c ' \b ' « " " <c e nd 'l r j
void main ()
{c i t e s t e (); i n it () ; p_dinamica(); a f Ls e a z a ll r }
Exemplul 2. Problema sirului de lungime maxima.
Pent ru a determina sirul de lungimea maxima, trebuie calculat a, pentru fiecare element aj al
sirului, lungimea celui rnai mare subsir crescator care se poate forma lncepand cu el, dupa
care se alege subsirul cu lungimea maxima.
PAS1. Problema are substructura opt ima. Fie un sir crescator de m numere din sirul
initial A care incepe cu numarul aj si respects conditia ca este subsir al sirului A, 9i care are
lungimea maxima dintre toate subsirurile crescatoare care i ncep cu numarul a., In subpro-
blema i se alege subsirul crescator de lungime maxima care incepe cu nurnarul ai astfel: S8
adauqa la numaru l a: subsirul cu lungime maxima dintre subsirurile din subproblemele ante-
76
Tchnici lie progra lllarc
{
1 daca i- n
L(i ) ;
1 + max(L(j)) daca ar s; aj . L n :?i i< j:$"11
- -
-_.
2 3 4

6
-".-
-2 3 2 4 4
4 3 3 2
....1-
3 5 5 6 6
3 4 4
rioare care incep cu numarut aj , cu ar ::; aj kj , altfel S8 contrazice ipoteza ca subsirul are
lungimea maxima.
PAS2. Descompunerc a problemei i n subpro bleme . Se determine pe rand lungimea
maxima a unui subsir crescator care incepe cu elementul a, din sir, pornind de la subsirurile
crescatoare de lungi me maxima care inc ep cu elementul an, la subsirurile care i ncep
cu elementul ai+1. Pentru eJementul aj din sir, lungimea maxima a subsirurilor crescatoare
care S8 pot forma, Incepand cu el. S8 va calcula pe baza lungimilor maxime care s-au calculat
i n subprobl emele anter ioare. Aceste lungimi sunt lungimile maxime pent ru fiecare subsir care
se poate forma i ncepand cu acel element si principiul optimalita\i i este respectat.
PAS3. Valoarea solutie i fiind lungi mea
subsirului crescator , functia recur sive
care defineste l un gimea maxima a sub-
sirului car e se poate forma pornind de la
elementul aj al slrului este prezentat a ataturat.
PAS4. Pentru a calcula valoarea solutiei optime i ntr-o maniera "de j os i n sus ", se va forma
un vector al lungi mi lor ma xime. porni nd de la ultirnul element din sir (elementul n) catre
primul element din in acest vector se va memora i n pozitia i lungimea maxima a unui
subsir crescator care se poate forma inc epand cu elementul aj al sirului. Cum lungimea
maxima a unui subsir crescator care se poate forma cu un singur element este 1, lungimea
maxima corespunzatoare elementul ui an se initializeaza cu valoarea 1.
PASS. Pentru reconstituirea elementelor solutiei, se foloseste vectorul p in care, i n pozitia i, se
mernoreaza indicele elementului urmator din subsirul de lungime maxima care i ncepe cu aj.
Se folosesc urrnatoarele date st ructuri de date:
-7 Pentru numarul de elemente ale sirului se foloseste vari abila n.
Pentru memorarea sirului de numere se foloseste vectorul a, pent ru memorarea lungi -
miter maxi me - vectorul L, iar pentru memorarea indicelui elernentului urmator din
subsir - vectoru! p. Tal i acesti vectori au dimens iunea n.
Se folosesc urmatoarel e subprograme:
-7 Subprogramul ci t.e s t.e () - pentru citirea datelor din fisierul text. i n fisierul text. pe
primu1rand este sensa lungimea sirului - n, iar pe urrnatorul rand cere n numere di n sir.
in urma executiei acestui subprogram se creeaza vectorul pentru sirul de numere - a.
Subprogramul i n i t () - initializeaza eleme ntul n al vectorilor L ;;i p.
Subprogramul p_di namica - calculeaza valoarea solutiei optime (Iungi mea maxima a
subsirurilor care incep cu fiecare element aj din sir).
Subprogramul cauta_ solut .i a ( ) - caut a cea rnai mare lungime maxima a unui subsir
pentru a gasi elementut cu car e i ncepe subsirul.
Subprogramul afi s e a za ( ) - afiseaza tungimea sirului gasit si solutia problernei
folosind inf ormat iile din vector ul p .
Strategi a proqramarl i dinamice este irnplement ata astfel:
PAS1. Se initiahzeaza elementul n al vectorului lun-
Indici 1
gimitor maxime cu 1 ;;i al vectorutui p cu n.
PAS2. Pentru urmiit oarele elemente i ale vect o- a
rului, Jungimi tor maxime Incepand cu ele- L
mentu l n-1 pana la elementul 1, ex ecuta:
PAS3. Sc irutializeaza lungimea maxima p
a subsirul ui car e incepe cu acest Subsirul
I nformaticii 77
element cu valoarea 1 :;;i pozit ia cu care i ncepe subsirul cu pozitia elemen-
tului in sir.
PAS4. Se calculeaza lungimea maxima a subsirului care i ncepe cu elementul
curent din sir, astfel : pentru toate elementele j din sir care urmeaza dupa
elementul i , exe cuta
PASS. Daca 3j este mal mic decat 3j 9i lungimea subsi rului care incepe
cu 3j este mai mare decat lungimea subsir ului care incepe cu ar,
atunci L(i ) este egal cu 1+LU) indicele elementului care ormea-
za i n subsir dupa elementul a: este j .
PAS6. Se deterrnina cea mai mare lungi me maxima L(k). Subsi rul de lungime maxima va
fncepe cu elementul a k.
Programul este :
# inc l u de <f s t r e a m. h>
int n ,k,a [20J , p [ 2 0 J , L [ 2 0 ];
fs tream f( "pd2 .txt " , i o s : :in);
void c Lt.e s t.e L)
t i nt l ; f» n;
for ; i<"'n;i++) f » a [ i ]; f . c l a s e () ; }
v o i d ini t()

void p _d i n a mi c a ()
tint L j ;
f o r (i =n - l ; i >= l ; i - - )


if &&

void ()
{int i, rl\iJ.x "= - l ;
for
if (ma z <L [ i j ) {lll a:x=IJl _LJ; k=i; } ]
void afiseaza()
{int i ,j ;
cout«" Lu nq ime subsir= " « L [ k ] «endl;
for coct cce l jl cc" ",oJ
void mai n ()
{c i t e s t e ( );p_dinamica() ,o c au t a s oluti. e jI : .af i s e a z a f j :
Exemplul 3. Problema tcvii .
Oaca se poate constru i 0 teava de lungimea 0 folosind bucati de teava cu lungimea 8 1, a2,
.. , a., atunci se poate construi a teava cu lungimea D+a i+1 folosind bucat i de teava cu
lungimea ar , az. . .. , a t, ai +1.
PAS1. Problema are substructura opt ima . Fie a teava care s-a obtinut prin sudarea bu-
catii de teava cu lungimea a., la a teava care a fast obtinuta anterior din bucati de teava cu
lungimea a], care are lungimea mai mica decat L. In subprobtema i se aleg dintre tevile
obtinute anterior numai acelea care au lungimea mal mica cecat L-aj, altfel 5e contrazice
ipoteza CEt se paat e construi noua teava.
78
Tchnici de programarc
{
-1 caca1=0
T(i,j )=
.. ar oaca T{i ,j - ai} :;C,Opentr u 'tsrsn ~ i 1 : S : j ~ L
PAS2. Descompunerea probl emei in subprobleme. Se determi ne pe rand lungimile
tevi lor care 58 pot forma cu bucata de tea va cu lungimea ar, pornind de la teava torrnata
numai cu bucata de teava cu lungimea a1, pana la tevile formate cu primele i ~ 1 bucati de
teava. '[evile formate nu depasesc lungimea L ~ i principiul optimalitatii este respectat.
PAS3. Valoarea solutie i fiind lungimea
unei tevi, functia recur siva care defines-
te lungimea t evi lor care se pot forma
cu bucata de teava cu lungimea a: este
prezentata alaturat,
PAS4. Pentru a calc ula valoarea solutiel optime intr-o rnani era "de jos in sus", S8 vor
forma toate t8vile cu lungimea mai mica sau eqala cu L, porni nd de la teava care S8 poate
construi cu bucata de teava cu lungimea a 1, ~ i adauqand la tevile obtinute, pe rand, urrna-
toarele n-1 bucati de teava cu lungimea ar. Pentru a tine evidenta tevilor care s-au constru it
in subproblema i se foloseste un vec to r al l ungimi l or t evil or care se constru iesc - T, care
are lungimea loqica L. i n acest vector se va memora in pozit ia j lungimea ultimei bucati de
teava care se adauqa la una dintre tevile construite anterior pentru a obtine 0 teava cu
lungimea j . Princ ipiul optirnalitatii este respectat prin modul In care se construieste 0 teava
cu lungimea j: pri n adau qarea unei bucati de teava la una dintre tevile confectionate in
subproblema anterioara .
PASS. Pentru reconstituirea elementelor solutiei. se foloseste vectorul T. Pomind de la
elementul din pozitia L care corespunde tevii cu lungimea L, se scade bucata de teava cu
lungimea T(L), obtinandu-se lungimea tevii la care a fost adauqata aceasta bucata de teava
(indicele din vectorul T). Procesul continua pana se obtine teava cu lungimea O.
Se folosesc urrnato arele date ~ i structuri de date:
--7 Pentru nurnarul de bucati de teava se foloseste variabila n, pentru lungimea tevii care
trebuie confectionata. variabila L, iar pentru lungimea maxima a unei tevi care se poate
forma adauqa nd 0 noua bucata de teava la tevile construite anterior - variabi la max.
Variabila ma x are initial valoarea 0 (nu s-a construit nici 0 teava), iar la sfarsit, daca
problema are solutie, are valoarea L (Iungimea tevii care trebuie confectionata) .
-7 Pentru memorarea lungimi i fiecare i bucati de teava se foloseste vectorul a , de lungime
n, iar pentru memorarea tevi lor care se pot confectiona , vectorul T, de lungime L.
Se folosesc urmatoarele subproq rams :
-7 Subprogramul ci tes te () - pentru citirea datelor din fisierul text. i n fisieru l text, pe
primul rand sunt scrise numarul de bucati de teava - n ~ i lungimea tevii - L, iar pe
urrnatorul rand, lungimile celor n bucati de teava . in urma executiei acestui subprogram
se creeaza vector ul cu lungimile bucatilor de teava - a,
-7 Subprogramul ini t () - initializeaza elementul 0 al vectoru!ui T si variabila ma x .
-7 Subprogramul p_ d ina mi c a - calculeaza valoarea solutiei optime (lunqimile tevilor ce se
pot obtine adauqand fiecare bucat a de teava ail .
-7 Subprogramul soLu t.ae () - verifies daca s-a gas!t solut ia problemei.
-7 Subprogramul afiseaza () - daca este posibil sa se confectioneze teava . afiseaza
lungimile bucatilor de teava din care se confectioneaza.
Strategia proqrarna rl l di namice este irnplementata astfel :
PAS1. Se initializeaza elementul 0 al vectorului T cu -1 si variabila max cu valoarea 0
PAS2. Pentru fieca re bucat a de teava cu lungimea ai i ncepand cu bucata de teava cu
lungimea a1 pana ta bucata de teava cu lungimea an, exec uta:
Info r matica 79
1 234 5
UIiliIiliJ
a
indici
n=5
PAS3 . Pentru tevile cu lungimea j lncepand cu teava cu lungimea max pana la
teava cu rungimea 1, executa:
PAS4. Dac a adauqand la teava cu lungimea j bucata de teava cu lungi-
mea a: S8 obtine 0 teava care va putea fi folosita la confectionarea
tevi i cu lungimea L, atu nei construirea tevii cu lungimea j+aj
incepe cu buc ata de teava cu lungimea aj. Se revine la Pasul 3.
PASS. Se deterrnina lungimea maxima a unei tevi care S8 poate construi din tevi le
construite anterior, astfel: daca adauqand la teava cu lungimea maxima
bucata de teava cu lungimea ai, S8 obtine a teava cu lungimea mai mica
decat L, atunei lungimea maxima a unei tevi care S8 poate construi va fi
manta cu lungimea bucatii de teava ar; altfel , ea va fi L. Se revine la Pasul 2.
Dad) nu exista solutie (nu exista 0 bucata de teava cu care se poate i ncepe
construirea tevi i de lungime L), atunci se afiseaza un mesaj de infor mare; altfe l , se
trece la Pasu l 7 pentru a afisa solutia.
Pentru fi ecare teava cu lungimea i din care s-a obtin ut teava flnala , incepand de la
teava cu lungimea L, pana la teava cu lungimea 0, executa:
PASa. Se afiseaza lungimea bucatii de teava cu care incepe constru irea tevii i: T(i) .
PAS9. Se calculeaza lungimea tevii rarnase , scazand lungimea bucafii de teava
din lungimea i
L=10
PAS6
PAS7 .
indi ci vectorul T = l ungi me tea va
ma x al i) 0 1 2 3 4 5 6 7 a 9
10
in it ial -1 0 0 0 0 0 0 0 0 0 0
0 a{1) -1 0 2 0 0 0 0 0 0 0 0
2 a(2)
-1 0 2 0 2 0 0 0 0 0 0
4 a(3) -1 0 2 3 2 3 0 3 0 0 0
7 a(4) -1 0 2 3 2 5 0 5 5 5 5
10 a(5) -1 0 2 3 2 5 6 5 6 6 6
De exemplu, dupa ce s-a luat in considerat ie ;;i bucata de teava de lungime a(2) se pot
construi levi cu lungimea 2 (din bucata de teava a(1)=2) ;;i cu lungimea 4 (din bucatile de
teava a(1)=2 si a(2)=2), lungimea maxima a unei l evi fiind 4. l.uandu-se i n consideratie si
bucata de teava de lungime a(3)=3 se pot const rui levi cu lungimea 2 (din bucata de teava
a(1) =2). cu lungimea 3 (din bucata de teava a(3)=3), cu lungimea 4 (din buca tile de teava
a(1)=2;;i a(2)=2 ) ;;i cu lungimea 5 (din bucatile de lea va a(1)=2;; i a(3) =3).
Programul este :
#include<f s t r e a rn. h >
int L,n , maz ,T[20 ] , a [2 0 ] ;
fstream f( l' p d 3 . t x t ", i o s : :in) i
void c .i t es t e \)
{int .i : £»L»n;
for ( i =l;i <=n; i ++ ) £»a [i ] ; f . c l os e ( ) i )
void i ni t o
ma x e Oj }
80
Tchnici de programarc
voi d
tint i ,j , r: ;
f or
{for (j=;ctax ;j>=O;j - -)
i f (T[jJ '=0 && j +a[iJ<=L) T[j +a[i]J=a[i] ;
if (ma x e a [i] <L) ma x -rna x s.a l i l : e lse f:',ax= L ; } }
int s o Lu t Le t )
( retur n T [L )
v oid a fisea za {}
{i f (! solutie()) c out«" Te a v rl nu se p oate c onfe cti or..a " ;
el se f or ( i n t i=L;i !=O; )
{cout .c-C'Buce t a d e "<c'I' Li j c-c " me t r ; " « endl ;
i -=T[i ] ; ) )
voi d ma in ( )
{c i t e s t e ( ) ; p_di namica ( ); a fi s e a za() ; )
Excmplul 4. Problema discreta a rucsacului .
PAS1. Fie un sir de m obiecte a carer greutate nu depaseste greutatea de tncarcare a
rucsacului G si care asiqura profitul maxim al transportului. in subproblema i a fast ales
obiectul i numai daca greutatea sa nu cepaseste greutatea de lncarcare dlsponibila
profitul adus de el este rnai mare decat al obiectului adauqat anterior i n rucsac. altfel se
contrazice ipoteza ca incarcarea rucsacului asiqura profitul maxim.
PAS2. Descompuncr ea problemei in subp roblcme. Se determine pe rand profitul maxim
adus de fiecare obiect aj pentru fiecare greutate de i ncarcare disponibi la (de la 1 la G) per-
nind de la obiectul a- . pana la obiectul an, pe baza profiturilor maxime aduse de primele
i-1 obiecte.
PAS3. Valoar ea solutiei fiind profitul, functia recursive care defineste profitul maxim C(i ,j)
obtinut prin lncarcarea optima a rucsaeului eu primele i obiecte, avand disponibila greutatea
de incarcare a rucsacului j , este prezentat a alaturat. C(i,O) reprezinta profitul maxim al unui
rucsac cu greutatea disponibila 0 (care
nu permi te adauqarea niciunui obiect i ). { Oceca ;-0 1::;;i sn
C(O,j) reprezinta profitul maxi m al unui 0 dace i=O 1$j $G
rucsac gol cu greutatea disponibila j C(i,j) =
(care nu contine niciun obiect). . max(C(I-1j-g(i))+c(i), C(i-1,j)) daca g(l) $)
. C(j-1.il in rest
PAS3. Pentru a calcula valoarea solutiel
optime intr-o maniera "de j os in sus", se va forma a mat ri ce a profi tu rilor maxima C,
pornind de la primul obi ect (Iinia 1), pana la ultimul obi ect (Iinia n). Matricea C are
dimensiunea nxG. Elementul C(i ,j) rnernoreaza profitul maxim obtinut in subproblema i
pentru 0 greutate disponibila j . Pe linia i , profitul maxim pentru fiecare greutate de tncar-
care j se deterrnina pe baza profiturilor maxime ce s-au calculat in subproblemele anteri -
oare (profiturile maxime de la linia 1 pana la linia 1-1). Aceste profituri sunt maxi me pentru
fiecare linie principiul optirnal itatii este respectat. Valoarea maxima a profitului este e nG
(profitul maxim obtinut pentru un rucsac cu greutatea disponibila G ocupat prin alegerea din
cele n obiecte a obiectelor care aduc profitul maxim).
PAS4. Pentru reconstituirea elementelor solutiei, se foloseste matricea p cu dimensiunea
nxG. Elementul p( i,j) rnernoreaza obiectul ales in subproblema i pentru 0 greutate disponi-
bila l
Infurmuticii
81
Se folosesc urrnatcarele date ~ i structuri de date globale:
-7 Pentru nurnarul de obiecte S8 toloseste variabila n. iar pentru greutatea rucsacului,
variabila G.
"" Pentru rnultimea obiectelor (A) se foioseste vectorul a ale carui elemente sunt de tip
Inregistrare obiect care coniine doua carnpuri: g - greutatea obiectului si c - profitul
obtin ut in urma transportului.
-7 Pentru memorarea profituriJor S8 folcseste matricea C, iar pentru memorarea obiectelor
alese lntr-o subproblerna S8 foloseste matricea p. Ambele rnatrice au dimensiunea nxG.
Se folosesc urrnatoarele subprograme:
"" Subprogramul ci teste () - pentru citirea datelor din fisier ul text 1n fisierul text, pe
primul rand este scris nurnarul de obiecte n l?i greutatea maxima a transportului G, iar pe
urrnatoarele n randu ri perechi de numere intregi, separate prin spat iu, care reprezinta
greutatea :;;i profituJ transportului unui obiect. In urma executiei acestui subprogram se
creeaza vectorul obiectelora
-7 Subprogramul p_d inami c a - calculeaza vaJoarea solutiei optime (profitul maxim obtinut
pentru un rucsac cu greutatea cisponibila G ocupat prin alegerea din cele n obiecte, a
obicctelor care aduc profitul maxim).
-7 Subprogramul afiseaza ( ) - afiseaza profitul maxim si solutia problemei folosi nd infor-
rnatiile din rnatricea p.
n=4 G=10
Matricea C
Greutatca di sponibil a
0 20 20 20 20 20 20 20 20 20
0 20 40 40 60 60 60 60 60 60
0 20 40 60 60 60 60 70 90 90
0 20 40 45 60 65 85 85 105 105
Ob ioc t ul Greutatea Profitul Obi ect 1 2 3 4 5 6 7 8 9 10
1
2
3
4
~
1 2 20
2 3 40
3 6 50
- - - - - - ~ - -
- - -
4 4 45
Solutia
Obi ect ul Gr eutate a Profitut
4 4 45
2 3 40
1 2 20
Tot al
9 115
0 1 1 1 1 1 1 1 1 1
0 1 2 2 2 2 2 2 2 2
0 1 2 2 2 2 2 3 3 3
o 2 4 2 4 4 4 4 4 4
Mat ricea p
Gre utatea di sponlblla
Obiect 1 2 3 4 5 6 7 8 9 10
r-r-r-r-r I
1
2
3
4
Strategia pr oqrarn ari i dinami ce este irnplementata astfel:
PAS1 . Pentru fiecare obiect i lncepand cu prirnul obiect pana la ultimul obiect (n), executa:
! PAS2. Pent ru greutatea disponibila j Incepand de la 1 pana la G, executa:
PAS3. Se ca'culeaza profitu l maxim pentru greutatea disponibila j luand in
consideratie profitul care s-ar putea obt ine prin adauqarea obiectului
i: daca greutatea obiectului i este mai mica sau eqala cu greutatea
disponibila si profitul adus ta greutatea j este mal mare cecat profitul
adus de obiectul i- 1, atunci profitul pentru obiectul i ~ i greutatea j
este egaI cu profitul obiectului i adunat la profitul calculat pentru
obiectul i ~ 1 ~ i greutatea j dirninuata cu greutatea obiectului i ~ i in
82
Tehnici de rrouramare
matricea P se rnernoreaza obiectul I; alt fel , profitul pentru obiectul I
si greut atea j este egal cu profitul obiectului ;-1 greutatea j in
matricea p se rnernoreaza obiectul i-1 ales pentru greutatea j .
Programul este:
#incl ude <f s t r e wn. h >
s truc t ob iec t lint g , c ; };
obiect a[20] ;
int n ,G,p[20] [201 , C [ 2 0 ] [201 ;
fs tream f ( " pd4 . t xt " , i os : : in) ;
voi d citeste()
l int i ; f »n»G;
for ( i = l; i <=f!.; i .;- + ) f »a[1] . g» 3 i i J . c ; f c c Los e Lj r }
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 ++)
if ((a [ .i ] . g <=j ) && (o i l] .c+C[ i- l] [j -a [i ] .g] >C[ i - l ] I j ] ) 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 coucc-cv pro Ej t tctal= "« :::[r: ] fG] « e nd 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;
cout« " 5i profi :.ul "« a [ k] . c«endl ;
j -va [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 proqramarii dinamice
Algoritmul proqrarnarii dinamice are complexitatea O{nxm) 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 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 S2. Sa se insereze 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 M(i,c) -
Inlocuieste caracterul din poziti a i cu caracterul c. Sa se transforme sirul A in sirul B
folosi nd un nurnar minim de operatii. Problema se va rezolva in doua variante: a)
transformante se vor aplica de la stanpa la dreapta; b) transformarile se vor aplica de la
dreapta la stanqa.
I n 1"0r ill atica 83
5. Se dau doua siruri de numere X=(x , . xz•. ..• xm} ~ i y =(y, . yz•. ..• yrn} . Sa se determine
eel mai lung subsir comun al celor doua siruri . $irul Z=(z, . zz. .... Zk} este subsir
comun al sirur ior X ~ i Y daca el este subsir al sirului 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 cel or doua siruri , lndicati e Valoarea asociata solutiei este lungimea unui
subsir comun, iar functia recur siva defineste valoarea lungimii maxime a unui sub;;ir
comun L(i.j) unde i .este indicele {Odaca i=O sau j=O
elernentului cu .care mcepe s U b ~ l ~ L(i,j) = 1+L(i. 1,j -1) daca i, O, j eO 'ii XI = Yi
rul X. tar J est e indicele elementului max(L(i,j·1), L(i-1,j) ) daca i. O, j,O 'ii x'*Yt
cu care incepe subsi rul Y.
6. Se da un ~ i r de n matrice A, . Az. .. .. An 'ii trebuie sa se calculeze produsul lor : A, xAzx
. .. xA
n
. Fiecare matrice Ai. cu 2:5I Sn, 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 parantezele potrivite astfel Incat
nurnarul de Inmultiri sa fie minim (deoarece Inrnultirea matricelor este asociativa,
inserarea parantezelor nu rnodifica rezultatul).
lndi catie . Fi ind date doua matrice Ap,q ~ i Sq,r, matrice a produs Cp,r confine elementele:
' I
c
ij
= La;"x h"j
k=d
Timpul necesar pentru calculul mat ricei produs este determinat de nurnarul de Inrnultiri
scalare: 3ikXbkj . De exemplu, pentru produsul A1 XA 2XA 3, in care rnatricele au dimen-
siunile 10x20, 20 x5 si , respectiv, 5x40, nurnarul de Inmultiri scalars pentru paranterizarea
((A, xAzlx A31 este 10x20 x5+10 x5 x40=12 00. iar pent ru paranterizarea (A,x(AzxA3ll este
10x20 x40+20x5 x40=12000 (de 10 on mai mare decat in exemplul anterior). Valoarea
asociata solutiei este nurnarul de Inrnultiri scatare, iar tunctia recursive m(i ,j ) defineste
nurnaru l minim de i nmultiri 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
Nurnarul minim de inmultir i scalare pent ru calculul produsului A1 X•. . x A n este m(1,n).
Pent ru a memora pozit iile parantezelor optirne se va folosi matr icea 5 , i n care elementul Sij
are valoarea k ce reprezinta pozitia parantezei optime i n produsul A i X. . . x Aj . Altfe l spus, Sij
este egal cu k pentru care m(i.j) = mli ,k) + m(k+1,j) + pi·1xp kXPi
1.7. Compararea metodclor de construire a algoritmilor
Metodele backtracking, greedy ~ i programarea dinamica se recornanda i n cazul proble-
melor care au urrnatoarele caracteristici:
-7 solutia poate fi data de un vector sau a matrice cu elemente de tip int reg;
-7 elementele solutiei apartin unui subdomeniu hmitat.
Algori tmul backtracking are cea mai mare complexitate (complexitatea exponentials), iar
algor itmul greedy, cea mai mica. Alegerea uneia dintre aceste metode se face i n functie de
cerinlele problemei :
-7 Oaca se cere determinarea tutur or sol ut i il or , se va alege metoda backtracking.
84 Tehnici de programarc
-7 Daca se cere determinarea so l ut lei opt ime, S8 va alege metoda gree dy. daca S8
poate demonstra ca ea furn izeaza un rezuJtat corect: altfel , S8 va alege metoda
pr oqramarii di namice.
Metodclegrccdy sl proqrarnaroa dinamica S8 folosesc in problemele in care trebuie gasita
solutia optima. In ambeJe metode alegerea elementului x, al solutiei este irevocabil a si
poate duce la obtinerea solutiei optime in cazul probleme lor care au propri etat ea de optim
loc al, adica solutia optima a problemei cu dimensiunea n a datelor de intrare cont i no solu-
tiil e opt ime ale subprobl eme lor similare cu problema initiala, dar de dimensiune mai
mica. Deosebirea dintrecele doua metode consta in modul in care este construita solutia :
1. in cazul metodei prcqrarnarii dinamice , S8 porneste de la structura problemei initiate
care corespunde solutiei optime globale si se descompune aceasta problema in sub-
probleme in care se deterrnina sotutiile optime ale subproblernelor (optimul local). Ea se
poate aplica in problemele in care opt imul global irnpti ca opti rnul local. Din aceasta
cauza, etapa cea mai dificila la aceasta metoda este cea de determinare a structurii
solutiei optirne . Oaca se cunoaste structura solut iei optime, metoda qar antcaza
obt i nerea sol ut io! optime a problemei prin determinarea optimului local.
2. i n cazul metodei greedy , se porneste de la solutiile optime locale si pe baza lor se
construieste solutia optima globala. Problema este descornpusa in subpr oblerne ~ i
solutia este const ruita treptat: se porneste de la rnultimea vida ~ i se alege pe rand
pentru fiecare element al solutiei candidatul optim pentr u acea subproblerna. Alegerea
solutiilor optime locale nu qaranteaza l nsa ca solutia globala obti nuta este si soluti a
optima, deoreee opt imul local nu impli ca intotdeauna opti mul global. Din aceasta
cauza, pentru a fi siguri CB. solutia aleasa este solutia optima, pentru fiecare problema
trebuie sa se demonstreze ca modul de alegere a candidatul ui optim (opli mul local)
impli ca optimul global. Metoda greedy este mai sirnpta decal metoda proqrarnarii
dinamice deoarece la fiecare pas se trateaza numai subproblema curenta, jar ordinul de
complexitate este mai mi c decat in cazul proqrarnar ii dinarnice.
Metodele greedy ~ i backtracking construiesc treptat solutia problernei , Deosebirea dintre
cele doua metode consta in modul in care se construieste sol utia. incazul metodei greedy,
cand S8 alege elementul Xk al solutiei , daca elementul a, care este candidatul optirn al solutiei
nu este element al solut rei, el este indepartat din rnultirnea elementelor candidate la solutie
(A). in acest mod el nu va mal fi verificat al unci cand se alege un alt element al solutiei.
micsorand foarte mult ordinul de complexi tate al algoritmului .
Pentru a obtine solutia dorita folosind un algoritm cat mai eficient se pot combina
metodele lnva tate.
Excmplu. Problema pla' ii unci sumc eu un numar minim de bancnotc eu valori date .
Problema a fost rezotvata cu ajut orul metodei greedy. Folosi nd aceasta metoda este posibil
sa nu obtineu nicio sol uue. sau solutia obti nuta sa nu fie solutia optima. Problema poate fi
rezolvata cornbinand metoda greedy (prin ordonarea vectorului eu valorile banenotelor
dupa criteriul candidatului optim) cu metoda backtracking. Solutia opti ma va fi printre
primele solutii generate. Apelul subprogramului btU se va opn imedial ce se depaseste
nurnarul minim de bancnote Prin combinarea celor doua metode se obtme un algoritm mai
eficient decat algoritmul backtracking, care va permite gasirea sol utiei optime.
In formaticii
85
Metodele divide at irnpera si programarca dinarnica S8 bazeaza pe descomp unerea pro-
blemei i n su bprobt cme si milarc cu probl ema i niti al a. Oeosebiril e dintre cere doua meto-
de sunt:
Divide et irnpera
1. Subproblemele
Subprcblemele sunt independen te si IlU se
cunase de la lnceput s ubprob lernele care apar
in urma descompunerii. De multe ori descompu-
nerea in subprobleme depinde de distributia da-
tel ar de intra re si este posibil ca in aceeasi pro-
blema, pentru date de int rare diferite, sa S8 cbti-
na descompuneri diferite (de exemplu, algoritmul
cautaru binare sau algori tmul sortarn rapide) .
2. Asigurarea oflcientei rnetodel
Este eficienta numai oaca este respec tata regula
de descompunere a problemei in subprobleme
independente. Daca nu este asiqurata indepen-
denta problemelor, metoda devine ineficienta
oecarece, in apelurile recursive, aceeast subpro-
olema este rezolvata de mai rnulte ori
Programarea dinamica
Subprobleme le nu sunt l ndependent e 9i i n des-
compunerea initiala exista subprobleme comune
unor subprobleme de dime nsiuni mai mari, Pen-
tru a se putea rezolva prob lema trebuie sa se cu-
noasca, de la inceput, subprobteme le in care se
descompune problema iniiiala. Aceasta presupu-
ne cunoasterea structurii problemei initiate 9i a
relatiei de recurenta care dete rmina sorutla.
Este eficienta numai caca a subproblerna este
rezot vat a 0 ain qura dat a, solutla sa este
mernorata 9i Iotos fta pont ru a ob t lne s olutille
celor lalte s ubproblcme
3. Modul de descompunerea ill subprobleme
Descompunerea se face tntr-o marne-a "de sus in Descompunerea S8 face int r-o rnaniera "dej os in
jo s" (jop-down"): problema este descom- sus" ("bottom-up"): se rezolva problemele de dirnen-
cosa i n subprobleme din ce in ce mai mici pana se siunile cele mai mici care apar i n problema initiala,
: btin subprobleme ell rezolvare imediata. se rozorva se mernoreazasolutiileJar si se rezolva subprobe-
aceste subprobleme, dupa care se combina solutiile mele de dimensiuni din ce in ee mai mari prin eom-
subproblernelor de dimensiuni din ce in ce mai mari. binarea sotutiilor problemelor rna! mici si memora rea
nai lor solutf
4. Algori tm ul
Algoritmul este rccursiv. Algori tmul este iterativ.
Din cauza acestor deosebiri aceste metode se folosesc pentru clase diferite de probJeme. De
exemplu, problema determi nar!i termenului n al sirului lui Fibonacci . Rezolvarea acestei
probleme prin metoda divide et impera este ineficienta deoarece pentru a calcula termenul f
n
rrebuie sa S8 ca!culeze termenii f
n
-1 fn-z. Dar, In calculul termenului f
n
-1, reapare calculul
termenului fn-z, iar in calculul ambilor termeni apare calculul termenului fn-3 s.a.rn.d. in acest
caz, 5e recornanda metoda proqrarnarii dinamice, calculand pe rand termenii t a. 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 necesar sa se memoreze
intregul sir de termeni, ci pentru fiecare subproblerna i, numai termenii obtinuti In subpro-
blernele i -1 'ii i-2.
I I
Adevarat sau Fals :
1. in algor itmul meto dei backtracking initializ area elernentului k al solutiei 58 face cand
se revine de pe nivelul k+1 la nivel ul k.
86 Tchnici de programarc
2. Algaritmul metodei backtracking se incheie daca s-au testat toate valari le posibile
pentru primul element at solutiei .
3. inalgoritmul backtracking. dupa gasirea unei solutii, S8 revinela nivelul anterior at solunei ,
4. i n algoritmul backtracking. trecerea de la nrvelul k la nivelul k-1 al solutiei se face
cupa ce s-au gasi t toate valorile posibile pentru nivelul k.
5. inalgoritmul backtracking initial izarea nivelului k al solutiei S8 face eu valoarea de pe
nivelul anterior al solutiei ,
6. i n algoritmu l backtracking. daca s-a trecut la nivelul k al solutiei. i nseamna ca s-au
gasit primele k-1 elemente ale solutiei.
7. in algoritmul backtracking, trecerea la nivelul k+1 al sol utiei se face dupa ce au fost
testate toate valorile posibile pentru nivelul k al solutiei,
8. in implementarea recur sive a metodei backtracking revenirea din autoapel este echi-
val enta eu reve nirea la nivelul anterior al solut iei din varianta iterativa.
9. in implementarea 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 g a s e ~ t e solutia optima a problemei.
12. Metoda proqrarn arii dinamice porneste de la solutiile optime locale si , pe baza lor.
construieste solutia optima globala.
13. inmetoda proqrarn arii dinamice descompunerea in subprobleme S8 face .ce susinjos",
14. Metoda greedy se bazeaza pe teorema ca optrmul local implica i ntotdeauna optimul global.
Aleqeti:
1. Algoritmul care implementeaza metoda backt rack ing este :
a. polinomial b. logaritrnic c. exponential d. liniar logaritmic
2. Algoritmul care impleme nteaza metoda sortarii rapide este:
a. lini ar b. logaritmic c. patratic d. liniar logaritmic
3. Algoritmul care implementeaza metoda cautarii binare este:
a. liniar b. logaritmic c. patratic d. liniar lagaritmic
4. Se utilizeaza metoda backtracking pentru generarea anagramelor cuv ant ului rnasca.
Sa se precizeze cuvantul precedent si cuvantul urrnator secvente 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 numerelor cu 4 cifre dis-
tincte care se pot forma cu cifrele O. 2. 4 si 8. Sa se precizeze nurnarul prece dent ~ i
nurnarul urrnator secventei 2840 4028 4082:
a. 2480 ~ i 4280 b. 2804 si 4280 c. 2804 si 4208 d. 2480 ~ i 4280
6. Se utilizeaza metoda backtracking pentru generarea sirului de opt paranteze rotunde
astfel i ncat ele sa formeze 0 succesiune corecta. Sa se precizeze sirul de paranteze
precedent ~ i si rul de paranteze urrnator secventei (0(0)) (000) (O())O:
a. ((00)) si O((())) b. ((0» 0 ~ i O((())) c. ((0))0 si (())(O) d. ((O()) ) ~ i (O)(())
7. Se utilizeaza metoda backtracking pentru generarea subrnuttirnilor mult irnii (1,2 ,3).
Sa S8 precizeze submultimea precedenta !?i submul tirnea 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 for ma t ira
87
c. 6 d. 8
(Bacalaureat - Sesiunea speciala 2004)
c. 4422
b. perrnut arilor
d. 4924
(Bacalaureat - Simulare 2004)
15, Un etev foloseste metoda back tracking pentru a genera subrnul tirnile multimii
{1,2,5,6,9}. Cate solutii (submultimi) care obligatori u contin elementul 2 nu contin
elementul 6 a generat?
a, 7 b. 16
a. Daca se util izeaza met oda backtracking pentru a genera toate permutarile de 5
obiect e 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 ci ncea permutare 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 determinarea tut uror rnodalitatilor de planific are in zile diferite a 4 probe
(rezi stenta. aruncarea sulitei , sarituri , tir) in oricare dint re cete 7 zile din saptarnana.
Problema este echivalent a cu:
a. generarea cornbinarilor de 4 obi ect e luate cats 7
b. generarea aranjamentelor de 4 obiecte luate cate 7
c. generarea cornbinarilor de 7 obiecte luate cate 4
d. genera rea aranjame ntelor de 7 obiecte luate cate 4
(Bacalaureat - Sesiunea speciala 2003)
10, Generarea tuturor sirurilor de 3 elemente, fiecare element putand fi oncare numar din
multirnea {1,2,3,4, 5,6), se reali zeaza cu aj utor ul unui algoritm echivalent cu algoritmul
de generare a:
a. aranjamentelor c. cornbinarilor d. produsului cartezian
(Bacalaureat - Sesiunea specials 2003)
11. Se cere determinarea tut uror rnodalitatilor distincte de asezare In linie a tuturor cetor
n sportivi aflat i la 0 festi vitate de premiere, Problema este echivalenta cu genera rea:
a. partitillor unei mult imi de n obiecte b. aranjamentelor de n obiecte luate cate 1
c. perrnutarilor de n obiecte d. submultirnilo r unei mult.rni cu n obiecte
(Bacalaureat - Sesiunea iunie-iulie 2003)
12. Conditia ca doua dame Q D (de tip structural sa se afle pe aceeasi diaqonala a
tablei de sah este :
a . (Q. l inie==D. l i ni e ) II (Q. co l oa na ==D. co l oa na )
b. abs (Q.linie- D. l i ni e l ==abs (Q. col oana- D.coloana )
c . Q. l i n i e -O .linie == Q. c o l oa na - O. coloana
d.
(Bacalaureat - Sesiunea iunie-iulie 2003)
13. Se cere determi narea tuturor numerelor formate cu cifre aflate in ordi ne stri ct cresca-
toare, cif re alese dintr-o rnultime cu k cifre distincte date. De exemplu, pentru cifrele
alese din rnultirnea {1,5,2) se obtin numerele 1, 2,1 2,5, 15, 25,1 25 (nu neaparat i n
aceasta ordine). Problema este echivalenta cu generarea:
a. partitiilor unei rnultirni b. aranjamentelor de 10 obiecte luate cate k
c. permutarilor de k obiecte d. subrnultirnilor nevide ale unei multirni
(Bacalaureat - Sesiunea august 2003)
14. Cineva doreste sa obtina sa prelucreze toate numerele forma te din trei cifre din
sirul 2, 9, 4 Ie genereaza exact 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 , 494, 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
88 Tehnici de programurc
c. 12345 d. 13254
(Bacalaureat - Scsiunea august 2005)
c. 10 d. 12
(Bacalaureat - Sesi unea speciala 2005)
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 permutari este:
a. 2 b . 4 c. 8 d. 12
(Bacalaureat - Sesiunea iunie-iulie 2005)
Se considera 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
pozi tia 1. De exernplu. pentru n=4, primele trei numere generate sunt: 2143 , 2341.
4123. Pentru n=5, primul numar generat este:
a. 21345 b. 21435
22.
23.
16. Pentru a determina toate rnoda litatile de a serie pe 9 ca surna de numere naturale
nenule distincte (abstractie facand de ordinea termenilor). un elev foloseste metoda
backtracki ng qener and, in aceasta ordine , toate solutiile: 1+2+6. 1+3+5. 1+8. 2+3+4,
2+7, 3+6 si 4+5 . Apticand exact acee asi metoda, el deterrnma sol utii le pentru
scrierea lui 12. Cate solutii de forma 3+... exist a?
a. 7 b. 1 c. 2 d. 4
(Bacalaureat - Sesiunea iunie-iulie 2004)
17. Pentru problema 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 - Sesiunea iunie-iulie 2004)
18. Pentru problema anterioara stabi liti care este solutia cu proprietatea 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 - Sesiunea iunie-iulie 2004)
19. Se gener eaza toate perrnutarile distinct e de 4 obiecte numerot ate de la 1 la 4, avand
proprietatea ca 1 nu este vecin cu 3 (1 nu se afla imed iat dupa 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
(Bacalaureat - Sesi unea augusl 2004)
20. Se cere sa se determine toate mcdalitatile distincte de a programa n spectacole i n z
zile (de exemplu, doua spectacole . Micul Print " ~ i . Pacata" se pot programa in trei
zile, mart i, miercuri si joi, astfel: "Micul Print " - rnarti si . Pacala" - miercuri sau: .Micul
Print" - miercuri ;;i . P'acala" - rnarti : "Micu! Print" - miercuri ~ i ..Pac ala" - joi: "Micul
Prin]" - rnarti ~ i "Pacala" - joi : .Micul Print" - joi si . P'acala" - miercuri etc.).
Rezolvarea se bazeaza pe algoritmul de generare a:
a. combinarilor de n obiecte luate cate z b. aranjamentelor de n obiecte luate cate z
c. cornbina rilor de Z obiecte !uate cate n d. aranjamentelor de Z obiecte luate cate n
(Bacalaureat - Simulare 2005)
21. Se consi dera algont mul care determina toate perrnutarile disti nct e de n obiec te
(numerotate de la 1 la n) i n care nu exista pozitii fixe. 0 permutare (p" pz, .. .. Pn) are
puncte fixe 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
permutari tara puncte fixe exista.
a. 8 b. 9
l nfu r mat icii
89
d. 2 5 6
(Bacal aureat - Simulare 2006)
c. 456 b . 356
24. Se genereaza toate subrnultirnile formate din doua elemente ale rnultimii (5,6,7,8) i n
ordinea: 56, 57, 58,67, 6 8, si 7 8. Daca se util izeaza 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 este:
a. 3 45
Miniproiecte:
Pentru realizarea miniproiectelo r S8 va lucra in oc hip a. Fiecare miniproiect va contine:
3 . doua metode pcntru con struirea algoritmului (care sunt precizate in cazul pn-
melor 8 miniproiecte);
b. justificarea Iolosirii metodelor care au fast alese pentru rezolvarea problemei;
c. explicarea metodelor folosite pent ru construi rea agoritmului;
d. compararea celor doua metode din punct de vedere al corectitudinii solutiei:
e. compararea celor doi algori tmi din punct de vedere al cornplexitatii.
1. Rezolva!i problema acoperirii tablei de sah de dimensiunea nxn cu un cal care porneste
din patratul de coordonate (x,y) folosind metoda backtracking si metoda greed y.
2. Rezolvati problema cost ruirii tevii de lungime L din bucati de teava de lungimi a: folosind
metoda backtracking si metoda proqramarii dinarnice.
3. Rezolva ti problema gasirii unui traseu pentru a ie;;i din labirintul de dimensiunea nx rn,
stiind ca se porneste din patratul de coordonate (x,y), folosind metoda greedy si metoda
backtracking.
4. Rezolvat i problema platii unei sume cu bancnote cu valori date, pentru fiecare valoare
de bancnota avand la dispozitie un anumi t nurnar de bancnote, folosind 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 dinamice ;;i metod a greedy.
6. Rezolvati problema deterrninarii sumei maxime l ntr-un triunghi folosind metoda greedy
;;i metoda proqrarnarii dinarnice .
7. Rezolvati problema deterrninarii unui subsir crescator de lungime maxima folosind
metoda greedy si metoda proqramari i dinamice.
8. Se dau n paralelipi pece avand fiecare dimensiuni le ar, bi ;;j c., Sa se construiasca un
turn de lna ltime maxima prin suprapunerea acestor paralelipipede. Un paraleli piped
poate fi asezat pe orice fa\a Un paralelipi ped poate fi aranjat peste un alt paralelipiped
numai daca fata lui nu depaseste fata paralelipipedului pe care este pus. Rezolvati
problema folosind metoda backtracking ;;i metoda proqrarnarii dina mice.
9. Pe 0 tabla de sah de dimensiunea nxn un cal porncste din patratu l de coor dona!e
(X1,Y1) si trebuie sa ajunqa in pat ratul de coordonate (X2,Y2) Sa se gaseasca traseul de
lungime minima.
10. 5e 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 nurnar.
2. Implementarea
structurilor de date
variabile locale I
zona de (alocarea implicita)
stiva si stemu lui (s tack )7
I(variabile gIObal:t-
-. segmentul de da te
I variabile local e stati ce I
(alocarea implicita)
I (alocare cu stati c)
pr ocesor ului
variabile local e I
(alocare cu reg ister )
2.1. Tipuri de date specifice pcntru adresarea memoriei
Memoria internaa calculatorului este orqanizat a sub forma unor locati i de dimensiunea unui
octet, numerotate consecutiv, pornind de la O. Aceste nurnere, exprimate 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. Fiecarui program
aflat in executie, sistemul de operare 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 principal (care
corespunde fisierului sursa). Spatiul de memorare este Irnpartit i n patru segmente, iar proce-
sorul are aeces la toate cele patru segmente, ale carer adrese Ie qestioneaza prin intermediul
unor reqistri :
-7 segment ul de cod - in care S8 incarca instructiunile programului care se executa;
adresa de i nceput se pastreaza in registrul CS;
-7 segment ul de dat e - in care se incarca anumite date ale programului care se executa
(de exemplu, variabilele globale) ; adresa de inceput se pastreaza in registrul OS;
-7 se gmc nt ul de st iva a sistemului - in care se incarca adresel e de reveni re din subpro-
grame , i variabilele locale cu care lucreaza subprogramele; pentru gestionarea sa se
folosesc doi reqistri : SS (in care se pastreaza adresa de la baza stivei) ,i SP (i n care se
pastreaza adresa de la varful stivei);
extraseg ment ul de date - in care se i ncarca alte date ale programului; adresa de
i nceput se pastreaza in registrul ES.
Sistemul de operare aloca spatiu datel or in mai multe zone de mernorie- in functie de
modul in car e au fost declarat e in program
o dat a rnanipulata de program prin intermediul unei variabile de memorie este caracteri zata
de mai multe at rib ute - pe care Ie prirneste in momentul in care este declarata in program:
-7 Nurnele- Este identificatorul folosit pentru referirea datei in cadrul programului (in
exemplu - a).
-7 Adresa- Este adresa de memorie interna la care se aloca spatiu datei respective, pentru
a stoca valoarea datei (in exemplu, datei i se aloca adresa adr in stiva sistemului).
Informatica
void sb ( )
lint
2 octeti / valoarea date;
..
a =numedat4000000001100
1
0t-------'
. . . } ad r = adresa zonei de memorie adr+2
Memoria intema
91
-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 intern al datei (rnultirnea In care poate lua
valori data). operatori i care pot fi aplicaf pe acea data si modul i n care data este
reprezentata i n memoria 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
numeric - aritmetici, relationali, logici, logici pe biti etc. - reprezentarea datei in
memoria internaS8 face prin conversia nurnarului din zecimal in binar).
-7 Lungimea. Este dirnensiunea zonei de memorie alocate datei 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 durata de executie a blacului i n care a fost declarata, adica pe
durata de executie a subprogramului sb).
Pentru a putea manipula 0 data , programul 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 aj utorul adreselor
de memorie, In limbajul C++ sunt implementate urrnatoarele tipuri de date:
-7 tipul pointer sau adrosa
-7 tipul roferinta
Se poate folosi un nou criteri u pent ru elasifiearea dat el or:
I contlnutului I
,
\,
Operanzii sau dateIe care fac ob iectuJ Adresele sau datele care permit
operat iilor de prelucrare. adresarea ope ranzilor.
Sun! dateale carer valori sunt tolosite ca Sunt dateale carer valori sunl folosite pentru
operanzi in cecru! expresiilor.utilizete pentru localizarea pe suportul de memorarea datelor
calcularearezultatelorcerutede problema. caresunt preJucrate(operanzii).
2.2. Tipul de data pointer
Pointerul este 0 vari abila de memoria in care se memoreaza 0 adresa de memori e.
Obsorvatle. Un pointer se asociaza intotdeauna unui tip de data (de exernpl u: int, char ,
fl oat etc.) numit tip de baza. Se spune ca un pointer indica a zona de memorie care
92
Impl cmen turcu st r ne tu r ilor de date
contine 0 data care are tipul de baza. Este necesar sa S8 asocieze pointerului un tip de
data deoarece el mernoreaza numai 0 adresa si, pentru a manipula cont inutul unei zone de
memorie, compil atorul trebuie sa cuncasca dimensiunea zanei de memorie care incepe de
la acea adresa ~ i sernnificatia continutului, adica ce algoritm de decodificare trebuie sa
foloseasca pent ru a transforma secventa de biti (din acea zona de memorie) intr-a data.
2.2. 1. Decl ararea variubi lelor de tip pointer
Decl ararea unei variabil e de tip pointer S8 poate face prin instructiunea decl ar ativa:
t i p_ da t a *nurne var iabila ;
II - .,.
l ipul datei stocate la adresa merr-orata 1numele var iabiJei de tip pointer i n care se
in pointer (Hpul de baza ) mernoreaza adresa unei variabile de
memoria care are tipul de beza
operatorul de referl nt a
Exernplu :
char *p ;
int *q ;
f l o a t *r ;
S-au deflnit trer variabile de lip adresa (pointeri): p catre tipul char, q catre tipul inl si r catre
tipul fl oat. Numele acest or variabile de memori e sunt p, q si r , iar tipul de baza al fiecarei
variabile de tip pointer este cha r , int, respectiv fl oat. Asadar, p esl e 0 variabila de tip
adresa a unei locatii ce confine un caracter care ocupa 1 octet , q este 0 variabila de tip
adresa a unei 10ca\Hce contine 0 data numerics i ntreaqa care ocupa 2 octeti, iar r este 0
variabila de tip adr esa a unei lccatii ce contine 0 data nurnerica reata care ocupa 4 octeti .
Se poate declara un po inter catre ti pul de data i nregist rare (adresa unci Inreqi st rari).
Exemplu:
struct punet {int x ,y; };
punc t; *p;
S-a definit variabila p de tip adresa cat re tipul inregi strare punct , adica 0 adresa a unei
locatii care contine doua date numerice intregi de tip int ce ocupa 4 octeti.
Pointerul zero are valo area 0 si i ndi ca zona de memori a de l a adresa O.
Pentru Iimbajul C++ adresa 0 i nseamna 0 adresa care nu este valida pent ru date , adica 0
adrcsa inexi st ent a.. Altfel spus, pointerul zero nu indi ca nimi c, Acest tip de pointer este
folosit ca t erm in at or in structurile de date care sunt prelucrate cu ajut orul pointerilor.
2.2.2. Constant e de tip adresii
a constanta de t ip adresa este un pointer al carui
co nti nut nu poat e fi modifi cat.
Exc mpl u. Con stanta 0 - car e sernn.fica .adresa nula" (adresa inex istenta sau adres a
nealocata) - este util a, in unele cazuri, pentru initializarea valcri i unui pointer. in locul
constantei numerice literale 0, se poate folosi co nstanta simboli ca predefi ni ta NULL.
Observatie La declararea unui t abl ou de memori a, acestuia i se aloca 0 zona de memori e
de dimensiune fixa, lncepand de la 0 anumita adresa de memorie. Ad resa de la care se
aloca zona de memor ie est e 0 const ants (nu poate fi rnodificata) !?i ea este asociata eu
Informaticii
93
numele tabloului de memorie. Numele tabloului de memoria este tolosit de compi latorul
C++ ca a constants sirnboli ca de tip adrosa (pointer catre tipul de baza dat de tipul
elementelor tabloului) .
Tablau l de memorie este 0 structure de date ornoqena, adica 0 colectie de elemen te de
acelasi tip, si fiecare element ocupa acelas i nurnar de octeti . Acest mod de memorare
permite determinarea adresei fiecaru i element pornind de la adresa sirnbolica a tabloului ,
care va reprezenta adres a primul ui element. Identifi carea unui element de tablou de
memorie 58 face folosind pent ru fiecare element un grup de indici (nurnarul de indici fiind
ega1 cu dimensiunea tabloului), adresa elementului calcu'andu-se fa\8 de un element de
referinta care este adresa tabloului. Deoarece adresa tabloului este si adresa primului
element, In limbajul C++ numer ot ar ea indicilor se f ace pornind de la 0, indicele repre-
zentand deplasarea elernentului fala de adresa tabloului.
Exemplul 1: int v [5] ;
Zona de memorie alocata unui vector are dimensiunea n x slzeof ttipbaza). De exemplu,
vectorului v i se va aloca 0 zona de memor ie de 5xsizeof(i nt)=5x2=10 octeti. ldentificarea unui
element de tablou de memorie se face folosind un singur indice (i). Oaca adresa tabloulu i v
este adr, ea este si adresa elementului vIOl , iar adresa elementului v[i] este:
adr + ixsizeof tt ipj baza}.
2 octet i
.--.

adr adr+2 adr+4 adr+6 adr+8
adr este a adresa de memorie care are valoarea
con stantei si mboli cev
Pentru exemp lul de rnai sus, adresa elementului v[2] este:
adr + 2xsizeof(int) = adr + 2x2 = adr + 4.
Exemplul 2:
04
4 0cteti

1
linia 0
I
linia 1 linia 2
1
lini a 3
1
.>: 1
a[O][OI I a[0][ 1] 1 z octeu a[3][0] I a[ 3][11 I
f . ',. f
adr adr+2 a[ 1][0] I a[1][1] a12][0] I a[2][ 1] I d +12 adr+14
t .... a r
adr+4 adr+6 coloana 0 coloana 1
adreste 0 adresa de memorie care are valoarea constantei simbolice
a
Alocarea memoriei unei matrice 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 elemente. De exemp lu, matricea a are 4x2=8 elemente ;;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 vector cu 4 elemente de tip vector cu 2 de elemente de tip int). Zona
94
Implementarea 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 4x2xsizeof( i nt) =4x2>< 2=16 octeti. Identificarea unui
element al rnatricei se face folosind doi indici (i j ). Adresa tabloului este adresa prirnului
element, a[O][O] . Daca adresa tabloului este adr, adresa elementului este:
adr + i xnxsi zeof(ti p_baza) + j xsi zeof(lip_baza)= adr + (i xn+j) xsizeof(ti p_baza) ,
Pentru exemplul de mai sus, adresa elementului a[3] [1] este:
adr + 3x2xsizeof(int) + 1xsizeof(int) = adr + 3x2 x2 + 1x2 = adr + 14.
2.2.3. Opera tori pcntru variabile de tip pointer
Pe variabilele de tip point er se pot aplica urmii toarele tipuri de operatori:
oper at ori speci fic i ,
operatorul de at ribuire,
-7 operat ori ar it met ici ,
-7 operatori relational l .
2.2.3.1. Operatori i specifici
Operatorii specifici variabilelor de trp pointer sunt:
-7 Operatorul & - operatorul de ad resare . Se aplica pe 0 vanabila de memorie sau un
element de tablou de memorie l?i furnizeaza adresa variabilei de memorie, respectiv a
elementului de tablou. Rezultatul obtinut prin aplicarea acestui operator este de tip
pointer. Operatia se nurneste referenti er ea unci variabile de memorie.
Operat orul * - operatorul de redi rect ar e. Se apnea pe 0 variabila de tip pointer
furnizeaza valoarea var iabil ei de memorie care se la adr esa rnemorata i n
pointer. Rezultatul obtinut prin aplicarea acestui opera tor este de tipul date i asocia te
pointerul ui. Operatia se nurneste doret orentierea unui poi nter.
& - operatorul de adre sare
I
rcf crent i erea
...
nume variabila de
variabi lei de memorie
adresa variabila de
memorie memorie
(continut) (pointer)
'* - operatorul de redi rectare
dereterennerea pointerului

Observatii :
1. Pointerii reprezinta adrese ale unei zone de memorie (continutul unei variabile de me-
morie p de tip pointer este 0 adresa de memori e).
2. Acce sul la 0 zona de memorie se poate face fie folosind identificatorul asociat zonei
de memorie (numele var iabilei de memorie), fie aplicand operatorul de redirectare • pe
adre sa zonei de memorie (continutul adresei de memorie indicate de un pointer p se
refera cu lo p).
3. Dimens iunea si sernnific ati a continutului unei zone de memorie indicate de un pointer
depind de tipul pointerului.
Exemplul1
int a =1 0, *p =&a ;
cou t « p« e nd l «a« e ndl ;
cout« p«endl« \ u« e ndl;
Informatica
95
S-a definit 0 variabila de memorie de tip int (a) 0 variabila de tip pointer catre tipul
int (*p) carei a 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 l ntreaqa, una de 2 octeti pentru variabila pointer
identificata prin numele p, in care S8 pastreaza 0 adresa de memorie (i n exemplu, adresa
vari abilei de memoria a). Continutul Beeslor zone de memoria asta prezentat in figura.
I I
2 octe\i 2 Geteti
4
t adC= --- :1
10
0
Memoria interna
b i 58 atribuie valoarea de la adresa
udi ca ve Lce ree v ar i.abi.Le i. a -Joe !
Ilafi$ea za 10 10
I Joevariabilei a c a r ei a dresa este memorata in
(adica , variabilei a ) i va10area 1 00 */
u« b i :00 10
Ptin instructiunea cout-oc- p i se afiseaza continutul variabilei de memorie a. Referirea la
aceasta variabila de memorie S8 face nu prin numele variabilei, ci prin operatorul de redirec-
tare '/< aplicat pe variabila pointer p in care este rnernorata adresa variabilei a. Aceasta instruc-
tiune are acelasi efect ca instructiunea cout -oc a , . Prin instructiunea ccut-ocp, se afisea-
Z3 0 constants hexazecirnala care reprezinta 0 adresa de memorie (adresa adr la care este
memorata variabila a). Aceasta instructiune are acelasi efect ca si instructiunea cout« &ai.
Exemplul 2
int
b= *P i I +va riabilei
memorat a in variabila p ,
cou txca-cc ' u« b i
*p=l OOi
point. e rul p
cout« a« "
Observatie Daca tipul de data indicat de pointer este tipul i nregistrare, data conune mai
multe carnpuri . Operat orul de red ircctare prin care se furni zeaza co ntinutul unui camp
este operatorul -> si se numeste operatorul de selectie indiracta amcmbrului unci
structun
4
4
/ / a fi$eaza 3
/I a::i.'?eaza 3
<n ume _ va r i a b i l a _ po i n t e r> - > <n ume _ c a mp >
EI coniine doua refer inte: una la continutul adresei indicate de pointer si alta catre un
membru al l nreqi strarii (carnput). Rezultatul furnizat de expresie este valoarea rnembrului
selectat (a carnpu lui). Este un op erator bi nar care are prioritate maxima asociat ivi-
tatea de la stanqa la dreapta.
Exemplu
str uct t i n t X ,Yi } i
punct
cou t « a . x«" "« a . y« endl ;
cou t -oc p - c-x-c-c" "« P - >-f ;
Observati i
1. Operatorul * se poate folosi in ambii membri ai unei operatii de atribuire:
,nt II ( 1)
*q= *p; I I (2)
96 huplcmcntarcu strncturilor de date
de 12 adres a in va ri abil a q , va r i a b i-
lei b , i se atribuie va Loa r ee de La acir e s a memo r a t a 1.:1
vari abila p , adlca valoarca a
cc ucc c acc'' "« 0 ; //a:i:;;eaza 10 10

I

I
P "p adr_3
p a ·
*p adr_3 : *q=*p

I

q • b adr b
q -
>
Memoria interna (1)
v
Memoria i ntorna (2)
2. Constructia rp (p fiind un pointer catre un tip de data) poate aparea i n orice expresie in
locul unei variabile de memorie care are acelasi tip ca si eel asociat pointerului :
int a ""lO, *p=&a;
*r-'= *p +S; /+ Lnc remencea z a cu 5 ve Loe r ee var i abi.Le i. de 1a aci r e aa
P, valoarea var i 0bilei a*/
cour.c-ca-c-c' ' "<xep , 15 15
3. Operatori i I\: si & sunt operatori unar i si au prioritate mai mare decat operatorii
aritmetici , relationali, logici ;;i de atribuire.
int a=iO , *p"""' &a ;
*p+=l ; j k co. 1 valoarea de ],a adresa memo-
ra t a in p , a dic5 vaJ. oa r e a va riabile i a " j
cou t c'<e , j/af':;;caz,'j 1 1
4. Asoci ativ ita tca operatorilor unari este de la drcapta la stanqa . 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:
int .1--=10 , *.r:= &a ;
++* p ; / - .i ncr eme nt.eaz a ell 1 va.i oare.s va r Labi. Le.i. de La adr e s a
memo r a t.a in p , ad.ice ve Loa r e a var i.ebi Le i a ',1
courc c a , / 100 f =-$eaza 11
{*1:. ) ++ ; I ' .i ncr cmcnt.eez a cu 1 vaLoa r ea va r i.abi.Le.i de La ecreee
r.emo r e t a in p, eo f cs i nc reraen tea za co. .1 va roe ree ve r i.abi Lei a *1
cout« a ;
5. Datorita tehnicii de supraincarcare a operatorilor permisa de limbajul C++, caracterul •
(asterisc) este folosit 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 pointeri 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.bi10i a i sc a t ri.bui.e prc.dus u l d.lr.t ro va.Loa r ca de
13. udreec mcmor at a in .0, vatoaree va'r i.abi.Lei. b, s i. vo tceree
de la adresD i n g, ndica variabilei c f i
cout« a ; 200
Iulurmat icii
97
'b=a+1O;
._- _._ - - - -
<->
b-* +10;
a b;
<->
b ;
a++; ,-> ( *p )++ ;
a-a+5 ;
<->
b-a*a;
<-> ( *I' ) *
a *-5 ;
<->
*p
L5;
Considerand declaratia: int <1 ,0, * p;.;;;& a; instructiu-
nile de atribuire din tabelul aiaturat sunt echivalente:
Asadar, local izar ea unei date memo rate intr-o varia-
bita de memo rie se poate face prin:
-7 adresare directa - folosind numele variabilei de
memorie (in exemplu a);
-7 adresare lndlrocta - folosind 0 variabi la de tip pointer In care este mernorata adresa
zonei de memorie In care este stocata data (In exempJu, p).
----.... ......-..... 1. Scrieti un program In care declarati 0 variabila de memorie de tip
f l oat un pointer catre tipul float , cititi de la tastatura valoarea
variabilei l i afisati valoarea folosind cel e doua metode de adresare:
adresarea directs adres area indirecta.
2. Scrieti un program in care declarat i - 0 variabila de memorie de tip inregistrare care va
contine doua carnpur i, corespunzatoara numitoruJui nurnaratorutui unei fractii, 0
variabila de tip pointer catre tipul imegistrare -' , citit i de la tastatur a valorile carnpur ilor
din i nregistrare afisaf valorile acestor carnpuri folosind cele doua metode de adre-
sare: adresarea directa adresarea indirect a.
2.2.3.2. Operatorul de atribuire
Unei variabile de tip pointer i se poate atribui numai 0 valoare care reprezinta 0 adresa de
memorie. Ea poate fi exprirnata prin:
-7 0 adresa de mamorie obtinuta prin apl icarea operatorului de adresare pe 0 variabita
de memorie definita anterior, de acelasi tip cu tipul de baza al pointerului . Dupa operat -a
de atribuire , variab i!a de tip pointer va adresa zona de memorie in care este stocata
vari abila de memorie.
-7 0 alta variabila de tip pointer care se retera la acelasi tip de baza. Dupa operatia de
atribuire, cele doua variabile de tip pointer vor adresa aceeas i zona de memorie.
-7 0 constanta de tip adresa de acelasi tip cu tipul de baza al pointerului.
- Numele unui tablou de memori e este a constants de tip adresa. Dupa operatia de
atribuire, variabiJa de tip pointer va adresa zona de memorie in care este stocat pri-
mul element al tabloului - in cazul vectorulul . elementul cu indice!e O.
Const ant a 0 sau const anta sirnbolica predefinita NULL - care corespunde pointe-
rului zero - poate fi atribuita oricarui tip de pointer.
-7 Rezultatu l unei expresii constr uite cu operanzi de tip adrosa a unor date definite
anterior care apartin tipului de baza al pointerului .
Observati e . Unui pointer i so poate atribui un pointer de all t ip dedit l ipul de baza
numai daca se aplica operatorul de conversie expliclta de tip . Acest operator trebuie
aplicat lnsa cu foarte mare precautie , deoarece de multe ori rezultatul obtinut nu este cel
dorit.
int *p = &a ; float *q;
q=( f l o a t *) p ; //Nerr,ori a Lnt e rnz (1)
expres j c i (ELoa t.v j p e s t c f1oat * , adi.cei pointer cat re tLpuI
float, :;.;i in eccs t mod po i .nt e r-u-L ui. q i s -a putut c t ri. bu.i. a drc c a
memor a t.S in po.i.nLe ruI p "/
c oo t-cc vqc-cendj • 1/ Af i sea za 1 .40129 l:J e -iJ tl , un numar rea l .
98
Implcmcutarea struct urilor de date
q
Pointerul q i ndica 0 zona de de tip fl oat de 4 octeti , din
car e primi i 2 oc t.c t i con r in repr e zentarea in complemen t fa t a de 2 a nu-
mar'uLui. i n t r e g 10 , La r urma t .or.i.L 2 oc t.e t ; 0 valoar e r ezLdua La . ru st. r ue -
t i unea de afi$are face convers i a val orii memora te , di n r eprezentarea i n
f ormat i nt e r n in r epr ezentar ea in extern, interpre t and- o ca pe un
numar r ea l reprezentat in virguia mobila sirrp l a precizie */
*q=l O: cout« *q« endl ; II Afi$eaza 10
p== ( i nt*) q ; 1/ l-lemor La Ln t.e r na (2)
I/pointerului p i s -a a t ribuit a d r e s a memorata in poi nterul q
cou t«*p; II Afi$ea za Of u n numa r i n t reg .
p indica 0 zona de memori e de tip int de 2 octet i , ca re re-
prezinta pr.imi i 2 octet;. i di n grupul de 4 oc t et;.i in care a fo s t r epre zen-
tal in v.i rqu La mobi.La s Lmp.La precizie nurre ru l real 1 0 . j nst ruct.Lunea de
face conversia valorii memorate din r epr e zent a r ea in f orma t
in in extern, ca pe un
intreg r e pr e zent a t complement fat a de 2
20cteti
(
)
adr
p
20cteti
)
adr
Memoria interna (1)
q
2 octet i reprezentat in vi rqula
...I i :::e\y ....+ .j sjmpla precizie
.> .1
4
1
)'
Memoria iriterna(2)
Exernpl ul 1:
c ha r c = 'A ' , *p;
p=&c; P tip pointer ca:re caracter i se at ibuie
adresa vari a bilei de memorie c
cou t-c-cc-oc" "<xep : I A A
Exernplul 2:
int 0=10 , *p=&a , * q ;
q=p; l ir poi nt e rului q i se a tribuie va l oar e a p oi n t e r ului P, adi c a
a dres a va r i ab i l e i a
cout« *p « " "« *q ; 10 10
Exemplul 3: Numel e unui vector este numele unei var iabile de rnemorie, dar ;;i 0 con-
stanta de tip adresa CII tipul de baza al elementel or vectorului , care indica primul element
al vectorului. Pointerului p i se poate atribu i adresa vect orului a exprirnata prin:
In1"" f ill at ira 99
-7 cons tanta sirnbo lica a;
-7 operatorul de adresare & aplicat pe numele variabil ei a;
-7 operatorul de adresare & aplicat pe identlficatorul primului element al vectorului a[O],
iar urrnatoarele operatii de atri buire sunt echivalente:
p=a <-> p=&a <-> p = &a [OJ *p <-> a[O]
int a[lOI , i ,k-l , *p ;
f or (i:0; i <10 ;1++) a[ i] =k++ ;
p=a ; j Jvari a b i l ei p i s e a tribuie nurnel e vector ului d , care
e s t e 0 c o ns t a n t a simbol ica de t i p adresa * /
cout.cc ep-;c" "<ca l Oj c c e nd L, //afi $eaza 1 1. - va Ioa rea e l ementul u i a l O]
Excmplul 4: Numele unei matrice este numele unei variabil e de memorie, dar 0 con-
stanta de tip adresa cu tipul de baza al elementelor matricei, care indica pr imul element
al rnatricei. Pentru un pointer p cu tipul de baza al elementelor matricei a, care trebuie sa
ndice pr imul element al matricei, urmatoarele operati i de atribuire sunt echi valente :
p=a <-> p=&a <-> p=a[ O] <-> p=&a[O] [0] *p <-> a[O] [0 ]
i n t a[lOJ
f or
for (j-O; j<lO;jH) a l i ]
p =a ; I * va r iabilei p i SP e t ri bu.i e n umel e ma t ricei d , c a re
este 0 cons t a n ta simbolica de tip adresa k /
ccutxcepc-;'' "« a [OJ [0] <cendk , / 1 1 - veuocr ea e.lenentulua a (OJ [0]
Exempl ul 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 matr icei a , c a re este 0 c on s t a n t a */
cou t « *p« " "« a rO] {O]« e nd l ;
1 1 - v a Loe rce e Lemen t uLu.i a[Ol [ OJ
Exempl ul 6:
.i n t; *q ;
q=O; II pointerului q i 5e atribuie consta nta 0
=out«*q « endl ; deoarece pointerul q are
v a Loa r-ea 0 s i e I fit; indica n i.c i 0 a d r- e s S de rnemor Le ... /
q=NULL; II q i 5e atribuie constanta simbolica NULL
c out«*q; !knu nimic deoarece pointerul q are
va Loa r e a NULL s L el nu indica ni ci G adresa. de memo r i e ... /

Unui pointer nu i se poate atribui valoarea unei constante intregi ,
Atcntie • chiar daca este a constanta hexazccimala, deoarece programatorul
. . nu are acces direct la adresele de memorie pentru a Ie gestio na.
.Jnei date nu poate sa ii atribuie 0 adresa de memorie decat sisternul de operare.
Deoarece nu mele tabl oului de memori e este folosit de cornpila-
torul C++ ca 0 constanta simbolica de tip adresa, unei variabile
de tip tablou nu i se poate atribui a alta variabila de tip tablou sau un
: ointerI ca in exemplul urrnator :
100 IIlIJllcIllcnta rca st r nct ur ilor dc datc
i n t a [ 1 0], b [ 1 0 ], *!p &b ;
a=b; a=p ; II Er oare ! Une i cons t arrt e nu i se poa t.e mod.i f i.ca va Lo area
Scrieti un program in care declarati 0 variabi la de memorie de tip i nre-
qistrare. care ccntine coua campuri cores punzatca re numitorului nu-
rnaratorului unei frac fii si 0 variabila de tip pointer catre tipul inregistrare
;;i care sa realiz eze urrnatoare!e:
a. atri bui e pointerului adresa variabilei inregistrare;
b. citeste de la tastatura valorile pentru numerator numitor;
c. afise aza fractia simp lificat a - rezultatele S8 obti n in doua variante, folosind cate una
dintre cele doua metode de adresare (adresarea directs ;;1 apoi adresarea indi recta)
;;1 S8 cornpara rezultatele obtinute.
2.2.3.3. Operatorii aritmetici
Operatiile aritmetice permise asupra pointerilor sunt:
-7 Adunarea sc aderea unei constante - operatorii + si -.
-7 Incrementarea decrementarea unui pointer - operatorii ++ --.
-7 Sciiderea a doi po interi de acetasi lip - operatorul -.
Toate operatiile aritmetice cu pointeri catre un tip de baza se execu-
Atcntie ta unilalea egal ii cu sizeof(lip_bazii) , adica eqala cu
nurnarul de octeti necesari pentru a memora a data care are tipul
tip_baza. De exernplu, incrementarea unui pointer cat re tipul int va considera unitatea
eqala cu 2 (numarul de octeti necesari pentru reprezentarea tipului int) noua adresa se
va obtine prin adunarea constantei 2 la adresa initiala mernorata de pointer.
Operatorul pentru adunarea sau scadorea unci cooatallte est e:
p + k sau p - k
unde p este un pointer catre tipul tip_baza care rnernoreaza a adresa adr, iar k 0 consta n-
ta Rezultatul este a adresa care se calcuteaza aslfel : adr+kxsi zeof(tip_baza ), respectiv
adr- kxsi zeof(lip_baza).
Obssrvatie: Operatia de adunare este cornutativa: p+k = k+p .
Operatorul pentru i ncrementarea si decremcntarea unui pointer este:
p++ sau p- -
unde p este un pointer catre tipul tip_baza care memoreaza a adresa adr. Rezultatul este
a adresa care se calculeaza aslfel: adr+sizeof(lip_baza ), respectiv adr -sizeof(lip_baza).
Operatorul pentru scade ro a a doi po interi este:
p q
unde p si q sunt doi pointeri catre acelasi tip de baza, care indica elementele aceluiasi
tablou de memorie, adresa rnernorata de p fiind mal mare decat cea rnernorata de q (p
indica un element de tablou situat in memorie dupa elementul indicat de pointerul q).
Rezultatul este un nurnar intreg care reprezinta nurnarul de cleme nte aflate intre p ;;i q.
Operatiile aritmetice cu pointeri au sens numai dac a adresele indi -
cate de pointerii opcr anzi si de pointerul rezultatului expresiei sc
pastrcaza i n spa t i ul de adrcsc ale unui ta bl ou de memori e. Sin-
ln furmaticii
101
gura exc eptie accept ata este cea a pointe rului care indica adresa unui element situat
imediat dupa ultimul element al tabloului.
Exemplul 1 - in cazu l in care operatorii aritmet ici se aplica pe pointeri care nu-s: pastreaza
valorile in spatiul unui tablo u de memorie, rezultatele obtinute nu au nici un fel de relevanta.
i n t d=10 , *p =&c, *g =p; cout.c-cp'<-;" "<cs p c c e n d j , "
p ++; cout .c-cp-c-c" "<xe pc -ce rid L: p -I-! ; cou t.c-cpc c" "<cvp -c -cendj, ,
de memo rLe .i nd.i. c at.a de po f nt ez- dupe f Leca r e ope r a t Le de
i nc r eme nt a r e cont;. i ne 0 va10are r ezidual a care nu a re ni c i un f e l de
i n cad r ul p rogramului*f
c out « p- q ; II 2
Exemplul 2 - Se inve rseaza un vect or in el l nsusi. Se folosesc doi pointe ri p si q cat re ele-
mentele vectorului care se interschimba .
i nt
cou t« " n= " ; c i n» n ;
for (p=a ; p <Zl +n ; p ++) {co u t.c-c ve Lemcrrt uL "« p - a +l « " = "; cin» *p;}
for (p=a ,qo:;; a -t n-1;p<q ;p /-j , q - - ) Laux v vp , *p o;; * q ; vq-ca ux r }
f o r( p=a ;p<a+:n ; p ++ ) c o u t «*p « " " ;
Obsorv ati e. Prin definitie, operatorul i ndice al tabl oul ui ([ ] ):
7 se aplica pe doi operanzi x :,i y (x[y] sau y[x]), x fiind un pointer si y un intreg;
-7 realizeaza adun area dintre poi nt erul x ;;i constanta y , obt inand adre sa elementului
y al vectorului de la adresa x;
-7 rezultatul furni zat este valoarea indicata de pointerul obtinut , adica valoarea ele-
mentului y al vectorului de la adresa x: x[y]=y[x] ='(x+y).
Este un operator binar are prioritate maxi ma si asociat iv itatea de la sta nqa la dreapta .
Elementul i al vectorului a poate fi identificat pri n a[i], deoarece ope ratorul indi ce al t a-
blo ul ul ([]) execut a suma dintre pointerul a (0 adresa) si constanta nurnerica i. Prin apli -
carea acestui operator se obt ine valoarea de la adresa elementului i. Deoarece operatia
de adunare dint re un pointer si 0 constanta este comutativa, urrnatoarel e expresii sunt
echivalente si se pot folosi pentru ident ificarea elernentului i al vectorului :
a [i] <-'> * ( a+i ) <-'> * ( i + a ) H i [ a ]
Un element al mat ricei a poate II identilicat, folosind cei doi indici i :,i j , prin a[i][j] .
Asociativitatea operaton..Iui indice al t ab l oul ui fiind de la st anqa la dreapta prior itatea
sa fiind cea mai mare, calcularea adresei elementului se va face asttel : mai Inta i se
executa suma dint re pointerul a si constanta i si apoi suma dintre rezultatul obt inut
anterior si constanta j . Prin aplicarea opera toril or indi ce al tablo ul ui se obtine adresa
elementului din linia i coloana j , urrnatoarele expresi i fiind echivalente:
a l i ] [j] <-'> *( a[i]+j) <-'> (*(a+i) ) [ j] <-'> *(*(a+i) +j) <-'>
*(&a [ O] [ O] +n * i + j )
2.2,3.4. Operatorii relationali
Operatorii relationali care pot fi aplicaf asupra pointerilor sunt:
-7 Operatorii de i negali t ate : <, >, <= >=
7 Operatorii de egal ita te == :,i !=.
Evaluarea unui operator relational aplicat pe doi pointeri p ;;i q se face prin anal iza dife-
rentei p-q.
102 lmplemcntareu st r uct uri lor de dat e
Exemplu - Se afiseaza ordinea in care apar doua valori x y l ntr-un vector cu numere
intregi. Se folosesc doi pointeri p si q catre elementele vectorului. Se parcurge vectorul
folosind pointerul p pentru localizarea valorii x si pointerul q pentru localizarea valorii y.
Stabilirea ordini i de aparitie in vector S8 face prin compar area celor doi pointeri (a adreselor
memorate in pointeri).
int x ,y, a[lOO] , *p=a , *q =a ;
c out« " n= " ; c Lroc-n :
f or ( ; p <a+n ; p++) {c ou t-ccve Lernent u I "<cp- ia-rl cc"> " ; cin» *p ; }
cout«"p r i ma va l oar e= "; c i n» x ;
cccccc? a doua va .J.oa r e= " ; c i n» y;
p =a ;
while (*p! =x ) pit ;
while ( *q !=y) q++ ;
if (p>q) cout-ccvva l car e e "<c y-oc '' apare ina i nte a valori i "« X i
e lse cou t« "va l oa r e a "« x« " apare i naintea valorii "« y;
Scrieti urmatoarele programe, in care prelucrarea vectorilor se va face cu
ajutorul pointerilor. Elementele vectorilor se citesc de la tastatura.
1. Se sterqe elementul cu valoarea k dintr-un vector cu numere intregi .
Valoarea nurnarului k se citeste de la tastatura .
2. Se insereaza elementul cu valoarea x inaintea elementului cu valoarea y. Valorile
numerice x y se citesc de la tastatura.
3. Se insereaza elementul cu valoarea x dupa elernentul cu valoarea y. Valorile
numerice x si y se citesc de la tastatura.
4. Se ordoneaza crescator elementele vectorului.
5. Se afiseaza elementele comune din doi vectori a b - a sinqura data.
2.3. Tipul de data referintii
Acest tip de data permite folosirea mai multor identificatori pentru aceeasi variabila de me-
mone. Declararea unei variabile de tip referinta 58 poate face prin instructiunea declarativa:
t ip da ta &nume va r iab ila = nume v a r i a bi l a refer itai
tipul se j -\ numele vana:ei de care se refer.
retera vanabila de vanabila de memorie deflmta
memorie defi nita
numele variabilei de memorie care se defi neste
operatorul de referentiere pri n referinta la 0 alta vanabila de memorie
Exemplu: int a=10 ;
int &b=ai
sau
int a=10 , &b=a i
Variabila de memorie b este 0 referinta catre variabila de memorie a. Aceasta lnseamna
ca, prin referinta, variabilei de memorie (a) i s-a mai dat un nume (b). Cele coua variabile
de memorie (a b) au aceteasi atribute (adresa de rnernorie. lungime. valoare, tip etc.), cu
exceptia numelui. Chiar daca In program s-au declarat doua variabile de memorie (a b) ,
se tucreaza cu 0 singura zona de mernorie, care poate fi identificata cu doua nume diferite,
iar urrnatoarele doua instructiuni vor afisa aceleasi valeri:
Info rmati ca 103
cout «"a = "« Zl « " ad r e s ,J. l ui a = u« &a« endl;
cout«"b = "« b«"ad r e s a lui b= "«&0 ;
Orice operatie de modificare a valorii variabilei referite prin numele b, va modifica valoarea
variabilei identificate prin numele a, deoar ece ambele nume de variabile S8 refera la conti-
nutul aceleiasi zone de memorie. Urmatoar ele doua instructiuni vor afi sa aceleasi valori:

c o u t .c-C' a
cout «"b
"« a« "a d r e s a l'..ii a= "«&a«endl;
"« b« "a d r e s a lui b= "«&b ;
30 30
!/afigeaza 31 31
Il a:igea za 90 9C
I/ a f i$e aza adevara t
!/a fi ge a za 21 21
21 21
adevar at
Observatil :
1. Tipul de data referinta, la lei ca si tipul de data point er, co nti ne 0 adrc sa. Pentru a
avea acces prin referinta la 0 var iabila de memorie nu este insa nevoie sa S8
totoseasca adr esa de memorie, ci numele variabilei referinta.
Exempl u:
i n t a =10 ,b=2 0 0 ; I/ s - au declarat d aua variabile intregi
int &x=a ; I/s-a declarat 0 referinta 1a var iabila a
i nt Ils -a declarat un pointer ca re indica v a r i a bi la a
i nt <q=&x ; Ils -a de c l a rat un poi n ter ca re i nd i c a va ri abila x
cout.c-ca -c«" H« X«" "<xvp'< «" "<c vqc c" "<c e nd j ,
! / af i ge a za 10 10 10 10
oouc-oca -c -c " "<xx-c c" "<x e p-c-c" "<c- qc-:" "<cencn ,
20 20 20 20
:-:=30 ; cout-c-ca c c" "<ex -e -c " "< ... p-e-e " " <x e qcc" " <c end j.:
// a f igeaza 30 30 30 30
p= &b ; /Ip .i.ndLc a variab.i La b
cout c c b-c -;" "<x e p-c-ce rid L: Ilafi:$eaza 2 00 200
p=&x ; li p indica variab ila x c a re se r e fera l a va r i a bi la a
c ou t « b« " "« r p«endl; 200 30
2. Operatorii aritmetici apli cati pe variabile reterinta nu rnodifica valoarea adresei refe-
rite, ci valoarea rnernorata la adresa variabilei referit e. Operatori i relat ional i aplicati pe
variabile ret ennt a nu comp are valorile adreselor referite, ci valorile memorate la
adresele variabil elor referite.
Exernplu:
i n t a =lO , b =20 ,&x=a ,&y=b ;
x=30 ; c out« a «" "« x« e ndl ;
x++ ; c ou t « a « " "« x«endl ;
x=- -x ; x-r-=x-2 ; cout« a«" "« x«endl;
i f ( x ! = y") c oue-ccvede ve r at " «endl ;
:-: =+ +y ; ccuec -c e -c-c'' " <x x-oc end L :
couc-oc c-cc" "<xy-c-ce ri d L :
i f (x ==y) cout«"a d e v a r a t" «endl;
1. Referinta tr ebui e lni t iallzata chiar i n momentu l dec larari i ei.

i nt II Eroare : va r i a b il a nu a f cst
104 Impl cmcnta r ca st r nct nrilor tic date
va riabila 7. , ca re tre b u i e sa
ca 0 re fo rLn ta 1 5 ver.i a b i l a
2. Dupa ce a fost lnitializata, referinta nu mai poate fi rnodifi cata (nu S8 mai poate
schimba adresa de memorie la care S8 refera).
Exemplu:
int a=lO,b=100,&x=a ;
c outi-oc a-oc " " « Y.« e nd l; ! faf i$eaza 10 10
x =&b ; / k Eroare : va.r i abi.L e L .re f'e r i nt.a x nu i se poat e a t rLbui.
adr e s a va r i ab ilei de memorie b , deoa r ece var i abi la X , pr i n
S0 r e fer S La vari a o i La de memor i e a s i. memor eaa a c d r o s e e i. -k I
x=b ; / '" Carect : va r Labi Le i r c Ier i n t' a x: i s c p oa 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 outi-c-ca-c-c" " <c x-c-cend l , / /afi$ea za 100 100
3. Nu S8 poa te crea un pointer la 0 ref erint a.
Exemp lu:
i nt a =]O ,&:-:: =a ;
i n t "P=/. ; / . Eroare: po.i r.r.er uLui p nu i se poate a t r Lou i edreee
variacila x, deoarece x nu 0
adres5 , ci 0 valoare l a adresa var i abilei a ' j
int /* Corect : po.i n t er-u Lui. p i se poat .e a t r i.bu L adrcs a
va r La b i Le i. r ererf nta x , acea s ta fi Lnc de rapt: ad r e s a va ri. abi Le i a * /
4. Nu este perrn i sa dec lararea unei referinte la 0 adresa exprirnata printr-o rc ferin\a
sau pri nt r- un poi nter.
Exemplu :
i n t a=10 ,b=:00 , "' :;- .)"-' &a , -q-o. b . &:-:=a ;
int &y = F. x ; / ": Er-oar-e: S- <J. decLar a t va.ri.ab.i.L a Y cnr o t rcbuic sb sa r c-'
f c r e La 0 ve r i a b i la de lip int , ca 0 1a adre aa va rL ab i. Le i x
int ; y =x ; / > Cor 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 a; vari abi l a .y se refera
In vuriabila a
i n t &z=q ; I '" Eroa:ce : s -a decLa r a t;
s e r-e f e r e In. I) va r i ab i.l. e de tip i n t,
poi n t e r q ca r e ml2mor eaza 0 a d r e s a
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 refere la 0 va r iabil a de rip int , ca 0 ref e r inta la 0 va riabila
a cn reI acrcsc e s t.e .i ndi.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 ridL : l/afJ.fjea7d 10 10 10 10
ccce-cct.c-c '' "«" q« " "<c accencn • / Jafi$eaza 100 ::" 00 100
"p=-20 ; cout -c-ca-c-c" "<e-pe-e" "<e x-e -c " " « y«end l ;
20 20 20 20
x-30; oou t.c-ca c -c" " <c vpc -c'' "<x x-cc" "<x yc -ce rid L:
30 30 30 30

cout c-ca -c-c" " <e -p-ee' " <ex-e-c ' "« '1«" "<c vqc-c" "<cz-c-ce nc .l ,
30 200 30 30 200 200
5. Tipul referintei si tipul variab ilei la care sc refora tr cbui e sa fi e aco las i 9i refe rinta
ob iec tu l la care face referirea trcbuie sa fie de ace las i tip. Astfel , daca referinta
Informaticii
105
este 0 variabila de memorie, referirea trebuie sa S8 taca tot la 0 variabila de memorie,
si nu, de exemplu, ta 0 constanta, chiar daca aceasta este de acelasi tip cu reter inta. Tn
cazul in care nu S8 respecta aeeste regul i, compilatorul va va atenticna. Aceasta
lnseamna CEt pro gramul va putea fi executat , dar rezultatul obti nut nu va fi eel asteptat,
deoarece S8 creeaza 0 variabila de memorie ternporara, cu tipul referintei, careia i S8
atribuie valoarea variabi lei referite, respectiv a constantei , jar variabila referinta va
adresa aceasta variabila tamporara, si nu variabila referita , respectiv constanta:
Exemplu:
A
A
B
&3""' temp ;
t empo r-a ra
II<1f.i $Gaza 65
I / a f i.,? e aza 13
/ /afi,'2e aza 13
ell ; int t e mp= l O; int
variab i l a de memo.rie
10
//afi$8aZa 20
cout« a« endl;
0. ""' 20 ; co u t .c-ca :
char c :. ' A' ; float
! / e c h i_va l e n t e u : char c"" ' J\ ' ; float t. empwc , float s a e t emp ,
/ / t f:>mp f i ind va rLab L'l.a de memc r i e t.e rnpor-a r a
cout.c-cac-c'' "<cccceocn .
a o;;o a / 5 ; cou t« a« " "« c«endl;
e l+ ; cout« a «" "« c«endl;
int &a=1 0 ; /I 0.ch i, \' a lenL
I I t.emp fii nd
Scrieti un program in care declarati a var iabila de memorie de tip f loat
a referinta catre aceasta variabila de memorie, cititi de la tastatura si
afisati valoarea variabilei de tip f l oat - folosind cele doua nume ale vari -
abi lei de memorie.
Ulililalea tipului de data rotcrinta
Tipul de data referinta este utiI in transm iterea datelor intre modulul apelant subprogam prin
intermediul parametrilor de cornunicatie. in tirnpul executiei subprogramului, date1e cu care
el lucreaza (variabilele locale si parametrii cu care a fast ape !at) sunt pastrate In stiva .
l nstructiunile subprogramului pot mcdifica aceste date. Madificarile se executa asupra
valorilor memorate In stiva. Cand se terrnina executia subproqrarnului . spatiul ocupat in
stiva de pararnetri de variabilele locale est e elib erat - i n cazul parametrilor de iesire
sau de int rare-iesire - S8 pierd valorile calcu late i n subprogram.
void sb ( i n t a} { a ''''c.. +2 ; cout -oc e-o c e nd Lr : ) l / a fi$'2' a;:a 'l
voi d main( ) {int a=2 ; sb(a l ; cout« a ; } 2
/ / a f .i$ e a za 4
//af.i:;; eaza 2
Folosind transfcrul parametrului pr in referinta, in mome ntu! apelarii subprogramului, in
suva este incarcata adresa de merno rie la care se valoarea parar.iet rului. Subprogra-
mu! va lucra direct in zona de memorie in care se qaseste data. Asada r, atat modulul ape!ant
cat subprogramul lucreaza asupra aceleiasi date, orice modificare a valorii acest ui
parametru tacuta in subprogram se va reflecta si In modulul apelant. La terminarea executiei
subprogramului, este eliberata din stiva zona in care este rnernorata adresa pararnetrului .
void sb( i n t &il ) { Q= 0 + 2; coct.ccc-ccendr r i j ·1
voi d mai n e) {int s b( a ) ; cout« a; } 4
Intre moduluJ apelant subprogram se pot transmite parametri de tip aorosa Daca
adresa este transrnisa prin valoare si ea este modificata in subprogram, noua valoare se
pi erde la ter minarea executiei subprogramului .
voi d sb (i n t *r ) {i nt x""' Lj; p""' &x cout« *p«endl;}
void ma Ln I} {int a=2 , *p=&-' i ; sb (p) ; cout cc vp r }
106 lmplcmcnturcu structurilor de <late
Folosind transferul parametrului prin retormta pentru pointer, i n momentul apelarii subpro-
gramului , i n suva este i ncarcata adresa de memorie a pointerului ~ i subproqrarnul va lucra
direct in zona de memarie i n care se qaseste painteru!. Asadar, atat madulul apelant cat ~ i
subprogramu l lucreaza asupra aceleiasi date, ~ i orice modificare a adresei memorate in
pointer facuta i n subprogram S8 va reflecta ~ i in modulul apelant. La terminarea executiei
subprogramului, este eliberata din stiva zona i n care este mernorata adresa pointerului.
void sb( i n t *&p ) tint x=4; P=&X i cout« *p«endl;} //afi$eaza 4
void ma in() ti nt a=2 , *p=&3. i sb(p} ; cou t -oc - p r } / /afi -? e a za I;
2.4. Alocarca dinamica a mcmoriei
Declararile de date i n cad rul programului folosesc alocarea statica a memorieL
Alocarea statlca a rnc moriei se face in timpul cornpilarii , in functie de modul
in care a fost declarata variabila de memorie sau str uct ura de date,
iar in tirnpul executi ei programului nu mai poate fi modiflcata.
Variabi lele care folosesc alocarea statica a memoriei se numesc variabile statice .
Sistemul de operare Ie aloca spat iu i n segmentul de date sau i n sti va sistemului, i n
functie de madul i n care au lost declarate i n progra m (globale sau locale) .
Structu rile de date stat ice au un mare dezavantaj, deoarece i n timpul executiei proqra-
mul ui pot sa apar a urmatoare te cazuri:
-7 spatiul al ocat structuri i este insuficient si este posibil ca sa se depaseasca acest
spatiu ~ i sa se intre in spat iul de memorie alocat altar date ;
-7 spatiul alocat structurii este mult mai mare docat est e necosar ~ i memoria interna
nu este utilizata eficient.
Acest dezavantaj poate fi climinat prin folosirea alocarii dinamice a memoriei.
Alocaroa dinamlca este metoda prin care unci variabile de memorie sau unci
structuri de date i se atribuie sp atiu de memorie - sau S 8 elibereaza spatiul de
memorie ocupat de ea in timpul exncutioi programului , in funct ie de nec esttati ,
Variabilele care folosesc alocarea dinamica a memoriei se numesc variabile dinarnice .
Spatiul de memorie alacat va fi in zona de adrese libere (Heap) . Sistemul de aperare ato-
ca unei date zona de memorie i n Heap sau elibereaza spatiul de memorie alocat dat ei, in
urma unor cereri de alocare de memorie ~ I de eliberare de memorie din program. Meca-
nismul prin care programatorul foloseste alocar ea dinarnica a memoriei este urrnatorul:
1. Se declar a a vari abll a de memori e de tip pointer catre li pul de data al variabilei
dinamice.
<t i p _ d e _ b a z a> *"': n ume _ p o i n t e r > ;
La comp ilarea programului , variabilei pointer i se va areca spatiu in segmentul de date
sau i n sli va sisternului, i n funct ie de madul in care a fast declar al in program (global
sau local). i n variab ila pointe r S8 va memora adresa variabilei dinamice.
2. in momentul in care in prog ram trebuie folosita variabila dinamica se cere si stemului
de oporare sa ii al ac e spatiu in Heap . Pentr u cererea de alocare de memorie se
toloseste operatorul new:
<n u me _ p o i n t e r > "" new <t i p _ d e _ b a z a> ;
Sistemul de operare cauta i n Heap a zona de memorie libera, de dimensiunea tipului
variabil ei dina mice, ~ i atribu ie pointerului adresa acestei zone.
Informaticii
107
3. in momentul In care In program nu mai este folosita var iabila di namica se cere
sistcmului de operare sa elibercze spat iul de memorie pe care i I-a alocat in Heap.
Pentru cererea de eliberare a mernoriei S8 toloseste operatoru l delete:
delete <n ume -po i n t e r> ;
SistemuJ de operare declara ribera zona de memo rie care a fost alocata variabilei
dinamice, si considera ca var iabila pointer nu mai este initializata cu 0 adresa de
memorie, iar valoarea care a fost mernorata in variabila dinami ca S8 pierde .
Observatie Operatorii new si delete sunt operatori unari si au prioritatea si
asociat ivitatea acestui tip de operatori.
[ Swd!:Ji.lI.lJ. de OSlZ I
Seop: exemplifica rea modului in care puteti folosi alocarea dinarnica a memoriei
Enunt ul problemei 1: Se citesc de la tesieture trei numere intregi - a, b §i c - care
reprezinte marimile lalurilor unui triunghi. Sa se eiiseze aria triunghiului.
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 referirea ariel si a semi-
perimet rul ui se folosesc point erf aria sp catre tipul float.
ftinclude <i o s t r c a m. h>
#i nclude <ma t h. h >
void mai n ( )
tin t *a, *b,* c; f loat lise declara poi n teri i (1)
a '"'" new int; b = new int; c = new int; l ise a l oca memorie pentru
ar i a = new f l o a t ; sp = new float; l /variabi lcle dinamice (2)
I /se citesc de 161 t .as te cur-s va Lor.i Le v a r i.abi Le l o r ol nami.ce
I l folo s i t e pell t ru latu ril e t r iunghiului
ccut ocv a -. " ; cin» *a; cout« " b = " ; ci n » *b ; c o u t c-c vc -. "; c in»*c ;
l i s e calcu leaza va10rile variabilelor dinami ce fo103ite pentru
s L a rie
*s p = (* a +* b +*c ) 12 . ; *a r i a =sqrt {*s p * ( *sp - *a )* ( *sp - *b l k( *Sp_ *c) ) ;
/ I s e a f i s eaz e vel oa r e a va rLabi.Le i di namice folos i t e pen tru arie
c out« " a r i a = "<ce a r i a ,
1158 e Li be r-cn zS zona de mcmor i.e a Lcca t a va r .i ab i Le Lor d inumi ce (3 )
del e te a ; delete b ; delete C i delet e aria ; delete sp; }
Enunt ul problemei 2: Se citesc de la tastatura coordonatclo a (Joua puncte din plan - a
:ji b. Sa se etiseze distnnte dintre cele cou« puncte .
Se toloseste alocarea dinarnica a structurii de date de tip i nregi st rare . Pentru referi-
rea coordonatelor celor doua puncte se folose sc pointer ii a b catre tipul i nregistrare
punc t., iar pentru refer irea distantei se foloseste pointerul d catre tipul float.
#include <.i.o s t r e a m. h >
#i nclude<ma t h. h > ·
struct punct {i n t X, Y i } ;
punct e e , *b ; f loat *d; /Ise cecl e r a p o .in t e ri i. ( 1)
vo i d main ()
{ I Isealoca memo r ie pentru variabi lele d i narni c e ( 2 )
a = new punct: ; b = new punct ; d = new fl oat ;
108 lmplcmcntarca st r nct nr ilor de dat e
lI se c i t e s c de 1a va lor i le
/ /folos i te pent ru coor done t.e Le punct e Lo.r a s i, b
CQut« "c oc r d oflil Le l e puncct:!ui a - x : " ; cin» -3 - >y.i
cout«" - y : cin» a ->y ;
cou t« "c oc !"d ona t e l e pUrlc -c.:llui b - Yo : " - cin» b - >x i
coocc-c" - 'J : ". c.i.noc-b- c-y :
/ /:::::::: caLcu LcazS va Loz u-e a va r i.ab.i.Lc.; di nami ce foLos.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? va Loarea va r LabiLe L di. nami.c e £0103i t.e pent r u d t s uant a
cout«"d i s t a n t a d i n t re punc tele a 3i beste "« *d ;
I I s e c Li be r ec zu z cria d e memor Le nIoca t a ve r i abiLeLcr d i.n um.Lc c (3)
d el ete i:J ; del ete b ; delete d ; }
Enuntul problem ei 3: So citesc de la Insta/ura n numero intrcgi cam sa memoreaza intr-uo
vee/or. Sa se iovorsozo voctorut in el insus! §i sa so etiseze vectotul dupa inversare.
Se totosest e alocarea dinarnica a structurii de date de tip vecto 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 elemente ale vectorului se foloseste
pointerul aux catre tipul int. Pentru referirea vectorului 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 elemente ale vectorului care este referita
de pointerul n . Pointerii q !?i r catre tipul int se folosesc pentru a parcurge zona de
memorie atocata vectorului in vederea prelucrarii elernentelor lui .

#i r.c l ude<ma t h . h>
void ma i n ( )
l int *p,*q, * (, *n,* a ux; / / .'H] doc La r S poi.n t.c r.i i (1)
//!; e; a Loca memo ri.e pent. ru vo r iabi.I o I e dLnemi .ce (2)
ne.ne w int; au x -ne v i n t ; c c u t c -cvr. > " ; c in» *n;
p = n ew int[*n] ;
l i s e de la tus: a tur5 vulorile pent r u
for (q ""-" p ; q <p+ *rl ; q t t)
{cout «"e J e me n t u l =- " « q-p +l « " = " ; cin» -- q ; }
I / se .int.er sch i.mba el ement.e Le vec t.o r uLu i.
fo= (q"" p , .:=p +*;;- l ; ::. <.: ; q .,.. +, r - -) {*a u:-: "-*q; *q ""*r; *ro--*a ux ;}
,/SE' e c' t s e e z a e l crnc n t e Le ....ec t oru Iu;
for {q =n ; q <!,l! *n ; q"1 cout-c-c vq-c-c " " ; A
I/se el i.bcr oe ze zan:'! oc memori e al ccat .a va.r.i ab i Le.lo.r d.inamLce (3)
delete [I f' ; delete n : delete aux r } fr-.?!\
Scrieti urrnatoarele programe in care Iolcsiti aiocare dinamica a rnernoriei:
3 . Cit iii de la tastatura temperatura, presiunea nurnarul de mali ai unui
gaz l? i calculati volumul lui.
b. Citl\i de la tastatura nurnaratorul numitorul a oc ua fractii, calcul ati suma si produsul
celor doua fractii, simplificati rezultatele obtinute si apoi afisat i suma si produs ul.
c. C,ti\i de la tastatur a coordo natel e a doua cclturi al e unui dreptung hi (coltu l din stanpa
sus si coltul di n dreapta jos) 'ii afisat i dimensiunea diaqonalei drept unghi ului.
I II for ma 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 mai ma ri decat media.
2.5. Clasificarea structurilor de date
Organizarea in structuri de date a dale lor prelucrate de algoritmi si rnplifica mutte dintre
operatiile de prelucrare. Atunci cand orqanizati datele l ntr-o structura de date, trebuie sa
identificat i modul in care puteti ave a acces la ele ~ i operatiile pe care Ie puteti executa cu
datele din colectie. Procesul de organizare a datelor in colectii este un proces care S8
desfasoara pe trei niveluri care interactioneaza i ntre ele, pomind de la nivelul concep tual:
nivel conceptual
(ni velull a care se dezvolta imaginea rnentala a structurii de date: modul
in care trebuie organizate datele !1i relatn!e care exlsta intre ele)
-U--
nivell ogic
(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
anumite 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 accesar ea, citirea §i scrierea datelor in memorie)
Ati studiat structuri le de date irnplementate la ni vel f izic In limbaj ul C++ :
-7 tabloul de memori e - structura de date omoqena, liniara, intern asi ternporara:
-7 flst erut -. structura de date ornoqena, liniara . externa si permanenta:
-7 sirul de carac te re - structure de date omoqena, liniara, interna ~ i ternporara:
-7 inrcgistrarea - structura de date neomoqena, interna si ternporara
A ~ i rnai studiat si 0 structure de date l og-ica-Ii sta - structure de date omoqena, liniara, interna
~ i ternporara ~ i 0 metoda de implementare ta nivel l ogic a listei folosind vectoruL
( Studiu de ca.z I
Scop: exemplificarea modului I n care identificati structura de date pe care 0 tolosit i
pentru 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.
Pent ru rezolvarea problemei trebuie stabilita st ructura de date care se va folosi :
-7 La nivel concept ua l - capacitatile de transport ale masinilor reprezinta un sir de
numere Intregi, aranjate lntr-o ordine aleatorie, in care trebuie cautat numarul cel mai
mare ~ i de cate ori apa re In sl r.
1 ~ 2 0 - - 1 40 I 50 on 20 I 40 I 50 I 40 I 30 I ~
-7 La nivel logi c - implementarea perrnisa de Iimbajul C++ a unei colectii de date omogene
este vectorul , fiecare numar Intreg fiind un element al structurii. Pentru rezolvarea proble-
110
an=ult imul element
(nu are succesor)
a, = element
succesorul sau este3;+1
predecesorul sau este a
i
_
1
3, = primul ele ment
(nu are predecesor)
mei S8 vor folosi urmatoni algoritmi: algoritmul pentru parcurgerea vectorului la memo-
rarea numerelor, algoritmul pentru determinarea valorii maxi me dintr-un ~ i r de numere si
algoritmul de cautare in vector a elementelor cu 0 valoare precizata (valoarea maxima).
int a [10];
7 La nivel fizic - numerele vor fi memorate i ntr-o zona continua de memorie interna, fiecarui
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[OJ a[l ] 0[21 0[3] 0[4 ] a[5] a[6J of7 ] 0[8 J a[9J
Daca se doreste pastrarea datelor memorate (capacitatile 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-unvector, la fiecare prelucrare (executie a programului).
Observat ie i n structur a de date folosita (vectorul), i ntre elementele 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
,
Enuntul problemei 2. Un profesortrebuie Sacelcuteze media semes/ ria/a a Iiecetu! 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 ceptual - elevii din ciasa reprezinta un si r de enti tati care sunt caracte-
rizate de 0 li sta de propri et ati (atri bute): nume ,?i prenume (care identifica unic elevul),
cinci note ~ i media sernestriala.
Nume Prenume Not a 1 Nota 2 Nota 3 Not a 4 Nota 5 Media
1 Anghel Maria 10 9 10 9 9,5
... ... .. . ... ... ... ... ... ...
30 Vlad Mihai 7 6 8 7
-7 La nivel logic - implementarea permisa de limbajul C++ a unei colectii de date omagene
este vectarul , fiecare lista de atribute ale unui elev fiind un element al structurii . Pentru
implement area listei de atribute (care este fermata din date neamagene: numele ~ 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, fiecare atribut fiind memorat intr-un
camp. Pentru rezolvarea problernei se vor folosi urmatorii algoritmi: aigoritmul pentru
parcurgerea vectorului la memor area listei de atribute a fiecarui elev si la aflsarea mediilor,
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 meot a , } ;
e Lev clas2. [30];
Inform atica 111
not a[O]
I I I I mLl
clasa[i } .nume
7 La nivel fizi c - listele de atribute ale fiecarui elev vor fi memorate int r-o zona continua de
memorie interna, fiecarei liste de atribute alocandu-i-se acelasi 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 datelor memorate (Iista de atribute
a fiecarui elev din ciasa), pentru prelucrarea lor ulterior, se vor salva intr-un fisier text, de
unde vor fi restaurate In memoria interna lntr-un vector de i nreqistrari, la fiecare prelucrare
(executie a programului).
c l a s a [ i ] . nota[2]
Observatie i n structura de date folosita pentru lista de atribute , int re elementele structurii
exista 0 relatie 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 vectorul c1asa) are ca
predecesor entitatea clasa ca succesori entitatile: nume, pren, nota media. Entitatea
nume are un singur predecesor (entitatea elev) 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]) . Structurile de date de tip inregistrare pot Ii ierarhizate pe unul sau mai multe
niveluri. Acest model de reprezentare a datelor se numeste arbore cu radacina , iar acest
tip de structura de date este o structura ierarhizata.
Nivelul4
Nivelul 2
Nivelul3
Nivelul 1
L...::F--J .
I ...
G:;J
intr-o structure de date ierarh izata. datele pot fi grupate pe mai multe niveluri. Eleme ntul
a1 se 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 nivel ul 4 nu au succesori.
o matrice cu n linii m coloane este si ea 0 struct ura de date ierarh izata pe trei niveluri:
pe primul nivel este matricea care are n succesori: liniiie, care sunt pe nivelul 1. Fiecare
112 I mpl ement area st ruct u r i lo r d c date
linie are ca predecesor matricea si ca succesori cele m el emente de pe 0 linie, care S8
gasese pe nivelul 3.
J Matricca
L
Nivelul 1
I l ini a 0 1 Iini a 1 linia 2 I lini a 3 I
Nivelul 2
------ 'l
I a[O][O] I a[0][1J 1 .. \. I a[3][OJ 1a[3][1] I
I a[1][0] I a[1][1] ;---'a[=2]:7[0::::]'I-a"'[ 2"']["' 1]:0\1 NiveIuI 3
. Enuntul prob l emei 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. intre 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 loaIe cote §apte
obiective tarasa l maca de doua or; ptin eceeesi IDea/ita/e. Daca exis/a mei multe trssee.
sa so ceute tresoui ell drumul eel tne! scurf .
Penl ru rezolvarea problemei, 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 conceptua l aceast a
structure de date vern reprezenta
in plan hart a zcnei turist ice prin
intermediuI unor eremente geome-
trice, astfel: localitatile se reprezint a 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 ervatie . 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
element are mai multi predecesori mai multi succesori. Acest tip de structura de
date este 0 retea ,
Din studiul de caz anterior putem folosi un nou criteriu pentru clasificarea structurilor
de date :
..
""
lerarhizate (arborescente)
Retea
I ntre elemente exista 0 relatie de subordo-
Intra exts.a 0
nare, i n care fiecare element are un pre-
relatie de subordonare,
decesor unic $i poate avea unul sau mai
i n care fiecar e element
multi succesori . cu exceptia primului element
poate avea mai multi
(numit radik iml ), care nu are predecesor, sl
predecesori mai multi
a ultimelor eleme nte (numite terminale),
succesori.
care nu au succesor .
Lini are
Fiecare element are un
succesor un
predecesor, exce ptand
primul el emen t, care nu
are decat succesor,
ultimul element. care nu
are oecat predecesor .
I criteriul relatiei de ordine

I II formuticii
2.6. Lista liniarii
113
Pe Itmga criteriile studiate pentru clasificarea structurilor de date, mai exista ~ i urrna-
toarele criteri i :
rImplementarea in limbajul de programare I
... ...
Structuri implicite Structuri explicite
Sl ructura creata la nivel conceptual este Structura creata la ni vel conceptual nu este
lrnptementata la ni velul Jimbajului de lrnplernentata la ni velullimbajului de
programare. Repr ezentarea sa este programare. Reprezentarea sa S8 face folosind
irnplicita $i nu mai necesit a inforrn atii st ructurile impl icite implementate in Iimbaj , fiind
suplimentar e pentru localizarea neces are inforrnatii supli mentare pentru
compone ntelor . localizarea componentelor.
I
Dispunerea elementelor in memorie I
.-
...
Structuri contigue Structuri dispersate
Elernentele sunt di spuse 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 f a ~ a de adresa de reterinta. element §, i adresa la care se 9aS8$te.
I Aloearea memoriei interne
I
.- .-
Structuri statice Strueturi dinamice
_Di mensi unea zonei alocate este fixa. Dimensi unea zonei alocate nu est e f i xa.
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 cata,
de componente ale structurii.
Usta liniara este 0 struct ure de date logica, eu date omogcne , in care fiecare
ele ment are un s ucces or ~ i un pred ecesor, exc eptand primul el ement, care nu
are dedit succesor, ~ i ultimul ele ment, c are nu are decat predccesor.
l.ista llniara, la fel ca ~ i vectorul, din punct de vedere conceptual este 0 structure de
date ornoqona tiniara . intre cele doua structuri ex ista urrnatoarele deoscbi ri :
Cri teriul
Vector i Liste
Implementarea
Sunt structururnpuctte Fiind 0 Sunt structuric xpl ici te . Fiind ostructura
III limbaj
st ruct ure Ilzlca . este Irnplementata
loq lca , trebuie ateasa 0 metoda de
in limbaj ul 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 mecanismul
prin care este implementata fizic prin care este implementata fizic nu asigu-
asigura identificarea elementelor.
ra identif icarea eiernentetor.
Implcmentar c: st r uct ur i lor de date 114 . . .
Criteri ul Vector;
Liste
Dispunerea
Sunt structuri co nt ig ue. Pot fi structuri dispersa te. Predecesorul,
el ementelor
Predecesor ul, elementul ~ i elementul !ii i succesorul nu sunt i n locatii de
in memorie
succesorul se gasesc i n locatii memorie contigue. Proqramatorul trebuie sa
cont igue prin mecan ismul de defineasca rnecanismul prin care elernentele
implementare a structuri i de date la structurii vor fi legate unel e de allele pentru
nivel fizic. a putea fi recasite i n rnemorie.
Al ocarea Sunt structu ri stance. Sunt str ucturi stat ic e sau di namice, in
rnemoriei funct ie de implementarea aleasa.
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 i n care folositi ca structure de
date Iista tiniara.
Enunt uri le probl emelor pentru care trebuie aleasa structura de date si eoneeput elgo-
ritmul pentru prelucrarea lor:
1. lntr-o bibliateea exist« a col ectie de eaf1i arganizale in ardinea alfabetiea a autari/or. Un
canor paate imprumuta 0 carte (se extrage 0 carte din co/eerie) sau poate inepoie 0 carte
(seinseteeze 0 carte in co/eerie). Toate aeeste operaNitrebuie exeeul ate 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 i n ordinea
venirii: prima ma§in8 sosite 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 mosinite §i S-8U esez»! la coeds.
3. lntr-o stive de cen: vol ume/e sunt asezare in ordinea alfabetiea a tiuutitor. Trebuie
extrese 0 carte din stiv» tara a deranj a modul in care sunt ordonate carti1e in stive .
Toate aeeste proble me au in eomun urrnatoarele caracteristici:
-7 Elementele colectiei sunt omoqenejtnreqlstrarl eu aceeasi structural .
-7 Conceptual sunt structuri liniare i n care fiecare element are un succesor ~ 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 elementelor.
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 lungi mea fizica fixa, iar implementarea lui
la nivel fizi c este un proces prin care se face conversia locatiel concep tuale a unui
element , in locatia reala, din memoria intema.
-7 Orice operatie de adauqare sau extragere a unui element din colectie mod.fica lungi-
mea logics a vectorului.
-7 Pentru a insera un element i n colectie . trebuie deplasate toate elementele spre
dreapta , lncepand cu pozitia inserarii,
-7 Pentru a extrage un elemen t din colectie, trebuie deplasate toate elementele spre
stanqa, de la sfarsit , pana i n pozitia din care se extrage.
I nformaticii 115
n cazul structurilor liniare care trebuie s a - ~ i pastrezo i n timpul exploatarll ordonarea
dupa un anumit criteriu, mecanismul vectorilo r este greoi. in aeeste cazuri, S8 poate
alege ca solutie de impl ementa re a structurii de date lisla tiniara ce degreveaza progr ama-
torul de ordonarea dupa indice a structurii, irnpusa de vectori .
mplementarea structurilor de date cu ajutor ul listelor are urrnatoarele avantaje:
~ al ocarea dina mica a memoriei - care gestionea za memoria rnult mai eficient:
-') algoritmii de.prelucrare - care sunl mull mal eficienti (se executa mul l mai $
punne opera!" pentru mserarea ~ I sterqerea urun element). .... W?,.e-
On functie de modul i n care S8 aloca memoria interna, S8 pot folosi metodele:
I Metode de implementare a listelor I
dinamica
y.
statica
.t.
numai statica
in functie de modul i n care sun! aranjate elementele i n lisla, S8 pot folosi metodele:
I Metode de implementare a listelor I
y.
i Metoda de i mpl ementar e Avantajul alocarf di namice a Ava ntaj ul alg oritrni lor
rnemori ei de prelucrare
stati ca secventialii nu nu
- at ati ca inlantulta nu da
otnamtca inlantuita da da
Implementarea statica secventiala nu aduce niciunul 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 mai sunt stocate succesiv i n memorie. Aceasta implementare se poate
face atat static, cat si dinamic, int re cele doua irnplernentari existand urrnatoarele diferente:
~ In impl ement area statlca, noduriIe Iistei ocupa un bloc contiguu de locatii de me-
marie (zona de memorie alocata vectorului );
~ In implementarea dinamica, nodur ile listei ocupa locatii di sp ers at e din memorie
(a carer adresa poate fi pastrata cu aj utorul pointeri lor).
i n c1 asa a X-a ali tnvatat modul i n care puteti implementa stat ic listele liniare. Algoritmii
pentru prelucrarea unei Iiste inlantuite sunt aceiasi . atat in cazul implementarii stance,
cat ~ i i n cazul irnplernentarii dinamice.
2.6. 1. lmplcmentarca dinarnicii a listclor in limbaj ul C++
Exemplu - a lista este fermata din 5 cuvinte (noduri), fiecare cuvant avand maxim 4
caractere. Nodurile listei se exploateaza i n ordine altabetica:
Usta = ("alfa", "beta", "gama", "teta", "zeta"]
116
Implcmcntarca st r uct u r i lor de date
Memoria mterna
5 locat ii de mcmorie dispersato
identif icate prin adresele adr1, adr2, adr3 , adr4, adrS
--::"""'be-.'- a'c-',.::.;, l "9
a:"
a" I [jjfL1
nodul 2 nodul 3 I I nodul 1 ( prim
la adresa adr2 l "zeta" la adresa adr3 "t et a" la adresa adr1
--.----- '
nodul5 nodul4
(ul t im) la adresa adr4
Deoarece nodurile listei nu sunt aranjate succe siv, ci aleatoriu, In memorie , trebuie irnple-
mental un mecanism pri n care sa S8 precizeze ordinea reala a acestor noduri (ordinea in
care S8 lnlantuie in llsta} . Aceasta tnseamna ca:
7 trebuie cunoscut locul di n care incepe lista (lantul de noduri), adica pozitia primului
nod din lista (nodul prim ) - i n exemplu, nodul "alfa";
7' trebuie cunoscut locul i n care S8 terrnina lista , adica pozitia ultimului nod din lista
(nodul ultim ) - in exemplu, nodul "zeta ";
7 pentru fieeare nod din lista, cu except ia ultimului nod, trebui e cunoscut nodul care
este succesorul lui - de exemplu, pentru nodu! "gama" trebuie cunoscut ca succe -
sorul sau este nodul "teta" .
Metoda totosi ta pentru implementare este ca .
un nod al listei sa cantina doua tipuri de infer- Il nfOrma! la p:ntru
rnatii : inforrnatia propriu-zi sa si i nforrnatia legatura
de legatura - adresa prin car e S8 identifica nodul care urrneaza i n structure . lnforrnatia
de legatura mernorat a i n ultirnul nod (i n carnpul de adresa) este const anta NULL (care
semnifica tapt ul ca ultimul nod nu se leaga de nimic) .
Memoria interna
adresele nodurilor adr1, adr2 , adr3, adr4 , adrS
r:- ! - '"" 'b-e-ta-'- ' - 1'-- a"", dr-' 31 i " ama" 1-'--,''-'a-:-,t:- a",,''---' ' a- ,d-:- r-::" 21
adr2 , dr3 , adr1 ,
.............. .........::::::::::::::::::::::: i.. ;
1"zeta" !NULL 1"teta"
adrS adr4
L
+. ;
[nlantuirea nodurilor Iistei in implementarea dinarnica
Lista l iniara intantuita este 0 structure loqi ca de date, parcursa Iin iar , care are doua
extrerni tati (i nceput si sfarsit), in care Iiecaru i element i se asociaza 0 informat ie
supl imenta ra referitoare la locul elementului urmator , din punct de vedere logic.
Un nod al lister va fi de tipul inregi strare ce contine un camp cu inforrnatia pentru leqa-
tura care este adresa succesorului exprimata print r-un pointer.
struct nod
{<t i p 1> 11 >, <i nf o 12>, , <i nf o In>;
<t i p_2> 21 >, <i n f o 22 >, , <i n f o 2n>;
Informati cii 117
<i n f o_mn>; < t . i p ~ m > <i n f o_ml>, < i n f o_m2>,
nod " urmr L :
nod *prim, *ul t i m, *p;
Carnpurile < i n f o_ i j> sunt carnpurile cu inforrnat ii, iar carnpul urm este un camp de tip
pointer catre tipul de baza nod ~ i cont ine intorrnatia de leqatu ra (adresa urrnatorutui nod
din lista). Aeest tip de i nregistrar e se nurneste inregistrarea auto referi t a. S-au declarat
variabilele de tip adresa a unei i nreqistrari de tip nod:
-7 *prim ~ i *ul t i m pent ru a memora adresa primului nod, respectiv a ultirnului nod;
ele va ajuta sa ldentificati extrernitatile listei;
-7 * p pentru a memora adresa unui nod curent di n lista (este folosit pentru parcurgerea
listei).
in lisle, algoritmii de inserare si eliminare a unor noduri din structura S8 sirnplifi ca foarte mult
7 Inserarea unui nod consta in alocarea zonei de memorie i n care S8 scrie nodul si
legarea lui la structure (stabilirea legaturii eu predeeesorul si eu sueeesorui lui).
?' Eli mi narea unui nod const a in ruperea nodului din structur e, prin legarea predece-
sorului 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).
I
..
..
Stiva Coada
Operatiile de introducere si extragere Operatia de introducere a elementelor se
a elementelor se pot face numai face pe la 0 extremitate, tar extragerea
printr-una dintre extrernltati. elementelor - prin cealalta extremitate.
.. .. ..
Usta simplu Inlantuita Lista dublu inlantulta Usta circulara
Fiecare element pastreaza Fiecare element pastreaaa Este 0 flsta inlantuita 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.
2.6.2. Clasificarca listclor
'--:L-;- i s-: t e-:7 1in-: i a-r- e- I
Algori tmii ce se pot f ol os i po nt ru prelu crarea Ii stelor:
-7 initi ali zarea Ii st ci - se creeaza lista vi da;
7 crca rea li st ei - se adauqa repetat elemente la lista, porn ind de la list a vi da;
-7 i nserarea unui clement i n li sta - la i nceput, la sfarsit , in inte rior;
-7 ste rqe rea unui c lement di n l ista - la inceput, la starsit , i n interior;
-7 pa rc urgerea l i st ei - se viziteaza elementele tistei pentru a obtine inforrnatii:
-7 cautarc a in lista a unui cl ement care lndepline ste anumite conditii:
-7 sortare a unei liste;
-7 concate narc a a doua liste;
-7 divi zar ca in doua liste .
118
Impl cmcn tarca st r uct uri l or de date
2.6.3. Agoritmi pcntnt prcillcrarca listclor simplll inlantllitc
Lista simplu inlanluita
IN U L L ~ info
ultim
I urm
I lI rm-
1
r.::: info
"--_---''-----J
I
~ I II. . f
urm I In 0
info
prim
In Implementarea alqoritrnilor urrnatori S8 considers ca inforrnatia propiu-zisa este
fermata nurnai dintr-un camp i n car e S8 rnernoreaza un nurnar i ntreg: '
s truct nod
{int info ; /linfor ma 1;. ia p r c p r Lu-e z l s a
nod *u r m;} ; l/inf orma1;;ia pent r u Leqe t u r a
nod *pr i rn, *u l t i m, ~ p ; j/pointe ri pen tru e xp loa t a r e a l i s tei
int x; . / /pent ru valoarea ce s e atriliuie cempuIui, eli I n format.L'i
i n lista vida atat nodul prim cat ~ i nodul ult im nu exista, ~ i adresa lor are valoarea NULL:
prim = ult im ",. NULL; Starea de ll sta vi da trebuie cunoscuta atune! cand S8
elirnina noduri din lista, deoarece in (isl a vida nu mai exista noduri care sa fie eliminate.
Aceasta stare S8 testeaza prin conditia : pr im = = NULL. Pentru testarea unei liste daca
este vida se poate implementa functi a operand este_ v i d a ( ) care va furni za valoarea 1
("adevarat"), daca lista este vida, ~ i valoarea 0 (.t als") daca Iista nu este vida.
i nt e s cejvLd e ( nod " p r i m)
{return p rim==NULLi l
2,6.3.1. lnitializarea listei
Prin acest algoritm se creeaza lista vida. i n acest caz, atat nodul pr im cat ~ i nodul ultim
nu exista, ~ i Ii se atribuie adresa NULL.
Implementarea algorit mului. Se foloseste functia procedurala i n i t () ai carei parametri
prim ~ i ul tim de tip nod se transmit prin referinta. deoarece sunt pararnetri de iesire.
v oid i n i t (nod * &p r i m, n od *&u l t i m)
{p r i m = ul t im=NULLi l
2,6.3.2. Crearea listei
Deoarece i n alqoritrnii de prelucrare trebuie sa se cunoasca adresa prirnului nod, este impor-
tanta adauqarea primului nod la lista vida. Pasii algoritmului de crcare a unei liste sunt:
PAS1. Se adauqa primul nod la lista (nodul pri m).
PAS2. Cat t imp mai exista informatie, exec uta: se adauqa un nod la lista.
2.6.3.3. Adauqaraa primului nod la lista
i n Iista cu un singur nod, adresa de legatura a nodului pri m are valoarea NULL - ~ i atat
nodul pr im cat si nodul ul tim au aceeasi adresa. Pasii executati i n acest algoritm sunt:
PAS1. Se cere alocarea de memorie pentru nodul p r im.
PAS2. Se scrie inforrnatia in nodul pri m.
PAS3. Adresei de leqatura a nodului prim i se atribuie valoarea NULL.
PAS4. Nodului ul tim i se atribuie adresa nodului p r im.
Impl ementarea algoritmului. Se foloseste Iunctia procedurala adauga_nod O ai carei para-
metri prim ~ i ul t i mde tip nod se transmit prin referinta, deoarece sunt parametri de iesire.
void ada ug_nod ( nod * &p r i m, nod *&u l t i m)
{p r i m = new nod i p r i m- >info=x i pr im- >urm=NULL i ultim=p rim; }
Informatica
119
2.6.3.4. Adauqarea unui nod la lista
Pentru adauqa rea unui nod p la lista, in functie de cerinte le problemei, S8 poate folosi
unul di ntre algoritmii urrnatori :
1. adauqaraa in fata pr imul ui nod ;
2. adauqarea dupa ultimul nod ;
3. adauqaroa l nt r-o poziti e in inter i oru l li stei.
Adauqare in tala primului nod
Pasii executati in acest algoritm sunt:
PAS1. Se cere aloearea de memorie pentru nodul p.
PAS2. Se serie inforrnatia in nodu! p.
PAS3. Nodul p se leaqa de nodul prim.
PAS4. Nodul p inserat devine nodul prim.
I Adauqare in fata pri mului nod
prim
1 i nf o
p ij i nfo @rnJ
ultlrn
G;3--+ info
p devine nodul prim
]
Impl ementarea algor itmului . Se foloseste functia procedurala adaugayrimO al carei para-
metru prim de tip nod S8 transmite prin reterinta, deoarece este parametru de intrare-iesre.
void adau ga...J'Jritn(nod *&p r i m)
{nod nod ; p ->i nfo=x ; p->urm=p r im;
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.
I Adauqarea dupa ultimul nod
p rim
info
p devine nodul ultim
ultim

....... ...... ................ .............,
p .. inf o
Implemen tarea algoritmului. 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 da uga...;.. ult im( nod *&u l t i rn }
{nod *p=ne w nod i p->info=x ; ul tim=p ; }
120 Implemcnta rea struct ur ilur de dat e
Adauga rea i n interi orul li st ci S8 poate face in doua modur i:
a. dupa nodul cu adresa q;
b. in ainte de nodul cu adresa q.
Ad augarea i n i nterioru l l i st ei dupa nodul cu adrcsa q
Pasii ai qoritrnulul sunt:
PAS1. Se cere alocarea de memorie pentru nodul p.
PAS2 . Se sene inforrnat ia in nodul p .
PAS3 . Nodul p se leaqa de succesorul nodului q .
PAS4. Nodul q se leaqa de nodul p adauqat.
PASS. Daca nodul q a fast ultimul nod, nodul p adauqat devine nodul ul tim.
Adauqare dupii nodul q
INULL,I
q
prim q->urm ulti m
I! , ·nl o I urm fI' .. j, •• •• Jl··· . I I J I"" ' - ' ·n- I o-,..-----,
I, , L ur .. In 0 urm I
p ..miinfolm"t¢r¢j:".J
Impl emcntarca algoritmului. Se foloseste functia procedurala adauga_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, !ii i ul tim (adresa ultirnului nod), care S8 transmits
prin referinta, deoarece este parametru de intrare-iesire.
void adauga. du pa( nod *q , r:.od *&ul t i m)
{ nod "p vnew nod;
p-csi.n f o e x : p -c-urmeq -c-u r m: q-c- u rur-p , i f (q·==ul tim) u l.f Ltr r-p r )
Adaugarca in interiorul Iistei inainte de nodul de adresa q
Pentru a adauqa nodul p l naintea nodului q, trebuie sa leqarn predecesorul nodului q de
nodu! p. Dar, predecesorul unui nod nu este cunoscut. Adauqarea unui nod in lista inseam-
na, de fapt , inserarea i n lista a informatiei pe care 0 contine, i ntre alte doua informatii, !?i
anume: informatia din predecesorul nodului q trebuie sa fie anterioara ei , iar informatia din
INULLII
Adaugare inaintca nodului q
q q- xurm ultim
___--'-_u_rm_ ++_ v .,,2....., .. --,-_u_rm_ff_v_3_ ..l I_u_r_mff==V=4=======
(1)
prim
I' v1
I NULUI
•...
v2 I urm f p II
(2)
prim
In furmatica
121
nodul q trebuie sa a urmeze. Ast fel , in lista nu se va adauqa nodul p i nainte de nodul q, ci
dupa el, interschi rnband apoi informatiile lnt re cele doua noduri. Pasii algoritmului sunt:
PAS1 . Se cer e alocarea de memorie pent ru nodul p.
PAS2 . Se cop iaza informalia din nodul q in nodul p.
PAS3. Se sene I n nodul q inforrnatia care trebuie adauqata la 115t3.
PAS4. Nodul p se leaqa de succesor ul nodului q.
PASS. Nodul q se leaqa de nodul p adauqat.
PAS6 . Daca nodul q a fast ultimul nod, nodul p adauqat 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 parametru de intrare, :;;i u l tim (adresa ultimului nod) , care S8
transrni te prin referinta, deoarece este parametru de intrare-iesire.
void oda uga i n fa t a( nod *q, nod *&ul t i m)
{nod q->inf o=x ; q- >urm=p ;
uLt.Lmvp r }
2.6.3.5. Parcurgerea listei
Prin acest algoritm se viziteaza fiecare nod al listei , pornind de la primul nod , pana la
ultirnul nod , in ordinea de lnlantuire a nodurilor - furnizata de adresa urm din nodul
vizitat. l.ista se parcurge pentru a prelucra informatia stocata In noduri .
Implementarea algor itmului. Se foloseste functia procedurala parcurge () al carei parametru
prim de tip nod se transmite prin va!oare, deoarece este parametru de intrare.
void percuqe (noel " prim)
{for (nod ep vp r i.m : p ! ""-NUL L ; ;'Y"' f) '- > lJ t:"" m)
p r e l uc r c ca za p->info;}
Atat vectorul , cat si lista sunt structuri liniare, iar algoritmii de parcurgere sunt asernanatori:
Vc cto rul Lis t a
Variabi la tolosfta
i de tip int pentru indlcele elementului P de tip pointer catre tipul nod a! listei
I uent ru oarcurocre curent din vector pent ru adr esa elementul ui curent din usta
lnitializarea
i=O- indicele prirnului element din p-prim - adresa primului nod din lista

vector
Trecerea la ele-
i-i+1 _ se incrementeaza indcele p-p->urm - pointeru lui i se atr ibuie
mentul urrnator adresa nodului urrnator
Conditia de
i- n - indicele i are prima valoare mar p NULL - adresa rnemorata in pointerul
tenninare mare decat cea a ultirnului element p este cons tanta NULL
2.6.3.6. Cautarea unui nod in lista
intr-o lista se poate cauta:
1. Nodul care indeplineste 0 anurnita condit ie, pe care 0 notarn cu condi ti e si care
este exprimata pri ntr-o expresie lcqica ce contine eel putin un camp cu informatie din
nod; valoarea cond itiei este dependenta de intorrnatia stocata In ned. Algoritmul
este: se parcurge lista lncepand de la primul nod, in ordinea de lnlantuire a nodurilor,
pana se gasel?te nodul care lndepl ineste conditia sau pana s-a ajuns la sfarsitullistei .
2. Nodu l care se intr-o anumita pozit ie in tist a pe care 0 notarn cu poz.
Algoritrnul este : se parcurge lista i ncepand de la primul nod, fn ordinea de inantuire
a nodurilor, pima cand s-au parcurs po z noduri sau pana s-a ajuns la sfarsitull listei
Impl ementarea algoritrnului . Se foloseste a tunctie operand cu tipul pointer catre tipul nod. In
ambele vari ante:
122 Impleme nta r ea struct urilor de date
-7 parametrul functiei este prim de tip nod S8 transmite prin valoare, deoarece este
parametru de intrare;
-7 variabila lccala p de tip pointer catre nod se foloseste pentru parcurgerea listei - este
initializata cu adresa prirnului nod ;
-7 adresa nodului gasit S8 rnernoreaza In pointe rul p care va fi ret urnata de functie.
Varianta 1
nod *c a u t (nod *p r i m)
{for (nod p !=NULL && !condi t i e; p=p ->urm) ; return P i }
Varianta 2 - Variabi la lccala nr de tip int se foloseste pentru a nurnara pozit iile parcurse
- este inltializata cu valoarea 1.
nod " c e u t t nod *p r i m, int p a z)
{nod *p=p r i m; i n t nr=l;
for ( ; p ! =NULL && nr <poz ; r eturn p i }
2.6.3.7. Eliminarea unui nod din lista
Dupa eliminarea nodului din pozit ia p di n lista S8 va elibera zona de memorie ocupa ta de
nod. Eliminarea unui nod S8 face numai daca lista nu este vida . Pentru elimi narea unui
nod din lista , In functie de situatie, se poate folosi unul dintre algori tmii urmatori :
1. eli mi na rea pri mul ui nod;
2. eli mi na rea ulti mul ui nod;
3. el im i na rea unui no d di n interi orulli stei.
Eliminarea primului nod
Pasii executat i In acest algoritm sunt:
PAS1 . Se salveaza adresa nodului prim I n pointerul q.
PAS2 . Succesorul nodulu i prim devi ne nodul prim.
PAS3. Se cere eliberarea lonei de memorie de la adresa memorata In pointerul q.
Eliminarea primului nod
prim·····... ultim
info
.' ". succesorul nodul ui prim devine nodul pri m
Implementa rea algorit mului . Se foloseste functia procedurala e liminayrimO al carei para-
metru prim de tip nod se transmi te prin referinta. deoarece este parametru de intrare-iesire.
void e l imina_prim(nod * &p rim)
{nod q=pr im ; p rim"'pr i m->urm; delete q ; }
Eliminarea ultimului nod
Pasii executat i In acest al goritm sunt:
PAS1 . Se salveaza adresa nodului ulti m in pointerul q.
PAS2. Se cauta predeceso rul ultimului nod, prin parcurgerea listei incepand de la pri mul
nod , pima la predecesarul nod ul ui terminal (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 iberarea zonei de memorie de la adresa rnernorata I n pointerul q.
Informatica
prim
El i min area ult i mul ui nod
-- .....
123
Implemenlarea algoritmului . Se foloseste functia procedurala elimina_ultimO al carei para-
metru ul tim de tip nod S8 transmite prin referinta, deoarece este parametr u de intrare-iesire,
vo id elimina_ultim(nod · p r i m, nod * &u l t i m)
{nod *p ,*q =u l t i m;
for (p=pr i m; p ->urm- >u r ml =NULL; p=p->urm) ;
p- >u r m=NULL; ultim=p ; delet e q i }
Eliminarea unui nod din i nt eri or ul l istei
Pentru a elimina nodul p afl at in interiorul listei, trebuie sa leqarn predecesorul nodului p
de succesorul lui. Dar, predecesorul unui nod nu est e cunoscut. Elimin area unui nod din
lista l nseamna de rapt eliminarea din lista a inforrnatiei pe care 0 conti ne. Astf el , din lista
nu S8 va elimina nodul p, ci succesorul Sc3 U (care este cunoscut), dup a ce lnforrnatia din
el a fast copiata in nodul p, Pasii executati in acest algoritm sunt
PAS1 . Se sal veaza adre sa succesorul ui nodului p in pointerul q .
PAS2. Se copiaza i n nodul p toata informatia din succesorul lui (lnforrnatia propriu-zi sa
inforrnatia de legat ura).
PAS3 . Se cere eliberarea zone i de memorie de la adresa memorata in poi nl erul q.
PAS4. Daca succeso ru! nodului p era nodul ultim, atunc i nodul p devine nodul ultim.
Implementarea algoritmului. Se foloseste functia procedura la el imina () ai carei para-
metri sunt de tip nod : p (adresa nodului care se elirnlna), care se transmite prin valoare,
deoarece este parametru de intrare, ul tim, care se transmite prin referinta , deoarece
este parametru de intrare-iesire.
vo i d elimina(nod *p, nod *&ul t i m)
lnod *q =p - >u r m;
delete q i
i f ultim=p ; }
2.6.3.8. El iberarea spatiului de memorie ocupat de llsta
Oaca in cadrul unei aplicatii care prelucreaza mai multe liste, nu mai este necesara una dintre
ele, se va elibera int regul spatiu ocupat de lista. Prin acest algor itm se viziteaza fiecare nod
allistei , pomi nd de la primul nod, pima la ultimul nod, i n ordinea de lnl antui re a nodurilor
_ furnizata de adresa urm din nodul vizi tat , si se elibereaza zona de memorie ocupata de
fiecare nod. Pasli executati i n acest algoritm sunt:
PAS1 , Se initializeaza pointeru! p cu adresa primului nod din hsta - prim (p <-prim).
PAS2. Cat l imp nu s-a parcurs toata lista (pONULL) executa :
i PAS3. Se salveaza adresa nodului p i n pointerul q.
i PAS4. Se trece la succesoru! nodului p (p <- p ->urm).
j PASS. Se cere eliberarea zonei de memorie de la adresa rnernorata i n pointerul q.
i Se revine la Pasul 2.
PAS6 . Primul nod nu mai are adresa alocata (p r i m<- NULL).
124
Implementar ea strnclu ri lor de date
Implcrnenla rea algoritmul 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 iberar e( r.od * &p r i m)
{nod *p=p r i m, *q ;
while (p ! =NULL) {q -:-o p; p =p->unn; delete q ; }
pr im=NUL L ; }
+
J.
Ordonate Ncordonate
Nodurile listei sunt ordonate pe baza valor ii Nu exista a ordine a nodurilor in Hsta.
unui camp cu informatie numit camp cheie. Operatiile de adauqare de noi noduri $i de
Operatiile de adaupare de noi noduri si de rnodificare a valorii campurilor cu infer-
modificare a valorii campului chele 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 ,
2.6.3.9. Lisle ordonale
in functie de cerintele aplicajiei listele generale pot fi c1asificate astfel:
I Liste gen erale I
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 dint re carnpurile inreqistrar!i. Pentru prelucrarea listelor
ordonate putet i folosi :
-7 algoritmul de sortare prin insortie:
-7 algoritmul de interclasare a doua Iiste ordonate.
Algorilmul de sortare prin insertio
Acest algoritm se foloseste pentru l ntretinerea unei liste ordonate. Se porneste de la lista care
contine un singur nod (considcrata 0 lista ordonata) si orice adauqare a unui nod la lista se face
intr-o pozitie prin care S8 pastreaza ordonarea in hsta. in implementarea algoritmului s-a foJosit
a lista pentru care campul cheie este de tip numeric intreg, iar ordonarea este crescatoare cupa
valoarea carnpului cheie. Oeoarece in acest algoritm nu este necesara informatia despre
adresa ultimului nod, din subprograme au fast eliminate prelucranle care se refera la acesta.
Numerele care trebuie memorate in nodurile listei se citesc de la tastatura pana se citeste
valoarea a(are sernnificatia ca nu rnai exista lnformatie de adauqat).
Vari ant a 1 - Se porneste de la lista care coniine primul nod cu inforrnatie. Pa§ii execu-
tati in acest algoritm sunt:
PAS1 . Se adauqa primu l nod cu informatie la lista.
PAS2 . Cat t imp rnai exista inforrnatie de adauqat executa
PAS3. Se cauta nodul inaintea caruia trebuie adauqat noul nod.
PAS4 . Oaca s-a ajuns la sfars itul tistei , at unc i se adauqa noul nod ca ultimul nod din
list a: altfel , se adauqa noul nod i n tata nodului qasit . Se revine la Pasu! 2.
Impl ernentarca algoritmul ui .

struct no d {int i nfo ;
nod * u r m;};
int n ;
void a dau qa__nod (nod *&p r i-m)
{ p r Lm-c ne w noti , p r i.rrr-c- i n f' o '<n : p r Lm-c-urm--Nttf. L r )
Infor illat icii
125
*q )
{nod epvnew nod ; p-c- urmvq- c- urmr P..... >i nfo=q - >i n[ c i q->i nfo=n ; q-c-u rmep r I
void aderu q ai u Lt ErnLr iod *q }
{no d *p=ne w nod ; p,.->inf Q=n; q- >urrn=p; p ->u r m=NULL ; }
nod * c au t.a (n od *p c.b nl
{no d *q =p r i m;
while (q - >i n f o <n && q ->urm! ""NULL) q - q - c- u r m.
retur n q ; }
void *p r i m)
{for ( nod * p =p r i m; p ! =NUL L ; p wp - c-ur ru) cout.ccp - oLn toc c ' ' " ;}
void main ()
{n o d *p r i m,* q;
cou t .c-c vn uma r "; cin»n;
aci d uga_ncd (prim) ; / /Se a daug a primu l nod
c o u t c c vnu m a r "; c i. ncc-n :
while (n ! =0 ) t i mp ma i. e x t s t z .i.nEo rme t. Le d e a cle uqet;
( q=c a u t a (p r i m);
nod u l q trebuj.e adb ug at nodu l p
if (q-c i nI'o-cn) /I Dac5 s - .« a j un s I a a f a rs i.t.u .I Ld s t. o i.
2d a uga:.;..ult irn( q) ; I lnodul p s e a de.uqf ce ul tirn n od
else adauga in rata (q) ; I inodul p se aciauqa i n f a t.a rrcciu.LuL q
cout.c-cvn uma r- "; c i n» n ; }
a f isa r e f p r imLr } li Se afi o;> cClzJ.inf o n na ;': i i l e din l i E;ta
Vari anta 2 - Se porneste de la lista care contine un nod santinela (un nod care
marcheaza sfarsitul liste i). Acest nod contine ln carnpul cheie 0 inforrnatie care are 0
valoare care face ca el sa fie intotdeauna ultimul nod din lista (de exemplu , In cazul unei
li ste ordonate crescator, I n care carnpul folosit pentru ordonare este de t ip i nt, se adauqa
un nod care are In acest camp cea mai mare valoare pentru t ipul i nt - MAXI NT). Cand se
va afisa lnforrnat.a din lista. ultimul nod di n lista nu S8 mai af iseaza. Pasii executat i in
acest algoritm sunt:
PAS1 . Se adauqa nodul santinela la lista.
PAS2. Ca l limp exista inforrnatie de adauqat execut a
PAS3. Dac a infcrmatia care se adauqa trebuie sa fie la i nceputul listei, atu nc i se
adauqa noul nod ca prirnul nod din list a si S8 rev ine la Pasul 2; altfel, S8
trece la pasul urmator.
PAS4. Se cauta nod ulTnaintea caruia trebui e adauqat nou l nod.
PASS. Se adauqa noul nod in fata nodul ui gasit S8 revine la Pasul 2.
tmplemcntarca al go ritmul ui.
#include<i o ::; t r czun . li>
#include<v2 l u e s. h >
struct nod {int info;
n od *u n n; };
int n ;
v o i d ad auqa s a n t. Lne La (noa v Sp r Lm)
{p r i m=new nod ; pri m-> inro"'-MAX. I NT;
void e da uqe p ti m.t n'od *&p r i m)
{n o d *p =new nod ; p -c- Ln I'ocn , p -c-ur m- p r im. p ri.rn e-pi }
void *q )
{n o d nod ;
p->lJrm=q->lJrm; p->i ll£o=q ->lnfo ; q - >i n £o =!l; q ->urm=p ; }
126 I mplemcntar cu srructuril or dc datc
nod *c a u t a (flod *p r j m)
{ nod *p =p r i m;
for retur n pi }
v oid a f isa re (n o d *p r i m) / I Nu se a fi gea za Intcrma t.La d i n u ltimul nod
{f o r (no d *p =p r i m; p ->u rm ! =NULL ; p=p ->urm) c ou t «p->:i. n f o« " " ; }
v oid ma in ()
{ nod *p r i m, *q ;
ada uga_santinela( pr im ) ; / IS e adauga nodul santi nela
cou t .c-c vnuma r " ; cin»n;
whi le (n !=O) II Cat timp mai e xista i n f or ma tri e de a d a uga t
{i f (n-cp.r i ru-o Ln f o ) j *Dac a .i nfo rrnat.La trebuie s a fie 10.
inceputul lis tei */
a d a u g a_prim( pr in) ; /I no dul p seada uga co. p r i m n o d
e l s e
I/Se c aur a nodu I q Lna.Ln t e a ca r u i a t r ebu t etac aucc t rro d u.l, 0
(q) ; } / I nodul p s e adauga in f a t a nodului q
cout« "numar "; c in»n;}
a f i s a.re (p r i m) ; }
Algoritmul de interciasare a doua liste ordonate
Acest algoritm folosest e acelasi princip iu ca ,i aigoritmul de inte rclasare a doi vectori
ordonati . Cele doua liste sunt ordonate dupa acelasi camp cheie crite riu de ordonare
S8 obtine 0 a treia lista care contine infcrmatia din primele doua liste ordonata dupa
acelasi criteriu, folosind acelasi camp cheie. Pasii executati i n acest algo ritm sunt:
PAS1. Se creeaza Lista 1 ,i Lista 2 ordonate dupa acelasi criteriu si dupa acelasi camp cheie.
PAS2. Se adauqa primul nod la Lista 3 astfel: daca in conformitate cu criteriul de ordonare
folosit treb uie adauqata intorrnati a din pri mul nod al Listei 1, at unci se adauqa
inforrnatia din nodul prim al l.istei 1 ;;1 In List a 1 S8 trece la succesorul nodul ui
prim, iar in Lista 2 la nodul prim; altfe l , S8 adauqa inforrnatia din nodul pr im al
Listei 2,i i n Lista 2 se trece la succesorul nodulu i pri m, iar i n Lista 1 la nodul pr i m.
PAS3. Cat timp nu s-a ajuns la starsitul List ei 1 sau al Li stei 2, executa :
PAS4. Se adauqa la Lista 3 un nod dupa ultimul nod astfel : daca i n conformitate cu
criteriul de ordonare folosit trebuie adauqata informatia din nodul curent al Listei
1, atunci S8 adauqa inforrnati a din acest nod ;;i in Lista 1 S8 trece la succeso rul
nodului curent , altfel , se adauqa informatia din nodul curent al Listei 2 ,i i n Lista
2 se trece la succesa rul nadului curent. Se revine la Pasul 3.
PASS. Daca s-a ajuns la sfarsi tul l.istei 1. at unci la Li sta 3 se adauqa dupa ultimul nod
nodurile rarna se in Lista 2; altfel, la List a 3 se adaug a dupa ultimul nod nodurile
rarnase in List a 1.
Imp leme ntarea algoritmului. i n implementarea algoritmului s-au folosit liste pentru care
carnpul cheie este de tip numeric intreg , iar ordonarea este crescatoare dupa valoarea
carnpului cheie. Numerele care trebuie memorate i n nodurile listelor se citesc de la tastatura in
variabila n pana se citeste valoarea a(are semnificatia ca nu mai exista intorrnatie de adauqat).
Din subprogramele i n care nu este necesara informatia despre adresa ultirnului nod au fost
eliminate prelucrarile care se retera la acesta. Cele trei liste se ldentifica prin adresa primului
nod (p rim! , p r i m2 si respectiv prim3). Deoarece in acest algoritm nu este necesara
intormatia despre adresa ultimului nod, din subprograme au fast eliminate prelucrarile care se
refera la acesta Pentru parcurgerea celor doua liste se folosesc pointerii q respectiv r , iar
pentru lista care se creeaza prin interclasare - pointerul p.
Informatica
127
#include<i o s t r e a m. h >
s t r uc t nod t int info ;
nod *u r m,'};
i n t n ;
void a d auga,..:..Dod (nod * &p r i m)
{ p r i.rne ne w nod ; p r i.m-c-i.n f o e n : p r i.m-c-ur meNtrl.L r }
voi d adaug3_in:....- f at a (nod *q )
{nod *p =new hod;
p ->u rm=q->urm;p->info=q->info ; q - >info=n ; q - c-urme-pr }
v o i d adauga ultirn (nod *q )
{nod *p =new nod ; p ->urm=NULL; }
nod *c au t a {nod *p r i m)
{nod *p=pr i rr.;
while {p- >i n f o <n && p ->urm ! =NULL ) p =p - >u r m;
r e t urn p i }
v oid creare(nod *&p r i m) liSe creeaza 0 l ista ordonata
{nod *q ;
oou t .c-cvnuma .r " ; cin» n ; e da uqa j nod (prim) ;
cout«"nurua r " ; c i n» n ;
whi le (n ! =O}
{q =c a u t a (prim) ;
i f (q ->irlfo<n) adauga u l lim(q ) ; else adauga in fa talql ;
ccut.c-cv n uma r " ; c i n» n ; } )
v o i d afisare(nod *p r i m)
{n od - p-cp r i.n.:
wh i l e (p ! =NULL) { cou t .c-cp - o i n I ccc " " ; p =p->urm; } }
v o i d ma i n {)
{n o d vp r i. rnL, *pr im2, *p r i m3, *q , "r , *p ;
crea re(priml ) ; c reare(prim2) ;
i f
{n =p r i ml - > i n f o ; qep .r imL- ou r m,
e lse {n=p r i rn2 - >i n f o ; r =pr im2 ->urm; q=pr iml; )
adauga nod (pr i m3 ) ; p=prim3 ;
whi le (q ! =O && r ! =O)
{i f (r -> info>q- >i nfo) {n e q-o Ln f o , q e-q - c- u r rri j }
else {n= r- >i n f o ; rar -c- u rm r j
p vp- c-urm r I
if
wh i l e (q !=OJ {n=q- >i nf o; adauqa u Lt irn tp I • p vp -c-u rrn. ,q=q- >u rm; )
e lse
wh i l e t r ! =0 ) {ne r -c-Ln fo , adauga _ult i.:Tl (p ) ; p-p-c-unn. rvr-c-urm. I
a£isareiprim3J ; ) / /Se afi$eaza informa\=. i ile din lista interclasata
2.6.3.10. Prelucrarea listelor simplu inlantuite
Rezolvarea problemelor i n car e orqanizati datele sub forma de liste presupune folosirea
algoritmilor prezentati , astfel:
1. Se creeaza lista prin folosirea urrnatorilor algoritmi :
-7 Se adauqa primul nod la lista vida (algori tmul pentru ad auqarea l a ll sta a primu-
lui nod ).
7 Se adauqa cate un nod la lista. Pozi tia in care se adauqa nodul depinde de cerin-
tel e problemei. Daca lista nu este ordonata, adauqarea se poate face la starsitul
128
lmplcmcn tarca structurllor de date
sau la inceputul lislei (al gori tmul pent ru ada uqa ro la i nc ep ut ul sau la starsi t u'
li st ei ). Daca lista este ordonata, S8 parcurge mal intai lista pentru a gasi pozi tia de
inserare (ai gori t mul pentru cautaroa unui nod i n ti sta) dupa care S8 inse reaza
noul nod In pozit ia gasita (al gori t mul pentru adauqaro i n i nte r i oru l li stei ).
2. Sa intretino l ista prin folosirea urrnatorilor algoritmi :
-,) Se adauqa noi noduri la lista . Ca ~ i la crearea listei, i n functie de cerintele proble-
mei S8 va folosi unul dintre algoritmii de adauqare.
-,) Se el irnina noduri din lista. Mai inlai se parcurge lista pentru a gasi nodul care se
elimina (al gori tmul pentru caut arc a unui nod i n lista) dup a care S8 elirnina
nodul din pozitia gasita folosind unul dintre algori tmii pent ru cli mi nare - in
functie de pozi tia in care a fast gasit nodul.
7 Se modifies inforrnatia dintr-un nod al listei. Mai i ntai S8 parcurg e lista pentru a gasi
nodul in care se va modifica informatia (ai goritmul pentru cautarca unui nod in
li sta). Oaca lista nu este ordonata sau daca inforrnatia care se rnodifica nu face
parte dintr-un camp cheie dintr-o lista ordonata, se rnodifica valoarea carnpului
respecl iv. Daca lista este ordonata si, prin modificarea valori i carnpului, se poate
distruge aceasta ordonare, se modifica valoarea carnpului, se salveaza inforrnatia
di n nodul listei l ntr-o variabila intermediara, 58 elirnina din vechea pozitie (al goritmul
pentru cli minarca unui nod di n Hat e). se parcurge lista pentru a gasi noua pozitie
(algori tmul pentr u caut area unui nod in li sta) ~ i 58 insereaza nodul in pozitia
gasi!a (algori tmul pentru adauqarc a un ui nod la lista).
3. Se obtin inforrnatii din Iista Se par curge lista (al gorit mul de parcurgere a li sl ei)
si se viziteaza fiecare nod all istei pentru a extrage din el inforrnatiile necesare.
[Swmu de cmz I
Seop: exempl ificarea modului i n care , pentru rezolvarea probleme i, folositi algoritmii de
prelucrare a listelor simplu l nlantuite ~ i implementarea lor cu aj utorul subprogramelor.
Enunt ul probl emci 1. So citosto dintr-un fi§ier taxt lin sir do numere separate prin spatia
cu care se creeazD 0 listfi simplu inlantlli ta 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/mar impar "din lista vetonroe 100 §i sa S8 etiseze numctete din tiste. Penuu testarea
programu!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. Numerele se vor cit : din fisier ~ i 58 vor
scrie in lista prin adauqare dupa ultimul nod. Problema se desco mpune i n urrnatcare le
subproblerne. iar algoritmul de rezolvare a unei subprobl ems este implemental cu ajutorul
unui SUbprogram:
iE1l Se crteste primul numar di n fisier si se adauqa pri mul nod la lista (nodul pri m) -
subprogramul adauga nod () .
~ Cat timp mai exista numere in fisier executa: se citeste un nurnar din fisier si 5e
adauqa un nod cu numarul respectiv dupa ultimul nod din lista - subpr ogramul
adauga ul t im () .
~ Se ver ifica daca numerele din lista sunt distincte, astfel: se parcu rge lista de la primul
nod pana la penultimul nod si se venfica daca nurnarul din nodul curent mai exista i n
. nodurile care urmcaza dupa el pana la sfarsit ul listei - subproqrarnul distincte () .
~ 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 relucrare ( ) .
Informatica 129
Se parcurge lista de la primul nod pana la sfarsit ul ei si se afiseaza inforrnatia din
fieca re nod - subprog ramul afi s are ( ) .
#include <f s t r e am . h>
struct n od t int i nfo;
n od * u r m;) ;
fs tream f( " Li s r.e l . t xt" , i 0 5 : : in) ;
int n i
void a da u g a ,.; n od (nod *&p r i m, nod *&u l t i m)
{pr i m=new nod; prim->info=n; prim->urm=NULL; ul t im=pr i m; }
void adauga_ultim(nod *&ul t i m)
{nod nod ; p->infb=ri ; p->ur .m=NULL; ulti rn->urm=p ; ultim=Pi }
v o id * &q, nod *&u l t i m)
{nod *p zonew nod ; p ->info=100 ; p ->urm=q->urm; q ->urm=p ;
if (q==ultim) illtim=p ;}
*pr i m)
{f or (nod *p""" p r i m; p->urm!:=.NULL; p=p->urm)
for (nod *q =p - >u r m; q !=NULL; q=q->urm)
if (p->info==q->info) retu r n 0;
return I ; }
v o i d prelucrare(nod *p r i m, nod *&u l t i m)
{for (nod *p =p rim; p ! o;,o NULL; pep -c-u r m)
if adauga_dupa(p,ultim) ; }
v o i d a f isa.r e (nod "p r.Lm)
{ for (nod * p=p r i m; p! =::oNULL; pep-c-urm) ccutx-cp - oi n focc '' ". cout-ocendf , }
void ma in ()
{nod ep r Im, *u l t i m; f >>n adauga nod(prim,ultim} ;
wh i le (f»n) adaugaultim(ultim) ; f i of o s e t j ,
i f {di s t Lnc t e tp r Lm l ) cccc .c-c vz I c m e nt e l e sun t d i.s t i nc tev c c e n cn .
else cou t-cc ve Iement.eLe nu s unt dt s t i n c t e.vccend f •
afisare(pr im) ; }
Enuntul problemei 2. Se cit este dintr-un tisier text un numet cu maxim 20 de cifre. Sa se
verifice daca nurnarul esle palindrom. Pentru testarea programului se var folosi oou«
numere: 1234321 §i 12345.
Se vor crea doua liste: una cu cifrele nurnarului citite din fisier. prin adauqa re dupa uJtimul
nod, iar a doua, cu cifrele memorate Tn nodurile primei liste prin adauqare In tata primului nod
;;i S8 vor campara cele doua liste. Din fisier se va citi fiecare cifra a nurnarului intr-o variabila
de tip char si se va obtine cifra scazand din codul ASCII al caracterului citit codul ASCII al
cifrei O. Cele doua liste se identifies prin adresa primului nod (prim1 si respectiv prim2) prin
adresa ultimului nod (ultim1 respectiv ultim2). Problema se descompune in urrnatoare!e
subprobleme, iar algor itmul de rezolvare a unei subprobleme este implementat cu ajutorul
unui subprc qrarn
IE] Se citeste primul nurnar din fisier se adauqa primul nod la Lista 1 (nodul prim1 ) -
subprogramul adauga nod ( ) .
[E] cat timp mai exista caract ere in fisler, executa: se citeste un caracter din fisier, se
converteste In cif ra si se adauqa un nod cu citra respectiva dupa ultimul nod din Lista
1 - subprogramul a d aug a u l t i m () .
Se adauqa primul nod la Usta 2 (nodul pr im2 ) care va contine infor matia din primul
nod al Listei 1 (prim1) - subprogramul adauga nod()
130 Im(ll ementarea st ru ct ur ilor de dat e
Se parcurge Lista 1 de la succesorul primului nod pana la sfarsitul ei se adauqa un nod
cu citra respectiva inaintea primului nod din Lista 2 - subprogramu l adauga prim() .
Se parcurg si multan ambe le liste de la primul nod pana la se v erifica daca
sunt egale cifrele memorate i n nodul curent din cele doua lisle - subprogramul
p alindrom ( ) .
#includ e <f s t r e a m. h >
s t r uct nod ti n t in f o ;
nod - ur mr l •
f s t r e a m f( "1 ista2 .t xt " , i o s : :in ) i
int n ;
v oid adauga nod {nod *&p r i m, nod *&u l t i m)
{p r i ;no:= new nod; prim->infoo=C1 ; prim->urm=NULL; ul tim=prirn. ; }
voi d adaugu_u ltim(nod
{nod *p=new nod : p ->info=n; p ->urm=NULL: ul t im=p ; }
voi d acta uga_ prim(nod *&p r i m)
{ n od - pv new nod ; p- >i n f o=n ; p-c- u rmepr Lm, p r Lm-p r j
i nt pa l i ndr om(nod *p r i ml, nod *p r i m2 )
{ nod "p , *q;
f or (p=priml , q=p rim2 ; p ->urm! =NULL; p=p->urrn, q=q - >ur m)
if (p ->info !=q->info) r eturn 0 ;
r eturn I ; }
v o i d ma i n ()
{char c ; nod
r » >c • n=c - 'O ' ; adauga nod Lpr Lml s u Lt i mLj r
whil e (f»cl ( n=c - ' O' ; a da uga_u l t i m(ul t i ml ) ; } f . c l o s e ( ) ;
n=priml ->info;
f o r (p=priml - >u rrn; p !=NULL; p=p->u r ml
{n=p - >i n f o; ada uga_prim (pr i m2 ) ; }
if (pa l ,indrom (p riml ,pr im2) ) cOllt«"Es Le pa lindrom" ;
el s e cout« " Nu estc pa lind rorn " ; }
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 programII/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 ordonate conform unui criteriu . Numerele se vor citi din fisier se vor
scrie i n lista prin adauqare dupa ultimul nod. Problema se descompune i n urrnatoarele
subprobleme, iar algoritmii pentru rezolvarea subproblemelor sunt irnplementati cu aj utorul
subproqrarnelor:
[i>] Se citeste valoar ea pentru x de la tastatura.
Se citeste prirnul nurnar din fisier si se adauqa primul nod la lista (nodul prim) -
subprogramul ada u g a nod ( } .
timp rnai exi sta numere i n fisier execut a: se citeste un nurnar din fisier se
adauqa un nod cu nurnarul respectiv oupa ultimul nod din lista - subprogramul
a d a u g a u l tim () .
Daca primul nod din lista contine numarul x, atunci se elirnina primul nod (subprogra-
mul e limi n a _ p r i m( )) ; altfel , se cauta predecesorul nodulu i care contine nurnarul x
(subprogramul cau ta () ) si daca se acest nod, atunci se sterqe nodul care
urmeaza d u pa el (subprogramul el imina _ u rm () ).
Informatica 131
Se parcurge lista de la primul nod pana la sfarsitul ei si se afiseaza inforrnatia din
fiecare nod - subprogramu l af Ls er-e () .
#i n cl ud e <f s t r e a m. h >
struct nod tint info ;
n od - 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.i.m=p ; }
nod * cauta {nod
&& 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; delete q ; }
void elimina_urm(nod *p )
{nod *q =p - >u r m; p ->urm=p->urm->urm; delete q ; }
voi 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 ( )
{no d ep r i m, "ul c i m, "'p ; cout.c-c" x e " ; cin» x;
f »o; (prim, u ltim) ;
while (f»n) 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 probl emei 4. Se citeste dintr-un tisier text un 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. Numerele se vor cifi din fisier se vor
scrie in lista prin adauqare dupa ultirnul nod. Problema se descompune in urrnatoarele
subprobleme, iar algoritmi i pentru rezolvarea subproblemelor sunt irnplernentat i cu ajutorul
subprogramelor:
:E1I Se citeste primul nurnar din fisier si se adauqa primul nod la lista (nodul prim) -
subprogramul adauga nod ( ) .
Cat timp mai exista numere i n fisier executa: se citeste un nurnar din fisier se
adauqa un nod cu nurnarul respectiv dupa ultimul nod din lista - subprogramul
adauga ul tim() .
5e elimina din lista valorile care se repeta, astfel (subprogramul prel ucrare () ):
Pentru un pointer p care indica fiecare nod din lista, incepand cu primul nod pfma la
p.enultimu l nod, exe cuta:
-7 Se initializeaza pointerui q cu adresa nodul curent (indicat de pointerul p).
-7 Cat timp pointerui q nu indica ultimul nod, executa: daca nodul indicat de
pointeru l p contine acelasi nurnar cu succesorul nodului indicat de pointerul q,
132
lmplcrnenrarea st r uct ur ilor dc date
: atunci S8 elimina succesorul nodului q (- subprogramul eLi.m.i .na u rm n ):
! allfel , pointerul q indica succesorul nodului.
Se parcurge Iista de la primul nod pana la sfarsitul ei se afiseaza informal ia din
fiecare nod (subprogramu l afisare ( ) ).
#incl u de<f s t r e a m. h>
struct n od lint inf o;
n o d * u rm; } ;
f s t r e am
int n ;
void adauga nod (nod *&p r irn, nod *&u l t i m)
{p r Lm- n ew nod; pr Lm-c-Ln foe x , prirn->unn=NULLi ultim=prim; }
v oid a dauga_ult im{nod *&u l t i m}
{nod *p=new nod ; p- >info=x ; p->urm=NULL; u lt im->urrn=p ; ultirn=p; }
v o i d e limina _ urm(no d *p }
{ nod * q=p - >u r m; p->u r :n=p->urm->urm; delete q; }
void *p r i m)
{::od *p ,*q ;
for
{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) cout ccp - c- Ln f o-cc" ";
cout« e ndl;}
void mai n {} *p r i m, *u l t i m; f» n; adauga_nod( pr i m,ultiml ;
while (f» :1) a dauqa_ul t i rn(u l t i m); L c l o s e (} ;
p reI ucra re (p r i m) ; afisar e (p r im) ; }
Enuntul problemei 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
potinoernete -lOx
4
+5x
2
-3x 3x
3
+7/+x+2.
Se vor crea coua liste i n care se vor memora cele doua polinoame. lnformatia utila va fi
mernorata intr-o i nregistrare cu doua carnpuri: un camp pentru coeficient si un camp pentru
grad. Ambele liste se creeaza prin citirea datelor din fisier 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, pri m2 respectiv pri m3) si prin adresa
ultirnului nod (ull im1, ul li m2 respectiv ull im3). Problema de creare a listei surna a
polinoamelor se descompune i n urrnatoarele subprobleme, iar algoritmii pentru rezolvarea
subproblemelor sunt impiernent ati cu ajutorul subprogramelor:
IE] Se citesc din fisler n1 si coefi cientul gradul primului termen din primul polinom. Se
adauqa primul nod la lista L1 (nodul prim1) - subprogramul a dauga nod () .
E?] Pentru urrnatoarele n1-1 perechi de numere din fisier , executa: S8 citesc din fisier
coeficientul gradul unui termen al primului polinom si se adauqa un nod cu
inforrnat ia respect ive dupa ultimul nod din lista L1 - subprogramul adauga_ ul tim() .
Informat icii
133
Se citesc din fisier n2 coeficientul si gradul primul ui termen din al doilea polinom.
Se adauqa primul nod la lista L2 (nodul prim2) - subprogramul adauga nod ( ) .
Pentru urrnatoarele n2-1 perechi de numere din fisier, exec uta : S8 dtesc din fisier
coef icientul gradul unui termen al celui de al doilea poli nam se adauqa un nod cu
informatia respect ive dupa ultirnul nod din lista L2 - subprogramul adaug a _ u l tim( ) .
Se adauqa primul nod (prim3) 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 nodului din Lista 1, iar coeficientul este egal cu suma coeficientil or din
nodurile celor doua liste 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, atunci
gradul este egal cu gradul nodului din Lista 1, iar coeficientul este egal cu coeficientul
nodului din Lista 1 in Lista 1 se trece la urrnatorul nod; altfel , gradul este egal cu
gradul nodul ui din Lista 2, iar coeficientul este egal cu coeficientul nodului din Lista 2
in Lista 2 S8 trece la urmatorul nod - subprogramul adauga n od () .
Cat timp 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 curent din
lista L1 este egal cu gradul nodului curent din lista L2, at unci gradul este egal cu
gradul nodului din Usta 1, iar coeficientul este egal eu suma ccefi cientilor din noduril e
celor doua liste in ambele liste se trece la nodul urrnator : allfel , daca gradul din
nodul curent din lista L1 este mai mare decat gradul din nodul curent 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 i n 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
in Lista 2 S8 trece la urmatorul nod - subprogramul adaug a _ u l tim () .
#i nclude<f s t r e a m. r.>
f stream f1 ( " l ista5 . t xt " , ios: : in) , f2 t vp o Lj nom. r x t ", ios : : ou t } ;
struct nod lint e ,g ;
nod eu r rrr j ,
int e ,g ,:1 ;
voi d ad auga nod { nod *&p r i.."TI, no d *& u l t i m)
prim- >g=g ; }
void
*p=ne w nod ; p->u r m=NULL; p - >c =c ; P->9=9 ; }
void c r ea r e (nod *&p d .:n, nod *&u l t i ml
{f l » c » g; a da uga_ nod lpr i m,ultim) ;
f or ( i n t i '-".2 ; t c-n , i -'- t ) { £ l » c» gi adzru qa ul t i m{u l t i rn) ; } }
void a d un a r e (noel - p r irn I. nod *p r i m2 , n od * &pr im3 , I1 C'Jd * &u1 t irr,3 .1
{nod *p =p r i ml , *q=p r i r:12;
if l p - >g ==q - >g) {g =p - >g ; c =p- >c +q- >c ; p=p->ur m; q=q->u r m; }
else i f (p ->g>q- >g) {g=p- >g ; c=p ->c ; p=p- >urm; }
else {g =q- >g; c =q- >c ; q=q->urm; }
adauga nod( prim3 ,ultim3 ) ;
while (q l =NULL && p !=NULL)
{i f c=p->c+q->c ; p =p ->Jrrn;
else if (p - >g >q - >g) { g=p- >g; cep->c • p =p- >u r rn; }
e lse c=q->c ; q=q ->urm; }
adauqa u l t i m(u l t i m3 ) ; }
if {p !
whi le (p ! =NULL ) ( g=p - >g; c=p->c ; adaug a ultim(u l t i m3 ) ; }
else
134
Implcmentarea structurilor de date
while (q !=NULL) ( g=q- >g; c v q-c-c r edeuqe \J1tim(ultim3) ; } )
void afisare{nod *p r i ml
(for (nod *p=p r i m; p !=NULL; p=p - >ur rn) c out « p - >c« " "« p - >g«endl;
cou t« e nd l; )
voi d salvare(nod *p r i m)
{f or (nod *p=p r i f:l ; p ! =NULL; p=p - >urm) f2 «p->C« " "« p - >g«endl;}
v oid main ()
( noc *p r i ml ,*u l t i rnl ,*p r i m2 ,*u l t i m2 ,*p r i m3 ,*u l t i m3 ;
int l"11 ,n2 ;
f l oc-n L: n=n l; creare {priml ,ultiml ) ; afisare (priml) ;
n=n2 ; creare (prim2 ,ultim2) ; af i s are {prim2 ) ;
a dunare (priml ,prim2 ,prim3 ,ult im3 ) ; afisare lprim3 ) ; salvare {prim3 ) ;
f 2 .cl os e() ; }
Enuntul probl emei 6. Reuniunea !ji intersectie a doua muttimt. Se citesc dintr-un
text do pe prima linie un numar n1, care reprezintfJ numeru! de elemente ale ptimei tnuttimi.
apoi de pe urmatoarea tinie elementele muuimit, de pe linia urmetoere un numer n2 -
numerut de elemente ale celei de a doua muttim), epoi de pe urmatoarea tinie elementele
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 i n care se vor memora cele doua rnultirni. Ambele liste se creeaza prin
citirea datelor din fisier 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, prim2, prim3 "i respectiv prim4) "i prin adresa ultimului nod (ultim1,
ull im2, ullim3 " i respectiv ultim4).
Pentru determinarea reuniunii se vor executa urmatorii pasi:
Pas1. Se adauqa primul nod la Lista 3 (nodul prim3) care contine numarul din primul nod
al Listei 1 (pri m1).
Pas2. Se parcurge Lista 1 de la succesorul primului nod pana la sfarsitul ei " i se adauqa
un nod cu numarul respectiv dupa ultimul nod din Lista 3.
Pas3. Pentru li ecare nod din Lista 2, exec uta : se parcurge Lista 1 si daca nurnarul din
nodul curent din t.ista 2 nu S8 gas8ii te 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 initializeaza Lista 4 ca lista vida (prim4=NULL si ult im4=NULL).
Pas2. Pentru fiecar e nod din t.ista 1, executa: se parcurge Lista 2 si daca nurnarul din
nodul curent din Lista 2 se gase" te in Lisla 1, at unci se adauqa un nod cu
numarul respectiv ca prim nod i n Lista 4 (nodul prim4).
Pas3. Daca s-a adauqat primul nod la Lisl a 4, atunci pent ru un nod din Lista 1 de la
succesorul nodului curent pana la ultimul nod, executa: se parcurge t.ista 2
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.

struct nod t i nt i n :o;
nod - u rn. r } ,
fstream
i nt x ;
voi d adauga_ nod( nod
III fnrill aticii
135
{p r i rnvne w nodi pri rn -c- Ln f oex r pr irn- >u r m=NULL; u LtImep r i.mr I
void a d a u ga_ultim( nod *&u l t i m)
{no d - penew nod ; p- c- Ln f c -cx, p ->unn=NUL L ; ul t i m- >u r m=p ; ul t i m=p ; }
voi d c r e a r e {nod *&p r i m, nod *&u l t i m)
l i n t n ; f »n»x; ada uga_flod (p rim, ultim) ;
for (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 od *p r i ml , nod *p r i m2 , * &p r i m3 , nod *&u l t i m3 )
{nod *p ,*q ; int ga 5it ;
xepr i.mL'- oi.n f o r adauga (p r im.J , ul tim3) ;
f or (p=priml ->unn ip !=NULLi p- -p->urm) l x=p->infoi adauga u ltim{ul tim3) ; }
f or
(for (q=p r i ml, ga s i t =O; q !=NULL &&
ga3it=l ;
if ( ! g a s i t i {x e p -c-Lnf 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 }
( nod *p ,*q ; int gasit ; ultim4=NULL;
f o r (ga s i t=O, p ""'p r i m1; p ! =NULL && i qas i t , p=p ->urm)
for (q=prim2 ; q !=NULL && q=-q->ur m)
i f (p - >info==-q->info) {g a s i t = l ;
if (ga s i ':)
( a da uga non (p r i m1 , u l : i m4 ) ;
f or ( ; p ! p=p - >u ern)
{for (gas i t =O, q=- p r i m2 ; q! =- NULL && !gasit ; q=q- >ur 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 :is 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 nd l ; }
v o i d mai n ()

c cee ce (p r .iml , ul timl) ; c r ee r e (prim2 , ul tim2} ; f _close ( ) ;
r cuni.une (priml , prim2 , prim.S, ul t i m3 ) ; ccucccvnecnt unee- " ; afisare (prim3) ;
Lnt c r sect i e (pr iml , p r i.mz , p r i.mq , u Ltim-1) ; c o u t-cc" Intersectia= " ;
if {prim4l=NULL)
else cout«"Mul t l :ne 2. vida " ; } '*"
o 0 Scrieti cate un program care sa rezolve cerintele flecarei probleme. Fieca-
Tenui --- re problema se va deseompune i n subprobleme algoritmul pentru rezol-
varea unei subprobleme se va implementa cu un subprogram. Datele se
transmi t intre subprograme eu aj utorul parametrilor de comunicatie nu al variabilelor
globale. Dupa executarea unei operatii de preluerare a li sle; simplu i nlant ui t e. se vor afisa
numerele din nodurile listei pentru a se verifica daca operatia de preJucrare s-a executat
corect. Se vor alege seturi de date de intrare astfel l ncat sa se verifice algoritmul pe toate
traseele lui. Pentru urmatorii 18 itemi in nodurile listelor se rnernoreaza numere i ntregi. Sirul de
numere se citeste dintr-un fisier text in care sunt serise pe acelasi rand. separate prin spatiu
1. Se creeaza 0 lista i n care ordinea de acces este cea i n care sunt citite numerele. Se
mai citesc de la tastatura coua numere x y. Se insereaza i n lista numarul y inaintea
nurnarului x.
2. Se creeaza 0 lista i n care ordinea de aeces este inversa celei i n care sunt citit e nurne-
rele. Se elimina din lista eel mai rnic nurnar si eel mai mare nurnar.
136
1m ilcmcntarca st r ucturilor de date
3. Se creeaza 0 lista ~ i S8 afiseaza in ordinea inversa citirii din fisier numai numerele pare.
4. Se creeaza 0 lista in care ordinea de acees este cea in care sunt citite nurnerele din
fisier. Se mai citeste un nurnar n de la tastatura. Se afiseaza elementul cu nurnaru! de
ordine n din lista. Oaca nu exi sta, S8 afiseaza un mesaj de informare.
5. Se creeaza 0 lista i n care ordinea de acees este cea in care sunt citite numerele din
fisier . Se insereaza inaintea fiecarui nurnar factorii sai primi.
6. Se creeaza 0 lista in care ardinea de acees este cea i n care sunt citite numerele din
fisier . Se insereaza i ntre fiecare pereche de noduri eel rnai mare divi zor comun al celor
doua numere.
7. Se creeaza doua lisl e in care ordinea de acces este cea in care sunt citite numerele din
fisiere. Se creeaza a treia lista prin concatenarea llstei care are cele mai putine
elemente la lista care are cele mai multe elemente. Daca listele au acelasi numar de
elemente, se va adauqa lista a doua la prima lista.
8. Se creeaza doua liste in care ordinea de acces este cea in care sunt citite numerele din
fisiere. Se creeaza a treia lista prin concatenarea celei de a doua liste la prima lista. Se
elirnina din a treia lista numerele care S8 repeta.
9. Se creeaza 0 lista i n care ordinea de acces este cea in care sunt citite numerele din fisier.
Se divizeaza lista in doua liste: una care coniine numere care sunt palindrom si una care
contine numerele care nu sunt palindrom. Se salveaza lista cu numere palindrom intr-un
alt f i ~ i e r . Daca nu au existat numere palindrom, in fisier se va sene un mesaj de informare.
in lista care nu confine numere palindrom se insereaza cupa fiecare numar inversul sau.
10. Se creeaza 0 lista in care ordinea de acces este cea in care sunt citite numerele din
fisier. Se afiseaza numerele care au ultimele trei cifre identice, se elimina din lista
numerele care au ultimele trei cifre consecutive si se insereaza valoarea 10 i naintea
numerelor care au suma ultimelor trei cifre eqala cu 10.
11. 8e creeaza 0 lista i n care ordinea de acces este cea in care sunt citite numerele din
fisier. Se afiseaza numerele care au mai mult de doi divizori primi , se insereaza divizorii
proprii in tata numerelor care au mai mult de trei divizori proprii si se elirnina din lista
numerele care au eel putin doua cifre identice.
12. Se creeaza 0 lista numai cu numerele prime din fisier. Se afiseaza eel mai mare numar
prim ;;i eel mai mic nurnar prim. Se verifica daca lista contine numai numere distincte ;;i
se afiseaza un mesaj de informare. Daca lista nu contine numai numere distincte, se
elirnina numere din lista astfel tncat sa contina numai numere distincte. Se salveaza lista
creata intr-un alt fisier. Daca nu au existat numere prime in fisier, se va scrie un mesaj
de informare. (l ndicati e. Se va crea 0 lista ordonata crescator ~ i se vor afisa numerele
prime din prirnul nod ~ i din ultirnul nod) .
13.Se creeaza coua liste cu numerele citite din fisiere. in primul fisier numerele sunt
ordonate crescatcr, iar i n al doilea fisier numerele sunt ordonate descrescator. Se
creeaza a treia lista prin interclasarea primelor coua.
14.Se creeaza 0 lista i n care ordinea de acces este cea in care sunt citite numerele din
fisier. Sa S8 inverseze ordinea de acces i n lista, astfel incat parcurgerea sa se taca de
la ultimul nurnar catre primul nurnar. (lndicati e. Se rnuta ultimul nod la i nceputul listei ;;i
apoi, pana se ajunge la numarul memorat la adresa care a fost a primului nod se
insereaza nodul ulti m dupa ultimul nod inserat.)
15.Se creeaza 0 lista in care ordinea de acces este cea in care sunt citite numerele din
fisier. Sa se afiseze in ordine inversa numerele din lista. (Indlcatle. Se implernenteaza
un algoritm recursiv de parcurgere a listei.)
I II formatid 137
16. Se creeaza a lista ordonata cu numerele din fisier si se divizeaza apoi lista in doua Iiste:
una cu numere pare una eu numere impare.
17.;n fisier sunt memo rate foarte multe numere (maxim 10.000). Foarte mul te dint re aceste
numere S8 repeta (exists maxim 100 de numere distincte). Se creeaza 0 lista ordonata
crescator numai cu numerele disti ncte si eu frecventa lor de aparitie. Se aflseaza eel mai
mare numar si eel mai rnic numar . Se calculeaza media aritrnetica a nurnerelor care au
valoarea cea mai mare sau au valoarea cea rnai mica se afiseaza numai numerete
care sunt mai mari decal media aritrnetica.
18. Pentru doua rnultirni de numere A B sa se determine diferent ele A-B B-A.
19. 5e citeste dintr-un fisier text un nurnar cu maxim 20 de cifre. Se creeaza a lista cu cifrele
nurnarului, S8 eli rruna din lista cifrete pare se afiseaza nurnarul astfel obtinut.
20. Se calculeaza produsul a doua polinoame. lnforrnatiile despre cele doua polinoame S8
citesc dintr-un fisi er. (Indi cat ie. Pentru fiecare nod din prima lista se parcurge a doua
lists iii. daca produsul coeficientilor nu este nul, se creeaza un nod i n iista a treia care va
avea coeficientul egal cu produsul coeficientilor gradu l egal cu suma gradel or. l.ista a
treia este a lista ordonata descrescator dupa grad.)
21. 8e creeaza dou a liste cu n noduri respectiv m nodur i care cont in numere intregi
generate aleatoriu in intervalul [a.b] . Valorile pentru nurnarul de noduri n, si respect iv rn,
si pent ru limitele intervalului , a b, se citesc de la tastatura. Sa se afiseze numai
numerele distincte din cele doua liste !;) i nurnarul care are cea mai mare trecventa de
aparitie in cele doua liste.
2.6.4. Algol'itmi pcntru prelucrarca listclor circulare simplu
inlan!lIite
Algoritmii de adau qare a primului nod la ti st a vi da si de ada uqare dupa ullimul nod
sunt la fel ca si cei de la listele simplu l nlantuite:
Lista circulara simplu ln tantuua
ultim
prim
I info
-,-
I urm
I,
info I r: info
I urm II I'.
info
I urI"l
I
2.6.4. 1. Crcarc a l i st c i
Deoareee in algoritmii de preluerare trebuie sa se cunoasca adresa prirnului nod, este impor-
tanta adauqarea primul ui nod la lista vi da. Pasii algo ritnl ului de croaro a unei liste sunt:
PAS1. 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 leaga ultimul nod de primul nod.
Impl cmcntarea al gori tmului. Se foloseste functia procedurala c reare ( ) at carei parame-
tru este prim de tip nod : care se transrnite prin reterinta deoarece este parametru de
intrare-ieslre. 8e foloseste variabila globala n pentru citirea inforrnatiei din nod. Se conside-
ra ca nu mai exista intormatie atunci cand valoarea citita pentru n are valoarea O.
voi d c reare (nod *&p : i o )
( nod *u l t i m; cin» n;
(cin» n;
ul t.i m-c-ur-mopr-a m }
138 Implcmenta r ca strudurilor de date
2.6.4.2. Parcurgerea listei
Deoarece lista circulara nu conti ne un ultim nod care sa fie conside rat ca termi nator al
listei , S8 va considera ca nod care terrnina lista nodul prim. Pasi i algoritmului de prelu-
crare a unei liste circulare sunt:
PAS1 . Se prelucreaza primul nod din lista (nodul prim).
PAS2. Pentru l iecare nod din lista lncepand de la succesorul nodului prim pana la
primul nod, executa: S8 prelucreaza nodul curent.
Impl ementarea algoritmului. Se foloseste functia procedurala parcurge (J al carei para-
metr u p rim de tip nod S8 transmite prin valoa re deoa rece este parametru de intra re.
vo id pa r cuge (nod *p r i ffi )
{l i se prel ucreaza prim->info ;
f or (nod p=p- >urm) I /se prelucreaza p->info; }
2.6.4.3 . Eliminarea unui nod din listii
Daca S8 elirnina din lista nodul care urmsa za dupa nodul curent p trebuie sa S8 verifice
daca acest nod nu este nodul prim, ca sa nu S8 piarda adresa primului element di n 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 devine
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, nod *&p r i m)
{nod *q =p->u rm; p->urm=p->urm->urmi
if (q===prirn)
delete q ; }
I Swmu de CBlZ I
Scop: exemplificarea modului in care, pentru rezolvarea problemei , foloslti algoritmi i 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 pare 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 primul nod si daca nurnar ul
din succesorul nodului curent este par, at unei se elimina succesorul nodului curent -
subprogramul eLami na 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 -
subprogramul eLi.mi.n a_ p r i m ( ) .
Informatica
139
Daca lista nu este vida (subprogramul es te vida () }, atunci S8 afiseaza numerele
di n fiecare nod (subprogramul afisare ()) . -
#include<f s t r e am. h >
struct nod {int info ;
nod *u r m;};
fstream f( "li s t a7 . t x t " , i o s : : i n } ;
int x ;
void ada uga nod (nod *&p r i m, nod *&ul t i :nl
{p r i :n=new nod ; prim->i n fo=x ; u l t i m=pr i m; }
void a cla ug a_u l t i m(nod * &u l t i m)
{nod "p e new nod; p-c- Lnfoex , p ->unn=NUL L ; u l t i m- >urm=p ; uL t..i nr- p , }
void c reare(nod *&p r i m)
{nod *u1tim; I c->x , a d a uga.....nod rpr im , u ltim ) ;
while (f»x)
ul t Lm- c-urme-p rLm , }
' vo i d e Li.m.ina __urm( no d *p, nod *&p r i m)
{riod *q=p - >u r :n; p -c-urmcp -c-urm- ou rm ,
if (q==p r i m) p r im=prim- >urm;
delete q ; }
voi d e Ld.m.i.na p i .im t nod *&p r i m)
{no d *q=p r i m; prirn=NULL ; delete q ; }
a.nt; e s t .e vLda ( noo ep r-Lrn) {return pr i m= =NULL ; }
v oid 2-fisare( nod *p r i m)
Lcout.c-cp r i.m -oLn Fo-cc " ",
for {nod *p"" p->u rm; p >=p rim;p =p->urm) coutxcc - c- Lnfcoc'' "; cout«endl ;}
void ma i n ()
{no d ep r i.m, *p; c r ee.r-e.Ip r i .mj , afi s are (p r i m);
for (p=pr i m- >u r m; p ! =p r i lll; )
if (p- >ur m->i nf o%2=-"' O) e l i rni nu.....urm(p ,prim) ;
else p=p- >u rm ; _
if (p r i m-c-I u Co %2==O)elimina,:-,"prim (p rim} ; -<I t>-
if (! 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 algoritmul pentru rezolvarea
unei subprobleme se va implementa cu un subprogram. Datele se transmit
intre subprograme eu ajutorul parametrilor de cornunicatie nu al variabilelor globale. Se
creeaza liste ci rculare si mplu ln lantu 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,
sa se elimine numerele care au ultimele doua cifre consecu tive.
2. Sa se verifice daca numerele sunt in progresie geometr ica si sa se afiseze primul
termen al progresiei geometriee. (Observat ie. Daca numerele sunt i n progresie geome-
trica, nu este obligatoriu ca sirul de numere citit din fisier sa lnc eapa cu primul termen al
progresiei geometrice.)
3. Sa S8 insereze intre doua numere pare din llsta media lor aritrnetica pana cand nu mai
exista perechi de numere pare.
140
Implcmcn t ar ca structuril or de date
//inforrna\:ia propriu-zisa
pentru
4. Din lists circul ara creata sa se creeze alte dOU8 liste circulate simplu i nlant uite - una cu
numerele divizi bite cu cea mai mare citra, iar alta cu numerele divizibi le cu cea rnai mica
cifra - saS8 verifice daca cele doua liste cont in numere comune.
5. Se creeaza 0 lista ordonata crescat or si S8 creeaza apoi din aceasta lista 0 lisl a cu
numerele care sunt patrate perfecte.
2.6.5. Algoritmi pcntru prclucrarea listclor dublu iulantuitc
in cazul listelor dubl u Inlantuite intorrnatia de legatura trebuie sa contina adresa
succes orului nodului (point erul wa n t catre tipul nod):
struct nod
lint .info ;
nod *a n t , *u r m; } ;
nod " p r i m, - u l t j-n , *p;
Algoritmi i de la li stele simplu lnlantui te S8 rnodifica prin adauqarea instructiunilor care
Int retin adresa de legatura cu predecesorul nodulu i. Algoritmul de ada uqare a unui
nod pin interio rul listei i naintea un ui nod q se sirnplifica deoar ece se cuno aste adresa
atat a succesorului , cat a predecesorului .
Lista dublu lnlantulte
prim NULLI i nfo
• ant I
2.6.5.1. Adauqarca primului nod la lista
Impl ementarea alqoritrnului . Se foloseste functia procedurala adauga_nod O ai carei para-
metri prim u l tim de tip nod se transmit prin re ferinta deoarece sunt parametri de lesire.
void adaug_nod (nod *&pr i m, nod *&ul t i m)
{p r 'im = new nod , pr im->.i n foe x r pr.l.m->ant =-NULL; p r i rn- >u rm =NULL;
ultim=pri:n; }
2.6.5.2. Adauqar oa unui no d la list a
Ad5ugare in Iata prirnului nod
Impl ementarea algoritmul ui . Se foloseste functia procedurala adaugayrimO al carei para-
metru prim de tip nod. se transmite prin referinta deoarece este parametru de intrare-iesre
v oid adauga_prim (:1oa *&p =i m)
{nod *p=new nod ; p-c-Ln foex , o »an =NULL; p ->urm=p r i rn; p.r i.mvp i }
Adflllga re dupa ultimul nod
Implementarea algoritmului. Se foloseste functia procedurata adauga_ul tim() al carei para-
metru ul tim de tip nod se transmite prin refennta deoarece este parametru de intrare-iesire.
void *&u l t i m)
{nod
=u l t i rn; =NULL; u.l t i.m-c-urmvp , ultim=p ; }
lufnrmaticii 141
Adauqarca in intc ri orul listei
[ pri m I- ... ...- 1ultimI
a) dupa nodul cu adresa q
Nodul p care se adauqa se insereaza l ntre nodul q nodul q-surm. Succesorul sau este nodul
q-surrn, iar predecesorul sau nodul q. Nodul p va fi succesorul nodului q predecesorul no-
dului q-surm.
Implementarea algoritmului. Se foloseste functia procedurala adauga_dupa ( ) ai carei para-
met ri sunt de tip nod: q (adresa nodului dupa care S8 face adauqarea), care S8 transmite prin
valoare deoarece este parametru de intrare u l t i m (adresa ultimului nod), care S8 transmite
prin referinta deoarece este parametru de intrare-iesire.
vo i d (nod *q , n6d -* &ul tim)
{nod p->inf o=x ;
i f (q==u l tim) ultirri.=p; e l s e q->.urxn=p ; }
b) l nai nte de nodul de adrcsa q
Nodul p care S8 adauqa S8 insereaza intre nodul q-sant si noduJ q. Succesorul sau este nodul
q. iar predecesorul sau nodul q-sant. Nodul p va f succesorul nodului q-e-ant predecesorul
nodului q.
Implementarea algoritmului. Se foloseste functia procedurata adauga_in_ fat a () ai carei
parametri sunt de tip nod: q (adresa nodului inaintea caruia se face adauqarea), care se trans-
mite prin valoare deoarece este parametru de intrare.
voi d *q )
{ned kp=n e w nod;
p -c-ur m- q , p-ec-an t e q- c -an L, q-c-anc-c-u.rm-e p , q·;.>ant=p ; }
2.6.5.3 . Parcurgerea listei
Vizitarea fiecarui nod al listei se poate face In doua moduri:
-7 pomind de la primul nod, pima la ultimul nod, In ordinea de i nlantuire a nodurilor -
furn izata de adres a urm din nodul vizita t;
-7 pornind de la ultimul nod, pima la primul nod, in ordinea de inlantuire a nodu rilor -
furnizata de adresa ant din nodul vizitat
Impl ementarea algoritmului. Se toloseste functa procs durala parcurge-inainte (),
respectiv parcurge-inapoi () , al carei parametru prim, respectiv ul tim, de tip nod , se
transmite prin valoare deoarece este parametru de intrare.
void pa r cuqe .i na i.nt e.Lri od e pri m)
{for (nod * p=pr i m; p !=NULL; p=p- >ur m) lise prelucreDza p->info}
voi d pa r cuge _inapoi( n od *ll l t i m}
{for (nod * p =ul t i m;-p ! >=NULL; p=p->ant) l i s e p r el.uc r ea za p->info}
2.6.5.4. Eliminarea unui nod din lista
Eliminarca primului nod
Implementarea al goritmului. Se Ioloseste functia procedurala eliminayrim() al carei para-
metru p r i m de tip nod se- transmite prin referinta deoarece este parametru de intrare-iesire
void el i mi na__prim( n o d *&p r i m)
{nod *q=p r i m; prim->urm- >a nt =NULL; prirn=p rim->u rm; delete q ; }
142
I mplement area strnctnrilor de date
El iminarea ultimului nod
Impl ementarea algoribnului . Se toloseste functia procedurala e limina_ ultim() al carei para-
metru ul t i m de tip nod S8 transmi te prin referinta deoarece este parametru de lntrare-iesire.
v o id e Li mi na u Lt Lmt rrod. * &u l t i m)
{nod ul tim=ultim->ant ; delete q;}
Eliminarea unu! nod din interiorul listei
Pentr n a eli mi na nodul p al lat in interiorul listei , treb uie sa legam pr edeeesor ul nodului p
(p-sant) de sueeesorul lui (p-s urm). Sueeesorul nodului p-e-ant va fi nodul p-x urm, iar pre-
decesorul nodului p- o-urm va fi nodul p-sa nt.
Implementarea algoritmului . Se foloseste functia procedurala ed.imi.na () al care i paramet ru
este de tip nod: p (adresa nodului care S8 elimina) , care S8 transmite prin valoare deoarece
este parametru de intrare.
v oid el i mina (nod *p )
{nod *q=:=p ; p:-c->a nt - >ur m:=p - >u rm; p-ourm- c-a n ue p- c- en t , delete q ; }
Seop: exemplificarea modului in care, pentru rezolvar ea problemei, folositi algoritmi i de prelu-
crare a listelor dublu Inlantuite ,;;i implementarea lor cu ajuto rul subpro gramelor.
Enunt ul probl em 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 tistelor dublu inlantuite trebuie lnt retinute atat adre sa primului nod, cat si
adresa ult imu lui nod . Problema se desco mpune in urrnatoarele subp robleme, iar algoritmii
pentru rezolvarea subproblernelor sunt implementati eu ajutorul subprogra melor:
lP11 Se creeaza lista du blu inlantuita - sub programul creare () .
Se adauqa un nod eu valoarea 1 dupa l ieeare nurnar par, astlel (subp rogramu l
pre l u c r a re 1 (» ):
1 -7 Se pareurge lista de la primul nod pana la penul timul nod si, daca nurn ar ul din
nodul eure nt este par, se adauqa dupa el un nod eu valoa rea 1 - subprogramul
ada u g a d u p a ( ) .
-7 Daca nurn arul din nodu l ul t im este par , at unc i se adauqa dupa el un nod care con-
: tine valoarea 1 si aeest nod devin e nodul ult im - subprogramul a d auga ul tim() .
Se elirnina nodurile cu numere pare, astfel (su bprogramu l p r e l u c r a r e _ 2 0):
-7 Se pareurge lista de la sueeesorul pr imului nod pana la penultimul nod si , da ca
nu rnarul din nodul eurent este par, at une i se elimina di n lista (subprogra mul
el imi na urrn(») ; al tfel , se trece la sueee sorul nodului eurent.
-7 Oac a nurnarul din nodul pri m este par, atunci se elimina din lista si suecesorul sau
devine nodul pri m - subprogramul e limina _ pri m( ) .
#i n c lude<f s tre a m. h >
struct nod ( i nt i n f o;
nod *a nt , *u r rn ; ) ;
f stream f ( " l i s t a8 . txt " , i o s : : in) ;
i nt X;
143 InliJrm:l!k.a'--- .:....:...::.
voi d adauga nod (nod *&p r i mr nod *&u l U .m)
{pr i m=- ne w nod i p r im->i nfo=x ;
p r i m- >ur m=NULL i pr i m->an t =NULL; ul tim=p r i rn; }
void a da uga u l t im(nod *&ul t i m)
{no d *p; p=n e w nod ; p ->info=x ;
p ->unn=NULL; p->ant =ult im ; ultim- >urm=p; ultim=p ; }
voi d adauga_dupa(nod *p )
*q=n e w n od; q ->info=x ;
q - >urm=p - >u rm ; q - >a n t =p ; p ->urm- >ant=q ; p ->urm=q ; }
v oi d elimi na p r i m{n od *&p r i m)
{nod *q =p r i m; prim->urm- >a n t =NULL; p r i m=prim->urID; delete q ; }
void elimi n a( nod *&p )
{nod *q=p; p ->urrn->ant =p->ant ; p =p - >u rm;
delete q ; }
void crearc{nod *&p r i m, l1oc *&u l t i m)
{f» x; adauga noc(prirn,ultirnl ;
whi le ( f » x)
void pre lucrare_ l ( nod *p r i m, n od *&ul t i ml
{for (nod *p=- pr i mi p- >urJn! +=NULL ; p=p- >ur ml
i f
if (ultim- >i nfo %2 =- =- O) a d a uga u l tim( u l t i m) i }
voi d pxe l uc r-are vz (n od *&pr.i m)
{for ( nod *p =p r i m- >u r m; p - >ur m! =NULLi )
c l i mi n a( p) ; e lse p=-p->urm;
i f (p rim- >i n fo%2==O)
void
{for (nod *p =pr i m; p !:=c NULL; p=p- >urm) " ; c ou t «endl ; }
void a fi s a r e ant {nod *u l t i rn)
{f or (no d *p=u l t i mi p > NULLi p =p->a nt l cout-ccp- c- Ln Coc c " "; cout « endl; }
void maine )
{no d *p r i m,*u l t i m,*p ;
creare (p r i.rn, ultim) ; a f i s a r ej u rm (prim) ; a f i.s a rejent (ul tim) ;
:-:=1; preLucrare 1 (prir:-: ,t;lt im) ; a r Lsare urm tpr im) i afisare an t (ulti m) i
p reLuc r e r e _ 2 (p r im) i a fisa re_'1rJn (pr .irnj r e f i s are _ ant. (ul t. Lm) ; }
Enuntul problemei 2 - Calcularea rezistentai echlval ent e Sa se cotcuteze rezisiente
echivetente intre puncteie A $i B pentru citcuiiut electric din figura.
n, s, u, Ril l

Pentru calcularea rezistentei echivalente se porneste de la ultimele rezistente - Rn R
n
-1 -
care sunt legate in serie. 5e calculeaza rezistenta lor echivalenta R
e
1, care va fi legata i n
paralel cu rezistenta R
n
·2. Prin calcularea rezistentei echivalente a celor coua rezistente
legate i n paralel, Rcl o; i Rn-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 care dintre variantele de calcul se alege, se foloseste variabila 5 care are
valoarea 1 daca rezistentele sunt legate in serie, valoarea 0 daca sunt legate i n paralel.
144 Implementarea st ructu r ilor de date
Valorile pentru rezistente S8 citesc dintr-un fisier text in care sunt memorate pe acelasi 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.
#incl ude <f s t r e a m. h>
struct nod {f loat info ;
n o d *a n t , *u rm; } ;
fstream f I vre z i s t.ent.e c t x t vi Los : : i n ) ;
f l oat X i
void adauga nod (nod *&prim, ncd *&ul t i m)
nod ; pr i m->i nf o=x; prirn- >urm=NULL; prim- >an t =NULL; ultimzprim; }
void adauga (nod *&u l t i m)
{no d *p ; p e ne w nod; p- c- Lnfoe x ,
p- >ur m=NULL; p - >ant=ul t i m; u l tim=p ; }
voi d c rear e (n od *&p r i m
l
nod *&ul t i m}
( f» x; a da uga
whi le ( f »x) adauga(ul t i rn) ; }
float R{n od *u l t i m)
{int 5=1 ; float r=ul t im->info; nod
while (p !
if ( 5) {r +=- p->i n f o; p=p - >a n t ; s=O; }
else {r = (r *p - >i n f o ) j {r +p - >i n f o ) ; p =p ->ant ; s=l ; }
return r ; }
void main(} {n o d e p r irn , *u l t i m; c r ea r-e {p r i m, u Lt. Lml ; f. c l o s e () ;. *
ccce-ccv nez t s t ent.a e c h ivaLeri t .a> "« R( u l t i m);}
Rccomandare. Listele dublu l nlantuite se fol osesc i n prob lemele in care, pentru
prelucrarea lnformatiilor:
-7 se executa frecevent operatii de inserare de eliminare de noduri ;
-7 lista trebuie parcursa i n ambele sensuri.
Exempl u. i n problemele i n care trebuie prelucrate numere foarte mari (pentru memorarea
carora nu pot fi folosite tipur ile de date implementate) se folosesc listele dubl u l nlantuite :
-) pentru operatiile aritmetice (adunare, scadere, lnrnultire) Iistele in care sunt memorate
cele doua numere vor fi parcurse de la ultimul nod, pima la primul nod;
-) pentru compararea a doua numere sau determinarea nurnarulu i de ci fre ale nurnarulu i ,
li stele i n care sunt memorate numerele vor fi parcurse de la primul pima la ultimul nod.
Scrieti cate un program care sa rezolve cerintele fiecarei probleme. Fiecare
problema se va descompune in subprobleme si algorilmul pentru
rezolvarea unei subprobleme se va implementa cu un subprogram. Datele
se transmit intre subprograme cu ajutorul parametril or de comunicate si nu al variabilelor
gl obale. Se creeaza liste dublu I nlant uite in nodurile carora se rnernoreaza numere i ntregi.
Sirul de numere se citeste di ntr-un fisier text in care sunt memorate pe acelasi rand, separate
prin spat iu. Dupa execut area unei operatii de prelucrare a listei, se vor afisa numerele din
noduri pentru a verifica daca opera tia s-a execut at corect. Se vor alege seturi de date de
intrare astfel incat sa se verifice algoritmul pe toate traseel e lui. Listele se creeaza astfel
lncat ordinea de acces sa fie cea in care sunt citite numerele din fisier.
1. Sa se elimine numerele prime $i sa se insereze intre fiecare pereche de numere rarnase
cel mai mare divizor eomun al lor.
2. Sa se calculeze eifra de cont rol a fiecarui nurnar daca numarul este diviz ibil cu cifra
de cont rol , citra este adauqata dupa nurnar; alttel, numarul este eliminat din lista. Citra
Informaticii
145
de control a unui numar este suma repetata a cifrelor numarului pana cane S8 obtine 0
suma mai mica decat 10.
3. Sa S8 modifice adresele din nodurile Iistei astrel inca t sa S8 obtina doua liste !iniare
dublu inlantuite care sa cantina numerele din pozitiile pare, respectiv di n pozitiile impare.
4. Se citese dintr-un fisier doua numere foarte marioSa S8 scrie urrnatoarele subprog rame
pentru prelucrarea nume relor:
a. calcularea sume i, a diferentei §i produsu lui numerelor;
b. compara rea a doua numere (subprogramul trebuie sa verifice daca cele doua
nume re sunt egale , iar daca nu sunt egale, saprecizeze care nurnar este mai mare) ;
c. ver ificar ea nurnarului daca are un nurnar par sau un numar irnpar de cif re, fara sa se
numere cifrele nurnarului:
d. determinarea nurnarului de cifre ale unui nurnar:
e. verificarea nurnarutui daca este palindrorn.
2.6.6. Algoritmi pcntrn prelucrarca stivclor
Cele coua ext rernitat i ale stivei se numesc varf baza, Accesul la nodurile stivei
(adauqarea. extragerea sau consultarea unui nod) este permis numai printr-o sinqura
extremitate nurnita varf si ultirnul nod inserat este primu l nod extras (se extrage cea mai
noua inforrnat ie adauqata). La 0 operatie de adauqare a unui nod , varful stivei stivei urea,
iar la 0 oper atie de extragere a unui nod , varful stivei coboara.
Implementa rea dinamica a stivei se face la fer ca a unei liste Iiniare, cu deosebirea ca:
-7 varful stivei va fi indicat de pointerul
var f
catre tipul nod;
-7 pentru adauqarea unui nod, se poale Iolosi numai algoritmul de adauqaro in fata
primului nod;
-7 pentru extragerea unui nod se poate folosi numai algoritmul pentru eliminarea primului
nod.
Altfel spus, prelucr area unei stive se face de la varf spre baza si se prelucr eaza Intotdea-
una nodul din varful st ivei . Accesul la informatia din acest nod se face cUvar f - >i nf o .
st.va vida este stiva care nu contine nici un nod adresa nodului vart are valoarea
NULL (v ar f NULL; ) . i n sl iva vida nu se mai pot exec ula operatii de extragere de
nodu ri. Stiva poate sa ajunqa sa fie vida In doua cazuri: la inltializare sau dupa
extragerea ultimului nod. Pentru testarea unei stive daca est e vida , S8 poate
impl ementa functia operand es te_vida ( ) care va furniza valoarea 1 ("adevarat") , daca
stiva este vida , si valoarea 0 ("fals") daca stiva nu esle vida.
int 8s t c_vi da (nocl *va r f )
{return
Penl ru prelucrari cu autorul sl ivei putet i folosi urrnatorii algoritmi:
-7 lni ti alizarea sti vei :
-7 adauqa rea unui nod la stiva:
-) ex tragerea unui nod din st iv a:
-) cons ult area nodului din varful stivei.
2.6.0. nit ial izarea sti ve i
Prin acest algoritm so croo aza st iva vida. in acest caz. nodul varf nu exista si poin terul
varf are valoarea NULL.
Impl ementarea algorit muJui. Se foloseste functia procedura la ini t () al carei parametru
varf se transmite prin referinta, deoarece este parametru de iesire.
146
Implementarea struet ur ilor de dat e
void i n it{nod *&va r f )
{va r f = NULL;)
2.6.6.2. Adauqaraa unui nod la stiva
Nodul se adauqa la stiva ca predec esar al varfului . Pasii algoritmului sunt:
PAS1. Se cere alocarea de memorie pentru nodul p .
PAS2. Se scrie informati a i n nodul p .
PAS3. Nodul p se leaqa de nodul varf.
PAS4. Nodul p a dauqat devine nodul var f .
Implementarea algoritmului . Se fol oseste functia procedurala adauga () al carei parametru
varf S8 transmite prin reterinta, deoarece este parametru de intrare-iesire.
void adauga( nod *&va r f )
{nod *p =ne w nod i p - >u r m=va r fi
2.6.6.3. Extragerea unui nod din stiva
Nodurite se extrag din stiva pentru a putea consulta informalia care exi sta in nodur ile
urmatoare. Un nod S8 poate extrage numai in cazul in care stiva nu este vida. Se poate
extrage numai nodul din varful sti vei (se elibereaza spatiul care a fost ocupat de nod). i n
varful stivei va ajunge succesorul nodului extras, Pasi i al goritmului sunt:
PAS1 . Se salveaza adresa nodului v a r f i n pointerul p .
PAS2. Succesorul nodului varf devine nodul varf.
PAS3. Se cer e elibera rea zonei de memorie de la adresa mernorata in pointerul p.
Implementarca alqoritmului , Se foloseste functia procedurala extrage ( ) al care: para-
metru var f se transmite prin referinta, deoarece este parametru de intrare-iesire.
void e xtra ge (nod *&va r f )
{nod *p =v a r f ; va r f =va rf- >urm; de l ete p ; }
2.6.6.4. Prclucrarea stivei
Prin acest algoritm se consulta informatia din fiecare nod al stivei. Deoarece nu poate fi
co nsul tata dedit informalia di n vartut st ivei , pentru a ajunge la un nod trebuie sa se
ext raga toale nodurile p;ma la et.
Implementarea alg oritmului. Se foloseste functia procedurala prelucrare() al carei parame-
tru varf de tip nod se transmite prin referinta, deoarece este parametru de intrare-iesire.
void prelucrare{nod *&va r f )
{whi l e (varf! =NULL) { l i s e p r e lucreaz5 varf->info
e xtr a ge (varf) ; ) }
Seop exempliticarea modului i n care, pentru rezolvarea problemei , folositi algoritmii de prelu-
crare a stivelor implementarea lor cu ajutorul subprogramelar .
Enunt ul pro bl emei. 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 trebuie prelucrat a, trebuie
extrase toate noduri le, pana 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
Informati ca
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.
Con su l tarea nodului care cont ine numaru! 3
' .... ..
5 _ _ ( 5 Ivarl
oescarca consulta Incarca
4 • 4
3 - 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 deseompune i n urrnatoarele subprobleme, iar algori tmul de rezol vare a unei
subprobleme este implementat cu ajutorul unui subprogram:
rP1l Se creeaza sti va cu numerele citite din fisier (nodul ver -f) - subprogramul c reare ( ) )
Se descarca stiva Intr-o alta stiva (nc dul varf r ) pana la penu ltimu l nod (subpro-
gramul d e s carca (» ).
Se extrag e ultimul nod din stiva - subp roqrarnul extrage () .
Se l ncarca in stiva (nodul v arf) nodurile din stiva de rezerva (nodul varf r ) - sub-
programul i n c arca ( ) .
Se seriu numerele din stiva (nodul varf ) i n fisierul text - subprogramul salv e aza () .

s t r u c t nod {i nt info;
nod * u rm;} ;
fstream f1 ( "stival .txt " , i o s : : i n ) , £2 ( " stiva2 .txt " , i o s : : o u t ) ;
i n t x ;
voi d init (no d * &va r f l { v a r f =NULL; }
voi d adauga (nod *&va r f ) {nod *p=new nod; p->i n f o=x; p->urm=varf;
i n t este vida(nod *va r f ) {retu r n varf==NULL; }
vo i d extrage (nod * &va r f ) {nod *p=va r f ; var f =varf->urm; d e lete p i }
void crcare{nod *&va r f )
{i n i t (va r f ); whi le (fl »x) adauga(varf) ; }
voi d *&va r f , nod * &va r f _ r )
{ Ln i t I va r f vr ) ;
while (var f -c-u rm! =-NULL) {x=va r £- >i n f o ; ext raqe (varf) ; adauga (var f rl ; } }
void inca rca (nod *&va r f , nod *&vd r f r)
{wh1 l e (les te_vi6a(varf_T ))
( x =va r f _ r - >i n f o ; adauga(varf ) ; } }
voi d salveaza(nod *&va r f )
( wh i l e ( !este vida {va r f l ) { f zccva r f -o i.n fo-cc" "; ext.raqe (varf) ; } )
void ma i n () ( ne d " ve r f , " va r f r ; c rear e (va r f) ; fl . cl os e () ; _
descarca (va r f j va r f r) ; e xtrage(varf) ; -<:I - t>
incarca{varf ,var[_r} ; salveaza(varf); f2 . c l o s e {) ; }
Fieeare problema se va deseompune in subproblerne algorilmul pentru
rezolvarea unei subprobleme se va implementa cu un subprogram. Datele
se transmit i ntre subproqrarne cu ajutorul pararnetrilor de cornunicatie ;;i nu
al varlabilelor globale. Se creeaza stive in nodurile carora se mernoreaza inforrnatia (numere
sau caractere). lnforrnatia se citeste dintr-un fisier text i n care, numerele sau caracterele, sunt
memorate 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
lmplcmcntarcu st r uct ur ilor de date
1. i ntr-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 r u r i de numere, pastrand ordonarea crescatcare. (Indi cat io. Se rastoarna a doua stiva
intr-o a treia stiva , S8 rastoarna si pri ma 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 pare.
4. Se rnernoreaza intr-o suva un ~ i r de litere mici. Se citeste de la tastatura 0 litera mica a alfa-
betului - l it. 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 afi seze in ordine inversa numere!e dintr-o lista linl ara simpl u l nlantuita. (Indicat ie.
Se i ncarca numerele din lista lntr-o stiva, i n ordinea de parcurgere a listei, !?i apoi S8
extrag ~ i se afiseaza numerel e din stiva.)
6. Se ordoneaza crescator un ~ i r de numere, cu ajutorul a doua stive. Determinati com-
plexitatea algoritmului. (Indi cat 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 nurnarul 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 esi e aritrnetica ce contine paranteze este balansata. adica daca
fiecare paranteza deschisa este i nchisa coree! De exemplu, expresia (a+b+(cI[d-e]})+
(di s) este bal ansata, iar expresia (a+b+{cI[d-e}])+(d/s) nu este balansata, (l ndicat ie. Se
codi fica paranlezele 1-(; 2- [; 3-{; 4-); 5-J; 6-)). Daca stiva nu esle vida ~ ; daca diferenta
dintre codul di ntre paranteza citita ~ i codul parantezei din varful stivei este 3, atunci se
elimina nodu! din varful stivei: aittel , S8 adauqa la stiva codul parantezei citite. Daca stiva
este vida la terminarea evaluarii expre siei, inseamna ca expr esi a este balansata.)
~ ( ) r i t 1II DC irn
Cele doua extr ernitati al e coz ii S8 numesc cap ~ i baz a. Ada uqarea de noduri la coada se
face pri n nod ul baza, iar extragerea ~ i consultarea unui nod est e perrn isa numai prin
extremitatea cap (se extrage cea rnai veche intormatie adauqata).
Implementarea dinamica a cozii se face la tel ca a unei liste liniare , cu deosebirea ca:
-) primul nod al cozii va fi indicat de pointerul r"' catre tipul nod. iar ult imul nod at cozi i va
fi indicat de pointerul ,i. cat re tipul nod:
-7 pentru adauqarea unui nod . se poate folosi numai algoritmul de adauqare dupa
ul t i mul nod;
-7 pen tru extrager ea unui nod se poate folosi numai algori tm ul pent ru eliminarea
prirnului nod.
Altlel spus, prelucr area unei cozi se face de l a cap spre baza ~ i se prelucreaza i ntotdeauna
nodul din capul cozii. Accesul la inforrnati a din acest nod se face cu c.ap-c-Lnfo
iaa este coada care nu confine nici un nod si adresa nodului cap are valoarea
NULL (ca p ~ NUL L ; ) . in coada vida nu se mai pol execut a ope ratii de extragere de
noduri. Coada poate sa ajunqa sa fie vida in doua cazuri : la in itlalizare sau dupa
ext ragerea ultimul ui nod . Pentru testarea unei cozi daca este vi da se poat e impl ementa
functia operand este_ v i d a () care va furniza val oarea 1 ("adevaran. dad! este vida , :;;i
valoarea °("fa ls") daca nu este vida.
III forill ' I t id 149
int e ste_vida(nod *c a p )
{return c a p ==NULL ; }
Pentru preluc rari cu ajuto rul cozii puteti folosi urrnatorli algorit mi:
-7 lnitl allzar ea cazii ;
-7 adauqaroa unui nod la coada:
-7 ex t rage rea unui nod din coada:
-7 con su lta rea nodului di n cap ul cozii .
2.6.7.1.lnitializarca cozii
Prin acest algoritm se creeaza co ada car e contlne un nod. in acest caz, nodurile cap
baza vor avea aceeasi adresa .
Impl ementarea al gori tmului. Se foloseste functia procedurala i ni t {} ai carei parametri
cap si ba za S8transmit prin referinta, deoarece sunt parametri de iesire.
vo id init{nod *&c a p, nod *&ba za )
{ca p=new nod ; cap->info=x ; cap->llrl11=NULL; baza=-cdp ; }
2.6.7.2. Adiiugarca unui nod la coada
Nodul se adauqa la coada ca succesor al bazei. Pasii algoritmului sunt:
PAS1. Se cere aloca rea de memorie pent ru nodul p .
PAS2. Se scri e intormatia in nodu l p
PAS3. Nodul p se leaga de nodu! baza
PAS4. Nodul p adauqat devine nodul baza .
hnplcmentarea alg oritmul ui. Se foloseste functia procedurala adauga () al carei parametru
baza S8transmite prin referinta deoarece este parametru de intrare-iesire.
void *&ba za )
{nod *p =new p->in:o=x ; baz3=9 ; }
2.6.7.3. Extraqcroa unui nod din coada
Nodurile S8 extrag din ccada pentru a putea consu lta inforrnatia care exista in nodurile
urrnatoare. Un nod S8 poate extrage numai in cazul in care coada nu este vida . Se poate
extraqe numai nodul din capul cozii (se elibereaza spatiul care a fast ocupal de nod). i n
capul cozii va ajunge succesorul nodulu i extras . Pasii algoritmului sunt:
PAS1. Se salveaza adresa nodului cap in pointerul p.
PAS2. Succ esor ul nodului cap devine nodul cap.
PAS3. Se cere elibera rea zone! de memorie de la adresa rnernorata i n pointerul p.
lmpl ernentaroa alg oritmului . Se foloseste functia procecurala extrage () a! carei
metru cap S8 transmite prin referinta, deoarece este parametru de intrare-iesire.
void extraqe (Ilo d *&c a p )
{nod *p <c ap r c apecap - c-ur m: d e let e p ; }
2.6.7.4. Prclucrarea cozii
Prin acest algoritm S8 consults informatia din fiecare nod al cozii . Deoarece nu poate fi
consul tat a decat i nforrnatia din capul cozii , pentru a ajunge la un nod trebuie se
extraqa toale nodurile pana la el.
Implementarea algoritrnului. Se foloseste functia procedurala prelucrareO al carei parame-
tru cap de tip nod se transmite prin referinta, deoarece este parametru de lntrare-iesire.
void *&c a p )
{wh i le (cap!=NULL) { l i s e prclucreaza c a p->i nf o
extrage(cap ) i )}
150
Implementa rca st r uct ur ilor de date
Scop exemplificarea modului in care, pentru rezolvarea problemei, folositi algoritmii de prelu-
crare a cozilor implementarea lor eu ajutorul subproqrarnelor .
Enunt ul problemei. 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 numerele (amase in cooos sa se sctie lnlr-un tisier text.
Pentru testarea programufui 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 trebuie prelucrata, trebuie
extrase toate noduril e pima la nodul care contine acea informatie, deoarece nu poate fi pre-
lucrata decat informatia din capul cozii . Pentru a nu S8 pierde intormatia din noduri le extrase,
ele vor fi descarcate l ntr-o alta coada (de rezerva), iar dupa prelucrarea lntorrnatiei, nodurile
var fi descarcate in continuare i n coada de rezerva. pana cand coada initiala devine vida.
caPJ
baza
Consultarea nodul ui care confine numaru l 3
coada coada coada

eap =NULL
cap cap \aza
ocscarca
descarc a
coada de rezerva coada de rezerva
C1IU
Problema se descompune i n urmatoarele subprobleme, iar algoritmul de rezolvare a unei
subprobleme este implementat cu ajutorul unui subprogram:
[E1J Se creeaza coada cu numerel e citite din fisier (nodurile cap :;;i baza) - subproqrarnul
creare () .
Se descarca coada intr-o alta coada (nodurile cap_ r sl baza_ r) pana la nodurile care
trebuie elimin ate - subproqra rnul descarca 1 () .
§ Se extrage nodul sau se extrag nodurile din mijlocul eozii - subprogramul extrage () .
lE1l Se descarca restul nodurilor din coada (nodul c ap) in eoada de rezerva (nodul
ba z a r ) - subproqrarnul des c arca 2 () .
Se seriu numerele din eoada de rezerva (nodul c ap r ) i n fisi erul text - subprogramul
s a l veaza ( ) .
#1 nclude<f s t r e orn . h>
str uct nod t i nt info ;
nod *u r rn; };
fs t r e a m fl( " c oadal .txt " , 1o s : : i n ) , f 2 ( " c oa da 2 . t x t", ios : :ou t );
i nt xs n , i,j ;
void init {no d *&cap , nod *&ba za )
{c a p=ne w nod ; baza=cap ; }
int este vid a{nod *c a p ) {r e tur n cap==NULL; }
void adauga(nod *&ba za )
{nod *p=new nod ; p ->info=x ; p->urm=NULL; baza->urm=p ; baza=p ; }
v01d ext rage(nod -&ca p ) {nod *p=c a p ; cap=cap->urm ; del ete p ; }
void creare{nod *&c a p , nod *&b a z a )
{f l» x; i nit( cap,baza) ; n++;
I II forill atiea 151
while ( f l » x) {a d a u g a (baza) ; n ++ i } }
void desca rca_l(nod *&c a p , nod *&c a p_ r, nod *&b a Za_ L)
{xvc e p- oi n f o , ext rage(cap) ; ini t ; i ++;
while (i<j) {x=c a p->i n f oi extra ge(cap) ; a d auga{baza r ); i ++;}}
voi d desca rc3_2(nod *&ca p , noc *&ba za _ r )
{whi le (! e ste vida (cap))
{x=c a p- >i n f oi e xt r age(cap} ;
v o id sal v e a za(nod *&c ap )
{whil e { ! este vi da (c a p } ) {f 2« c a p - >i n f o«" "; e x t rage (cap ) ; }}
void main ()
(nod *ca p ,*ba za ,*c ap r, *ba za r ; crea r e (cap,ba za ); f l . c lose ( ) ;
i f (n%2==O) j=n/Z-l ;-e l s e
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 subprobleme algoritmul
Tem« '>::::J pentru rezolva rea unei subproblems S8 va implementa cu un subpro-
-,-f gram. Datele se transmit intre subprograme cu aj utorul parametrilor de
cornunicatie si nu al varia bilelor globale. Se creeaza cozi in nodur ile carora se memo-
reaza numere intregi . Sirul de numere S8 citeste di ntr-un fisier text i n care sunt memorate
pe acelasi rand, separate prin spatiu. Se vor alege seturi de date de intrare astfel i ncat sa
se veri fice algoritmul pe toate traseele lui.
1. Se elirnina din coada numerele pare.
2. Se verifica caca numerele dintr-o coada sunt ordonat e (crescator sau descrescator).
3. Se concateneaza doua cozi , adauqano a doua coada la sfar§i itul primei cozi.
4. Se formeaza din doua cozi 0 a treia coada care contine rnai intai numerele pare din pozi-
tHle impare din prima coada si apoi numerele impare din pozitiile pare din a doua coada.
5. Se inverseaza ordinea numerel or dintr-a coada cu ajutorul unei stive.
2.6.8. Aplicatii practice
1. Ana liza lexi cal a a unui text. Sa se afiseze. i n ordine alfabetica, cuvi ntele dintr -un text
frecventa lor de aparitie i n text.
2. Exista coua automate care elibereaza bonuri de ordine pentru 0 coada de asteptare. Pe
fiecare bon de ordine este trecut nurnarul bonului momentul la care a fost eliberat
(exprimat in ora , minut si secunda). Bonur ile au numere unice . Deservirea persoanelor
S8 face in ordinea momentului de eliberare a bonurilor. Sa S8 organi zeze 0 coada de
asteptare pe baza bonur ilor emise de ceredoua automate.
3. Jocul lui Josephus. i ntr-un grup de n copii, acestia sunt aranjati in cerc sunt nurnarati
ince pand cu primul copi l pana la nurnaru: k. Copilul care are numarul k iese din joe. iar
nurnaratoarea i ncepe din nou de la 1 cu urrnatorul copi l. Sa S8 afisez e ordinea de iesire
din joc a copiilor. Se vor implementa doua solutii , folosind 0 structure de date de tip:
a) ccada: b) lista circulara simplu lnlantuita.
4. Sa S8 simuleze, cu ajutorul unei stive, 0 rnasina de adunat si muJtiplicat. Numerele S8
introduc i ntr-o stiva - si operatia S8 inche ie atunei cand S8 citest e de la tastat ura
operatorul n +" (pentru adunarea numerelor) sau operatorul n *" (pentru l nrnuttirea
numerelor). Se mai folosesc : caracterul .A", pentru a anula ultimul nurnar introdus,
caracterul pentru a anula toate numerele introduse.
152
_ _ ___ _ _ _ _______ _ _ _ --'- Ir:.:.: " I'l cl11 ell t a fea Sl f llet IIfilllf de dal e
5. Un automo bil trebuie sa parcurqa un traseu care forrneaza un poligon, cu i ntoarcere la statia
de pomire. Pe traseu exista n statii de alimentare cu carburant care formeaza varfurile poli-
gonului. Fiecare statie de alimentare i este caracterizata de coordonatele (x;,y;). Automobilul
consurna 1 litru de carburant la fiecare 20 km nu exista restricne pentru capaeitatea rezer-
vorului. Se citesc dintr-un fisier text urrnatoarele informaui: de pe prirnul rand nurnarul de sta-
tii n, de pe urmatorul rand un sir de n numere Cj care reprezinta cantitatea de combustibil cu
care este alimentat la statia i, iar de pe urrnatorul rand n perechi de numere Xj Yi care re-
prezinta eoordonatele statiei i. Din ee punet trebuie sa piece automobi lul astfel incat sa par-
curga traseul cu i ntoarcere in punctul de pornire sa nu n3mana tara combustibil.
Pent ru exercitiile urrnatoa re, daca nu S8 specifica sernnificatia variabilel or de memorie, se
l ol osese urrnatoarele dat e:
struct nod tint info ;
nod *u r m;} ;
r. od
int x , k ;
Lista simp!u Li sla dublu inf an!uita
Neordonata Ord onata Neordonata Ordonata
Cau t a (L,k)
_____
Elimina L,x
(h><)
-
PredecesorullL,Xl
MinimJ
l
1
Maxim (L)
Raspundoti :
1, Analizati di n punet de vedere al cornplexitatii algoritmii pent ru prel uerarea listelor. Se
va fol osi i n determinarea cornplexitatii timpul maxim de executie Pentru compararea
algoritmilor completat i urrnatorul tabel:
2. 0 lista simp lu inlantuita ccntine, in ardine, urrnatoarele naduri : 2 - ) 4 - ) 6 - ) 8 - ) 10
- ) 12 - ) 14 - ) 16 - ) 18 _.) 20 . Ce se va afisa in urma executiei urmatoarei secvente
de program?
cou t «
3. 0 lista simplu inlantuita contine, i n ordine . urmatoarete noduri: 1 - ) 2 - ) 3 - ) 4 --t 5
-» 6 -o 7 8. Ce se va afisa i n urma executiei urrnatoarei secvent e de program?
for {k=O,p::.:;prim;p->urm!::.;; NULL; if (p ->i n f o%2) k+= p->info ;
cout« k;
4. Ce se va afisa i n urma executiei urrnatoarei secvente de program, daca lista sirnplu
inlantulta conf ine. in ardine , urrnat oar ele noduri: 1 - ) 2 - ) 3 - ) 4 - ) 5? Dar daca
naduri le ei sunt, i n ordine: 1 - ) 0 - ) 3 - ) 0 - » 5?
f or (p =p r i m; c out« p- >i n r o;
5. Ce se va afisa in urma executiei urrnatoarei secvente de progra m, daca lista sirnplu
contine , in ordine , urrnatoarele nadur i: 1 - ) 2 _.) 3 - ) 7 - ) 8 - ) 9? Dar daca
nodurile ei sunt, in ordine: 1 - ) 2 - ) 4 - ) 7 8?

Informatica 153
i f f p -c-urm-'>'i n f o r p -' >.i n.f oe -eL) k++;
cout cck ,
Adevarat sau Fals:
1. Daca p este primul nod al listci, pentru a afisa informatia din al doil ea nod se executa
secventa de instructiuni; pep- c- u r m, cout -cc p- c- Ln fo•
2. Daca peste pr imul nod al listei, pentru a afisa infcrrnatia din al doilea nod se executa
instructiunea: cou t-cc p- c- u rm- >info;
3. Daca p est e primul nod al Iistei, pentru a afi sa inforrnatia din al treilea nod S8 executa
instructiunea: cout.c-cp - »ur m- c- u rm- >i nfc :
afisa
b . p ->urrn=q->urm ; q ->urm=p ;
d . p->urm=q->urm; p->urm=q ;
instructiune trebuie executata pentru a
Aleqeti:
1. Daca p este primul nod al listei, iar q al doilea nod al listei, prin ce instructi une se
leaqa nodul p de nodul q?
a. p'<q : b. q=p->urm; C. p=q->urm; d. p -c-urme q :
2. Care dintre urmatoarel e variante realizeaza corect leqaturile in cazu l inserarii unui
nod nou intr-o lista simplu lnlantuita, daca nodul nou are adresa p, iar nodul dupa
care se tnsereaza are adresa q?
a. o-c-u rme o : q ->urm=p->urm ;
C. q-c-urmep -c- u rm :
3. Daca p este primul nod al listei, ce
intorrnati a mernorata in al treilea nod?
a. c out « p- >ur m- >urm- >i n f o- >i n f o ; b.
c. cout« p - >u.rrn- >u r :n- >i n f o; d. cout« p ->urm->urm->u rm->info ;
4. Daca p, q si r sunt trei noduri consecutive ale listei , pentru a intersch imba nodul q cu
nodul r , care dintre secventele de instructiuni este corecta?
a . r ->unn=q; q ->urrn=r->urm; p-c-urrnor :
b. p- >u r m= r ; r->unn=q ; q-c-urrrr-r'-c-u rrru
c. q-c- u.rme r -c-urm . r -c- urrn-iq. p ->unn=r ;
d. .r-c-ur me -q , p-c-urme r : q -c-urrn-ir -c-urm.
5. Daca p este un nod al listei " i q un pointer catre tipul nod, care dintre secventel e de
instructiuni urrnatoa re realizeaza corect leqaturile astfel i ncat sa se elimine din lista
cele doua nod uri care urrneaza dupa nodul p?
a . b. p-c- urm- p- ourm- c-u rm .
C. p->unn->urm=p->urm->urm->urm; d . q=p->unn; p-c-u rme q-c-u.rm-c-u.rrn:
6. Daca L1 este 0 lista orqanizata ca stiva. stabiliti care este adresa corecta de
extragere din stiva:
a. delete p ; p=p->urm; b. r =p ->urm; p=r ; delete p ;
c . r =p ; p e p-c-u rm : delete p ; d. r e -p - c- u r m: p=r ; delete r ;
7. Care dint re urmatoarele secvente de progr am calculeaza , in variabila k, suma ele-
mentelor din lista simp lu inlantuita:
a. for {k= O, p=p r i m; p !=NULL; p = p ->urrn) k+ = p-c-i n f o :
b. for ( k=O, p""p r i m; p-c-u rmI k+=p-> info;
c. k=O; p=pri:n; while (p! =NULL) {k+= p->info; p = p -c-urrr u }
d. p=pr im; k= p ->info ;
do { p = p-c-urm, k+= p ->info; } while (p->unn! =NULL ) ;
i n urrnator!i 7 iterni , variabilele p si q mernore aza adresele de i nceput ale listeJor
liniar e simplu lnlantuite nevide L1 si respectiv L2. Elementele listelor sunt de tipul nod.
(Bacataureat - 5e siunea iunie-iu lie 2003)
154 Implernentarcu struct urilor de datc
8. Trebuie mutat primul element al listei L1 imediat dupa primul element al listei L2, in
rest listel e ramanand neschi mbate. Car e dintre urrnatoarele atribuiri sunl necesare ~ i
in ce ordine se etectueaza? 1) r eq- ourm . 2) r-ep - ourm, 3) q-c-urmep , 4) p=r ;
5) p- >urm=r ; 6) p- >urm =q- >urm;
a. 1 6 3 4 b. 13 5 c. 2 6 3 4 d. 2 3 6 4
9. Trebuie mul at primul element al listei L1 imediat dupa primul element al Iistei L2, i n
rest listele rarnanand nesch imbate. Care dintre urrnatoarele atribuiri sunt necesare ~ i
in ce ordine se etectueaza? 1) r =q- >urm; 2) r =p->urm; 3) q- c- urm-p, 4) pe r r
5) p->urm=r ; 6) p- >urm =q- >urm,
a. 1 6 3 4 b. 1 3 5 c. 2634 d. 236 4
n=O; r=p ;
while (e ga l e (r , p) && r }
{ r =r - >uLln: n-l-+ ; }
r->ur m == q && q ->u nm == r
q == r
b.
d.
q
r-c-urrn
r I I r - >unn
10. Daca la sfarsitul executarii secventei alaturate valoarea r =p- >unnr"'l'Nh' :w ~ i i
var iabilei r este nula, atunci li sta L1: while J .t:' ! =p && r )
a. are eel putin doua elemente b. este vida r';'i->UDni 'l!
c. este incorect constituit a d. nu este circulara '"'
11. Functia egale(ad1 ,ad2) returneaza valoarea 1 daca ~ i numai daca inforrnati ile utile
memorate la adr esele ad1 ~ i ad2 coincid, altfel return eaza valoarea O. Secventa
alaturata calculeaza i n variabila l ntreaqa n nurnarul de elemente din lista L1:
a. disli ncte consecutive aflat e la i nceputullistei
b. egale consecut ive afl ate la inceputul listei
c. care sunt egale cu primul element
d. car e sunt egale doua cate doua
12. Daca L1 este 0 coada , cu p adresa primului element si u adresa ultimului element, iar
r este adresa unui eleme nt ce urrneaza a fi adauqat i n coada , stabilit i care dintre
urrnatoarele este 0 operali e corecta de adauqare :
a. rvu- c- urm. u=r ; b. r- >urm::o:: p: pe r :
C. u -ou rme r : ue r • d. r - c- u rmeu , ue r :
13. Pent ru a uni listele L1 ~ i L2 plasand lista L1 in continuarea listei L2, se etectueaza
operatiile:
a. r e q : whil e (r ->urm) {r e r - c-urm, r ->urm=p ; }
b. r <p : whi l e ( r) r e r -c-urm : r e q :
c. r e q , whil e (r - >urm) r-e r' - c-u rmr r -c-urm- p :
d. r =p : wh ile ( r - >urm) r =r ->UnTI i r - >urm::o::q i
14. Pentru a determina nurnarul de elemente ale listei L1 se utilizeaza 0 variabila
intreaqa n astfel :
a . n=O: .re p , while ( c- -c-urm) {r e r -c-urm. n++ ; }
b. n=O: r ep r while ( r) r e r -c-urm: n+... ;
C. n =O: r e p s while ( r) {r e r -ourm. n +t- ; }
d . n =O; r =p; do { n ++ : } while I rl
in urmatorii 6 itemi, variabilele p ~ i u rnernoreaza adresa primului, respectiv a ultimului
element al lislei Iiniare simplu lnlantuite nevide L. Elementele listelor sunt de tipul nod.
(Bacalaureat - Sesiune a august 2003)
15. $t iind ca L este fermata di n 4 elemente, atunci adresa penultimului element este:
a. p-c- urm- c- u.rm- > b. p -c-urrn- our m C. p->u r m d . p - >u rm->urm->urm
16. Elernentele din lista L aflate la adresele q si r sunt vecine (consecuti ve) i n lista caca
si numai daca:
a. q - >urm
C. q->u rm
Intormati ca
155
b. while (! p->unn) p->u rrn;
d . while (p - >urm) p- >urm;
(Baealaureat - Sesiunea speciala 2003)
22. Stiind ca intr-o lista circular a simpl u inlanluita cu eel putin doua elemente. adresele p si
q reprezinta adresele a doua elemente distincte din lista, atunci elementul memorat la
adresa p este succesorul elementului memorat !a adresa q in lista daca si numai daca:
a . p->unn == q ; b. q ->urm =:::., p
C. p ->urm == q-c-urrn, d. q - c-urm-ourrn == p
(Bacalaureat - Sesi unea speciala 2004)
23. Daca lntr-o lista circulara simplu inlantuita. cu eel putin 4 elemente, se cunoaste
adresa p a unui element din nsta, atunei este accesibila adresa element ului din lista
precedent celui aflat la adresa p?
a. Nu.
b. Da, in orice situatie.
c. Da, numai daca p este adresa prirnului element al listei.
d. Da, numai daca p este adresa ultimului element al listei .
(Bacalaureat - Sesiunea iunie-iulie 2004)
24. intr-a lista liniara simplu i nlantuita nevida , pentru eliminarea elementului ee urmeaza
dupa elementul aflat la adresa p (elementul de la adresa p nu este nici primul, niei
ultirnul) un elev utilizeaza trei instructiuni simple (nestructurate). Care dintre instruc-
tiunile urrnatoa re poate fi una dintre cele trei?
a . p->unn->urm = p ; b. d i s pos e (p )
c. p ->urm = p->urm->urm; d . p-c-urm = p
(Bacalaureat - Sesiunea iunie-iulie 2004)
25. Noduri!e unei liste dubl u inlantuite retin in carnpurile info, adp si adu 0 inforrnatie
numerica, adresa noduJui precedent si respectiv adresa nodului urmator. Stiind ca lista
este eoreet construita si ca doua noduri p ~ i q ale acesteia se lnvecineaza, atunci :
a . p- >adp==q- >adu b. p ->adu ==q ->adu C. p -c-e duwe q d . p - >a d p ==q ->adp
(Bacalaureat - Simulare 2006)
17. Stiind ca est e cefl nita 0 functie cnf astfel incat cnt(a1,a2) returnea za nurnarul de
elemente situate i n lista i ntre elementele de la adresa a1 si a2 (fara a nurnara
elementele de la adresele respective), care dintre urmatoarel e expresii arata al
catelea este elementul memo rat la adresa q in lista L?
a . c n t (p ,q) +2 b. c nt (q ,u) +2 c . cnt (q,u)+l d . cnt (p , q) +l
18. Este defini te 0 functie min astfel tncat min(a1,a2) returneaza valoarea 1 daca 'Ii
numai daca eel putin unul dintre elementele memorate la adresele a1 ~ i a2 S8 afla in
lista L ~ i returneaza valoarea a in caz contrar. Care dintre urrnatoarele expresii are
valoa rea 1 daca ~ j numai daca el ementul de la adresa q S8 afla in lista L?
a . min{p , q) b. min(q,u} c . min (p ,u ) d. mi n (q ,q)
19. Un element aflat la adresa q face parte din lista L daca la
starsi tul executarii secventei alaturate variabila r are valoarea:
a . 1 b . p e. q d. NUL L ! 0
20. Lista L are exact doua elemente daca:
a. p->unn==u b. u ->urm==NULL / ! u->u rm
c. P'''' U d. p ->urm==NULL / ! p ->urm
21. Daca in variabila p este rnernorata initial adresa primului nod al unei liste simplu
Inlantuite cu eel putin 10 elemente, pentru a obtine in variabila p adresa penultimului
nod al listei S8 executa secventa:
a. while ( ! p ) p->urm;
C. while (p->urm->urm) p- c- urm,
156
___ _ _ _______ _ _ _ _ _ _ ---' I=1ll plclI1 CII ta rca st.-nctn rHo.- dc date
q;..;;p-»acu-:>adp ;
p""'q->odtJ;
p->ad p=NOLI ,;
delete q ;
c. 52
v f - >urm==O

b. q =v f->a dr ;vf=q - >ad r ; de l e t e q ;
d. q=v f ; v f =q->a dr ; delete q ;
(Bacalaureat - Simulare 2003)
cu adresa de i nceput merno rata i n variabila p este
b. 24
d. 23
(Bacalaureat - Simulare 2006)
Variabila vf mernoreaza adresa elementului din varful stivei . Fiecare element al stivei
rnernoreaza intr-un camp adr adresa urrnatorului element din stiva. Variabila q poate
memora adresa oricarui element al stivei. Sa se realizeze elirninarea elementulu i din
varful stivei:
a . q - >a d r =v f; v f - >a d r =q;delete q ;
c . q =v f; v f =v f - >a d r; delete 'If ;
29. 0 lista tiniara simplu i nlan\uita
vida daca:
a. *p==NULL I ! "" P
c. P ! =NULL I p
b. eliminarea primu lui element
d. eliminarea ult irnului element
(Bacalaureat - Sesi unea speciala 2005)
31. i ntr-o lista dublu inlan! uita cu cel putin 4 elemente, fiecare eleme nt reline i n carnpul
adp adu adresa eleme ntului precedent respect iv urrnator din llsta , Daca p
reprezinta adresa pr imulu i element din lista, atunci p ->adu->adu->adp este
a. adresa primu lui element b. adresa celui de-al doilea element
c. adresa celu i de-al treil ea element d. adresa celui de-al patrulea element
(Bacalaureat - Simulare 2005)
32. Intr-o lista circulara simplu i nlantuita fiecare element refine i n carnpul next adresa
elementului urmat or. Stiind ca. pentru variabi la p ce rnernoreaza adresa unui element
oarecare din lista, este adevarata relatia p ->next=p, atunci lista este fermata din:
a. zero componente b. 0 components c. 2 componente d. minim 3 componente
(Bacalaureat - Sesi unea august-septembne 2005)
33. Daca vf indica ulti mul nod al stivei , care dintre urrnatoarel e expresi i trebuie sa fie
adeva rate, pentru ca stiva sa fie vida?
a. v f ==NULL b.
c . v f - c-u r me e Nu L l, d .
28.
26. Daca i ntr-o lista liniara simplu i nlantuita adresa de inceput a listei este p, iar adresa de
sfarsit este u, atunci transfonna rea llstei in lista circulara S8 realizeaz8 prin instructiunea:
a. p -c-u rm-.u b. pcu-o-u rm C. u- c- u r rnvp d . uep - c- u r m
(Bacalaureat - Sesiunea iunie-iulie 2004)
27. Se considera 0 lista simplu Inlantuita ale carei noduri retin in carnpul urm adresa nodului
urmator allistei sau NULL daca nu exista un nod urmator. Pentru inserarea unui nod aflat
la adresa p irnediat dupa un nod al listei aflat la adresa q, 58 utilizeaza unele dintre urma-
toarele atribuiri: 1) p -c-ur me q, 2) q->u rm=p ; 3) p=q->urm; 4) q=p->urm;
5) p->unn =q - >u r m; 6) q - >urm=p - >u r m; . Stabiliti care dintre acestea S8 utilizeaza
in ce ordine:
a. 36
b. I l p
d . e p ! =NULL / "p
(Bacalaureat - Sesiunea speciala 2003)
30. i ntr-o lista dublu in lantuita cu cel putin 4 elemente, fiecare ele-
ment rel ine i n carnpu l adp adu adresa eleme ntul ui prece-
dent si respectiv urrnat or din lista. Daca p reprezinta adresa
primului element di n lista, iar q este de acelasi tip cu p, atunci
secventa alaturata realizeaz a:
a. interschimbarea pr imelor doua componente
c. eliminarea ce!ui de-a! doi lea element
Informati d
157
34. Daca vf indica ultimul nod al stivei, jar q un pointer catre tipul nod, care dint re
urrnatoarele secvente de instructiuni extrage nodul din varful stivei?
a. q e v f-c-u r rn: v f =q ->u r m; d e l e t e q; b . c.=v :: ; v : =v f ->urm; d e l e t e q ;
c . q =vf ; v f =q ->u r m; d e l e t e q ; d . q =v f ;vf =q - >u r m; d e l e t e q ;
35. Daca variabila cap rnemoreaza adresa primului nod din coada si variabil a baza
rnernoreaza adresa ultimului nod din coada, care dintre urrnatoa rele exp resii trebuie
sa fie adevaratc. pent ru a avea 0 coada vida?
a. be za e v NlfL l . b . cap->urm=== ba za c . cap==b aza d. c ap==NUL L
Miniproiccte:
Observati e: Pentru realizarea urrnatoarelor 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, bugetul va fi folosil numa i pentru plata membrilor echipei
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 realizarii aplicatiilor, membrii echipelor pot migra de la a echipa la
alta. cu conditia 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 torrnata din:
-7 Conducatoru! proiect ul ui I ~ i va forma echipa ~ i va distribui sarcinile pentru fiecare
membru, negociind initial suma repartizata din bugetul alocat pentru realizarea sarcini i. Va
fixa termene de executie pentru fiecare membru al echipei ~ i va urmari rnodulin care sunt
respectate aceste tennene. In cazul In care unul dintre membrii echipei nu i ~ i realizeaza
corect :?i la timp sarcinile, va redistr ibui a parte dintre sarcini lntre ceilalti rnernbri ai echipei,
renegociind suma din buget alocata fiecaruia dintre ei La sfarsit , va da calificative fiecarui
membru al echipei , In functie de modul i n care si-au respectat termenele, de modul in
care au cooperat cu ceiialti membrii ai echipei si de calitatea lucrarilor executate.
-7 Analistul va analiza cerinte!e informationale ale aplicatiei. va determina functiile apli -
catiei ~ i va elabora modul de rezolvare (datele ~ i structuri le de date 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 gramatori (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 Testorul 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 aplicatiei ,
-7 Documcntaristul va Intocmi docurnentatiile aplicat iei : documentatia pentru beneficiar
si docurnentatia pentru proiectantul aplicatiei
La terminarea pro.ectului membri i echipelor vor primi note pentru evaluarea activ.tatii lor.
Sistemul de evaluare trebuie sa tina cant de venitu rile realizate 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 titlurilor. Este
posibil ca pentru acelasi autor ~ i acelasi titlu sa se prirneasca mai multe exemplare. Se
va fol osi cate 0 stiva pentru fiecare autor, In care se va simula teancul de titluri primite ,
pentru fieca re titlu rnernorandu-se si numarul de exemplare. Numele autorilor si adresa
158
Implcmcnta rca st ruct ur ilor de da te
k linii de rnanevra
l ,inia de _
Jmanevra
TRIAJ VAGOANE
linia de linia de
intrare ies.re
varfului stivei de carti asociate S8 vor memora i ntr-o lista ale carei elemente contin in
informati a utila doua carnpuri : un camp de tip sir de car acte re pentru numele auto rului si
un camp de tip pointer cate tipul nod al stivei pentru varful stivei. Scrieti a aplicatie care
sa asigure urrnatoarele operatii prin intermediul unui meniu:
a. Distribuirea pe autori si titluri a unui teanc de carti sosi t de la 0 edit ura.
b. Afisarea titlurilor si a nurnarul ui de exemplare ale unui autor al carui nume se citeste
de la tastatura.
c. Afisarea in ordine alfabetica a autori lor si a numarului de titluri 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 mal multe, respectiv cu cele mai putine exemplare.
2. La un concurs participa mai multi candidati identificati dupa nume ~ i prenume . Fiecare
candidat primeste la i nscriere un nurnar de identificare. Concu rsul consta i n trei probe,
notele putanc lua valori de la 1 la 10. Rezultatul concursului se stabileste pe baza medi-
ei aritrnetice a notelor primite. Trebuie prevazute doua variante de admitere a candida-
tiler: sunt adrnisi toti candidatii care au a medie mai mare decat m ~ i sunt admlsi, i n
ordinea mediilor, primii k candidat i (valorile pentru m si k se citesc de la tastatura).
Scrieti 0 aplicatie care sa asigure urrnatoarele operatii prin intermediul unui rneniu:
a. Inscrierea unui nou candidat la concurs.
b. Retragerea unui candidat din concurs.
c. Completarea notelor ~ i calcularea mediei pentru fiecare candidat.
d. Modificarea infor rnatiilor despre un candidat.
e. Afisarea candi datilor adrnisi i n fiecare dintre cele doua variante in ordinea descres-
catoare a medi ilor.
f. Afisarea candidatilor adrnisi in fiecare dintre cere dou a variante i n ordinea alfabetica
a numel ui si prenumelui .
3. Intr-un depou exista 0 linie pe care se gasesc mai multe locomotive, aranjate in ordinea
in care au intrat in depou, ~ i a linie pe care se TRIAJ LOCOMOTIVE
gasesc mai multe vagoan e, aranjate i n ordinea i n linia de linia de
care au intrat in depou. Fiecare locornot iva ~ i intrare i e ~ i r e
fiecare vagon are un numar 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. Valoarea
pentr u k se citeste de la tastatura. in triajul vagoa-
nelor exi sta 0 linie de intrare ,,1 0 linie de iesire pe care depla-
sarea se poate face numai in sensul saqetilor si 0 linie de
ma-nevra pe care dep!asarea se poate face in ambele
sensuri. Scrieti 0 aplicatie care sa asigure urrnatoarele
operatii prin inter-mediul unui meniu:
a. Intrarea unei locomotive in depou.
b. A f i ~ a r e a locomotivelor din depou .
c. lntrarea unui vagon in depou.
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
locornotiva cu numarul de iden-tificare p "i n vagoane, dintre care m vagoane sunt de
clasa 1 (valori le pent ru p. n si m se citesc de la tastatura).
Informatica
2.7. Graful
159
2.7.1. Definitia matcmaticii a grufului
Se nurneste graf (G) 0 pereche ordonata de rnultirni (X,U), unde X este 0 rnultirne finit a ~ i
nevlda, iar U 0 multirne de perechi formate cu elemente distincte di n multirnea X (familie
de subrnultimi cu doua elemente din rnultimea X).
Terminologie:
-7 Elementele rnultirnii X se numesc varfuri sau noduri . Mulfirnea X se mai nurneste ~ i
multirnea varfurilor sau rnultimea nodurilor grafului G. Ea este de forma :
x= {X1J X2, X3, . .. , Xi• . .. , X
n
}
unde Xi reprezinta nodul i al grafului G careare n noduri .
-) Ordinul grafului reprezinta numarul de noduri ale grafului, n:
ordinul grafului = eard(X) = n
-7 Elementele rnultimii U sunt perechi de nocuri , adica submultirni eu doua elemente din
rnultirnea X ~ i se noteaza cu Uk. Elementul Uk este definit de perechea de forma {x;, Xj} ,
unde x, X
J
EX ~ i X;*X
J
(elemente distincte di n rnultirnea X). Elementul u, leaqa nodurile x,
~ i x
J
si se noteaza astfel : [X;, Xi). Multirnea U este de forma:
U={U1. U2, U3, .... ue, " OJ Um}
Clasificarea grafurilor:
Criteriul de clasificare folosit este proprietatea de simetrie a rnult irnii U.
Mul\imea U are proprietatea de simetrie daca §i numai daca,
pentru orico per eehe de noduri (x;, Xj), daca [x, Xi}E U, at unei §i (xi ' X;}E U
in functi e de proprietatea de simetrie, grafurile se clasifica In:
~ Grafuri neorientate. Un graf G=(X,U) este un graf neorientat daca multirnea U are
proprietatea de simetrie. Mu1limea U este fermata din pereehi neordonate {xi, x;}.
~ Grafuri orientate. Un graf G=(X,U) este un graf orientat daca rnultimea U nu are
proprietatea de simet rie. Multimea U este fermata din perechi ordonate { Xj, Xi}.
Pentru a identi fica tipul de graf pe care 11 veti folosi pentru a reprezenta datele, daflniti rel a-
tla dintre noduril e grafului si verificati daca relatia are proprietatea de sirnet rie, astfel:
~ Daca nodul XIn relatie eu nodul y irnplica ~ i ca nodul y este In relatie cu nodul x, atunci
graful este neoriental.
~ Daca nodul X In relatie cu nodul y nu irnplica ~ i ca nodul y este In relat ie cu nodu! x,
atunci graful este oriental.
I S1bul.dlJi.u de CSlZ I
Seop: identi fiear 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
sosete 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 nodurile grafului este:
nodul x este in relatie cu nodul y, daca exista 0 sosea care leaqa direct local itatea asociata
ncdului x cu localitatea asociata nodului y. Relatia are proprietatea de simetrie, deoarece
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
reprezentarea caller de cornunicatie dintre lccalitati S8 va folosi un graf nooriontat .
Enuntul problemei 2. Pe haria unui cartier existe rna! multe ititersectii 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 asoci ata
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 .
Enuntul problemel 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 noori entat .
-j- Relatia de simpatie este 0 relatie definita 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 obligatoriu ca persoana y sa simpatizeze persoana x
(relatia de simpat ie nu presupune reciprocitate). Pentru reprezentarea relatiilor de
simpatie dintre membrii grupului S8 va folosi un graf orientat .
1. Prin ce tip de graf va fi reprezentat un grup de persoane lntre care
~ . s-au stabil it relat ii de vecinatate? $
~ .. 2. Prin ce tip de g r ~ f va fi reprezentat un grup de persoane Intre-<J;),:> C>-
care s-au stabi lit relatii de cunostinta?
1'11111 n-rri-nt:
1 r srminoloqre
-j- Elementele multirnii U (perech ile de noduri) S8 numesc mucnu. Multirnea U se mai
nurneste si Itimea muchiilor grafului G. 0 muchie, fiind un element din rnultirnea U,
este ceterrninata de 0 subrnultirne cu doua elemente din multimea X: muchia k a
grafului ( ), care uneste nodur ile Xi ~ i Xj , este determinata de subrnultirnea {Xi, xi} ~ i se
noteaza cu x"j ' [x., Xj] ~ i [ Xj , Xi ] reprezint a aceeasl muchie a grafului. Graful G are
m muchii :
nurnar ut de muchi i = card (U) = m
In formatica
161
-7 Numim noduri adi acent e orice pereche de noduri care forrneaza 0 muchie - {Xi,Xj} EU.
Fiecare dintre cele doua noduri (x, Xj) este nod inci dent cu muchia Uk= [x;,Xj] .
-7 Nodurile vec ine 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 Xj sunt extrernitatile much iei [Xi . Xj].
-7 Se numesc rnuchi i i nci dent e doua muchii Uj 9i Uj care au 0 ext remitate comuns -
nadul Xk.
Un graf neari entat G est e definit de 0 pereche de rnultirnl:
rnult i rnea noduril orsale - X rnulti rnea muchi ilor sal e - U. EI poate fi consi derat ca
o rnultirne de noduri din care unele pot fi unite doua cat e doua pri ntr-o muchie.
Graful S8 reprezint a In pla n prin intermediul unor elemente geometrice: noduril e se
reprezinta prin cercuri, iar muchiil e prin linii drepte care unesc anumite cercuri .
0 " Nodul xi al grafului G
Muchia Uk=[Xi,Xj] a grafului G
'- Nodul Xj al gratului G
Elemenlele mult irnii X (nadurile) se identiflca cu ajutarul unar etichete , care pot fi numere
sau litere. Pentr u simplificare, vom folosi ca etichete un sir de numere consecutive,
lncepand cu nurnarul 1. De exemplu, pentru un grat cu n noduri, vom tolosi etichetele: 1, 2,
3, .. . , n-1, n. 0 muchie se va nota cu [i ,j] , unde i j sunt etichetele nodurilor incidente cu
muchi a. De exemplu, muchia [2,3] este muchia care uneste noduri le cu etichetele 2 3
Fig. 1

Exemplul 1:
in gratu! G, =(X" U, ) din figura 1:
-7 Ordinul gratului este 8.
-7 Graful are 8 naduri (n=8) rnultimea noduril or este
X,={1,2,3A,5,6,7,8}
-7 Graful are 9 muchii (m=9) mu ltimea muchiilor est e
U
,={[1,2].
[1,3] , [1A], [2,3], [2,5], [3A], [3,5], [6,7]. [6,8]).
-7 Nodul 1 este nod adia cent cu nodur ile 2, 3 4, iar nodul 6 este adiacent cu nodurile 7
8. Nodurile 3 4 sunt adiacente deoarece perechea de noduri [3A] EU
,
. Nadurile 5
6 nu sunt adiacente deoarece perechea de nodur i
-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 muchiilar [1,3], [2,3], [3AJ [3,5].
-7 Muchii le [1,21 si [2,3] sunt muc hii inci dent e deoarece au un nod comun (nodul 2).
Muchiile [1A] [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 numarul total de grafuri
neorientate care sepot forma cu aceste noduri esteg:

b
Demc nstratle. Notam cu X multimea nodurilor grafului, cu U rnultirnea muchiilor, cu A multimea
tuturor subrnultirnilor de doua elemente din X cu B multimea {O,1}. Multimea A are urrnatoarete
elemente (subrnuttimi) :
162 Implemen tarea st r net ur ilor de date
[1,2J, [ 1,3],
[2,3].
[ 1,4],
[2,4].
[ 1,n]
[2,n]
0- 1 submulpmi
0-2 submulturu
{
1' daca [x.y] E U
f( { x.y l)=
_ O. caca[x,yJ e. U
[0-1,0] 1 subrnuhirne
n x( n - I) C'
Nurnarut total oe submultirnieste: (n- I) +(n -2) + ... + 1= 2 "
Notarn cu a - card{A):;;i cu b - card(S). Fiecarui graf ii putemasocia 0
funcue definita ataturat . lovers, unei functii ii putem
atasa un grat, astfel: f(1x,y})=1 daca si numai dace [x,y]e: U, Rezulta
ca numarul total de grafuri care se pot forma cu n noduri este egal cu
numarut de funct ii f. Dar. numarul de functii f:A-) Beste ega! cu b
3
, unde b=2:;;i a=
/\
H H
1. in gra!ul G, - cu ce noduri este adiacent nodul1?
i n gra!ul G, - cu ce muchii este incident nodul 1?
3. Dati exemple de doua noduri adiacente de ooua noduri care nu
sunt adiacente in gra!ul G, .
Dati exe mplu de doua muchii incidente de doua muchii care nu sunt incidente in
gra!ul G, .
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)}.
Desenati gra!ul traseelor rutiere care lac legatura int re localitati le Brasov, Bucuresti,
Buzau, Ploiesti Constanta. Oaca exists mai multe trasee rutiere i ntre doua localitati
(de exemplu, Bucuresti Brasov), adauqati la gra! noduri pentru local itatile care
identifica unic aceste trasee (de exemplu, Valenl i de Munt e, Tarqoviste si Pitesti),
Desenati gra!ul judetelor din Roman ia (i ntre doua judete exista a muchie daca cele
doua judete sunt invecinate).
Cate grafuri se pot construi cu 3 rnuchii? Desenati toate grafurile care
se pot construi cu 3 muchii. 4 3 5
Pentru graful G
J
din figura 2, precizau ordinul, numarul de noduri,
nurnarul de muchii multimile X
3
U
3
. 6 7
Structura unei molecule de substanta chimica poate fi reprezentata Fig. 2
printr-un gra! neorientat , i n care nodurile sunt atomii gruparile din
care este cornpusa 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 C2H4.
4.
6.
Go 5.
7.
8.
9.
10.
2.4.2.2. Gradul unui nod al grafului neorientat
Fi g. 3
Nodul unui gra! este caracterizat pnn grad.
Gradul unui nod Xkal gra!ului G esle egal cu nurn arul muchiilor incidente
cu nodul se not oaza cu d(xk) '
Tcrminologie:
Se nurneste nod terminal un nod care are gradul egal cu 1 - d(xk) = 1 (este incident
cu 0 si nqu ra muchie).
Se nurneste nod izolat un nod care are gradul egal cu 0 - d(xk) = 0 (nu este adiacent
cu nici un alt nod al grafului, adica nu S8 in extremitatea nici unei muchil) .
Informat ica 163
® G4,
@
Fig. 4
Exemplul1 :
Graful G
4
=(X
4
,U
4
) din figura 4 este defin it astfel :
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] },
in graful G
4
:
-7 Grad ul nodului 5 este 5, deoar ece are 5 muchii inci dente: [2,5J, [3,5], [5,6J, [5,7] [5,8J
-7 Nodul 9 este nod te rminal , deoarece are gradul 1 (0 sinqura muchi e tncidenta: [7,9]) .
-7 Nodul 10 este nod izolat, deoarece are gradul 0 (nicio muchie inci dental .
Exe mpl ul2:
Fie graful G
5
=(X
S
.U
s
), 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 unui graf neorientat , putef preciza urmatoarele inforrnatii:
-7 Determinati gr adul unui nod - nurnarand de cate on apare eticheta nodul ui 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 - verifi cand daca eticheta lui apare 0 singura
dat a. Nodul 7 este nod t ermi nal (eticheta lui apare numai intr-o sinqura muchie: [4,7]) .
-7 Deterrninati daca un nod este izolal - verificand daca et icheta lui nu apa re i n lista de
muchii. Nodul 8 este nod izol at (eticheta lui nu apare in lista muchi ilor).
-7 Deterrnin ati nu rnarul de noduri izolatc (n-) astfel: nurnarati etichetele distincte care
apar in lista muchiilor (n2) n1=n-n2. i n graful G
s
, i n lista de muchi i exista 7 etichete
distincte. Nurnarul de noduri izolate 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 mai mic sau egal cu n-1 (O';d(xk)'; n-1).
-------------- .-----.. 1. in graful G
4
: precizali gradul nodu lui 3 identificati nodu l cu gradul cel
mai mare, nodurile izolate si nodurileterminale.
2. i n graful G
3
: identiflcati nodurile 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 noduri le izolate si noduri le terminale ,
precizati cate noduri au gradul 2 cate noduri au gradul impar.
Teorerna 2
Daca graful G are m rnuchl i (Ul, U2, ... , um) n noduri (x-, X2, .. . , X
o
) , at unci intre gradul
nodu rilc r si numarul de muchii exista urrnatoarea relatie: suma gradalor tuturor noduriJor
grafului este cgala cu dublul numarului de muchii:

;,- 1
Demonstratie. Fiecare muchie Uk = [xj, Xi] coresounde unei unitati din gradul nodului Xi unei unita\i
din gradul nodului Xj . Rezulta ca fiecare muchie contribute cu2 unitati la suma gradelor.
Exemplu. i n 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, nurnarul nodurilor de grad impar este par.
Demon st ratie. Suma gradeJor nodurilor fiind un numar par, aceast a surna trebuie sa contina un
numar par de termeni caresunt numere impare.
Exemplu. in graful G
3
exista 4 noduri cu grad impar (3, 6, 8 9).
164 Implcmcntarca st r uct urilor dc da tc
Propozitia 2. Numarul minim de muchii, rnmtn, pe care trebuie sa Ie aiba un graf neorientat,
cu n noduri , ca sa nu existe noduri izola te, este:
III "'''' = [ II ; I]
Dernon stratl e. Pentru ca un nod X j sa nu fie izolat , trebuie ca d(X
r);
:::.1. Pentru ca toate noduri le sa 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 - mmin=(n+1)/2.
Teorema 3
Daca gralul G are n noduri (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. lnsearnna eel sinqurul sir de n numere, diferite intre ele doua cate coua. care pot
reprezenta gradele unghiurilor este 0, 1, 2, ... , n-l . Deoarece un nod este lzotat, eel mai mare grad al
unui 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 care se poate defin i) nu poate reprezenta sirul gradelor in graf.
1. i n graiul G, ,, verificati ca este Indeplinit a relatia dintre gradul nodurilor
si nurnarul de muchii ale gralului . ldentiflcati nodurile cu grad impar
verificati ca nurnarul lor este par.
2. Daca un graf are 8 noduri , care este nurnarul minim de muchii pe care trebuie sa Ie
aiba, ca sa nu fie noduri izolate. Oesenati un graf care, avand nurnarul minim de muchii
stabilit, nu contine noduri izolate. Daca un graf are 9 noduri , care este nurnarui minim de
muchii pe care trebuie sa Ie alba, ca sa nu fie noduri izolate. Desenati un graf care
avand numarul minim de rnuchii stabilit nu contine noduri izolate.
, } 2,7,2.3, $irul grafic
Se nurneste si r grafi c un sir s de n numere intregi pazil ive (d" d" .." do) care pot
reprezenta gradele unui graf neorientat, cu n noduri.
Propozitia 3
Cond itlll e necesare ca un de n numere i ntregi pozitive (d" d" ..., dol
sa fie un sir grafic sunt:
(1) d,,; n-r , penlru once i=1,n;
(2) suma d, + d, + ... + do trebuie sa fie un numar par.
Demonstratle. Neces itatea ccnditiei (1) rezutta din faptul ca gradul maxim al unui nod dintr-un graf cu
n noduri poate fi n-t . Necesitatea conditiei (2) rezulta din Teorema 2 - suma gradelor fiind ega la cu
dublul numa rului de rnuch!i, este un nurnar par .
Aceste conditil nu sunt intotdeauna sufici entc. Pentru a verifica dace sirul de
numere este sir graf ic, se face anali za sirului de numere.
Exemple:
(a) s=(1,1,2,3,3,4,5,5,7,8)
Acest sir nu i ndeplineste una dintre conditiile necesare - (2) " suma numerelar este 39.
(b) s=(1,1,1,2,2.3,5,6,8,9)
Acest sir l ndeplineste condltiile necesare (suma numerel or este 38 l}i fiecare nurnar este
mai mic sau egal cu 9: Aceste conditii nu sunt tnsa suf iciente . Din analiza sirului
rezutta ca nodul 10, avand gradul 9, este legal de toate celelalte 9 naduri . Nadurile 1, 2 si
3 sunt naduri l erminale. Ele nu pot f leqate decat de nadul 10. Rezulta ca gradul maxim
III for illaIicii 165
pe care i l poate avea oricare dintre celela lte sase noduri este 6 (ele nu se pot lega de ere
insel e si de nodurile 1, 2 3). Dar nodul 9 are gradul 8, ceea ce este imposibil.
(c) s=(1,1,1,2,3,4,5,6,6,9)
Si aeest Ind eplin este condi tiile necesare (suma numerelor este 38 fiecare numar
este mal mic sau egal cu 9). i n plus, fal a de sirul (b), avand aceleasi grade pent ru
nodurile 1, 2, 3 10, i ndeplineste condit ia ca celelalte nod uri sa al ba gradul mai mic
sau egaI cu gradul maxim posibil (6). Dar , exists doua noduri cu grad ul 6. Ele trebuie sa
se lege arnandoua de nodul 4, la care este legat si nodul 10. Nodul 4 trebu ie sa aiba eel
putin gradul 3. Dar nodul 4 are gradul 2, ceea ce este impo sibil.
(d) s=(1,1,1,3,3,4,4,5,5,9)
Acest i ndeplineste conditiile necesare (suma numerelor este 38 si fiecar e numar este
mai rnic sau egal cu 9) este un sir grafic caruia i se poate asocia grat ul G, =(X
6
,U
6
) , cu e,
18 muchii , definit astfel.
X
6
={1,2,3,4,5,6,7,8,9,1O}
U
6
={[1,10] , [2,10], [3.1OJ, [4,8J, [4,9J, [4,10), [5.8], [5,9], [5.1OJ. [6,7J, [6,8J, [6,9], [6,10).
[7,8J, [7,9J, [7,10), [8,10J, [9,10]}.
Precizat i daca sirurile s,=( l ,1,2,2,4) s,=(0,1,1,1,4) pot fi siruri gratice.
Pentru sir ul care este sir grafic, gasiti un graf care i S8 poate asocia .
2.7.3. Graful or icntat
Spre deosebire de gratul neorienta!, In gratul orientat perechile de noduri sunl ordo nale .
Gratul orientat se mai nurneste digraf.
2.7.3.1. Terminologie
Elementele rnultirnii U (perechile de nodur i) se numesc arce. Mul\imea U se mai nurnes-
te rnultirnea arcel or gratului G. Un arc, fiind un element din multirnea U, este
determinat de 0 submultirne ordonata, cu doua elemente, din multimea X: arcul k al
gratului (Uk), ce uneste nodurile x; Xi ' este determinat de subrnultimea {x;,x,} se
noteaza cu [x ;, xi] ' [ x;, xi] [Xi, Xi] nu roprezinta acelas i arc aJ grafului . Gratul G are
m aree:
numarul de arce = card( U) = m
-7 Se numesc noduri 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
incident cu arcul Uk = [ Xii Xj] sau cu arcul Uk =[ Xj , Xi].
-7 Nodurile Xi si Xj sunt extremitati le arcului [ Xi, Xj]. Nodul Xi este extrcrnitatea initial aa
arcului, iar nodul Xj este extremitatea finala a arcului .
Se numesc arce incidcnte coua arce u, Uj care au 0 extremitate comuns - nodul Xk.
Se numeste succesor al nodului Xi orice nod la care ajunge un arc care iese din nodul
Xi. succcsorilor nodului Xi este fermata din rnultirnea nodurilor la care ajung
arcele care ies din nodul Xi. Se noteaza cu S ( Xj) si se defineste ca multirnea:
S(x) = {Xi EXI(X;, xj)e U}
Se nurneste prcdcccsor al nodului Xi orice nod de la care intra un arc in nodul Xi
Mul1imea predecesorilor nodului Xi este fermata din multimea nodurilor de la care
ajung arcele care intra in nodul Xi . Se noteaza CU P(' si S8 defineste ca muttimea:
P(x) = { Xi eXI(xj, x;)e U)
166 IlIIplclllcntarca st r nct ur ilor dc datc
-7 arcelor care ies din nodul Xi S8 noteaza CU U+(Xi) S8 defineste ca rnultimea
U+(x,) = {u=(x,. Xj) IUEU} .
-7 Multimea arcelor care intra in nodul x, S8 noteaza cu U -(X i) !?i S8 defineste ca rnutti-
mea U"(x,) = {u=(x;. x,) IUEU}
-7 Nodul sursa al grafului este nodul care are rnultimea succesorilor fermata din toate
celelalte noduri, mai putin el , jar multimea predecesori lor sai este mul timea vida.
-7 Nodul destinatie al gralu lui este nodul care are multimea predecesorilor fermata din
toatecelelalte noduri, mai putin el , iar rnultimea succesorilor sai este rnultirnea vida.
Observatii
1. card(S(x))=card(U+( x)) card(P(x))=card(U"(x))
2. Pentru nodul sursa al qrafului card(S(x))=c ard(X).1 card( P(x))=O.
3. Pentru nodul destinatie al gralului card( P(x))=ca rd(X)- 1 car d(S( x))=O.
4. Daca un graf are un nod sursa , atunei nu poate avea un nod destinatie, invers.
Un graf orientat G este definit de 0 per eche de rnulti mi : rnultimea nodurilor sal e - X
multlmea arcelor sale - U. EI poate fi cons idera t ca 0 multirne de noduri din ca re
un el e pot fi unite doua cate doua, pri n unul sa u doua arce.
Graful orientat se reprezinta in plan prin intermediul unor elemente geometrice: nodurile
se reprezinta prin cercuri, iar arcel e prin linii drepte care unesc anumite cercuri si care au 0
saqsata la capatul care corespunde extrernitat ii finale a arcului.
0 "'- Nodul xi al graful ui G
Arcul uk=[xi,Xj] al grarul ui G
'- Nodul Xj al grafului G
Exemplu:
:;> t; , in graiul G, =(X" U, ) - din figur a 5: 5
-7 Ordinul grafului este 5.
-7 Gral ul are 5 noduri (n=5) si rnultimea noduril or este X, ={ 1,2,3,4,5} . 4 3
-7 Gralul are 7 arce (m=7) si multirnea arce lo r este U, ={[1,2], [1,4J, Fig 5
{2,3J, [4,1], [4,3], [5,2], [5,31}. .
-7 Nodul 1 este nod adiacent cu noduri le 2 si 4, iar nodul 3 este adi acent cu nodurile 2, 4
5. Nodurile 3 si 4 sunt adiacente deoarece perechea de noduri [4,3JEU, . Nodurile 5
4 nu sunt adiacente, deoa rece nici una dintre perech ile de noduri [4,5Jsi [5,4]
-7 Nodul 4 este nod in cident cu arcele [ 1,4], [4,1J [4,3]. dar nu este incident cu arcul [1,2].
-7 Nodul 2 este ext remitatea initial a a arcului [2,3J ex tr emitatea flnal a a arcului [1,2Jsi
[5,2J.
-7 Arcele [1,2J [5.2] sunt ar ce i nci dente deoarece au un nod comun (nodul 2). Arce le
[ 1,4J [2,3] nu sunt arce incidente, deoarece nu au un nod comun.
-7 Multi mea succesori lo r nodului 1 este fermata din noduri le 2 si 4. Nodul 2 este nod
succosor al nodului 1, dar si al nodului 5. Nodul 1 este nod succesor al nodului 4, dar
nodul4 este nod succesor al nodului 1. Nodul 3 nu are succesori.
-7 Mul!imea pred ecesoril 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 predecesor al nodului 1. Nodul 5 nu are prede cesori .
167 Informati ca
Tcorema 4
Daca graful oriental G are fI noduri (X" X2, "', x
o
), atunci nu rnarut total de grafllri
orientate care se pot fanna ell acoste noduri osto g:

g='" 2
Demonstratie. Se dernonst reaza la fel ca Teorcma 1,
eu deosebirea ca multimea Beste {D,1,2,3} -
card( B)=4, iar functia f este definita atatur at
{
3' daca [x,Y] E U [y,x] E U
2, daca [x,y) E U
f(l x.Y I ) =
1, oaca [y,x) E U
0, daca [x,y] e U [y.xj e U
1. in graful G, - cu ce noduri este adiaeent nodul 2?
2. i n graful G, - cu ee arce este incident nodul 2?
3. Dati exemplu de doua nodur i adiacente in graful G, .
4. Dati exemplu de doua noduri care nu sunt adiacente in graful G, .
5. Da!i exernplu de doua aree incidente i n graful G, .
6. Dati exemplu de doua aree care nu sunt incidente in graful G7.
7. in graful G, precizati ce fel de extremitate este nodul 4 pentru fiecare arc cu care este
incident. Preciaati rnultirne a succesorilor rnultirnea predecesorilor nodului 4.
8. Desenati qraful G, =(X" U, ), defimt asttel. G,
X, ={ 1,2,3,4,5,6,7} .
U, ={[ 1,2]. [ 1,5] , [2,1J, [2,4J, [3,4J, [4,3J, [5,3], [6,5J, [6,7], [7,5] }.
9. Cate grafur; orientate se pot eonstrui cu 3 aree? (JF-
Desenali 10 dintre aceste grafuri. .
10. Pentru graful G, din figura 6, precizati ordinul, numarul de ( \ II G,
noduri , nurnarul de aree rnultirnile Xg Ug.
2.7.3.2. Gradele unui nod al grafului orientat
Fig. 6
Nodul unui graf orientat este caracterizat prin gradul intern gradul extern .
Gradul intern al unui nod Xi al grafului G este egal eu nurnarul arcelor care intra in nodul
x, (arce de forma [x" x,)) se noteaza cu d(x).
Gradul extern al unui nod Xi al grafului G este ega I cu nurna rul arcelor care ies din nodul
x, (arce de forma [ Xi, Xj)) se noteaza Cll d+(x).
Tcrrninologie:
-7 Se nurneste nod terminal un nod care are surna gradelo r eqala cu 1 (gradul intern sau
gradul extern egal cu 1 gradul extern, respectiv gradul intern, egal eu 0 - d+(x,) = 1
d'( x, ) = 0 sau d"(x,) = 1 si d+(x,j = 0). Nodul terminal este incident cu un singur 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 la extremitatea niciunui arc.
Observatii:
+ ' . •
1. d (x)=eard( S(x)) d (x) =card( P{x)).
2. Daca graful are n noduri , pentru un nod sursa al grafului d+(x)=n-1 d"{x)=O, iar
pentru un nod destinatie al grafului d-(x)=n-1 d+(x) =O.
168
l mpl emcnta r ca structuri lor de date
5
Exemplul 1:
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
:
-') Gradul intern al nodului 2 este 2, deoarece are 2 arce
care intra: [1,2J ~ i [7,2] . Gradul 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 t erminal 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 l zotat , 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
urmatoarele inforrnatii:
-7 Gradul extern al unui nod - numarand de cate ori apare eticheta nodului in Iista de
arce, ca prim element din pereche. Nodul 3 are gradul extern 2 (in rnultirnea arcelor,
eliche ta 3 apare de 2 ori ca prim element: (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 multirnea arcelor,
eticheta 5 apare de 4 ori ca al doilea element: (l ,5J , [2,5), (3,5J ~ i (4,5]) .
-7 M u l ~ i m e a succesorilor unui nod este fermata din nodurile a carer eticheta 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 ~ i m e a predcccsorilor unui nod este fermat a din nodurile a carer eticheta apare ca
prim element in perechile in care al doilea element este nodul precizat. Multtrnea
predecesorilor nodu!ui ;). este {2, 4) - arcele: [2,;).] si [4,;).J.
Exemplul3
C" Fie gra!uri le 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
G
13
=(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 urmatoarele informatii :
-') Nodul sursa al unui gra! apare pe primul lac din pereche de n-t ori - ~ i niciodata pe
locul al doil ea. i n gra!ul G
12
, nodul 1 este nod sursa. Desenati gra!ul G
'
2 pentru a
veri fica ace asta afi rrnatie.
-') Nodul 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 afirmatie.
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) sn-t ~ i O,;d-(xk) sn-t ).
1, In graful Gg - precizati gradul intern ~ i gradul extern ale nodul ui 5,
identificati nodul cu gradul extern eel rnai mare si nodunle cu gradul
intern eel rnai rnic.
2. ingraful G
lO
- identificati nodurile care au gradul intern 1, precizati cate noduri au gradul
intern egal cu gradut extern, care sunt nodurile terminale ~ i care sunt nodurile izolate.
Informati ca
169
3, i n gralul G
ll
- precizati gradul intern si gradul extern ale nodului 4, ldenti flcati nodurile
izolate ~ i nodurile terminate, identificati nodurile care au gradul extern maxim ~ i nodurile
care au grad ul intern egal cu gradul extern.
Tcororna 5
Daca gralul orientat G are m ar ce (u, . U2, .... Um) ~ i n noduri (x-, X2..... X
o)
. atunci i ntre
gradele nodurilor ~ i nurnarul de muchii exista urmatoarea 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] corespunde unei unttati dingradul extern al nodului Xi ~ j unei
unitali din gradul intern al nodului Xj_ Rezulta ca fiecare arc contribuie eu 0 unitate la suma gradel or
interne ~ j eu0 unitale la suma gradelor externe.
Exempl u. 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 egal cu 10
-------- ~ In graful G
11
verificati ca este Indeplinita relatia dintre gradurile nodurilor
~ si nurnarul de arce ale grafului .
2.7.4. Rcprezcntarca ~ i implemcntarca grafllilli
Exista mai multe moduri de reprezentare la nivel logic a unui graf, care pot fi implementate i n
memoria unui calculat or, l olosind diverse tipuri de structun de date. Aceste reprezentari pot fi
folosite in algoritmii care prelucreaza grafuri si, implicit, in programele prin care vor fi impJe-
rnentati in calculator acesti algoritmi. Printre rnodurile de reprezentare a unui graf se numara:
-7 reprezentarea prin matricea de adiaconta:
-7 reprezentarea prin matricea de incidonta :
-7 reprezentarea prin Iista muehiilor (areel or) ;
-7 reprezentarea prin Iista de adiacenta (Ii st ele veeinilor);
-7 reprezentarea prin matricca costurilor.
Fiecare reprezentare prezinta avantaje in ceea ce prives te utilizarea efi cienta a memoriei
interne, in functie de tipul grafului (cu noduri put ine. dar cu muchii multe - sau cu noduri
multe, dar cu muehii putine) ~ i din punet de vedere al eficientei algoritmilor de prelucrare
(i n functie de aplicatie). in urrnatoarele reprezent ari se conside ra ca gralu l G=(X.U) are n
nodur i ~ i m muchii.
2,7.4,1, Reprezentarea prin matricea de adiaccnta
Matricea de ediaccnta a unui graf este 0 matrice patrat a binara de ordinul n (A,I,Il),
ale care i elemente aiJ sunt definite astfel :
{
I. dad Ii, il E U
a j,J = o.Jacal i."j Jrl U
Implementarea qraf ului prin matricea de adiacent a se face printr-un tablou bidimensional
(0 matrice patrata cu di mens iunea n), asttet:
i n t a «r:>]l<:1>] ;
170
Implemcutarca structurrlnr de datc;
Exempl e:
--'-" - '-_ .
0 1 0 0 0 0
1 0
1 1 0 0
0 0 0 0 1 0
0 1 0
0
1 0
0 0 1 0
0 1
0 0 0 0 1 0
Grafu l oriental Gg
1 2 3 4 5 6
1
2
3
4
5
6
Graful ncorientat G
1
2 3 4 5 6 7 8
0
-,-::,- - - - - ~ -
1 1 1 0 0 0 0
1 0 1 0 1 0 0 0
1 1 0 1 1 0 0 0
1 0 1 0 0 0 0 0
0 1 1 0 0 0 0 0
.s.
0
.z,
.,Jl._ 0 0 1 1
- ,--
0 0 0 0
- ~
1 0
.s,
0 0 0 0 0 1 0 0
1
2
3
4
5
6
7
8
Proprietati le matricei de adiacenta:
1. Elementele de pe dia go nala pr incipals au val oarea 0 - din definitia grafului rezulta ca
oriee muehie (arc) [i. j) trebuie sa respeete conditi a i,.j .
2. i n cazul unui gra f neorientat , matricea de adiac erita este 0 matri ce si rne t r ic a fata de
di agonala principata. deoarece , dac a exi sta rnuchia [i , j] , atu nci exis ta ~ i muchia U,i].
Accasta r eprezentare es te recornandata pent r u probl emel e in c are se tcstcaza pre-
zenta unci muchii sa u a unui ar c intre doua noduri , se ca lculoaza gradul unui nod
etc. - deoarece pe r mi te un acces r apid la nodur i le si muchi i le (arcele) unui graf.
Algoritmi pentru reprczenta rea grafurilor fo losind matricea de adiacenta
Din matr icea de adiacenta puteti obt ine urrnatoarel e informat ii:
Graf neoricntat Graf orientat
Suma elementelor matr icei de aotacenta esle Suma elcmcntelor matrj cot de adiacenta este
eqala eu 2xm (dubtul numarului de muchii ). ecala cu m (numaru! de arce).
Gradul unu! nod i este egal cu suma Gradul extern al nodului i este egal eu suma
elementelor de pc lin ia i (sau cu suma orementetor de pe li nia i
elementelor din colo ana I). Gradul intern alnodulul i este egal cu suma
elementelor din coloana i.
Nodurile adiaccntc nodului i sunt nodurile j Succcsorii nodului i sunt nodurilej (j=1,n)
U=1 .n) pentru care clcmentc le din lini a i sun t pentru care elementele din lini a i sunt egale cu
eqale cu 1 (altl l ll s t l Mal pot f definite ca 1 (a[ilUl =1)
ncdurile j U=1,n) pcntru care clementelc di n Predeeesorii nodului i sunt nodurile j U=1 ,n)
coloarta isunt cgale ell 1 (aU][iJ=1) pentru care elementele din eoloana i sunt
egale cu 1 (aUJ[i] =1).
Noduri le adiacunte nodului i sunt nodurile j
U=1 ,n) pentru care elementele din linla i sau
di n col oana i sunt egale cu 1 (a[i] U]=1 sau
a(j][i]=1 ) - reuniunea dintre multimea
succesorilor si multimea predecesorilor nodutui.
Numaru! de vcctn! at nodului i este egal eu Numarul de vecini ai nodului i este egal eu
cradul nodului. eardinalul multimii de noduri adiacente nodului i.
Muchia [i,j] a grafului reprezmta un element al Arcul [l,j] al grafului reprezinta un element al
matrieei de adtacenta care Indephneste conditia: matricei de adiacenta care lndeplineste conditia:
afiJOl = 1 (sau aUlfil = 1) afilfil = 1
Informaticii 171
Exemplu
Se consi dera graful din FIgura alaturata . ldentificati matricea de adiacenta a
gratului
~
a)
0 1 1 1
1 0 1 0
1 1 0 1
1 0 1 0
b)
0 1 1 1
1 1 1 0
1 1 0 1
1 0 1 0
c)
0 1 1 1
1 0 1 0
1 1 0 0
1 0 1 0
d I
0 1 0 1
1 0 1 0
0 1 0 1
1 0 1 0
(Bacalaureat - Sesiunea specials 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 verificarea urrnatoarelor conditii:
1. Matricea trebuie sa fie binara - toate matriceJeindeplinesc aceasta conditie;
2. Elementele de pe diagonala principal a trebuie sa aiba valoarea 0 - matricea b) nu
Indeplineste aceasta conditie .
3. Deoarece graful este neorient at , matricea trebuie sa fie sirnetr ica - matricea c) nu
lndeplineste aceasta conditie
4. Din analiza grafului S8 observa ca doua noduri au gradul 2 si doua noduri au gradul
3; in matricea de adiacenta trebuie sa existe doua 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 epllneste aceasta conditie.
®
@
:05
Fig. 8
1. Scri eti matricea de adiacenta a gratului G
4
. Folosind informatiile din
matricea de adiacenta, deterrninati: gradul noduJui 5, nodurile izolate
si nodurile terminale .
2. Scrieti mat ricea 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 adiacenta a grafului Ga. Folosind inforrnatiile din matricea de adia-
centa, deterrninati: gradul intern al nodului 5, gradul extern al nodului 4, succesorii 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,
nodurile terminale ~ j nodurile izolate.
5. Scriet i mat ricea de adiacenta a qrafului orientat G1 5 din
figura 8.
6. Scriet i mat ricea de adiacenta a grafului G
12
. Cum iden-
tificati in matricea de adiacenta nodul sursa al grafului?
7. Scrieti matr icea de adiacenta a gratului G
13
. Cum
identificati i n matricea de adiacenta nodul destinatie al grafului?
Implcmentarea algoritmilor pcntru reprczentarea grafurilor cu matricca de adiacenta
1. Crearea matricei de adlaconta prin introducerea dateler de la tastatura, Det er-
minarea gradului unui ned. Salv area matricei de adiaconta intr-un fisier text.
Se citesc de la tastatura muchiile (arcele) unui graf orientat (neorientat) , se creeaza matri-
cea de adiacent a a grafului , se aflseaza nodurile izolate $i terminale $i se salveaza mat ri-
cea de adiacenta 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 urrnatoarele randuri,
li/matrtcei de adiacenta. Functia scrie () se foloseste pentru a scri e matricea de
172 Implcmeutu ren st ru ct ur ilor de da te
adiacenta in fisier. Deoarece matricea de adiacenta a lost dectarata ca variabila ql obala,
elernente le ei sunl initlatlzate cu valoarea O. Pentru testarea programelor se lolosesc
gralul neorienlat G, ;;i gralul orientat G, .
Gralul neorienlat Functia grad () se 10105e;;te pentru a determina gradul unui nod.

int a[10J [10J , n, :C.;
fstream f( "grafl .txt " , i o s : . outi j ,
void .sc r i e t )
t i n t i ,j ; f «n« e ndl ;
f o r {i =l; i <=n; i +T)
(for ( j - l ; j <- n ; j++ ) f« a [ i ] rj J« " " . f « e nd1 ; )
f. close () ; }
int q r adt Ln t; i)
lint j ,g-O;
f or {j =1;j<=n ;j++) g+ =a[i] [jl ; return g i l
v oid main ()
t i n t i ,j ,k;
cou t .ccvnu.mar de nodur i " ; cdrco-n , cc u t-oc't numa.r de muchii II. c in» r1;

{c out -cc vp r LmuI ned e L much i.e I "« k«"; " ; c i n» i ;
cou t .c-c vaL doi.Lea nod eL mucni e i " <ck-ccv: "; c i n» j ;
al i ] a[JJ [ij-1')
o outi -oC'Nod 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 out« e nd l « " Nodur i l e t e r mi na l e sunt : It ;
f or {i =l; i <=n ; i ++) if (grad(il==l) cout« i « " II .
scrie{) ; }
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 ncl 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 : :out ) 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-Lent e t j
i n t qrad ext{i n t i)
{J.n t
f or ( j =l ; : <=n i j -t l ) g't=a:i] l j l : r eturn g i }
int grad_int( i n t i)
t i n t j ,-:j=O;
f or {j = l ; j <=n i j ++} g +=a[j] [i] ; return g i }
v oid main ()
ti n t i , j , :: ;
c ou t .c-C'riume r de nodur.i " ; cin » :1; cout -ccvn umar de arce "; cin» rn;
for (k=::' ; k<=rn ; kH-}
{co u t.c-cv nodu I. initial a L a r cuLu i, "<x k-oc '" : " ,' c i n» i ;
cout« " nod u1 final a1 ar c u l u i " « k« " : " ; cin» j; al i ] [ j]=l ; }
cou t.c -C'Nod u rLl e LzoLa t e sun t : " ;
for (i=l; i <,.... n,· i t·+) i f (gr ad_int ( i. ) +gr a d_e x t (i) =:-::0 ) c out-oc k-cc'' " ;
c out«endl «"Nod ur i l e t e r mi na l e ,sunt : " i
f or ( i = l; i <=n i i +-+ ) if (g rad int.(i)+gr a d_e xt(i)==l) ccut -c-c j.c-c '' ";
serie () ; }
[II form aticii 173
2. Cr earea matricci de ad iacenta prin citi rea datelor din fisier. Determinarea nurna-
rului de vecini ai unui nod. Afisarea muchii i or (arc el or] 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 se afiseaza muchiile
(arcele). Functia ci teste () se foloseste pentru a citi matricea de adiacenta din fisier,
Grafu! neorientat Functia n r _ m() S8 foloseste pentru a determina 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],:>;
fstre a m
v oid c i t.e s t e t )
lint i ,j ; f »:i. ;

for (j=l ;j<=n ;j++) : »a [=- ; l i l . f . c l o s e () ; }
int nr_m()
t int 1 ,j ,m=O ;

for (j=l ;j<=n;j+ t) s+=a. [ i] [ j] ; r e t u r n m/2; }
int g r a d ( ti n t; .i.) { I / es t e ident iea ell cea de 1a exempl ul an t ert or j
void main ()
lint i ,j ,ma:-: ; c t t.e s t e t j , max-qra d t l j •
if (gr a d( i»max)
cec eccv nc du r aLe eu c eI rna I mul t i vec rni sunt : " ;
for {:i = l; i <"'" rl; H· +) if (g r a d{ i)=o=max) c ou t cc Lc -c' ' It;
cout«endl«" Gr n f u l a r e "« n r m( ) « " muc h i i "« e ndl;
cout.c-C'Huc h i i Le gra f u lui s unt : ";
for (.L=l; i <=n; i ++ )
f o r ( j -= i +l ; j <=n ;j ++ ) i f (a l i J [ jJ""=l) cout« i«"-"« j« " " ; }
Graful orientat Functia n r _ a ( ) se foloseste pentru a determina numarul de arce ale
grafului. Functia vecini ( ) se Ioloseste pentru a determina nurnarul de vecini ai unui nod.
La afisarea arcelor , se parcurge toata matr icea de adiacenta.
#include<f s t r e a m. h >
int ,,[10J [IO],n ;
f s tream f( "g:-ilf2 .txt " , i o s : : i n ) ;
v o i d c it.es t.e t ) { I l e s t e Ldent i.ca eu cea de 2.,] q re fu l n ecr Lent a t. }
int nr_a()
lint

f or (:=1;j<=n ;j++) :n+=a.[i] [jl ; r eturn m; }
int vecini( i n t i)
t i n t .1 , 1.'=0 ;
f or l j =- l ; j <=n ; j ++ l if (a, [ i ] [j]o;.;=l I I v ++ ; return v ; }
voi d ma i n ()
lin t i ,: ,maz ; c Lt.es t.e t y , mexe-vec i n i (::./ ;
f or ( i - 2; i <=n; i ,..'t- ) i f mex-vsc InLtLi ,
c c u t-c c vt.od u r i 113 cu eel mai. mu.l t i vec i n i sunt : ";
for ( i =2. ; i <=n ; ':'++} if {v12cini(i )==:naxj c out « i«" It ;
c o ut « endl«"Gr a f u l are " « rr!:"_ a. ( « " aree "« e nd l ;
174 Implementarea strneturilor de datc
oout.c-C'Ar c e Le grafulul s un t : " ;

if (a [i ) U J=o:: l) cout« i « "-"« j«" ";}
3. Crearea ma tr ice i de adiacenta pri n ci t irea muchiilor (arcelo r) di n fi si er. Determi-
narea veci nilor unui nod.
Datele se citesc din fisierul text graf3.!x!, pentru graful neorientat, graf4.txt, pentru graful
orientat. In fisier sunt scrise, pe primul rand, despartite prin spatii, numarul de noduri ;;i nu-
marul de muchi i (arce) ale grafului, apoi pe cate un rand, separate prin spatiu , cele doua
nodur i terminale ale fiecarei muchi i (arc). Se afiseaza vecinii fiecaru i nod. Functia
ci teste () S8 Ioloseste pentru a citi datele din fisier , iar functi a vecini () pent ru a deter-
mina vecini i unui nod. Fisierele text S8 creeaza cu ajutorul unui editor de texte. Pentru
testarea programelor se folosesc graful neorientat G
,
graful orientat Gg.
Gr aful neori entat.
#include<f s t r e altl. h>
int a [lO] [1 0 ], n, ffi;
fstream f ( " q r a f L . txt " , ios : : in) i
void ci teste ( )
{int k ,i , j ; f » n»m;
( f» i» j; ali] a[l] [i]=1 ; ) f . clo s e () ; )
void ve c i n i{ i n t i }
(for (int if ( a [ l ) cout-oc j c-c'' " ; )
void main ( )
{int i ; c i t e s t e l ) i cout«"Ve cin i i f i .ccar -u I nod sunt : "<c e nd.l ,
for (i =l ;i<=n i i +T) (cout-ocvuoou ; "<xi -c-;" : ". vec Ln .i t i l : cout«endl;})
Graful ori ental.
#include< f s t r e a m. h >
int a [l OJ [lO ) , f1, m;
fstream f( " gr a f4 . txt " , i o s : :in}i
void c i t e s te()
{int k , i ,j ; f » n» m;
for ( k=1; k<=m; k++ ) ( f»i» j; a[,][jJ=1 ; ) f. c l o s e () ; )
void vecini ( i n t i)
ffor (int j=l;j<=n;j++) .i.fit a l i ] [j ]==1 II a [ j ] [l J==1) ccuc-oc j c-c'' ";}
void main ()
{int i ; citeste() ; oout-oc vve c i. n i i. fi e ce r-u i nod s unt : " <c e nd .l :
for (i =l ;i<=n ii++) t cout.ccvtcoc u l "« i«": or; vecini (i) ; cout«endl;}}
4. Gener area matricei de ad iacenta.
Pentru a testa programele care prelucreaza grafuri implementate cu mat ricea de adiacenta ,
puteti sa generati aleatoriu matricea de adiacenta Functia generare () qenereaza matri-
cea de adiacenta a unui graf neorientat , cu n noduri mmuchi i.
#i nclude<i o s t r e a m. h >
#include<s t d l i b . h >
int a ll01 POL n ,D;
void qener-are ()
tint k=O, i , j ; randomize();
while ( k<m)
{.i =rand ( ) %n+l ; .j v xa nd ( i %n+1 ;
&& a li] [ j ] ==O) (a[iJ[j]=l; a [ j J[ i ] = l ; k++ ; ) ) )
In limnatica 175
void rnai n ( ) {CQut« " n= "; c i n» n ; cout«"m= "; c i n» m;
whi le (m>n - (n-l) /2) {cout.c-c vm« "; c i n» m;}
qencr a r e () ; .. . }
1. intr-un fisi er este sensa 0 matrice patrata, astrel: pe primul rand, un
nurnar care reprezinta dimensiunea matricei , ~ i pe urmat oarele rancuri.
valori numerice despartite prin spatiu - care reprezinta elementele de
pe cate 0 linie a matricei. Sa S8 verifice daca aceasta matrice poate fi matricea de adia-
cent a a unui graf . in caz afirmativ, sa S8 precizeze daca graful este orientat sau neorientat
2. Scrieti un program care sa genereze aleat oriu matri cea de adiacenta a unui gr af orie ntat.
3. Scrieti un progr am care citeste dintr-un fisier matricea de adiacenta a unui graf neorien-
tat ~ i care deterrnina nurnarul mini m de muchi i care trebuie adauqate pentru ca graf ul sa
nu conti na noduri izol ate.
4. Scrieti un program care citeste, din doua fisiere lext , gl .l xI ~ i g2.lxI , matricele de
adiacenta a doua grafuri , G.=(X.U.) si Gb=(X.Ub), ~ i care determina matricea de
adiacenta a graf ul u; reuni une Gr=(X,Url , unde U,= U. VUb, care se salveaza i n fisierul
g3.lxI ~ i matricea de adiacenta a graful ui inter sectle G,=(X,Ui), unde U,= U. n Ub, care
se salveaza in fisierul qa.txt.
5. Scrieti un program care citeste din fisierul lext graf2.lxI informatii despre un graf
oriental (de pe prima linie - nurnarul de noduri, apoi malricea de adiacent a) ~ i de la
tastatura 0 rnult ime A de numere care reprezinta etichetele unor noduri din graf - ~ i
care afiseaza multirnea arcelor ce au 0 extrernitate lntr-un nod din rnuttimea A si 0
exl remitate in rnutirnea X-A (X fiind rnultimea nodurilor grafului). Pent ru leslarea
programului , se vor folosi graful Gg ~ i rnultimea A={1,3,4,6).
2.7.4.2. Reprezentarea prin matricea de incidenta
Matricea de lncidonta a unui graf ncorientat este a ma tri ce binara cu n Iinii ~ i m
cal oan e ( A II,m), ale ca rei elemente a ij sunt defin ite as tfel :
. _ { L JaCfI 1i..i JElJ
.I ' , J - O. Jac" l i.. i I ~ U
1 1 1 0 0 0 0 0 0
1 0 0 1 1 0 0 0 0
0 1 0 1 0
1 1 0 0
0 0
1
0 0
1 0 0 0
0 0 0 0
1 0 1
0 0
~
0 0 0 0 0 0
1 1
0 0
.s,
0 0 0 0 1
.s,
0 0 0 0 0 0 0 0 1
,;fD
~
Graful G,
Fig .9
1
2
3
4
5
6
Proprletatile matricci de lncidonta a 7
grafului neorientat:
1. Pe fiecare coloana exista doua ele- 8
mente cu valoarea 1 (pe liniile i ~ i j care corespund nodurilor incidente cu muchia), iar
restul elementelor au valoarea O.
Implemenl area grafului neorienlal prin malr icea de incidenta se face pri ntr-un tablau
bidimensional (0 mal rice cu dimensi unea n xrn ), astfel:
int a l cn> ] [ <m>] ;
Graful ncoricntat G
1
1 2 34 5 6 7 8 9
176 lmplcmentarca st r uct ur ilor de date
2. Matrieea de incidenta are 2xm etement e egale eu 1, deoareee fieeare muehie este
inci denta cu doua nodur i.
Matricca de incidenta a unui graf orientat este 0 matrice cu n linii §oi m caloane
(An,m), al e carei clemente au sunt definite ast fel :
{
1' dac a nodul i este extremitat ea final a a arcului j
a i, J = -1 , daca nodul j este extremitat ea a arcului j
0, dac a nodul i nu este extremitat e a arcului j
lmplementarea grafului neorientat prin matri cea de incidenta S8 face printr-un tabl ou
bidi mensional (0 matr ice cu dimens iunea nxrn), astfel :
int [ <m>] ;
Gralnl orientat G,
1 2 3 4 5 6 7 8 9 10
r-'- --
1 -1 0 0 0 0 0 0 0 0
-1 1 -1 -1 1 0 0 0 0 0
0 0 1 0 0 1 -1 0 0 0
0 0 0 1 -1 0 0 -1 0 0
ri1-
0
ri1-
0 0 -1
r-1-
1 1 -1
0 0 0 0 0 0 0 0 -1 1
1
2
3
4
5
6
Gralnl G,
Fig.10
Proprietatile matricei de incidenta a grafuJui orientat:
1. Pe fiecare coloana exista un element cu valoarea 1 (pe linia i care corespunde extrernitatii
finale a areului ) o; i un element eu valoarea -1 (pe linia j care care eorespunde extrerrutatn
initials a arcului), iar restul elementelor au valoarea O.
2. Matricea de incident a are m elemente egale cu 1 m elemente egale cu -1, deoarece fie-
care arc are 0 extremitate finala 0 extremitate Suma elementelor matricei este O.
Aceast a reprezent are est e roc orn and at a pent ru graf urile care au un nurnar ma re de
noduri un nurnar mic de muchi i.
Algoritmi pentru reprezentarea grafurilor folosind matricea de incidcnta
Din matricea de incidenta putet i obtine urrnatoarele informatii:
Graf neoricntat Graf orientat
Gradul unul nod ; este egal eu suma Gradu! intern al unul nod i est e egal ell
ele mentelor de pc linia t. numarul de clement e eu va toarea 1 de pe
tini a; Gradut extern at unul nod i este egat
cu numaru l de clem ent e eu va loa rea -1 de pe
lin ia i .
Nodurlle adiaeentc nodului i sunt nodurile j Sucecsorii nodului i sunt nodurit e j 0=1,n) pen-
0=1,n) pentru care c lementel e di n li nia j sunt tru care elementc lc din li nia j sunt egalc eu 1
egate eu 1 in cotoana k (k=1 ,m) in care i n cotoana k (k=1,m) i n care etementele de pe
etementele de pe tinia i au valoarea 1: Iinia i au valoarea -1: altl lkl =-1 al ll lkl =1
>[i][ k] =1 ' O][ k] =1. Predcecsorii nodufui i sunt nodur ile j 0=1,n)
penru care elcmentcle di n Iinia j sunt egaIe ell
-1 in coloana k (k=1.m} in care etemenlete de pe
linia i au varoarca 1: all l l kl =1 ' Ul[k] =-1.
Informatica 177
..
-
Grafneorientat Graforientat
Nodurile adiacente nodului i sunt date de
reuniunea dintre rnultimea succesorilor si
multimea predecesori lor nodulu i.
Numarut de vecini at noduJui j este egal ell Numaru! de vec!n! a! nodul ui i esle egal ell
qradul nodului cardinalul multimil de noduri adiacente nodului i.
Muchia k - Il.ll a grafului este deterrninata de Arcul k = [i,j] al grafului este determina t de
doua elemente ale matncef a{i}kj] a[j]k;} , care ooua elemente ale matr icei , a[i}kj] si a[j]kJJ, care
indeplinesc conditia a[i][k] =1 aO][k] =1, indeplinesc conditia a[i][ k] =-1 allllkl =1, s!
semnifica faptul ca muchia k este inci denta ell sernnifica faptul ca arcul k les e din nodul i §i
nodurile j §i int ra in nodulj
1. Scrieti matricea de incidenta a grafului neorientat G
4
. Folosind infer-
rnatiile din matricea de incidenta, deterrninati: gradul nodului 5, nodurile
izolate si nodurile terminale.
2. Scrieti matricea de incidents a grafului neorientat G,4. Ce proprietate are acest graf?
3. Scrieti matricea de incidents a grafului G
8
_ Folosind inforrnafiile din matricea de inci-
denta, determinati: gradul intern al nodului 5, gradul extern al nodului 4, succesorii
predecesorii nodului 2 si predecesorii nodului 3.
4. Scrief matricea de incidents a grafului orientat G
16
din figura 11. G",
5. Scrieti matricea de incidenta a graful ui G
11
. Folosind informa-
tiile din matricea de incidenta ceterminati: gradul intern al r:t\ ("';\
nodului 5, gradul extern al nodului 2, nodurile adiacente \...'!J \...3..J
nodului 5, succesor ii predecesorii nodului 4, nodurile termi- Fi g. 11
nale si nodurile izolate.
6. Scrieti matricea de incidenta a grafului G
13
. Cum identificat i, in matricea de incidents,
nodul sursa al unui graf?
7. Scrieti matricea de incidenta a grafului G
14
. Cum identrficati, in matricea de lncidenta,
nodul destinatie al unui graf?
Implementarea algoritmilor pentru reprezentarea grafurilor cu matricea de inc identa
1. Crearea matricei de in ci denta pr in int rod ucerea datel or de la t astat ura. Det er -
minarea gradului unui nod. Salva rca matricci de incld enta i nt r-un fi si er text.
Se citesc de la tastatur a muchiile (arcele) unui graf orientat (neorientat). Se creeaza
matrices de incidenta a grafului. Se afiseaza gradul nodului p a carui etichet a se introduce
de la tastatura. Se salveaza matricea de incidents in fisierul text graf5./xt, pentru graful
neorientat, si graf6.txt, pentru graful orientat. In fisierul text se scriu pe primul rand ordinul
grafului si nurnarul de rnuchii, iar pe urrnatoarele rancurt, ltniile matricei de incidenta.
Functia scrie ( ) se foloseste pentru a scrie matricea de incidenta i n fisier . Pentru testarea
programelor se folosesc graful neorientat G
,
graful orientat Gg.
Graful neorientat. Functia g rad () se foloseste pentru a determina gradul unui nod.
#include<f s t ree m. f->
i n t a[ l OJ [lO j,n,m ;
fstream f( Hgraf5 .txt " , i o s : i out. j •
vo i d s c r i e ()
{i n t i , j ; .f-ocn-c-c " "« m«end l ;
for ( i = l ; i <tin ; i++)
f -c-ca l i ] fk] « " '" f « e n d l ; )
f. close () ; )
178
h uplemcntarca st r ncl ur ilor de dare
int g r a ct (i n t i)
lint g=O, k;
f or ( k=l; k<=m; k++) g +=a {i ] [k] ; return g ; }
v oid main ()
l i n t i ,j ,p, r. ;
c out.cc vnuma r de noduri " ; cin» n ; couexc vnumar de rauch .ii. " . cin» m;

{cou t« "p r i mul nod a l muc hie i "« k«": "; cin» i ;
c out« "a l doilea nad al muchiei "« k« ": "; cin» j ;
a[i] [k] =l; a[j] [ k ]=l ; }
c out«"nodul = It; cin» p ;
c ou t «"Gr a dul nodul u i "« p«" este "« gr a d {p )«endl;
sc r Le () ; }
Graful orlontat . Functia g r ad_ i ot () se toloseste pentru a determina gradul intern al unui
nod, iar functia gra d_ext () se foloseste pentru a determina gradul extern al unui nod.
#include<f s t r e a m. h >
i nt a l l O] [10] , n , m;
f s tream f( "graf6 .tx t " , i o s : : o u t ) ;
iot serie () {/ /este .i.den t i.c e ell cea de la graful neor i e nt a t }
int grad int{ i n t i)
l i nt g=O , k :
if ( a[ i] [kj eeL} g++ ; return g ; }
int grad_ext (i nt i)
(int k ,
if (a[ i] g++ ; return g ; I
void main ()
tint i , j , p ,k:
ccut-cc vnurna r de noduri "; ctn»>n . ccutx-cvnume r de much i i ". cin>>m;

{CQut«"nod ul i ni t i a l al a r c ul ui "« k«" : It ; cin» i;
ccue-oc vn odu j f i n a l a I a rcu l u i "« k« " : " ; c in» j;
ali ] [kJ=- l; a[ j] [k ]=l ; }
CQut«"nodul = " ; cin» p ;
c out« "Gr a d u l inte r n a 1 nodul ui "« p« " este "« g r a d_ i n t {p l«endl;
c out «"Gr a dul extern a1 nodului "« p«" est e "« g r ad_c x t (p }«endl ;
scrie () ; }
2. Crea rea matricei de inci denta prin citi rea datelor din Afi sarea vecinil or
unui nod.
Se citesc din fisierele create anterior (graf5.txt, respectiv graf6.txn matricele de incidenta
ale celor doua grafuri se afiseaza vecinii unui nod x a carui eticheta se introduce de la
tastatura. Functia c i teste () se foloseste pentru a citi matricea de incidenta din fisier.
Graf ul ncorientat. Functia vecini. ( ) se totoseste pentru a determina vecinii unui nod.
#i. ncl ude<f s t r e am. h >
int arlO] [lO],n ;
fst ream f{ "gra£5 .txt " , i o s : : i n ) ;
vo id c t t.e s r e ()
lint i ,k;
f or ( i =l ; i <=n ; i t + )
f or {kv Ls kxemr kt-t I f » a [ i ] [ k ] ; f . c l o s e () ; )
I nfunnati ca 179
void veci ni( i n t i )
{int k ,j ;
for ( k= 1; k<=m; kH I
if ( a [i ] [ k] ==1) for ( j = l ; j<=n ; j++)
if (j !=i && a[j ][k]==l ) coucccj cc '' H;)
void main ( )
(int P i cout«"nodul = It; c in» Xi citeste() ;
cout«"Ve c i n i i nodului "« x«" sunt nodurile " ; vec i ni( x) ; }
Gralul orientat Vectorii binari s p se folosesc pentru a memora succesorii, respectiv prede-
cesoni nodului x . Elementul i are valoarea 1 daca nodul i este succesor, respectiv predecesor
al nodului x; altfel, are valoarea O. Functille succ () pred () se lolosesc pentru a determina
in vectori i 5 p succesori i, respectiv predecesorii unui nod. Functia vecini () se foloseste
pentru a determina vecinii unui nod, prin reuniunea multimii predecesorilor a succesorilor.
#include<f s t r e a m. h >
int a [ 10 ] ('.0 ] ,n,m,s [1 0 J ,p [10 ] ;
fstream f ( flgraf6 .txt " , i o s : : i n );
void c i.t.es t e ( ) {/ / e s t e .i dent i.ce c u cea de 1a g raful neo.rIent.e t }
void succ( i n t i)
{for (int k=l ik<=mik++)
if l a [ i] ( k]=.=- l) for (in t
if ( j ! =i && a[ j] ( k J == l ) s lj J=] ; )
void pred (i n t i )
{for l i n t k=l ; k<=m;k++)
if (a [ i ] [ k]==l) for (i nt
if ( j ! = i && p[j] = l ; )
void i )
lint j ; pr ed (i ) ;
if && I I p[j)==l ) ) cout-oc j-cc" "; )
voi d main ()
l i n t X i cout«" nod u l = " i cin» z ; c i t e s t e () ;
c out«"Ve c i n i i nodului "« X«" sunt nodurile " ; vecini (x ) i }
3. Crea rea matricei de ln ci denta prin citi rea mu chiil or (arcel or) din fisier. Prelucrarea
informatiilor asoci at e muchiilor.
Datele se citesc din fisierul text grafT. txt , pentru gralul neorientat , grar8.txt, pentru graful
orienata!. in fisier sunt scrise, pe primul rand, despartite prin spatii, numarul de noduri si
nurnarul de muchii (arce) ale gralului, apoi, pe cate un rand, separate prin spatiu, cele doua
noduri terminale ale fiecarei muchii (arc) lungimea muchiei (arcului). Se afiseaza muchiile
(arcele) care au lungimea mai mare decal lungimea medie a muchiilor (arcelor) din graf. Se
foloseste vectorul d pentru a memora lungimea fiecarei muchii (arc). Functia ci. teste () se
foloseste pentru citi datele din fisier. functia rne die () pentru a determina lungimea medie a
muchiilor (arceor) din graf iar functia afisare () pentru a afisa muchiile (arcele) care au
lungimea mai mare decat media. Fisierele text se creeaza cu ajutorul unui editor de texte.
Pentru testarea programelor se folosesc gralul neorientat G, gral ul orient at Gg. i n aceste
grafuri se asociaza fiecarei muchii (arc) 0 valoare pentru lungime.
Graful neorientat

int a[ 1 0 ] [1 0] , d [ 1 0 ] , n , m;
fstream f ( " g r a f7 . txt II I ios: : in) ;
180 Implcmentarca st r uc t ur ilor de date
void c i t e s te i)
t i n t k , if j , 1; f » n» :ll;
{ f » i» j » l ; a li ] a[jJ (kJ=l ;
f. c lose () ; )
fl o a t media ()
l i n t i ,5=0 :
f o r ( i = l; i <=m; i + +) 5 +=d [ i ] ; r e t urn ( fl o a t ) s / f:",; )
voi d afi seaza ()
t i n t i ,k: fl o at dm=me d i a ( );
for ( k=l : k<=m; k++)
i f (d [ k ] >dm l
{f o r ( i = l ; i <=n ;i +-q i f ( a[ i] [ 1:] =: = :') coce cci c c " or .
cout « " cu lung imea "« d [ k l « e ndl ; } }
v oid main ()
{c Lt e s t e ( ) ; o ou t .c-C'He d i.a Lunq i m.iI e s t.e : "« med i a o« end l ;
ccu t .c-cvxuch .i i. Le sun t: "<x emdL: af i seaza ( ) ; }
Graful orientat
#i nc l ude <f s tre am. l: >
i n t a r l O] 115J , d I 15 ] , n , m;
fs t r e a m f( "graf8 .txt " , i o s ; :in) ;
v o id c i t e s t e ( )
t int k , i,j , l ; f » n »m;
( f » i» j » l ; al i] [ k]=-l ; a[ j ] [ k ]=l ;
f. clo s e () ; )
f l oat medi a( ) {/ / e s r e Lde n t Lce c u c ee de 1a 9 :-a: 1;1 r.e o r i.e n c }
void e f i.seaza t j
t i n t i ,k/x ,Yi fl oat
f o r ( k=l i k<=mi k++ ,
if ( d [ k » dm)
{for ( i =1; i <=ni i ++ ) {if (al i) ( k]==- l i xe L:
if (ali] 'r" ; )
ccuu-ccx-oc v-o'<xyc-c" cu Lun-r.i ruea "<xa l k l c-ceridL r L}
voi d ma i n ()
{c i teste () ; c ouecc vtce d t a Lunq i.rnL; e s t e : "« me d i a () «end 1 ;
cou t cc vA r cel e aunt.: "<xemdL: a f i s ee za () i}
4. Crearea matri cei de incidenta prin citl rea datel or di n matricea de adi aconta.
Afi sarea mu chiil or a nodurilor izolate.
Matricele de adiacenta se citesc din fisierele text create anterior: graft .txt , pentru graful
neorientat, si graf2.txt , pentru graful oriental. Se creeaza matricele de inctdenta ale celor doua
grafuri, se afiseaza muchiile (arcele) nodurile izolate. Se salveaza ill fisierul text graf9 .txt ,
respectiv graf1O.txt , informaliile despre muchii, astfel: pe pnmul rand, despartite prin spatii,
nurnarul de noduri nurnarul de rnuchii (arce) ale grafului, si apoi, pe cate un rand, separate
prin spatiu, cele doua noduri terminale ale fiecarei muchii (arc). Se folosesc matricele a pentru
matricea de adiacenta b pentru matricea de incidenta functiile ci tes te () pentru a citi
matricea de adiacenta din fisier, salveaza () pentru a salva i n fisierul text inforrnatiile despre
muchiile (arcele) grafului, t rans forr.t a () pentru a obtine matricea de incidenta din matricea
de adiacenta, afiseaza_ n Oduri_ i zol a t e () pentru a afisa nodurile izolate, !?i
a f i s e a za_ mu c h i i () pentru a afisa muchiile (arcele). Pentru testarea programelor S8
folosesc graful neorientat G, si graful oriental Gg.
Informat ica 181
Graful neorientat
#include<fst r e arn. h>
int .[lOI(lOI ,b[lO] { ZOI , n , m;
fstrea m £1 ( "g raf l . t x t ", i o s : : in) , £2 ( " g r a £9. t xt " I ios : : out ) i
void c i t e s t.e ( )
tint i ,j ; f Loo-n :
for (i =l; i <=n ; i ++}
{n » . [ i ] [ j] ; mt + ; }
mo'rr.l2 ; fl . close () ; )
void t r a n sfo rma ()
tint i ,j , k=l;
for (i=l ; i <=n; i++ )
for ) if (a [i ) ( b l i l blj l kt+ ; ) )
void afis eaza muc hii ()
{for {i n t 1:=1 ; kt + )
{cout«"LvJ u c h i a "<ck-cc" : " .
for {Ln t; i=l; i<=n; i t t) if (o[ i][I:]==l ) c out-ccl -cc'' "; cout« endl;} }
void a f Ls c a z a jncdu.ri .i z o La t.e l )
tint i ,k,x ;
for
{for ( k=l ,x=O; k<=m && x ==::O ;l:++) if (b [ i lLk] ==l) x=l ;
if {!x} couc-c-c r -cc" " ;}}
void salveaza ( )
( f 2« n« I, "<cn.<cencn •
for {i n t k=l ; k<=-m; l:++)
{for ( i n t i =l ; i <=n ; i f+) if {b[i ] [k ]=o;;=l) f2«i« " "; f 2« e n d l ; }
f2 . close () ; )
void main ()
{c i t e s t e J) ; t r a ns forma () ; a f i.s e a aa unuch.ii. Lj r
cout.c-C'Hod u r i. J e .i z 0 1 21 t.e .s u n t : " ; afi seaz3_nodu ri_i z ol a t e () ;
s e l voaze () ; }
Graful orientat
#include<f s t r e a m. h >
int a[lOI 110 I , b [lOj [2 0 I , n , m;
fs tream f1 {"grafl .txt " , i o s : . an ) , f 2 ( " g raf9 . t x t " , i o s : :out );
void c i.Le s t e j )
{int i ,j ; f l »n;
f or ( i=1; i<""n ; i + +)
{fl»a [ i ] [ j]; m++ ; ) f l. e l o s e () ; )
void transforrna()
{int i , j I ke L:
for ( i=l ; i <=n ; i ++ )
for if (al i ) {b.l L] bljl k++ ; ) )
void afiseaza arce()
{int L, k , x , y ;
for (ko;;= l ; k<=m ; k+ +)
{cout«"Ar c u l "«k« " : ";
f or (if (b [ i ) if (b [ i) yv.i • }
cout« x«" - "« y«endl; }}
void a f l s ea za
l int i ,k,x;
182 Implementarca st r uct ur ilor de dat e
for ( i =l i i <=n ii++)
{for && if (b[ i] [ k] ==l I I b [ i ] x=l ;
if ( ! xl c cue-cc f .c-c'' " ; } )
v o i d sal v e a z a ()
li n t i ,k;
f2 «n« " "« rn« endl;
for ( k=l ; k<=mi k++l
{for (if (b[i) [ k]== - lj if (b[i] [ k] ==l) y=i ; }
f2 « z« " "« y«endl ;}
f2 . close () ; }
void main ()
( c iteste( ) ; t r ans f orma {); e f i s eeza a rce(J ;
cou c-ocvNodur i Le i zolat e s unt : " ; afi seaza nodur i .i zc Le t e () ;
sa lve a z a( ) ; }
1. int r-un fisier text este scrisa a matrice, astfel : pe primul rand - doua
numere separate prin spatiu, care reprezinta numarul de linii si
numarul de coloane ale mat ricei, si, pe urrnatoa rele randuri - valori
numerice despartite prin spatiu , care reprezint a elementele de pe cate 0 linie a rnatricei ,
a. Scrieti un program care sa verifice daca aceasta matrice poate fi matricea de
incidenta a unui graf neor ientat. in caz afirmati v. sa S8 afi seze cate noduri izolate are
graful (l ndi cati e. Se verifica urmatoarele conditii: a) sa fie a matrice binara: b) suma
elementelor de pe fiecare coloana sa fie egala cu 2; c) sa nu existe doua coloane
identice. Un nod este izolat daca suma elementelor de pe linia sa este egala cu 0).
b. Scrieti un program care sa verifice daca aceasta matrice poate fi matricea de
incidents a unui graf orientat. in caz afirmativ, sa se determine cate noduri care au
gradul intern egal cu gradul extern exista (l ndi catie. Se verifies urrnatoarele conditii:
a) pe fiecar e coloana sa nu existe cecat 0 valoare e9ala cu 1, una eqala cu -1
restul egale cu 0; b) sa nu existe doua coloane identice. Un nod are gradul intern
egaI cu gradul extern daca suma elementelor de pe linia sa este eqala cu 0).
2, Scrieti un program care citeste din text graf6.lxl matricea de incidenta a grafului
ori entat care :
a. aftseaza nurnarul de vecini ai unui nod p a carui eticheta se citeste de la tastatura:
b. genereaza mat ricea de adiacent a a grafului din mat ricea de incidenta a salveaz a
in fisierul graf6a.txl .
2,7.4,3, Reprezentarea prin lista muchiilor
Lista muchiilor unui graf este fe rmata din m el ement e ca re contin, fi ecare,
cate 0 pereche de doua noduri , Xi!§i Xi, care Iorrneaza 0 muchi e,
adi ca pentru ca re [Xi, Xj)E U,
Implementarea acestui tip de reprezentare se poate face folosind una dintre urrnatoarele
structu ri de date :
-7 Matricea muchiilor u cu dimensiune mx2, in care fiecare linie corespunde unei
muc hii (arc) in fiecare linie se inregistreaza i n cele doua coloane etichetele nodu-
rilor care se gasesc la extr ernitatile muchiei (arcului) .
int u [<rn>] [2] ;
Referirea la nodurile adiacente muchiei (arcului) i se face prin u [i 1 (01 - extreml tatea
initiala a muchiei (arcului), respectiv u [ i J [1 ] - extremitatea finala a muchiei (arcului).
I nfor mat i ca
183
7 Vcctorul muchiilor u cu dimensiunea m ale carui elemente sunt Inreqistran, fiecare
i nregistrare fiind fermata din doua carnpuri x ~ i y ce contin etichetele nodurilor care
se gasesc la extrernitatile muchiei (arcului). Pentru elementele vectorului se defines-
te tipul de data muchie, de tip i nregistrare.
s t ruc t muchie { i nt x, y ; } ;
muchie u[<m>] ;
Referirea la a muchie (arc) i se face prin u [i ] , iar la unul dintre nodurile adiacente
muchiei (arcului) se face prin u [ i] • x - extremitatea initiala a muchie (arcului),
respectiv u [i 1 . y - extremitatea finala a muehiei (arcului).
Implementarea cu matrice
o 1
1
2
3
4
5
6
7
8
9
1 2
1 3
1 4
2 3
2 4
3 4
3 5
6 7
6 8
~
Graful neorientat G
1
Implementarea cu vector de lnroqlstrari
Muchi ile
--- - - - - - ---"------------
lmplementarea cu matrice
o 1
1
2
3
4
5
6
7
8
9
10
......!.... 2
2 1
2
..!-
-".-
3 2
_.-
..~ -
3 5
4 2
4 5
5 3
5 6
6 5
Graful orientat G,
ImpJementarea cu vector de inregistrari
Arcole
- ~ -
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 l nreqistrari, atunci pentru
oriee muchie (arc) i ,u [i ] . x" u [ i] .y .
Aceasta reprezentare este recomandata pentru problemele in care se face
prelucrarea succesiva a muchiilor (arcelor). Are avantajul ca permite adauqarea la
tipul de data muchie ~ i a altar campur; (Iungime, cost, timp etc.), corespunzator
unor ma rimi care pot fi asoc iate muchiilor (arce lor).
184
Implcmenturea st r uct ur ilnr de da le
2.
3.
4.
G"
5.
6.
7.
Algorilmi penlru reprez enlarea grafuri lor f ol osind li sta muchiilor
Din lista muchiilor puteti obtine urrnatoarele informat ii :
Graf neorientat Graf oriental
Gradul unui nod i este egal , in funct ie de Gradul extern al nodului i este egal, i n functie
implementare, cu numarul de apa ri tli al e de implernentare. cu numarul de aparit f ale eti-
et lch et cl no dul ui in matrice. respectiv in chetel nodului i n coloana aa matricei. respec-
carnpurile vectorul ui de tnreqist rari . tiv in pnmul camp , i n vectorul de lnreqistrari.
Gradul intern al nodulu i i este egal, in functie
de tmptementare, eu nurnarul de aparitf al e eti-
chetci nodului i n coloana 1 a matricei. respec-
tiv i n al doilea came. i n vectorul de inreci strari.
Ncdurile adiaccntc nod ului j sunt , in functie Succesorii nodului i sunt, in funcl ie de
de implernentare. eti ehelele j din coloana 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 etichetele j din carnpul (I{k] y pentru care u[k]. x=i (k=l ,m).
u[kj.y, pentru care u[k] .x=i , sau din campul
Prcdecesorii nodului i sunt , i n functie de
u{k]x. pentrucare u[k] .y=i (k=1.m). implementare. etichetele j din coloana 0 pentru
care u[k][1 ] =i , respectiv etichetele j din carnpul
(I{k]x pentru care u[ k].y=i (k=l, m).
Noduri lc adiaccntc nodul ui j sunt date de
reuniunea dintre multirnea succesorilor ~ i
multi mea predecesorilor nodului.
Nurna ru l de vccini ai nodului i este egal eu Numaru! de vecini ai nodului i este egal eu
gradul nodului. cardinalul rnultimi i de nodur i adiaeente nodului l.
1. Scrieti lista muchiilor a grafului G
4
Folosind informatiile din lista mu-
chiilor, deterrninati: gradul nodului 5, nodurile izolate si nodur ile lermi-
nale.
Scriet i lista muchi ilor a grafului neorienlat G
14
. Ce proprietate are acest graf?
Scrieti lista muchiilor a graful ui Ga. Folosind inforrnatiile din lista muchiilor , deterrninafi:
gradul inl ern al nodului 5. gradul extern al nodului 4. succesorii ~ i predecesorii nodului 2
si predecesorii nodului 3.
Scrieti lista muchiilor a grafului G
ll
. Folosind informatiile din lista muchiilor. determina ti:
gradul intern al nodului 5, gradul extern al nodului 2, nodurile adiacente nodului 5,
succesorii si predecesori i nodului 4, nadurile termi nale si nodurile izolate.
Scriet i lista muchiilor a grafului orientat G" din figura 12. F010- ~ f 2 \
sind inforrnatiile din lista muchi ilor. identificati nodurile izolate. 1 0 ~ 0
Scrieti lista muchiilor a grafului Gn Cum identificati, in lista _ 7
muchiilor. nodul sursa? 0 3 6
Scrieti lista muchiilor a grafului G,4. Cum identificali, in lista
muchiilor, nodul destinatie? Fig. 12
Implementarea algorit milor pentru reprczentarea grafur ilor eu Ils ta muehii lor
1. Crea rea matrieei eu lista muchii lor prin introdueerea datelor de l a tas t at ura, Deter -
minarea gradul ui unui nod. Salvarea intormatillor despre much ii i ntr- un flsier t ext.
Se citesc de la tastatura muchiile (arcete) unui graf oriental (neoriental). Se creeaza matri-
cea eu muchii le grafului. Se afiseaza noduril e izolate li
j
terminaIe. Se satveaza matricea eu
muchii le graful ui i n fisierul text grafll ./x/ , pentru graful neor ientat , ~ i graf 12. tx/, pentru graful
orientat. in fisierul text se vor scrie, pe primul rand, ordinul grafului l?i nurnarul de muehii, iar
Informatica
185
pe urrnatoarele randuri , nodurile de la extrernitatile unei muchii (arc). Functia scri e () S8
foloseste pentru a scrie inforrnatiile din matricea muchiilor in fisier. Pentru testarea prcqra-
melor se lolosesc graful neorientat G, si graful orientat Gg.
Graful neo rientat . Functia grad () se foloseste pentru a determina gradul unui nod.
#i nclude<f s t r e a m. h >
int a[lOJ [2] , n, m;
fs tream f t vq r a f l l ct x t t'v Lo s : : o u t );
int g r ad( i n t i)
lint k, g=O;
for i f (af k] [OJ==i I I ark] g++ ; return g; }
void scr i e ()
lint k; f «n« " "<<m<<endl ;
for ( k=- l; k<=.r. . ; k. ++ ) f -cce l k} [0] « " "« a ( k } flJ « e n d l ; f . c l o s e {) ; }
vo i d main ()
l int i ,j ,k ;
ccutiocvnuma r de noduri "; c.i r cc-n : coucccvnuma r de rnuchii " ; c i n>>m;
for {k=l; k<=m; k++)
{cout«"p ::i mu l nod a1 muc hi ei u« k« ": " ; cin» i ;
c out« "a l do i lea no d a1 muchiei "« k«" : "; cin» j;
ark] [ 0] =;' ; ar k] [l ]=j ; }
cout« "Nodur i l e izol a te s unt : IT;
f or (i =l ; i <=n ; i ++} if (g r ad{i)==O) cout « i«" II .
c out«endl « "Nod u r i l e t e rmi n al e s unt : " ;
f or {i =l; i <=n ; i ++J if {q r a d Li l e e L] c ccccc t c -c" If ;
scrie () ; }
Graful oriental Functia grad_int () se foloseste pentru a determina gradul intern al unui
nod, iar functia grad_ext () se foloseste pentnu a determina gradul extern al unui nod.
#include <f s t r e arn. h >
int a[lOJ [2j,n,m;
fs trea m f ( " g r a f 12. txt" , i o s : :out );
i nt grad int( i n t i )
l int q =O,k;
for {k=l; k<=m; k ++ l i f (a [ k ] [l]==i) g++ ; return g ; }
int grad_e xL( i n t i)
li n t g=O, k ;
f or ( k=l ; k <'=In; k++ l if (a l k] [Ol==i) g++ ; return g ; }
void scri e() {I l e s t e identic5 e ll cea de l a grafu l neorient a t
v oid main ()
l int i ,j , k ;
cou't-ocv numar de ncdur i. "; ci n» ni ccu ec c vmcnar de arce "; cin>>m;
f or (:'< =1 ; kc -m: k+ -r )
{c o u t «"nociu l initial a1 a rcului "« k« ": "; c in» i;
cout .c-cvn od u L final a L arcului "« k«" ': " ; cin» j;
ark] a rk]
cout« " Nod u r i l c izo late sunt : It;
f o r ( i =l; i <=n; i ++ j i f coce c -cdc -c" If;
c out« e ndl«"Nod u r i l e t erminale sunt : " ;
f or (i =l ; i <=n i i +';' } if (g r ad_ i nt( i) +g r ad e xt{ i)==l) cout« i «" If;
scr ie () ; }
186
Implementarea struct urilor de date
2. Grearea vecto rului de muchii prin citirea muchiil or (arcelor) din fi si er, Prelucrarea
informati ilor asociate muchiil or.
Datele se citesc din fisierele text create anterior : grafT.!x!, pentru gratul neorientat, si
grat8.!x!, pentru gratul oriental. Pentru un nod p a carui eticheta se citeste de la tastatura ,
S8 aflseaza eel rnai apropiat vecin (sau cei mai apropiat i vecini , dace exists mai multi) la
care S8 poate ajunge din nodul p. in cazul grafului neorientat, eel mal apropiat vecin este
nodul adiacent nodului p care tormeaza cu acesta muchia care are lungimea cea mai mica
ta\a de muchiile incidente cu ceilalfi vecini . in cazul gratului orientat , eel mai apropiat vecin
la care S8 poate ajunge din nodul peste nodul succesor nodului p care forrneaza cu acesta
arcul care are lungimea cea mai mica fata de arcele incidente cu ceilalti succesori. Functia
ci teste () S8 foloseste pentru a citi datele din fisier. Pentru testarea programelor S8
Iolosesc gratul neorientat G, si gratul orientat Gg.
Graful neoricntat. Functia izolat () determine daca nodul este izolat.
#include<f st r e a m. h>
struct muchie t int x, Y, d;};
muchie u [2 01; i n t n, m;
fstream f ( "gra f7 . t xt Jt I Lo s : : in);
void ci t.e s t e t)
{int k; f» n» rn;
for k++ ) f » u [ k ] . x»>u [ k] . y»u t k l . d : f . close () ; }
int i zola t ( i n ti)
lint
for if II g++ ;
void main ( )
{int k ,p/min ;
ci tes te () ; cout-oc vtcodu L: " . cin» p;
if (i201at(p}) cout«" Nod u l "« p«" nu a re vecini " ;
else
{ ke I ;
while {u l k lc x l e p & & u l k l kH ;
mi. neu [ k ] . d :
for ( k++; k<=ffi ; k++)
if ( u[k] II
if (u l k l v d -cmi .n) rni n =u [k ] . d ;
cout«" Di s t a nt a mi nima e st e "<<mi n<<endl;
eout«"No d ur i l e af l ate l a distanta minima sunt : ";
for
{if (u [ k) . cc - o-p && u'l k l cout-ocu l k l . y«" ";
if && cout.ocu l k j v x-c-c" "r Ll I
Graful oriental. Functia suce () determine daca nodul are succesori.
#include<f s t r e am. h>
struct a rc tint x ,Y,d ; } ;
arc u [2 0J ;
int n, nl;
fstream f ( " g r cif8 . txt " , ios: : in) ;
void c iteste ( ) {f l e s t e Cll c ea de 1 a graf ul neorien tat }
int succ( i n t i )
ti nt k ,g=O;
for { k=l ; k<=ffi ; k++;' if (u [ k ] . x==i ) g+ + ; return g !=O; }
Infor matica 187
voi d main ()
{in t k , p , mi n ; citeste( ) ; cou t «"Nod ul : "; cin» p ;
if ( ! slice (p) )
cout« " Nodu l u« p«" nu are vec ini l a c ar e s a se poat a a junge " ;
else
{ ke L:
while (u l kl . x ' =p ) k++ ;
min=u [ k] . d ;
for (k++ ; k<=m ;k++) if {u ] k'] . x==p && u [k] . d <mi n ) m.t neulkI . d;
cout« " Di s t an t a mini ma e ste n« mi n« e ndl ;
cout« " Nod u r i l e a f l a te 1a ct t s r anre minima s ant : ";
for (k=l ;k<=m;k++ )
if l u [k ] . xe e p && u[k] . d==mi n ) cou t c-cuj k] . y« " ";})
1. Scr ieti un program care realizeaza urrnatoarele:
a. reface matricea cu muchiile grafului orienlat din fisierul text graf12.txt,
b. determina cate noduri izolate are graful :;; i afiseaza aeeste noduri;
c. genereaza matricea de adiacenta din matricea muchiilor si 0 salveaza i n fisierul text
graf12a.txt.
(l ndi catie, Se numara nodurile distincte care apar in lista muchi ilor - n1, iar numarul de
noduri izolale va fi dal de diterent a n-n1 .)
2. Scrieti un program care construieste vectoru l de muchii din matricea de adiacenta a
grafului oriental car e se citeste din fisierul lext graf2.txt ~ i care deterrnina vecinii unui
nod p a car ui etic heta se cit este de la tastatura.
3. Scrieti un program care sa genereze aleator iu, i ntr-un fi sier, lista muchiilor unui graf
neoriental (oriental). Nurnaru] de nodur i ~ i nurnar ul de muchi i se citesc de la tastatura.
4. Scrieti un program care sa genereze aleatori u, i ntr-un fisier, lista muchiilor unui graf
neorientat (orientat) in care muchiile au asociate 0 marirne nurnita cost. Se citesc de la
tastatura: numarul de noduri, nurnarul de muchii :;; i Iimitele intervalului i n care marimea
cost poate lua valori .
2.7.4.4. Reprezentarea prin lista de adiacenta
,
~ _ o d
l.ista de adiacenta
1 2,3,4
2 1,3,5
3 1,2,4,5
4 1,3
-
5 2, 3
6 7, 8
7 6
8 6
lmplementarca statica
A. Matricea Iistei de adiaconta L cu 2 Iinii si n+2xm
coloane pent ru graful neorientat, respectiv cu n+m co-
loane pentr u graful oriental , defmita ast fel :
Lista de adlacenta este fer mata din Iistele L, (1::;i'::;n) care cont in toti veci nii
unui nod Xi la care se poate ajunge direct din nodul Xi,
adica to at e noduril e Xj pentru care [Xi,Xj] EU.
Observat ie. in cazul graful ui neorientat, lista li a vecini lor unui nod Xi al grafu lui este
fermata din nodurile Xj adiacente nodului Xi . i n cazul graful ui orientat, lista li a vecinilor
unui nod Xi al grafului este fermata din nodurile Xj care sunt succesorii nodului Xi.
Implementarea acestui li p de reprezenl are se poat e face: Graful ncoricntat G
-7 static, folosind una dintre urrnatoarele structuri de date:
A. Matricea l iste i de adi acenta
B. Vectorii l i stei de adiacent a
-7 dinamic , cu ajutorullistelor lnlantuite.
188 Implcmcntarcu structuril or de dat e
Nod Li sta de adiace nta
1 2
2 1,3,4
3 5
4 2,5
5 3, 6
6 5
- Prima linie contine etichetele nodurilor listele de adiacenta ale fiecarui nod; este
fermata dindoua secnuni: Grafu l orientat G
g
a. Primele n coloane contin etichetele nodurilor:
L[O] [ i]=i (1';i.;n).
b. Urrnatoa rele mx2 caloane, respectiv m coloa-
ne, conti n in ordine cele n liste de adiacenta
ale celor n noduri.
- A do ua Iini e cont ine inforrnat iiie necesare pentru a
identifica in prima linie list a de adiacenta a fiecarui
nod; este fermata din coua sectiuni:
a. Primete n coloane contin , in ordine, pentru fieca re nod i (1::;i::;n), indicele
coloanei din prima linie din care incepe llsta de adiacenta a nodului:
L [1] [i 1= j , unde j este indicele coloanei de unde incepe list a de adiacenta
a nodului i. Daca nodul este izol at, se va memora valoarea 0 - L [1 ] [i] =0
(nu exis ta lista de adiacenta pentru acel nod).
b. Urrnatoarel e mx2 caloane. respectiv m caloane, contin in ordine mformatii
despre modul i n care se inlant uiesc eternentei e din lista. Daca nodul
L[O] [ i ] se i n interiorul listei, atunci L[l ] [ i ] =i +1 (indicele
urrnatorului element din lista) . Daca nodul L [0 ] [i] se gase'ite la sfarsitul
listei , atunci L [ 1] [i] = 0 (s-a terminat lista de adiacenta a nodului i).
Matricea este definita astfel :
a} pentru graful neorientat int L [ 2 ] [ <n>+ 2 k <;n>; i
b) pentru graful orient at: i n t L [2 ] [<n>+<m>J ;
Gralul neoriental G,
Nod uril e
L1
L2 L3
L4 Ls L, L7
L,
A
...
8 2 3 4 1 3 5 I 1 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

--------
Graful orienlal G,
Indicii coloane lor
Noduri le
L1 L2 L3 L4
Ls
L,
A
, r
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 8 9 10 11 12 13 14 15 16
-- ----
-.,..--
Indicii coloan clor
B. Vectorii Iistei de adiacenta: un ve ctor L cu dirnensiunea mx2 , pentru gratul neorien-
tat, respectiv cu dimensiunea rn, pentru gratul orientat, care conti ne listele de adia-
centa 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 vectorul L. Indicii din vectorul cap corespund
etichetelor nod uri lor . Cei doi vectori sunt defini ti ast fel:
a) pentru gratul neorientat: int cap [ ':'"1> j , L (2 "' <:n> J ;
b) pentru graful orientat: int c ap <ri>J , L [<m> 1;
lntorrnutica
L
Graful orientat G,
L3
7 8
189
1 234 S 6
cap C-1J 2 I S 1=U 8 [JQ
»> J / I \
1 2 3 4 S 6 7 8 9 10
L n 1 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 vecini Lr, contine indicii coloanelor j in care S8 gasesc valori
de 1 in matricea de adiacenta (a [ i] [j]
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 element din fiecare lista S8 memoreaza intr-un vector L care are lungimea lcqica
egala cu nurnarul de noduri n si ale carui eleme nte sunt de tip pointer catre tipul nod:
struc t n od {int i n f o;
Ho d * u.em; } ;
n od *L [<n >] ;
L
2
1
_ I
2
5
3
4
5
6


5
Gr af ul ori entat G,
Gratul neorientat G
1
Impleme nt a rea struet ur ilor de dat e 190
L
2
1
1
2
1
3
1
4
2
5
7 8
6
7
8
Acoasta reprezentare este recornandata pentru grafurile care au un nurnar mare de
noduri ~ i un nurnar mic de muchi i.
Algoritmi pcntru roprozcntaroa grafurilor folosind Hst elo de adiacenta
Din lista de adiacerita irnplornontata static cu rnatr ice puteti obtine urmatoarele intorrnatii:
Graf neo rie ntat Graf oriental
Lungimea ustc! de adiacenta a nodu!u i l Lungimea listei de adiacenta a nodului i
neizolat , cu eticheta mai mica decaf n, este neizclat . cu eticheta mai mica cecat n, S8
egala cu dife renta dintre pr imul indice j (j=i+1 .n- calculeaza la fel ca l?i in cazul grafutui
1) diferit de 0, din prima sectiune a lini ei a doua neorientat. Pentru nodul n lung imea listei de
(L[1] [j] :t-O), ~ i indicele caloanei din care incepe adiacenta este egala eu (n+m+1 - L[1][n] ),
listade adiacenta a nodului i (L[1l Ol . L[1][i]) Gradul extern al nodului i este egal eu
Pentru nodu Jn. lungimea listei de adiacenta lungimca li stei de adtacenta a nodu lui .
este eqala eu diferenta dmtre nurnarul total de Gradul intern al nodului i este egal, eu
eoloane, plus 1, si indicele coloanei din care numarul de aparitii ale etichetei nodului in a
incepe lista de adiacenta a nodu!ui n (n+2xm+1 doua secnune a pr imei linii a matricei (L[OlU] =i,
- L[1][n] ). Lungimea listei de aolacenta se mai cu j=n+1 ,n+m).
poat e determina prin numararea in linia a doua
a elementelor diferite de 0, lncepand cu
elementul din coloana L[1][i] ), la care se
adauqa 1
Gradul unui nod i este egal cu lunqlmea Iistei
de adiacenta a nodului sau cu numarul de
aparitii ale et ichetei nodu lui in a doua secttune a
primei linii a matricei (L[ O] U]=i , cu
i=n+1,n+2*m) .
Nodurile ad iacente nodului i sunt nodurile a Succesorii nodulul i sunt nodurile a carer
carer eticheta apare in lista de adiacenta a etiche ta apare in lista de adiacenta a nodului i
nodului i Pr ed ecesorii nod ului i sunt nodurile j i n a
carer lista de adiacent a aoare nodul i.
191 Informat ica . - .
Graf neori entat Graf orientat
Nodurile adia cente nodulu i j sunt date de
reuniunea dintre multimea succesorilor ~ i
multimea prede cesorilor nodului .
Nurnarul de vect nt at uodutu! i este egal ell Numar ul de vc ctn! ai nodului j est e egal ell
aradul nodului, cardinalul multimi i de noduri adiacente nodului i .
Mllchia [ i,j] a grafului reprezinta nodul ; ~ j un nodl Arcul [i ,j] al grafului reprezinta nodul ; s! un nod
din lista de adiacenta a nodului i din prima Iinie a j din lista de adiacent a a nodul ui i din vectorul L
matrioei (U Olli1El;). (U Ollil EL,)
Din lista de adiacenta imptomontata static eu doi vectori puteti obtine urrnatoarele intormatii:
Graf ncori entat Graf oriontat
Lu ng imca listei de adiacenta a nodului i Lun gi mca li st ci de adiacenta a nodului ;
neizolat . cu eticheta mai mica decat n, este neizolat. cu eticheta mai mica decat n. se
egala cu diferenta dintre primu1indice j U=i+1,n-1) calcule aza la fel ca ~ i i n cazu1grafului
diferit de 0, din veetorul cap (cap[jl;tO), ~ i neorientat . Pentru nodul n. lungimea listei de
indicele elementului de la care incepe lista de adiacent a este egala eu (m+1 • cap[n] ).
adiacenta a nodului i (capO] - cap[ i] ). Pentr u Gr adu l extern al nodutui I este egal eu
nodul n, lungi mea listei de adiacenta est e egali3 l un gi mea li stei de aot ac onta a nodulu i.
eu diferenta dintre nurnarul tota l de elemente Gradul int ern at nod ului r este egal eu
ale vectorul L, plus 1, ~ i indicele elementului din numarul de aparitii ale et ichetei nodul ui in
care i neepe lista de aoiacenta a nodului n vsctoullistei l (l UJ=;, cu j=1.m).
(2xm+1 - cap[n]) .
Gradul unui nod ; este egal eu l ungi mea Iiste i
de adiacenta a nodului sau cu nurnarul de
apari tii ale et ichetei nodului in vectorullistei L
(l Ol =;, cu i=1,2·m).
Nodurile adiacentc nodutul I sunt nodurile a Succesorii nodulul I sunt nodurile a carer
carer eticheta apare in lista de adiacenta a eticheta apare in list a de adiacenta a nodului i
nodului i din vectorul L. din veetorul L.
Pr edcccsori i nodulul r sunt nodurile j in a
carer lista de adiacenta din vectorul L apare
noduli.
Nodur il e adiacente no dut ul I sunt date de
reuniunea dlnt re muttirnea succesorilor ~ i
mult imea predecesoril or nodulu i,
Nurn aru! de vecinl a! nodului f este ega! cu Numarul de veci ni at no dut ulr este egal eu
qradul nodului . eardina lul multimii de noduri adiacente nodului l .
Muc hia [i,j] a grafului reprezinta nodul ; ~ i un nodj n rcu! li.Il a! grafului reprezinta nodu l i :;; i un nod
din lista de adiacenta a nodului i din vectorul L j din lista de adi acenta a nodului i din veetorul L
(L01EL,) (l !ilE L,).
Din lista de adiacenta irnplernentata dinamic putet i obtine urrnatoarele inforrnatii ;
Graf neori entat Graf oriontat
Numaru l de ele mente di n toate listele simplu Numarut de ele mente din t oate liste1e simp1u
inla nluite este egal eu 2xm ( dubl ul nu marului Inlantuite este egal eu m { numarul de arce).
de muchli ),
Lungime a nst e! de adlacenta a nodului ; este Lungimca Iis tei de adtacenta r este egala cu
eqala eu numeru ! de noduri ale listei ce are numarul de noduri ale Iistei care are adresa
adresa nodului prim ecata cu un. nodului prim eoata cu l [i]
192 Im plcmentur ca st r uet ur ilor de date
Fi g 13
Graf neoriontat Graf orientat
Gradul unui nod i este ega l ell lungimea listei Gradul extern a! nodului i este egal eu
de adlacenta. lungimea Iiste i de adlacenta a nodului.
Gradul intern al nodului i este egal, ell
numarul de aparitii ale etichetei nodului in
toate Iistele simplu Inl antuite.
Nodurile adiacente nodului ; sunt nodurile a Succesorii nodului ; sunt nodurile a carer
carer eticnet a apare in listace are adresa etichet a apare in lista ce are adresa nodului
nodului prim egala ell L[i]. prim egala eu L[i ].
Predecesorii nodului ; sunt nodurile j in ale
carer liste (ee au adresa nodului prim egala ell
LOll apare nodul i.
Noduril e adiacente nodu lui i sunt date de
reuniunea dintre rnultimea succesorilor sl
multimea predecesorilor nodului,
Numarul de vecini at nodului i este egal cu Numaru! de vecini ai nodului j este egal cu
qradul nodului. cardi nalul rnuttirnii de noduri adiacente nodului i.
MuchiaIi.Il a grafuluireprezinta nodul i ~ i unnodj Arcul [i.j] al grafului reprezintanodul i ~ i unnod j
dinlista ce areadresa nodului primeQalacuL[i] dinlista ce areadresa nodului primegalacuL[i].
1. Scr ieti lista de adiacenta (Iolosind eele trei metode de implemenlare) a
grafului neorientat G
4
. Folosind lnforrnatiile din lista de adiacenta,
det errninati: 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 Irei melode de
implementare. Ce proprietate are aeest graf?
3. Scrieti lista de adiacenta a qrafului orientat G8 (foloslnd eele trei metode de implemen-
tare). Folosind lntorrnatiile din lista de adiacenta, determinati: gradul intern al nodului 5,
gradul extern al nodulul 4. sueeesorii ~ I predeeesorii nodului 2 ~ i predeeesorii nodului 3.
4. Scrieti lista de aoiacenta a grafului orientat G
ll
. Se vor folosi eele trei metode de imple-
mentare. Din lista de adlacenta, det errninati: gradul intern al nodulu i 5. gradul extern al
nodului 2, nodurile adiacente nodului 5, succesorii si predecesorii nodului 4, nodu rile
terminale ~ i nodurile izolate. 1'ft_ "'-'
Scrieti lista de adiacent a a graiulul orlentat G' 8din figura 13.
Se vor folosi eele trei met ode de implementare.
6. Scri eti lisl a de adiacenta a gralului G
13
. Se vor folosi eele trei
melode de implementare. Cum identificati - i n fieeare imple-
mentare a listei de adiacenta - nodul sursa al grafului?
7. Scri eti lista de adiacent a a qrafului G". Se vor folosi eele
trei melode de implementare. 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 adiac ent a,
intr-un tisier text se gasese urrnatoarele informatii despre un gra! neorientat ( ~ i varianta
orientat) : pe prima linie, valorile pentru nurnar ul de noduri n !? i numarul de rnuchii m,
despartite orin spauu, iar pe urrnatoarele n linii, despartite prin spatiu, nurnarul de veeini ai
unui nod si lista vecinilor (:;; i varianta nurnarul de succesori ai unui nod si lista succesorilor).
Informatica
193
Se citesc din fisierul text aceste informatii se creeaza lista de adiacenta 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 adiacenta din lista de adiacenta. Se
salveaza apoi matricea de adiacenta intr-un fisier text. in fi sierul text S8 scriu: pe primul
rand ordinul grafului, iar pe urmatoarele randur i - liniile matricei de adiacenta, Functia
citeste() se foloseste pentru a citi listele de adiacenta din fisier , functia g rad() pentru
a determina gradul varianta gradul extern) al unui nod. functia g rad_max ( ) pentru a
determina gradul maxim varianta gradul extern maxim) al nodurilor din graf , funct ia
transpune ( ) pentru a obtine matricea de adiacenta din lista de adiacenta , iar functia
scrie ( ) pentru a scrie matricea de adiacenta in fisier . lnforrnatiile 58 citesc din fisierul text
grar13.txt, pent ru graful neorientat, qrett a.txt, pentru graful orientat, se satveaza in
fisierul text grar15.txt , pentru graful neorientat , grar16.txt , pentru graful oriental.
text grar13.txt si qrett a.txt se creeaz a cu un editor de texte. Pentru testarea programelor se
folosesc graful neorientat G
,
graful orientat G, .
Graful neo ricntat graful oriental _ impl cmcntarca cu matricc
#i nc l ude <f s t r e a m. h>
i nt [ 50J , a [ 10 J [10 J ;
//pentru graful ne o r i e r. t a t:
fstr e am £ 1 ( " qraf13 .txt " , i o s : :inl , £2 ( "gr af l.') . L:{t " , i o s : :out );
//pen t r u g r a f u l o rientat
// 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: :out );
v oid c i t.e s te ()
tint L j , x , k ; f l »n»:n;
for (i =l; i <o=n; i ++) L[1J [ij ""i ; j =- n+l ;
for ( i =l; i <=n; i ++ )
{rI o>x ,
if L [2 ] [i) = O;
e l s e { L [ 2 ] [ i]=j ;
f or {f l» L [ l } [j]
] [j) = j +l ;
else L [ J [j; =O;
J++ ; ) ) )
::1 . close {} ; }
int g rad {i n t i )
lint g ,j=L[2 ] [i] ;
if (1,[ 2J ( i. ; = =O) 9=0 ;
else {go= "2.;
while (!'[ 2j [j J ! =Ol {g ++; j ++ ;)}
return c; ; }
int ()
tint i ,I;:ax=C;
f or ( i =l ; i<=n ; i+f) if iqrad\ i1 >max
return :n2X ; l
void t r aaapune ()
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] {a l i ) [L [l ] [jJJ =l; j++ ; }
a l L] ( L[ l J )j]]=l ; )})
194 I m plc mcntarca st r ucru r llor de date
void s c r ie()
(int i ,j ; f 2« n« e nd l ;
for {i""l ; i ++)
{for (j = l ; jT+1 £ 2« a [ i ) [j ] « " " . f2« e n d l ; )
£2 . close () ; )
void main ()
{inti; citeste () ;
cout«"Gra d u l eel mai maTe este "« g r a d_ma x () « e nd l ;
oout-c-C'Nod u r i.Le vc u gradul eel mal mare
for ( i=l i i<=n; i·j· ,,,) if (g r ad (i) -o- q r ad max {} [" ccceccr -c-c '' " .
t r anspune t-j • scrie() ; }
Gra fu l ncori entat si qraf ul orientat - implemcnt area eu voctori .
#include<f s t r e arn. h >
int n,m, L[ SO] , a r l O] [ 1 0] , c a p ( 1 0 );
/Ipentru grafulneCrienat
fstream fl ( " g r a £1 3 . txt " , ios: : in) , £2 ( "gr-af1 5 . txt " , ios: : out ) ;
I/pentrugraful o r l e na::
/ I f s t r e a mfl ( " g r a f 1 4 . t x t " , ios : : in) f f2( " g r a f 1 6 . txt" , ios: : out );
void ci tes te ( )
lint i , j =l , x , k ; fl »n»m;

{ fl »x;
if cap[ i] =O;
else {c a p Ci ]""' ];
for ( fl» L [j ]; j ++ ; ) } )
f lo close () ; }
int g r a d ( i n t i )
(int g ,j ;
if
else
{if ( Lcn j
while &&j<=n) j++;
if ( j==n+l) g=2 -A-
m
+l ::"
c a p
[ i J ;
II g=m+l -cap[ i ] ; pentru graful orientat
else
else g=2*m+l -cap [ il ; }
return g ; }
int grad max() ( / /este Loent tcc cu eea de l a implementarea e u mar r i.ce j
void t ran s p un e ( )
ti nt i, j;
for ( i =l ; i<=o ; i ++)
for ; j ++ 1 a [ i] [L[ca p [ i]
void scrie{) { / I es t e .i. dent i ca ell e ea de La i mplernent a r e a CD mat r Lce }
void main() {/ / e s t e iden t i c a cu o e e de la .i.mpLement a r'ea cu rnatrice }
2. Crearea li st ei de adiacent a i n impl ement are statica din matri cea de adiacent a.
Salv area listel or de adiacanta intr-un fi si or.
Se citeste din fisierul ereat anterior (grafI5.lxI , respectiv grafI6.lxl) matricea de adiacenta a
grafului se obtine din ea lista de adiacenta irnplernentata cu matrice, respectiv cu vectori.
Sc salveaza listele de adiacenta 1ntr-unfisier text (grafI7.lxl , respectiv grafI8.lxl) , astfel: pe
prima linie, valorile pentru nurnarul de noduri n nurnarul de muchii rn, despartite prin
Informatica
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 programelor se lolosesc gralul neorientat G, gralul oriental G
9
.
Graful neorientat grafu l oriental - implemcntarca cu matri cc
#include <f s t r e a m. h >
int n ,m,L[ 3 ] [ 5 0 J, a [ l OJ [lO J ;
/Ipent r u gr a f ul 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 gra ful orienta t
Il f s t r e a m f 1 ( "grafI6 _t xt " , i o s : : in) , £2 ( "graf I8 . txt " , i o s : : out ) ;
vo i d c i, t este ()
{int L j ; £1»n;
for ( i =!; i <=n ; i T+ )
f fl» a [ i ] [j] ; i f l a [ i ] m l + ; ) fl . c l o s e l) ;
m=m/ 2 ; } //numai pentru graful neorientat
void transpune {)
{int i ,j ,k,g ;
L[ lJ ke-n-t I r


if (a[ iJ {L [ l ] L [ 2 ] k++ ; g++ ; )
if L[2]
e l s e f L [ 2 ] L[2]
i nt grad( i n t i ) {I / i de nt i c a eu eea de la eu rna t r i ee }
void s c r Le ()
{int .i ,j=l , J.: ; f2«n« " "« m«end l;
f or (i=1 ; i <=n ;i++)
if (L[2 J f2«0« e n d l ;
el se {f 2« gr a d ( i) -cc' ' " ;
f or ; k++, j ++ ) f2«L[ 1] [ j J«" " ;
f2 « e nd l ; ) f2 . c l o s e ( ) ; )
void main ()
{c i t e s t e ( ) ; tra n s p une ( ) ; seri e() ; }
Graful ncorientat graful orientat _ im plcmcntarea cu vectori
#i nclud e <f s t r e a rn. h >
int n ,m ,L[ 50 j,cap[lO] , a[101 [lOJ ;
I /pcnt. r u graful neor i e n ta t
f s t r e a m £1 ( " g ra f13 ; txt " , i os : : i n ) , £2 ( " g ra f I S . txt " , i o s : : out ) ;
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 os : : aut ) ;
void cites t e ( ) (/ / es t e roent.t ca eu cea de 10. imp.Icrnenterea c u met rLce l
void t r a ns p u ne()
{i n t i , j,k=l ,g ;
f ar ( i =l ; i <=n; i ++)
if (a[ i l {L j kl e j s k++ ; g++ ; )
el se
i n t grud{i nt i ) eu cea de l a ell vectori }
196 Implemcntareu st r uct ur ilor lie da te
vo id sc r i e {)
{i n t i I j ; £2 «n.« " " <cm-cce ndf :

{f 2« qr 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 .cfcse tj r j
void mai n () { I / e a t e iden t Lca e ll cea de 1a i mpleme n tarea e ll rna t r i c e)
3. Crearea listei de adiacent a in implementare dinami ca prin ci tirea lis t ei muchiil or
di n fi sier. Determinarea veci nilor a gr adului unui nod.
inlr-un fisier text se gasesc urmatoarele mformatii despre un graf neorientat variant a
orientat) : pe prima linie, valorile pent ru nurnarul de noduri n si nurnarul de muchii m, iar de pe
urrnatoarele m linii, cate 0 pereche de numere despartite prin spatiu, care reprezinta etiche-
tele nodurilor ce tormeaza a muchie (arc). Se citesc din fisierul text aceste informatii se
creeaza lista de adiacenta implernentat a dinamic. Se afiseaza veci nii gradul fiecarui nod.
Functia ini to se Ioloseste pentru a initializa cu valoarea NULL elementele vectorului 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 cr eare ( ) pentru a crea lista de adiacenta, functia grad () pentru a determina
gradul var ianta, gradul ext ern) al unui nod, functia afisar e _ v eci n i ( ) pentru a afisa
veci nii fiecarui nod, iar functia afisar e _ g r a d () pentru a afisa gradul fiecaru i nod. lnfor-
rnatiile se citesc din fisierul text graf11 .txt pentru graful neorientat graf12.txt pentru graful
oriental. Pentru testarea programelor se l olosesc graful neorientat G
,
si graful orientat Gg.
#i n clu de <f s t r e arIl. h>
struct nod t i nt i n f o ;
nod * ur 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 ()
f or ( i nt :=l ; i<=r. ;i++) L[i}=NULL; }
voi d a dauga_nod( ::1od *&p r i :n, int y)
{Lod *p=ne w nod ; p- >i nfo:o: y; p- >ur m=pri m;
void c r e e r e ()
t i n t Y. ,y;
whi le (f » x»y) ( a d a uga _ no d ( L [ x . , y ); a d a u ga _ l1 od {L [ y ], x );}
f . close () ; }
void
{for (i n t
{ cou t cc v v e c Ln i i. nodcLui. "<x L c -c '" : " ;
f or (nod *p'""' L[ i l ; p ! =cNULL; p=f:- >ur m) cout « p - >l nfc« " It .
cout «endl ; }}
i nt g r ati ( i n t i)
t i n t 9"'0 ;
for (nod * p = :" [ =-- ]; p ! =NULL; p =p ->urm) g++ ; r e t urn g ; }
void afisare grade(}
{for (i n t
cout«"Gr a du l nodului "« i« ": "« gr a d (i ) « e nd l ; )
voi d main ()
{i n i t : l ; c r ea r e t ) , afisare_ve c ini() ; afisa r e _9rad e{) ; }
I nformati cii 197
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 afiseaza nodurile izolate.
Listele de adiacen 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
stat ic 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 matri ce de adiacenta),
2.7.4,5, Aplicati i practice
1. i ntr-un grup de n persoane s-au stabil it doua tipuri de relatii : de prietenie si de vecina-
tate. Scrieti un program care sa citeasca matricele de adiacenta ale celor doua grafuri
dintr-un fisier text (pe primul rand, nurnarul de persoane, ~ i pe urmatoare te randuri, in
ordine, liniile fiecarei matrice de adi acenta) ~ i care saafiseze:
a. persoanele care sunt §i i prietene !? i vecini (lndicatie. Se deterrnina rnuchiile din
gratul intersectie a celor doua graturi neorientate);
b. eel mai mare nurnar de persoane care S8 qasesc intr-un grup de vecini prieteni
(lndicat ie. Se determine gradul maxim i n gratul intersectie a cetor coua grafuri.)
Pentru testarea programului forrnati un grup cu 10 dintre colegii vost ri ~ i descrieti cu
ajutorul a doua graturi cele doua tipuri de relatii.
2. intr -un grup de n persoane s-a stabilit 0 relatie de cunosti nta: persoana x este i n
relat ie cu persoana y daca 0 cunoaste pe aceasta. Relatia de cunostint a nu este
reciproca. 0 cel ebrit ate este 0 persoana care este cunoscuta de toate persoanele din
grup, dar care nu cunoaste nici 0 perscana (este un nod dest inatie al gratului). Un
necunoscut este 0 persoan a care cuncaste toate persoanele din grup dar nu este
cunoscuta de nici 0 persoana din grup (este un nod sursa al gratului). Un singuratic
este 0 persoana care cunoaste 0 sinqura perscana din grup sau este cunoscuta de 0
sinqura persoana din grup (este un nod terminal al gratul ui). Un strain de grup este 0
persoana care nu cunoaste nici 0 persoana din grup ;;i nu este cunoscuta de nici 0
perscana din grup (este un nod izolat al gratului). Dernonstrati ca i n grup nu poate
exist a decat 0 sinqura celebritate ;;i un singur necunoscut . Scrieti un program care sa
citeasca dintr-un fisier matricea de adiacenta a grafului ;;i care sa afiseze:
a. daca exista 0 cefebritate , sa se precizeze persoana, iar daca nu exista, sa se
precizeze: persoana care cunoaste cele rnai putme persoane ~ i persoana care este
cunoscuta de cele mai multe persoane;
b. daca exista un necul1oscut , sa se precizeze persoana , iar daca nu exista. sa se
preci zeze: persoana care este cunoscuta de cele rnai put ine persoane si per-
soana care cunoaste cere mai multe persoane ;
c. daca exista sinqurotici, sa se precizeze persoanele;
d. daca exista strbini de grup, sa se precizeze persoanele;
e. cate persoane cunosc dear doua persoane din grup iii sunt cunescute la randul
lor de trei persoane din grup (nodurile care au gradul intern egal cu 3, iar gradul
extern egal cu 2);
198
Implcmcntarca structurilor de da te
f. cate persoane sunt cunoscute de un nurnar de membri egal cu nurnarul de
membri pe care Ii cunosc (nodurile care au gradul intern egal cu gradul extern);
g. care sunt persoanele care S8 cunosc reciproc (perechile de nodur i intre care
exista arce duble).
3. La graful judetelor, adauqati un nod cu eticheta 0, care reprez inta exteriorul tarii,
muchiile corespunzatoare, care evidentiaza judetele limitrofe. Creati cu un editor de
texte sa ccntina urrnatoarele inforrnatii: pe primul rand, numarul de
judete. pe urmatoarele randuri matricea de adiacenta, pe urrnatorul rand, in ordinea
etichetelor nodurilor, denumirile judetelo r separate prin spatiu (pentru judetele care au
un nume format din mai multe cuvinte folositi ca separator Iinia de subliniere). pe
urrnatorul rand numele vecinilor Rornaniei separate prin spatiu, si apoi, cate un rand
pentru fiecare judet limitrof, in care scrieti separate prin spatiu urmatoarele inforrnatii:
eticheta nodului tara (tari le) cu care se i nvecineaza, precizate prin nurnarul de ordine
din lista numelor. Scrieti un program care sa citeasca aceste inforrnatii din fisier sa Ie
transpuna intr-o implementare a grafului , adecvata problemei , si care sa aflseze:
a. judetele care au cele mai multe judete vecine - se va preciza nurnarul maxim de vecini
si numele judetelor care au aceasta proprietate;
b. judetele care au cele mai putine judete vecine - S8 va preciza nurnarul minim de vecini
numele judetelor care au aceasta prcprietate:
c. judetele de la granita - pentru fiecare judet se va preciza numele sau si numele tarilor
cu care se lnvecineaza.
4. I ntr-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
lungi mea drurnului, rnasurata i n kilometri . Se vor folosi doua graluri : Go=(X,U
o
) pentru
leqaturile prin sosele nationale GJ=(X,U
J
) pentru leqaturile prin sosele j udetene, Cele
dou a grafuri se vor citi din doua fisiere text, care contin pentru fiecare legatura directa,
pe cate un rand, separate prin spatiu, cele doua etichete ale 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-
mei, si care sa afiseze:
a. localitatile la care nu ajung drumuri nationale (nodurile izolate, in primul graf) ;
b. cea mai scurta leqatura directa dintre doua localitati - se va preciza eticheta
nodurilor asociate localitatilor, distanta dintre local itati tipul scselei prin care se
asiqura leqatura:
c. pentru doua localitati precizate , a 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 distants pana la aceste localitati
(lndi cat i e. Se dete rrnina graful reuniune a celor doua grafuri .);
e. localitatea care are cele rnai multe leqaturi directe cu alte localitati - 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 unor tuneluri .
Exista si grote care cornunica cu exteriorul. Desenati a retea ipotetica de grote con-
struiti matricea de adiacenta a grafului neorientat asociat {grotele sunt nodurile, jar
Info rmuticii 199
tunelurile sunt muchiile) . Inaltimi le grotelor S8 vor memora intr-un vector. Gasiti 0
modalitate de a evidenti a grotele care comunica cu exteriorul. (Indi cat i e. Adauqati la
graf nodul 0, care reprezinta exter iorul munteJui .) Scrieti matricea de adiacenta ~ i
vectorul cu Inaltirnile grotelor, in fisierul text grote.txt. Scrieti un program care sa
citeasca matricea de adiacenta si vectorul din fisier - ~ i care sa afiseze:
a. numarul de tuneluri de comun icare (nurnarul de muchii ale gratului);
b. grotele care au leqatura cu exteriorul (nodurile i pent ru care exista muchie cu
nodul 0);
c. grotele care cornunica direct cu cele mai multe grote (nodurile cu eel mai mare grad);
d. grotele care nu cornunica prin tuneluri cu alte grote (nodurile izol ate);
e. cea mai ina Ita grat a si cea mai [oasa grata care cornu nica cu exterioruJ ;
f. pentru a grot a a carei eticheta se citeste de la tastatura, sa se afiseze grotele cu
care cornunica direct, precizand pentru fiecare tunel daca suie, coboara sau este
la acelasi nivel cu grota .
6. Reteaua de strazi dintr-un oras este fermata din strazi cu doua 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 intersect ii de eel putin 3 strazi . Pentru a stabi li prioritatea i n intersectii
si pentru a fluidiza trafi cul intersecuile vor fi modernizate. Pentru modernizare se vor folosi
panouri cu semne de circulatie, semafoare - :;;i se vor amenaj a sensuri giratorii . Pentru
fiecare strada din care se poate intra i n intersectie, se rnonteaza in intersectie un panou
cu semn pentru prioritate. Pentru fiecare strada pe care nu se poate intra din intersecue se
rnonteaza in intersectie un panou cu semnul de interzicere a circulatiei , i n toate
intersectiile vor fi montate panouri cu semne de circulatie , corespunzator strazilor incidente
cu intersectia. Fiecare dmtre aceste mijloace de modemizare are un cost panoul cu semn
de circulatie - costul ct , sernaforul - costul c2. ~ i sensuI giratoriu - costul c3. Pentru a
stabili modul in care este rnodernizata fiecare intersectie, intersectiile au fost c1asificate in
intersectii 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 amenaja sensuri giratorii). Desenat i
o retea ipotetica de strazi :;; i construiti matricea de adiacenta a grafului orientat asoci at.
Scrieti matricea de adiac enta i n fisierul text strazi.txt . Scrieti un program care sa citeasca
matricea de adiacenta din fisier :;;i care sa afiseze:
3 . intersectiil e la care nu se poat e ajunge din nici 0 alt a intersectie (nodurile care nu
au predecesori );
b. intersectiile de la care nu se paate ajunge la a nici 0 alta intersectie (noduri le care
nu au succesori );
c. daca exista intersects tara nici a intersecue succesor sau tara nici 0 intersectie prede-
cesar, sa se corecteze desenul 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 care se poat e aj unge direct di n cele mai multe intersectii (nodurile
care au cel mai mare grad int ern);
e. intersectiile de la care se poate ajunge direct la cele mai multe inter sectii
(nodurile care au cel mai mare grad extern);
1. numarul de strazi pe care se circula i n ambele sensuri (nurnarul de perechi de
noduri i ~ i j pentru care. i n matric ea de adiacenta, elementel e a[i][j) ~ i aOWl sunt
ega!e cu 1);
200 Irnplcmcntn rcu 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 adiacente);
h. numar ui de panouri eu semne pentru prior.t ate care S8 var folosi (suma grade lor
interne ale nod urilor):
i. nurnarul de panouri eu semne pent ru interzicerea circul atiei care S8 vor folosi
(diferenta dintre suma gradelor externe ale nodurilor ~ i nurna rul de strazi cu sens
dublu de circulatie):
j. numarul de semafoare care se vor menta (suma grade lor interne ale nodurilor
care au 4 nodur i adiacente );
k. costul de rnoder nizare necesa r pentru fiecare lntersectie ~ i costul total al moder-
nizarii.
7. Pe un munte exista mai multe parcele eu Ianete ale satenilor. Unele tanete au aeces
direct la drumul satesc, all ele nu. i ntre propr ielarii parcel elor veci ne exista relatie de
prietenie - sau nu. Daca do; propr ietari veci ni sunt prieteni, i ~ i permit unul altuia
accesu l pe propr ia parcela. Pent ru a transporta fanul, satenii care nu au acces la
drumul sat esc, trebuie sa treaca peste parcelel e all or sateni, ca sa aj unqa la el. Un
proprietar este considerat izolat daca nu are aeces direct la drumul satesc si nici nu
este i n relat ie de prieteni e cu vr eunul dintre vecinii lui. Se vor folosi doua grafuri: unul
pentru a reprezenta relat ia de vecinatate a fanetelor, iar allul penlru a reprezenta
relatia de prietenie dinlre proprietar i. Desenati 0 harta ipotetica a fane\elor si stabiliti
relatii ipotetice de prietenie i ntre veci ni. Constru iti rnatrice le de adiacen ta ale celor
doua grafuri asoc iate. Scr ieti malricele de adiacenta in fisierele texl Ienete.txt ~ i
prieteni.txt. Scriet i un prog ram care sa citeasca matricele de adiacenta di n fisiere ~ i
care sa furnizeze urrnatoarele informatii
a. daca exista proprietari izolati, sa se afiseze lista propriet arilor vecini cu care
trebuie sa stabileasca relatii de prietenie, pent ru a ajunge la drumul satesc, !iii sa
se identif ice vecin ii care au acces direct la drumul satesc;
b. care este proprietarul eel mai neprietenos (care are eel mai mare procent de
veci ni cu care nu este prieten).
8. Se anal izeaza rniqrat ia unei specii de pasari catatoare pe perioada unui an. Migra\ia are
doua etape: rniqrat ia de toarnna, cane pasarile migreaz8 din zoneIe reci catre zonele
calde (migra\ia de la rece la cald), si rniqratia de prirnavara. cand pasarile miqreaza din
zonele calde cafre zonele reci (miqratia de la cald la rece). Fiecare etapa a miqratiei va
fi reprezentata 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
predecesori. i n graful rniqratiei de la cald la rece nodurile care apartin zonei calde au
numai succesori, iar nadurile care apart in zonei reci au numai predecesari. Fiecarui nod
i se asoc iaza coordonatele geografice. Oesenati cate 0 harta ipotetica pentru fiecare
etapa de rniqratie. Construiti. cu un editor de texte, fisieru' migraliel. /xt, care va contine
pe prima linie n1, nurnarul de noduri ale prirnului graf, pe urrnatoarele n1 linii, mat ricea
de adiacenta a graf ului , ~ i apoi, pe urrnatcarele n1 linii, coordonatele geografice ale
fiecarui nod de pe harta (sunt 6 entitati de intorrnatie, separate prin spatiu: doua valori
numerice i ntregi pentru latitudi ne, in grade ~ i minute, ~ i un caracter pentr u ernisfera,
doua valori numerice intregi pent ru 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, pent ru cel de al doilea graf al miqratiei. Scrieti un program care sa
Informatica 201
CD:0
~
Fi g. 15
citeasca aceste informatii din fisier, sa Ie transpuna intr-o implementare a grafului
adecvata problemei (recomandare - 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, atunci au][i]=O - , i produsul
dintre gradul int ern , 1 gradul extern ale fiecarui nod trebui e sa fie 0; in plus,
trebuie ca nodurile din zona calda sa coincida - i n ambele grafuri);
b. daca in graful rniqratiei de la rece la cald exista un nod destinatie al grafului - , i
ce sernniflcatie are existent a lui pentru rniqratie;
c. daca pasarile s-au reintors i n aceleasi zone, prirnavara (nodurile din zona rece
coi nci d in cele doua grafuri); i n caz contrar, saS8 specifi ce nolle locatii aparute i n
zona rece in care a ajun s specia respective:
d. sa S8 obtina matricea de adiacenta a har1ii rniqratiei, pe intreaga 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).
2.7.5. Grafuri spcciale
Se definesc urrnatoarel e grafuri speciale:
-') graful nul;
-') graful compie!.
2.7.5.1. Graful nul
Graful G=( X,U) se nurn est e graf nul daca multimea U este vida (U=0),
adi ca graf ul nu are mu chii.
Reprezent area sa in plan S8 face prin noduri izolate .
Exemplu: (1) @
Graful N=(X.VJ - unde rnultirnea X={1,2.3.4} este rnultimea nodurilor, iar
mult imea V=0 este mult imea muchiilor - este un graf nul (graful are noduri dar 0) 0
nu are muchii) - figura 14.
Observatie. Matricea de adiacenta a unui graf nul este mat ricea zero (nu Fig. 14
. '
contine nici un element eu valoarea 1).
2.7.5.2. Graful complet
Un gTat ell n noduri este un gTaf compl et daca are proprietatea ca, oricare ar fi do ua
nod uri ale grafului, ele sunt adiacente. EI S 8 notoaza ell K
n
.
Observ atli .
1. S8 poate construi un singur graf neori cnt at complet, ell n noduri , deoare-
ce i ntre doua noduri , x si Y. exista 0 singura muchie [x,yj . in figura 15 est e
prezentat graful neorientat complet K4 . EI are 6 muchii. Desenati grafurile
neorient ate complete Ks si K6. Nurnarati cate muchii au aceste grafuri.
Teorema 6
Nurnarul m de rnuchii ale unui grat neori ent at camplet , ell n noduri (Kn), este:
11 -1
111 = I1X - -
!
202
Implementarea structurilor de date
Fi g. 16


ncmonst rat!e . Nurnarul de muchii cstc cat de numa rul de subrnultimi de 2 clemente care se pot
forma dintr-o rnultirne cu n clemente, aoica m =
2. Se pot construi mai multe grafuri orientate complete, cu n noduri , deoa rece dOU3
noduri x 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 S 8 pot construi cu n noduri este egal cu
Demonstratie Deoarece nurnarul de subrnultimi de 2 nooun care se pot forma dintr-o muttime de n
noduri este a= pentru fiecare pereche astfel def lnita S8 pot defini trei situatil de adiacenta.
rezurta ca numarul de grafur i complete care se pot construi este de 3
a
.
Exemplu. Pentru n=4 se pot
defini 3
6
=729 graluri orientate
complete. In l igura 16 sunt pre-
zentate patru dintre acestea.
Definit i alte patru gralur; com-
plete cu 4 nodur i.
Obsorvatii
1. in cazul matricei de adiacenta a unui graf neorientat complet , valoarea fiecarui
element care nu se pe diagonala principa la este 1.
2. in cazul matricei de adiacenta a unui graf orientat complet - pent ru orice pereche de
noduri , ; j . dilerit e l ntre ele (iej} - a[i]UJ=1 sau aO][i]=1 .
3. Nurnarul minim de arco intr -un graf ori enta t complet ell n noduri este ega 1 ell
nurnarul de much ii ale grafului neorientat complet Kn.
4. Numarul maxim de aree int r-un graf oriental complet ell n noduri este ega l cu dublul
nurnarului de muchii ale graf ului neorientat complet Kn.
Algoritmi pentru prelucrarea grafurilor complete
1. Al goritm pentru a determina nurnarul minim de aree care trebuie adauq ate la un
graf orientat , pentru a obtino un graf orientat camplet.
Al gori tmui. Se nurnara perechile de noduri i si j (i:,t:j) int re care nu exista nici un arc.
Impl ementarea algori tmul ui i n program, inforrnatiile despre graful orientat se citesc din
fisierul text gc.txt: de pe prima linie numarul de noduri , apoi , de pe urmatoarele randuri
matricea de adiacenta.
#i nc l ude<i os t r e a m. h>
i n t n ,a[lOJ [ l OJ ;
fstream £( "gc.txt" , i o s : : i n );
voi d c.l t e s t e t ) {l i s e c .i t e s.t.e ma t r i .ce a de arf i a cen t.a d i n f i s Le r }
void main ()
{int i ,j ,m"-' Oi c i t e s t e O i
f or ( i =2 i i <=n ; i ++)
.If (a [ L] && a[j ] m++ ;
cout«"Numa r u l de aree ca re trebuie ada ugate este "« m;}
lnformatica 203
2. Algoritm pentru a determin a nurnarul maxim de noduri izolate pe care poate sa
Ie cantina un graf neori cntat care are n noduri ~ i m muchii.
Algoritmui. Se identifica graful compl et care S8 poate forma astfel l ncat sa consume
cat mai multe muchii (mrnax) din cel e m muchii ale grafului (mmaxsm). Graful complet astl el
obtinut are nl noduri:
111 - 1
mma\ =nl x - - SIIl
2
Numarul de noduri nl este partea intreaqa din radacina pozitiva a ecutiei de gradul II:
[
1+ " I + Mx m]
III =
2
Pentru diterenta de muchii rarnase (m-mmax) 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,
#include <i o s t r e am. h>
ffincl ude<ma t h. h>
voi d ma i n ()
( i n t m, n , n l : c ou t«"muc h i i= " ; c in» rni ccue .c-cvnoda r i> " ; cin» n;
nl-l i n tl{( 1+ s q r t(1+8-mIJ/ 2) ;
cout « "Numarul ma xi 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, nurnarul de noduri, apoi
mat ricea de adi acenta) , ~ i care verifica daca este un graf complet.
2. Scrieti un program care citeste, din fisierul graf_c2.txt. inforrnafii despre un graf orientat
(de pe prima linie, nurnarul de noduri, apoi matricea de adiacenta) - si care verifies
daca este un graf complet.
2.7.6. Grafuri derivate dintr-lIll graf
Se definesc urrnatoarele grafuri :
-7 graful part ial;
-7 su bgraful ;
-7 graful compl ementar.
2.7.6.1. Graful partial
Fi e graful G = (X,U) ~ i multimea VS;;U. Graful Gp= (X,V) se numcsto graf partial
al gratulu; G.
GI (I
Graful partial
G, p
~
Altfel spus, un graf partial al grafului G esto 01In susi sau un graf care s-a obtinut prin
climinarea unor mu chii (aree) din graful G.
Exemple:
1. Pentru graful neorientat G, =(X" U, ), definit anterior , graful G, p= (X" U, p), defini t astfel:
-7 rnultimea noduril or este X,={1 ,2,3,4,5,B,7,8}.
-7 multimaa muchiil or este U,p ={(1,2], [1,3], [1,4J, [2,3], [2,5J, [3,41, [B,7]}.
este subqraf al grafului G, - figura 17.
Graful ~ ®!Ec:> ~
G, ~ ~ ® ~ ' @
Fi g. 17
204 lmpl cm cn tarcu s t r uc ru r ilor li e date

Grafu i
® partial
G
10P
9
5
Fig . 18
2. Pentru graful orientat GIO=(XlO.UlO) definit anterior, graful G10p= (Xr o, U1CP) definit astfel :
-7 rnu lt i rnea nodurilor este X
lO
={1,2,3,4,5,6,7,8,9,10j,
-7 rnultlmea arcelor 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
Graful ......
G, o .J
4
Teorcma 8
Numarul de grafuri partiale al e unui graf cu m muchii (arce) este eg a1cu 2
m
.
em
,"
Dcmcnstratl e. Grafurile part iale se pot obtine: tara eliminarea une! much ii (arc) - obtinandu-se
gratul initial; prin eliminarea 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): a
tuturor muchi ilor (arcelor ) - obtinandu-su un graf partial numai cu noduri rara rnuchi i (arce), adica
gratul vid:
Numarul de grafuri partiale care se pot obtine cu m mucnu (arce):
Numarul de grafuri partiale care se pot obti ne cu m-t muchii (arce):
Nurnarul de grafuri part iale care se pot obtine cu m-z muchii (arce). :
c
m
-
l
'"

'"
Nurnarul de gra fur i parti ale care se pot obt ine cu 0 muchie (un arc ):
Nurnarul de grafuri partials care se pot obtine rara nici 0 muchie (nici un arc ):
Nurnarui total de grafu ri part iale este : C::: + c:::-
I
+ c:::-
l
+ .. + + C::
1
= 2''' .
c
l
'"
Algoritmi pentru prelucrarea grafurilor partiale
1. Genera rea t ut uror grafurilor partiale ale unui graf neorien tat.
Algori tmul. Se fotoseste metoda backtracking. i n stiva se vor genera muchi ile grafului
partial, Deoarece grafu l partial poate avea p muchii (O,;p,;m), se va apela repetat subpro-
gramul bt ( ) , la fiecare apel qenerandu-se variantele cu p muchii. Fiecare apel al subpro-
gramului bt ( ) trebuie sa genereze C:: de muchii (arce) din graf . La fiecare apel al subpro-
gramului, sol utia se obtine atunci cand i n stiva s-au generat cele p muchii ale grafului
partial . Evidenta muchiilor este pastrata i n matri cea de i nci denta .
Impl cment ar ea aigori tmul ui. Se cites te din fisierul text graf i S.txt mat rices de adiacenta
a unui graf necrientat, Pentru fiecare graf parti al S8 afise aza muchiile. Matricea de inci-
denta b se obtin e din matricea de adiacenta cu functia t r ans fo rma re () . I n variabila nr
se cont orizeaza nurna rul de grafuri partial e generate , in functia tipar () se afise aza
graful partial general. Pentru testarea programuiui se Ioloseste grafui G, .

f s tre am f ( "g:::-a :: ::" 3 . :xt " , ':c ,s : : i :-d ;
typedef 3 t i vA[ l OOJ ;
int ;l ,ffi ,p,k, ev , as ,a lClflO] ,o[lOlf 20] ,nr ;
s tiva
void ci t.e s te (}
III for ma ticii 205
t int L j 1»n»x;
for (i= ;
f or { = ; j <=n ; j ++ } { f l» a [ i ] [jJ ; i f (a:i] [jl ==l) m+-i- ; }
. c l o s e ( ) ; }
void
tint i, j , k=l;
f o r
for if (a[ l ] {b [ i ] b[j] b+; II
v o i d i n i t l)
int succe sor- ( )
{if (st [ k l <m) { s t [ k ] = s :: [ k ] 1-1; return l ; } else r e t urn OJ }
i n t valid i l
{i f ( k>: && s l: [ k ] <st [ k-l ] ) r eturn 0 ;
for ( i n t i=l ; if (s t I k j e-es t. i1J return 0 ;
r e t u r n I i }
int solu:: ie () {r e t u r n i:==p; }
vo id t i p e r t )
t i nt .i ,j ; n r-t e s
c out« " Gr a f ul part i a l "<Xn.r-c-ce rid L, oo u t.c -cvlquc h i.a I e : ".

if (bl j ] [ st[ i J ] ==l ) cou t.cc j -c-c' ' ".
cou t c c'" , "; }
c out« endl;}
v oid b t I ) { / / pu r t ea fi x tl a a Lqor i .tmu Lu.i bac k r r -a c k i nq }
void main ( )
( c i t e s t e {) ; t r a ns f o :r8ar e { ;
f or (p=r.; p>=O ;p- -) b L() ; }
2. Ver i fi carea daca un graf G
p
este graf part i al al unu i graf G.
Al goritmul Se verifica daca cele doua grafuri au acelasi nurnar de nodur i si daca graful
G
p
nu contine muchii care nu exist a i n graful G.
Implementar ea al gori tmului. Se cilesc , din doua fisiere text glp.txt g2p./x/, inforrnatii
despre doua grafuri neorientate (sau orientate ): de pe prima linie, nurnarul de noduri, si
apoi, de pe urmatoarele randuri , rnatricea de adiacenta. Matricele de adiacent a ale celor
doua grafuri sunt all}i a2, cu dimensiunea n, respect iv m. Functia grafp () verifies daca
graful G
p
est e graf part ial al grafului G.
#i nclude <i c s t r e a m. h >
f stre a m fl ( " g l p . c x: " , i o s : : i n ) ,f2 ( " g2p . : xt " , i o s : :in);
int Cl ,n , a1[ :0) [:0] , a 2[:O: [10) ;
i n t g ra f p ()
{i f (mt e n ) r eturn 0 ;
el s e f or ( i n t i=l i i<=n ;it--t-)
f o r (i nt if (a 2[i) && 01 l i l r e t urn 0 ;
r e turn 1 i }
v oid ma i n ( )
l i nt i,j ;

f o r {j = l ; j <=n ; j .... +) £1» a 1 l i l [ ""'] ; : 1 . c l o s e () ;
i:"2 »;r: ;
f o r i-i=l ; i<=;lI ; 'i 1·)
f o r f j =1; j <=m; j ++ ) f2 »5.2[:'] [j} ; :2 . c l o s e () ;
206
Implementarea strncfn rilor de date
if (grafp(J ) ooub-ocve s t e qr a f partial ";
else cout«"nu c ste gra f partial " ; J
3. Obt i nerca unui graf partial G
p
al unul graf G.
Algoritmui. Se el imina din graful G muchiile, in functie de conditia irnpusa de problema.
Reprezentarea eea mai adecvata pentru graf este matricea de adiacenta, i n care S8
atribuie valoarea 0 elementelor a [i] [j] ,i a [j] [i], corespunzatoare muchiilor [I,j]
care trebuie eliminate..
Impl ementarea algorltmului. Se citesc, din fisierul text g3p.txt, informatii despre graful
neorientat: de pe prima linie nurnarul de noduri n eticheta unui nod x, apoi , de pe
urrnatoarele randuri , matricea de adiacenta a grafu!ui. l nforrnatiile despre graful partial obti-
nut se scriu in fisierul text g4p.tx/, astfel: pe primu! rand nurnarul de noduri n , 1numarul de
muchii m si pe urrnatoarele m randuri - muchi ile, sub forma de perechi de etichete de
nodur i oespartite prin spatiu. Cerinta este sa S8 obtina subgraful prin eliminarea tuturor
muchi ilor cafe au la extrernitati un nod cu grad par !?i nodul x. in vectorul v S8 mernoreaza
nodurile care au grad par . Funct ia ci t.es t.e () S8 foloseste pentru a citi intormatiile despre
matricea de adiacenta a grafului din fisierul text. funct ia scrie () pentru a scrie In fisierul
text informatiile despre lista muchiilor grafului partial , functia grad () pentru a determina
gradul unui nod, iar functia graf_ p a r t i a l () pentru a obtine graful partial. Pentru a obtine
graful partial , se cauta toate muchiile care au la extrernitati un nod cu gradul par si nodul x
(muchiile [v[i),x) pentru care a[v[i)] se elimina aceste muchi i. Pentru testa-
rea programu!ui se va folosi graful G3 si nodul 6.
itinclude<i o s trcem . h >
fstream f 1 ( " g 3p . t x t", ios: : in) f £2 (Hg 4p . t x t " , ios: : out ) ;
int a[2 0] [20 ] , n, m, x , v [l O];
void c i t este(} { / / s e c i t. e s r.e rna t.r i cea de adi acen \-.3 d i n f i.$ i er )
int g r a d (int i )
tint j , g =O;
for g+=a [i ] [j ] ; return g ; }
void
tint .i ,
for ( i =l ; i<=n ; i++)
if (grad (il %2--0) ( k++; v[ k ]-i ; )
for (i= l ; i<=k;i++)
if ia[v [i]j { a l v j i I ] [x )-O; a [x ] l v [j ]] - O; m-- ; ) )
void cscri. e j )
{int i, j; f2 « n« " "« m«endl;
for (i =l ;i<=n;i++)
for ( j - l ; j <l ; j'+j if (a[ i] lj l - -l) f 2« i « " "« j«endl;
f 2 . close () ;}
void main() {c i t.esve t i • graf_part i alO ; scri e{ ) ; }
1. Scrieti un program care citeste , din fisieru l text graf16.tx/, matricea
de adiacenta a grafului orientat G9 si care genereaza toate grafu-
rile part iale care se pot obtine. lnforrnatiile despre grafurile partiale
se vor salva in fisieru l text graf_p16./x/. Pentru fiecare graf part ial generat se va scrie
pe un rand textul Graful ptutiet, urmat de nurnarul de ordine al grafului gene rat, iar pe
randul urrnator textul Arcele urmat de lista de arce a qrafului generat.
2. Scrieti un program care citeste , din doua fisiere text graf_1p.tx/,i gra'-2p./xt informatii
despre matricele de adiacenta a coua grafuri neorientate (, i varianta grafuri orientate):
lnfurmutica
207
de pe prima linie nurnarul de noduri, apoi matricea de adiacenta, ~ i care verifies daca
unul dintre grafuri este graf partial al cel uilalt. i n caz afirmativ, se afiseaza care este
graful ,1care este graful partial. (lndicatie. Daca cere doua grafuri au acelasi ardin n,
se identifica graful care are mai multe rnuchii (m) sl numarul de muchii ale celuilalt graf
- p (rnzp). Pentru grarul cu m muchii, se genereaza taate matricel e de adiacenta ale
grafurilor partiale cu m muchii ~ i n noduri - ~ i S8 verifies daca una dintre ele este
identica cu matr icea de adiacenta a cel uilalt gra!.)
3. Scrieti un program care citeste din fisierul text graf19.txt matricea de adiacenta a unui
graf neorientat !?i care genereaza un graf partial prin eliminarea muchiilor care au la
extremitati un nod ce are gradul minim ~ j un nod ce are gradul maxim in graf.
lnforrnatiile despre graful part ial obtinut se scriu intr-un fisier text sub forma listei de
rnuchii . Pentnutestarea programului se va folasi gratul G4.
2.7.6.2. Subgraful
Fi e graful G = (X,U). Graful Gs= (Y,V) se numest a subgraf al gr afului G daca Y ~
(subgraful contine numai noduri ale grafulu i) 9i mu chiile (arcele) din multimea V sunl
t03t8 muchiile (arcel e) din rnultimea U care au ambele ext rernitati in multirnea de
noduri Y. Se spune ca subg raful Gs esle indus sau general de multirnea de noduri Y.
Altfel spus, un subgraf al grafului G esle el insusi sau un graf care s-a obtinut prin
suprirnarea din graful G a unor noduri ~ i a tuturor muchiilor (areelar) incidente cu
aceste noduri.
Exernpl e:
1. Pentnu graful neorientat G, = (X"U,) , definit anterior, gratul Gt s = (Y"V,). definit asltel: (; "
~ rnultlmea nodurilor este y , =(1,2.4,5,6.7).
~ rnultimea muchi il or este V, =([1.2]. [1A]. [2.5]. [6,7]}.
este subgraf al grafului G, - figura 19.
Gratul
G,
~
~
~ q ~
~ 0 '@
Fig . 19
cifiJ
Subgratul
Gt s
2. Pentru graful arientat G
lO
=(X
lO,
U
lO)
. definit anterior, gratul GlOS= (YlO,V
lO)
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.
5)
~ @
q
~
®
®
-
Subgraful Gt os
Fig . 20
Teorerna 9
Nurnarul de subgrafuri ale unui graf cu n noduri este egaI cu 2
n
-1.
208
Implemcntureu st r uct uri lor de date
n emcn atret re. Subgrafurile se pot obtme : prin elirmnarea niciunui nod (obtinandu-se grafu! initial ):
a unui nod (obhnandu-se subgrafurile cu n- 1 noduri): ...; a n-1 noduri (obtinandu- se subqraf urile eu
un nod):
Numaru! de subg rafuri care se pot obtine eu n noduri:
Numarul de subgrafuri care se pot obtine eu n-1 nocun:
Numarul de subgrafuri care se pot obtine eu n-2 noduri:
Nurnarul de subgrafu ri care se pot obune eu 1 nod"
Nurnarul tot al de subgrafuri este : + c::-
r
+ <::: -1+ . + e
l
l
l
;; 2" _1.
Algoritmi pentru prelucrarea subgrafuriJor
1. Generarca tuturor subg raf urilor unui graf.
Algor itmui. Se foloseste metoda backtracking. in stiva se genereaza nodurile subgra-
fului. Deoareee subqraful poate avea p noduri (15p5n), se va apela repetat subprogramul
b t () , la fiecare apel generandu-se variantele eu p noduri. Fieeare apel al subprogramului
bt () trebuie sa genereze de noduri din gral . La fieeare apel al subprogramului, sotutia
se obtine atunci cand In stiva s-au generat cere p noduri ale subgrafului. Pentru nodurile
generate i n stiva se afiseaza muehiile (areele) care exista in graf.
Implementar ea alq orltmulul . Se citesc, din fisierul text gra fl./x/ , matricea de adiacenta
a unui graf neori entat, respectiv, din fisierul graf2.txt, matricea de adiacenta a unui graf
oriental. Pentru fieeare subgral general. se afiseaza numarul de noduri ,i muehiile
(arcele). in variabila n r se contorizeaza nurnarul de subqrafuri generate. in functia
tipar () se afiseaza subqraful general. Pentru testarea programelor se l olosese gralul
neorientat G, si graful orientat Gg
ff include<f s t r e a m. h >
f s tre am : i n ) ;
1/ f s tre am f( "g:-a f2 . t.x :. " , i o s : :in j ; pent r u q r-a f u L o ri .ent .at
t ype def i ;. t
int n. , !=' , ,(,ev ,as ,3[lOl [10, . r. r .
s:Lva st ;
void c ite s t e ( ) ( I / s e ma t r icea de a d i acenta din
void .i n.i t I I ( 3 t [ k ] = O;)
int 2\1CCe SOr ( )
{if ( s t[ kJ<n) return I ; } el s e return O J }
int v a lid ()
(if Ik>: && r eturn 0;
for , i n t i=l ; i < k;i +-) if (st[;:]==st:i]) r e t urn 0 ;
r etur n 1 ; }
int s o l u t Le r ) {retu rn k==p ; }
v o i d t Lo a r ()
li n t i , j; nr t r :
cou t « "SLbg r afu L "« n r«endl«" Nod ur j J. e:" ;
for (i=l ;i<=p ;iH') cout.c -cs t l i l c c " or; c out « e ndl ;
cou t.c-c vMuchi i L e : "; I! ccut c-c vAr ceLe : " ; p e n t r u q r a f u L c r Lcnt a t
for (i=: ; i<=p ; :..,.. _)
II graf ul o rienta t
I II formati d
209
" .
if (a l st [L ] ] c out« s L[i j «"- "«s t [J J« "
cout«endl;}
void b t ( ) {/ / p arte a fix3 a a I'qor i t muLu i. backtra cki n g }
v o id mai n ()
t c Lt oa t o t j : btl ); )
2. Verificarea daca un graf G
s
este subgraf al unui graf G.
Algoritmul. Se verifica daca :
-7 nurnarul de noduri din graful G
s
este rna! mic sau cel mult egal cu nurnarul de noduri
din graful G:
-7 etiche tele nodu rilor din graful G
s
exista printre el ichetele grafului G:
-7 intr a nodurile din graful G
s
exists muchiile dintre nodurile din graful G si numai acelea.
Implementarea algoritmu l ui. Se citesc , din doua fisiere text glslxt g2s.lxt. inforrnatii
despre doua grafuri neorientate (orientale): de pe prima Iinie nurnarul de noduri apoi,
de pe urrnatoarele randuri, matricea de adiacenta. i n fisie rul g2s txI pe ultimul rand, dupa
matricea de adiacenta, este memorat un sir de numere care reprezi nta etichet ele ncdu-
filar din acest graf. Matricele de adiacenta ale celor doua grafur i sunt al a2 , cu
dimensiunea n, respectiv m. In vectorul v S8 mernoreaza etichet ele nodur ilor celui de aJ
doilea graf . Fu nctia subg raf () verifica daca graful G
s
este subgraf al grafului G.

i nt ol, n ,a1[10] [ 1 0 1, a 2 [ 1 0J [101,v[10 ];
f stre am fl( " g l s .txt " , i o s : : i n) ,f2( "q2s .:xt " , i o s : : i n } i
int s ubq r a f ()
{if (m>n ) r e t u r n 0 ;
el se
{for ( i n t i =l; i <=m; lH-) i f (v[ i} >nJ r e t urn 0 ;
f o r (i n t i =l ;i<=-:D i i +-l- )
for (i n t j=l;j <=::n; j ++ ) if (a.2 [ i ] [ j ]! =al[v [ i ))[v[j }] l r eturn 0 ; )
return I ; }
void ma in ( )
l i n t i, ji fl »n:

fl » al l i J Ij ]; :l . c l o s e () ;
f? »rni
fo r (:i =I ; i<=ru ; .1. -! +)
f or ( j =l ; j <o;; m; j ++ ) £2 »a2[i] [j ] ;
for ( i =l; i <=nl ; i +T} f 2» v [ i } ; f2 . c l o s e ( ) ;
if ( s ub (j r a f ( ) ) c cut-cc ve s t c s ubq.ra f " ;
e l se cou t ocv r: u e s t e subgr'af " ; )
3. Verif i carea daca doua matri ce de adiaconta pot reprezenta ma tr icele de
adi acent a ale unu i graf ale unui subgraf al acestu i a.
Algoritmui. Matricele de adiacenta ale celor coua grafuri au dimensiunea n, respectiv p.
Se identi fica graful care are ordinul mai mare (n) gradul cetuilalt graf - p (nz p). Pentru
graful cu n noduri se genereaza toate matricele de adiacenta ale subgrafurilor cu p noduri
S8 verifica daca una dintre ele este identic a cu matricea de adiace nta a celuilalt graf).
Generarea tuturor subgrafur ilor cu p nodur i S8 face cu met od a backt racking. In stiva S8
vor genera nodurile subgraf ului.
Impl ementarea algoritmului. Se citesc din doua fisiere l ext, graf_ls.txt graf_2s .txt.
inforrnatii despre mat ricel e de adiacenta a doua grafuri neorientate: de pe prima linie,
210 Implcme nta rea st r uct ur ilor de dat e
numarul de noduri, apoi matricea de adiacenta. Se verifica daca unul dintre grafuri este
subgraf al celuilal!, iar i n caz afirmat iv, se identifica care este graful ;;i care este
subgraful. Matricele de adiacenta ale celor doua grafuri sunt a l si a2. Variabila x S8
foioseste pentru a identifica reialia dintre cele doua grafuri: daca are valoarea 0, a doua
matrice de adiacenta se asociaza unui posibil subqraf, iar daca are valoarea 1, prima
matrice de adiacenta se asociaza unui posibi l subgraf. Variabila loqica gas i t S8
foloseste pentru a determina daca una dintre matricele de adiacenta reprezinta mat ricea
de adiacenta a unui subgraf: are valoarea 0 - False, daca nu este subgraf si valoarea 1
- True daca este subgr af. in matricea b se va construi matricea de adiacenta a unui
subqraf format cu nodurile generate in stiva. Functia zero ( ) se toloseste pent ru a initia-
liza cu 0 elementele matricei b - inain te de generar ea fiecarui subqraf. Functia tipa r ()
S8 toloseste pentru a genera matricea b pentru a a campara cu rnatricea asocrata unui
posibil subgraf. Functia furnizeaza un rezultat logic: 1 - true, daca matricea qenerata
matricea asociata unui posibtl subgraf sunt egale: altfel , are valoarea a - False.
Rezultatul acestei functii este atribuit variabilei gasi t . Subprogramul bt ( ) se executa
atat timp cat nu s-a generat 0 matrice de adiacenta egala cu cea asoci ata unui posibil
subqra! (gasi t==O) ;;i se mai pot cauta solutii pentru matricea generat;; (k >O).
#i nclude<i os t r e an. h>
int n ,p,al[lOj [lO} ,a2DO] [ lO} ,b(2.0] flO] ,v[lO] ,nr , x ,as ,ev, k , ga si': ;
fstream . Ln ) , f 2 (" g r a f 2_ s. t x t"/ios : : i n ) ;
typedef int stiva[lOO] ;
s t Lve s t :
v o id zero ()
{for (int i=l ; i <=p ;i++)
for (int b ii J
v o i d i n i t ( ) ( s t [k ]=O; )
i nt succe sc r ()
{if (st [ kJ<n) {s t[ K] =s t [ k]+ I; r e t urn I ; } e lse return O; }
i nt vel i.d j j
{if (k>l && s t.j k jcs t j k -i L] ) r e t urn 0;
for ( i nt i-l ;i<k ;i++) if l st[k]==st[i] ) retur n 0 ;
return 1; }
int sol\Jtie() {return k==p ; }
int t Jpa rt j
tint i ,j ; z e ro t j ,
if (,;==0)
{for ( i = l; i <=p ; i ++ )
if (alfstfi]] l s t l j l l e s l I b[iJ [jJ=l ;
for ( i =l; i <=p; i ++)
if {a2{i] :=b[':'] [j.) return a ; }
else
(for
for j=l ;j<=p;j++) if (a2 s t I i ; [st[jJJ==lj brio fi; =l ;

if [j) !"-b[5..) {jl return O; }
r eturn I ; }
v oid b t. t ) {1/ p.J. r t e a fixa a e Lqor i tmu Lu i be c k t r ack.i nq }
v oid main ()
tint i ,j /m; I I o c-n :

f or (j=l ; j<=n ; j t-+) ': 1»a1 I i ] [j J; :"1 "close () ;
I II formuticii 211
f2 »p;
for ( i =l ; i <=p ; i ·
l
·
t
'
f2 » a 2[i ] [ j ] ; f2 . c l o s e () ;
i f (p >n) {m=n; n=p ; n=H\ ; x=l ; }
else x -=- O;
b t () ;
if (gasit)
i f ( x ) cout .ccvp r ima matrice de adj acenta e s t e a subg r a f ului ";
else cout« "a doua ma;:rice de a.d i ac e nt a este a subgrafului ";
else c out« "nu este subgraf "; }
------.... 1. Scriet i un program care citeste din fisierul text grafl6.txt matri cea de
adiacenta a unui graf orientat - care genereaza taate subgrafurile
care S8 pot obtine. lnforrnatiile despre subgrafuri se vor salva in
fi sierul text gralsI6. txt. Pent ru fiecare subgraf generat se va scrie, pe un rand , text ul
Subgraful x are p nocun (unde x este nurnarul de ardi ne al subgrafului generat, iar p
numa rul de noduri) pe randut urrnator textul Arcele - urmat de lista de arce a
subgrafului general.
2. Scrieti un program care citeste din doua fisiere text , gralls.txt si gral2s.txt inforrnat ii
despre matricele de adiacenta a doua grafuri orientate (de pe prima Iinie numarul de
noduri, apoi matricea de adiace nta) care verifies daca unul dintregrafuri este subgraf
al cel uilal t. in caz afirmativ, se precizeaza care este graful si care este subgraful.
3. Scr iet i un program care citeste din fi sierul text grafl6.txt matricea de adiacenta a unui
graf orient at - care genereaza subgraful care S8 obtine prin eliminarea nodului care
are cei ma i multi vecini.
2.7.6.3. Graful complementar
Fie graful G = (X,U) rnult lrnea de muchii (arce) V. Gra!u! Gc = (X,V) se numeste graf
complomentar al grafu lui G daca are proprietatea ca doua noduri sunt adiacente in
graful G
c,
numai dacii nu sunt adiace nte in graful G (U " V = 121 ).
Altfel spus, un graf compl eme nt ar al qr afului G contine aceleasi noduri ca graful G,
dar nici 0 muchi e din acest graf.
Exemple:
1. Pentru graful neorientat G, = (X" U,), definit anterior, graful Grc = (X" V, ), defi nit astfel : G, c
-7 rnu ltirnea nodurilor este X,={1.2,3,4,5,6,7,8j .
-7 multirnea muchi ilor este V, ={[ 1,5]. [1,6], [1.7], [2,4]. [2,7], [5,7], [5,8]}.
este graf complementar al grafulu i G, - figura 21.
G
10c

Graful
G,

rl complementar
6 L....( (.;\ 6 c.,
8 4 0 5 8
Fig. 21
2. Pentru graful orientat GlO=(XlO,U
lO),
definit anterior, graful Gl 0c= (XlO,VlO) , definit astfel:
-7 multlmea nodurilor este X,o={1.2.3,4.5,6,7,8,9,1OJ.
-7 rnultirnea 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 complementar al qrafului G10- figura 22.
212
Gratul
G,o
1
5
Fig. 22
Implementarea st r net nr ilur de dat e
Scrieti un program care citeste din doua flsiere text graCi c.txt si
graf_2c.txt inforrnatli despre doua grafuri neorientate - si varianta 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. (Indlcat ie. Oaca
cele doua grafuri au acelasi nurnar de noduri, S8 determine graful inter sectie, care va trebui
sa fie gratul vid).
2.7.6.4. Aplicatii practice
1. Din grupul de n persoane inlre care s-au stabilit relalii de prietenie. afisati, pentru
fiecare persoana , persoanele cu care nu este in relat le de priet enie. (lndicati e. Se
genereaza gratul cornplementar.)
2. Din grupul de n persoane i ntre care s-au stabilit relatii de cunostinta, elirnmati strainii
de grup ~ i singuraticii. (Indi cati e. Se genereaza un subgrat al qrafului initial, pnn
eliminarea tuturor nodurilor izolat e sau terminale.)
3. La gratul judetelor, construiti un vector i n care rnernorati. pentru fiecare judet, un indice
pentru provincia istorica din care tace parte (1 - Munterua, 2 - Moldova etc.). Obtineti
din graful judetelor , subqrafurile provinciilor istorice. Precizati provincia istorica ce
contine cele mai multe judete, ~ i provincia istorica ce coniine cele mai putine judete.
4. Din gratul grotelor. obtineti subgratul grotelor care se gasesc la a Inaltirne h, cu
h1$h:'5h2. Venficati cate dintre aceste grate cornunica direct cu exteriorul rnuntelui.
Valorile pentru l naltirnile h1 si h2 se crtesc de la tastatura.
5. in reteaua de strazi a orasului, doua strazi se i nchid pentru a fi reparate. Etichetele
intersectiilor care sunt legate de aceste strazi se citesc de la tastatura. Sa se veritice
daca, prin i nchiderea acestor strazi, traficul auto nu este perturbat, i n sensuI ca vor
exista intersectii la care nu se mai poate ajunge. (lnd icatie. Se genereaza gratul partial
al traficului, prin eliminarea arcelor dintre nodurile precizate. l?1 se verifica caca exista
noduri care au gradul intern egal cu 0.)
6. Se citesc, din doua fisiere text doua matrice de adiacenta a doua grafuri care au acelasi
nurnar de noduri . Sa se verifice daca aceste matrice pot reprezenta matricele de
adiacenta a relatiei de vecinatate. respectiv a relatiei de prietenie pentru satenii care au
tanet e. (Indicalie. Se verifica daca gratul cu mai putine rnuchii este grat partial al
celuilalt graf).
Informatica
213
2.7.7. Concxitatca grafu r ilor
2.7.7.1. l.antul
intr-un graf G= (X,U) se defineste lant ut ea fiind 0 s ueeesiune de noduri care
au proprietatea ca, oricare ar fi dow! noduri succesi ve, ele sunt adia cente.
Graf ul neorientat
Daca multirnea 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" 1
2
I; . .. . , I, } , unde I,EX pentru
orice i (1<;i<;k) , iar muc hi ile [1
,
,1,], [1
2
,1
3
] , [1
3
,1
4
] , ... , [1,., ,1,] E U. Lantul poate fi interpretat ca un
traseu prin care S8 parcurg anumite muchii ale grafului, traseul fiind ordinea i n care S8
parcurg aces te muchii: [1
,
,1
2]
, [1
2
,1
3
] , [1
3
,1
4
] , ... , [l
k

"l
k
] . Fiecare pereche de noduri succesive din
Ian! reprezinta parcur gerea unei much ii. Daca exista L( x;,xj) , se spune ca nodul Xj este
accesibil din nodul Xi .
Graful orientat
Daca multirnea nodurilor unui graf orientat este X={X" X2, x
o
}. un lant de la nodul 1
,
la
nodu l I
k
- L(I
,
.l
k
) - va fi definit prin rnult imea L(I"I,) =[I
"
1
2,
, I; , ... , I
k
] , unde I;EX, pent ru
orice i (1sisk). Arcele [1
,
,1
2
] , [1
2
,1,], [1
3
,1
4
J, ... , [l
k

"I,
] au proprietatea ca, oricare ar fi doua arce
succesive, ele au 0 extremitate comuns. La defi nirea unui lant, nu S8 line cont de
oricntarea arcel or , ci numai de faptul ca doua noduri sunt legate de un arc .
G
19
.
Terminologie:
~ Lungimea unui lant reprezinta nurnarul de parcurgeri ale muchiilor, respectiv arceJor.
De exemplu, lungimea lantului L(I
"I
,) este k-1. Daca a muchie (un arc) este parcursa de
mai multe ori, S8 va numara fiecare dintre parcu rgerile sale.
-7 l. ant ul de lungime minima dintre nodul Xi ~ i nodul x
J
- L min( x j,Xj) - este lantul cu
nurnarul minim de muchii (arce) , din rnultirnea nevida de lanturi L(x" x,).
~ Ext rernitat i le unui Ian! sunt formate din nod ul cu care lncepe si nodul cu care se
terrnina lantu l (1
,
~ i I
k
) .
~ Sublantul este format dintr-un sir continuu de nodur i din lant. De exemplu , pentru
lantul L(I" I
k
)={I
"
1
2
, ... , I" ..., I" " ', Id , L, (I" I,), definit astfel : L, (I;, 1,) = [ 1" 10+1, ..., 1" " I,l este
un sublant allantului l.
Exemple:
1. Pentru graful neori entat G19= (X
19
,U
'9)
, defi nit astfel:
~ rnuttirnea nodurilor este X
, 9
={1 ,2,3A,5,6 ,7,8}.
~ rnultirnea muchiil or 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 graful orientat Gzo = (X'O,U20), definit astfel:
~ multlmea nodu ri l or este X
2o={
1,2,3A,5,6 ,7}.
~ mullimea ar celor este U
20
=([1,2] , [ 1A), [2,3J, [2A],
, ' - ~ J . . J
[3,6], [3,7] , [4,1J, [4,5] , [5,2], [SA], [6,3] , [6,5], [7,6]}.
L
,
(1,5)= (1, 2, 5, 6, 3, 6, 7, 6, 5) est e un lant intre nodul cu
eticheta 1 si nodu l cu elicheta 5 (figura 24). Lungimea lantului este 8.
214 lmplcmcutarca structurilor de date
Clasificarea lanturilor - in functie de :
Muchii (arce)
Simple
Toate muchi ile (arcele) din lant sunt
diferite i ntre ele: [1,,1,] [1, .1,1:
(I,.I,J [I, .I,J: ...; [1 ,,1,) [I" .IJ; ...:
[l
k

2
.1
k
.,1;t. [1" "'1<] - aceeas! much ie (arc)
peate fi parcursa 0 sinqura data.

Compuse
in lant se pot repeta unele much ii (aree)
- aceeasi muchie (arc) poate fi parcursa
de mai multe ori .
Noduri
I
Elementare
Conl in numai noduri distincte doua cate
doua: 1,-0"-1
2
: ... ; I,;t.l
k
: [3; . . . ; I
k
.
1
",l
k
- acelasi nod poat e fi parcu rs a singura
data.

Neelementare
Contin noduri care se repeta - prin
acelasi nod se poate trece de rnai rnurte
ori.
Exemple:
1. Pentru graful neorientat G
19
:
-? l.antul L
,
(1,7) definit anterior este un lant neel ementar , deoarece se repeta nodul cu
eticheta 3. Este un l ant campus, deoarece in lant se repeta muchia [2,3)
-? l.antul L, (1,7) = {1, 2, 3, 6, 7} esle un lant elementar deoarece fiecare nod este par-
curs a sinqura data.
-7 l.antul 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 nodul 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.antul L, ( 1,5) = {1, 2, 3. 7, 6, 5} este un lant elementar, deoarece fiecare nod este
parcurs 0 sinqura 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 deoarece se repeta nodul cu eticheta 2.
Teorema 10
Daca un graf confine un Ian! i nt re doua noduri , x y,
atunei contine un Iant elementar intre nodurile x si y.
Dernonstrati 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 j , astfel inca! I;; IJ; z: L(x,y)={x, 1" 12, ..., lr. ..., 11_ "', I
k
• V}.
Nodul z apartinand lantului L(x,y), tnseerrma ca el este accesibil din nodul 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 Insusi:
11. 12, ..., Ii, Ij+1. "', I
k
, 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 apare decal 0 sinqura data, adica un lant
elementar.
Exemplu:
i n graful neoriental 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 elementar.
Informatica
Tcorcma 11
215
Dacii un Ian! esl e elemenlar, alunci este Ian! simplu.
oemcnetrat !e - prin recucere la absurd. Presupunem ca lantut elementa r este Jan! campus . Daca
este lant campus, el trebuie saparcurqa de doua on aceeasi muchie (arc), ceea ce ar i nsemna sa
treaca de doua ori prin nodurile adiacente muchiei (arcului). l.antut fiind elementar, nu trece lnsa de
doua ori prin acelasi nod.
Algoritmi pentru determinarea lanturilor elementare intr-un graf
1. lanturilor elementare dinlre doua noduri.
Algorilmul. Pentru generarea lanturilor elementare intre nodul x nodul y , se foloseste
metoda backtracking. Nodurile lantului elementar vor fi generate in stiva. Primul nod din
stiva este nodul x. Conditia ca un nod adauqat in stiva sa taca parte din solutie (sa fie valid)
este sa formeze 0 muchie (un arc) cu nodul adauqat anterior in suva sa nu mai existe in
stiva (conditia ca lantul sa fie elementar). Solutia se obtine atunci cand nodul adauqat i n
stiva este nodul y.
Imp lementarea algoritmului. Se citeste din fisierul text graf1 .txt matri cea de adiacenta a
unui gral neorientat . respectiv , din fisierul graf2.txt matricea de adiacenta a unui gral
orientat. Se mai citesc de la tastatura doua valori numerice care reprezinta etichetele a
dove nodur i din grar. Se cauta toat e lanturt le elementare care exista tntre cele coua
noduri se afiseaza. Oaca nu exists nici un lant elementar, se afiseaza un mesaj .
Functia ci t es t e () se foloseste pentru a cif matricea de adiacenta din fisier . Variabila
este se foloseste pentru a verifica daca s-a gasit un lant elementar i ntre cele doua noduri
(are valoarea 0 - False, dacii nu s-a gasft un lant elementar). Pentru testarea programelor
se lolosesc gralul neorientat G, gralul orientat G, .
#i nclud e <f s t r e a rn. h >
typedef stiva[lOO] ;
int a[20] [ 20] ,n,k,as ,ev,Y.. ,y, este=0 ;
.stiva st ;
f s t r e am f( "grafl .txt " , i o s : : i n) ;
v o id c Lt e s t e t ) { l i s e c i.te s t e mat r Lceu de adi a ccnt a din f i s Le r I
void init()
int succes o r ()
{ if (st[ k] <nJ ( st [ k ] =st l k ] +l; r et urn 1; ) el se r etur n 0; )
i nt va l id ()
{if ( k>l ) Ilconditi a ca doua noduri s ucce siv e sa f i e a d i a c e n t e
if la [s t[ k-1 ] 1Ist:[k l j ==O) r eturn 0;
! /pen t r u gra f ul orien t a t
Il if (e l s t j k ] ] && a Lst Lk-T l ] [st lk J] ==O) return 0;
f or (i n t Il conditia ca 1 ant u l s 5 fie elemen t a r
i f Ist[k]==st[i]) r et ur n 0;
r e t ur n I ; }
int solutie() {return st[k}==y; }
lise atunci c and ultimul nod adaugat in stiva e s te y
void t.Lpa r ()
{f or (i n t i=l ,este=l ; i<=k;i++) cout«s t[ i] « " " ; cout«endl;}
void bt () {/ I pa r t e a fi xa a a lgo r i t mul u i }
{ k=2; init () ;
wh i l e (:<>1)
( a s =- 1 ; ev=O;
while {a s && l ev )
216
Impl ementarea st r uct ur ilur de date
{a s =s ucc e s o r ( };
if {a s ) ev=va lid ( ) ; }
i f i a s )
i f ( s ol u t i e ()) t i p a r ( ) ;
e lse { k++ i in i t () ; }
e l se k - - ; } }
void ma i n e)
( c i t e s t e ( ); cou c-oc " >; » "; ctrc- >x , c ou t«"y= ". c i n» y ; st[l] =z:; bt () ;
i f ( ! est e) cout«"Nu e x Ls t a l ant " ; }
2. tuturor lanturilor elementare din grato
Algori tmul. Pentru generarea tuturor lanturilor elementare din grat, se vor genera lanturile
elementare dintre nodul x (t sxsn) nodul y (1$y$n), folosind metoda backtracking. care
se va apela pentru fiecare pereche de noduri x 'Ii y (x>,y) .
Imp lementarea al gori tmului. Se citeste din fisierul text grafl.txt matricea de adiacenta a
unui grat neorientat, respectiv, din fisierul graf2./xt mat ricea de adiacenta a unui graf
oriental. Se cauta toate lanturile elementare care exista I n graf si se afiseaza. Daca nu
exista nici un lant elementar, se afiseaza un mesaj. Pentru testarea programelor se
folosesc graful neorientat G, si graful orientat G, .

typedef sLi va[lOOj ;
int a[20] [20} , n, k, a s , ev, x , y , e st e =O;
s :: ':" va st ;
fstream :in) ;
void c Lt e s ce t ) ( l I l a tel c a l n e xe mpL u I p r e ced ent;
void Lnj t () { f /1<.1 EeL C3 in exernpLuL prec edent: }
i n t .succe scr t ) { / / La fe l c e i n e xemp LuL pre ced e n t
int va Lad {) { l i l a tel c a i n e xernp lu.l. p r e c edent }
i n t s oLu t i.e ( ) {/ / La f e L c a in e xe mpl ul p reced ent }
void t i po r ( ) {I l I a fel ca i n e xe mplu l pre cedent }
void bt() { I / par t e a fi x5 a - c a i n e xempl ul preceden t }
void main ()
{ c Lt e s r.e t j •
for
for (y=l ; y<= n ;y++) i f btl) ; }
if (!este) cout c c vt tu e x t s-;c Lan t ur ; e Ier-enca r ev r }
3. Ver i fi carea unui sir de et ichete de noduri daca I orrnoaza un Ian! simp lu.
Algor itmui. Se verifica daca:
sirul de etichete poate forma un lant (daca fiecare pereche de noduri consecutive din
lant este leqata prin muchie. respectiv arc);
lantul este simplu (se verifies daca muchiile formate cu noduri le din lant nu se repeta).
Impl ementarea algor 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 i n graf. $irul 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 'I i pentru a Ie memora in matricea de adiacenta a grafului , functia Larrt. () se
\n1'0 rmatica
217
toloseste pentru a verifica daca sirul de numere poate reprezenla un lant din graf, functia
simp lu () se toloseste pentru a verifica daca lantul este un lant simplu. Pentru testarea
programelor se folosesc graful neorientat G, si graful orientat G, .
#include <f s t r e am. :-t >
s truct t int x, y; };
mi.: chie <: [10 J ;
i n t <,n ,m,a [ 1 0 ) [ 10 ) , v [ 1 0 ];
fst rea 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 ] 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 u r n I ; }
int s i.mp lc {}
{for l i nt l=l ;i<k;i++)
f or (i nt i f {z [i ] .x==z i j ]. x && z [i j . y= =z [ j ] . y ) 0;
r e t urn 1 ; )
v oid main ()
tint i; c Lt.ea 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 he 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 ] ; z [ i ] . y =v [ i + l ]; }
el s e {z I L] ; : [ i } . y =v l i ] ; }
i f (Lant f l )
i f Ls i .rnp Lu t l ! c cuc-cc ve s t e Lan t. s i.mpLu" ,
e lse cout ccvnu e s t c Lant s iu.pLu" ,
e lse cout«"nu :'a.nt " ; }
1. Scrieti un program care citeste dintr-un fisier text lista muchiilor unui
graf nearientat (gra/3. /xI) sau varianta graf orientat (gra/4.IX/), care:
a. Verifica daca un de k numer e citite de la tastatura reprezinta
un lant eleme nt ar pentru graf .
b. Cauta toate lanturile elementare cu lungimea d 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 i ntre coua
noduri x si y, Ie afiseaza. 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 elementar. se afiseaza un mesaj .
e. Cauta toate lanturile elementare de lungime maxima afiseaza cate lanturi s-au
gasit care sunt ele. Daca nu exista nici un lant elementar , se afiseaza un mesaj.
f. Cauta 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 de p numere, care reprezinta etichete ale nodurilor din graf t q - numar de muchii
un slr de q perechi de numere, care reprezinta muchii (arce) din graf.
2. int r-un fisier text sunt memorate informatii despre doua grafuri neorientate G' G" : pe
primul rand nurnarul de noduri ale celor ooua grafuri (n, nz), pe urrnatoarele n,
218 lmplcmenturca st r uct ur tlor de dale
randuri mat ricea de adiacenta a grafului G' , iar pe urmatoarele n2 randuri matricea de
adiacenta a grafului G". Scrieti un program care citeste din fisierul text informatiile
despre cele cou a grafuri ~ i care determina doua noduri p si q (p din graful G' ~ i q din
graful G" ) care - daca se leaga printr-o muchie - asiqura leqatura , printr-un Ian! de
lungimea k, i ntre doua noduri precizate x ~ i y (x din graful G' ~ i Y din graful G" ). Valorile
pentru x, y ~ i k se citesc de la tastaura.
2.7.7.2. Ciclul
Un Ian! care are toate muchiil e distincte doua cate doua ~ i
extrornitaf care coincid - se numesto ciclu.
Ciclul este un Ian! simplu ([1, ,1,) '" [1, ,1
3
); [1,,1, ) '" [1
3
,I, J; ...; [I" I, l " [I, ." I,J; ...; [I,." I,.,J" [1, ., ,1, )),
in care extremitatile coi ncid: 1,=l
k
_
Un graf f ar a cicluri se nurnests graf ac icl ic .
Daca toate noduriIe unui ciclu sunt distincte doua cate doua, cu excepti a extrernitatilor,
ciclul S8 nurneste ciclu clcme ntar.
Exempl e:
1. Pentru graful neorientat 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 elementar deoarece nu se repeta
niciunnod.
2. Pentru graful orientat G, o:
~ l. antul L
4
( 1,1) ={1, 2, 4, 5, 2, 1} nu este un cicl u deoarece i n lant se repeta arcul [l ,2J .
~ l.antul L5(1,1) = ( 1, 2, 5, 6, 3, 2, 4, l }=C, este un cicl u neelementar deoarece se
repet a nodul cu eticheta 2.
~ t.ant ut L
6
(1,1) = {1, 2, 3, 6,5,4, 1} este un cicl u elementar deoarece nu se repeta
niciun nod.
" . G ~
.. 3. Un circuit electric poate fi reprezentat cu ajutorul unui graf orientat G
21
, i n care nodurile
retelei sunt noduri le grafu lui, iar sensul arcelor este dat de sensu I ales pentru curentul
electric - figura 25.
R,
11 I 12
R,
--.

+'
I,
E,
R,
R,
R,
2
1
4
:; l ~
4
1 ~ 5 ' Ie" E
2
~ I,
E,
Rs
Fi g. 25
Un ochi al retelei electrice reprezinta un ciclu in graful orientat. Fiecare arc k are asociate
trei rnarirni: rezistenta Rk, 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 nfor rna tica
Pentru fiecare nod din grat , se aplica teorema lntal a lui Kirc hhoff:
219
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
unde q este nurnarul de arce ale ciclului.
......-----. ....-..... Pent ru circuitul electric din figura 25, S8 considera cunoscute urrna-
toarele marirni: R" R2, R3. Rs. Rk, I" E, ~ i E2. Scrieti un program care
sa calculeze - in graful circuitului el ectric - rnarirnea rezistentei R4.
Teorema 12
Daca un graf coniine un ci clu, atunci conti ne ~ i un cicl u elementar.
Demonst ratie - Ia fel ca derno nstr atte de la Teorerna 11, de la subcapitoul Lant uri.
Doua lanturi - L
1
={ 1
1
, 1
2
, .•" Ij, ... , I
k
.
1
, I
k
, Ii } ~ i L'1={I'1' 1'2, ..., ( i l " " I'k_1, I'kt I'd -
care au aceeasi l ungime k, formeaza acetasi ciclu daca exis ta un nu rnar i ntreg
j , astfel incat li= I' (i+j) mod k+1, pent ru orice i=1, 2, 3,... , k.
Exemp lu:
in gratul neorientat G' 9lanturi L,= :I" I" 1
3
, I" 1, 1= { 1, 2, 6, 5, 1} ~ i L, ={ I " 1
2
, 1
3
, 1
4
, 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, rezult a ca j=2. Verificam daca pentru acest j si pentru orice i= 2, 3, 4, exista
doua noduri cu aceeasi eticheta i n 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: 1
3=6
si 1,2=6 c> 1
3
=1.
2.
i=4 c> (4+2) mod 4 + 1 = 3; dar: 1
4=
5 ~ i 1
3
=5 =>1, =1
3
.
In gratul neorientat G' 9lanturi L,= {I" 1
2
, 1
3
, 1
4
, I, ) = : 1,2, 6, 5, 11~ i L , =:;" I" 1.
3
, 1
4
, I , ) = { 2,
5,6,1 , 2} care au lungimea 4, nu forrneaza acelasi ciclu . Se observa 1,=1 si 1
4
=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: 1
2
=2 ~ i 1,=2 =>1
2=
I , .
i=3 => (3+2) mod 4 + 1 = 2; dar: 1
3=6
~ i ;'2=5=> 1
3
" ;'"
Algoritm pentru determinarea ciclurilor elemenlare intr-un grar
Algoritmul. Se qenereaza toate lanturile elementare care pornesc din nodul x (t sxsn),
tree prin eel putin trei noduri si se pot inehide eu nodul x. Pentru generarea aeestor lanturi
elementare se foloseste metoda backt racking , care se va apela pentru fiecare nod x .
Solutia se obtine atunei cane nodul adauqat in stiva formeaza 0 muehie (un arc) cu nodu x
- ~ i stiva contine eel putin 3 noduri.
trnplem entar ea algoritmului. Se citeste din fisierul text graft .txt matrieea de adiacenta a
unui grat neorientat, respectiv , din fisierul graf2./xt matricea de adiacenta a unui graf
orientat . Se cauta toate ciclurile elementare care exista in graf ~ i se afiseaza . Daca nu
exista niei un ciclu elementar, se afiseaza un mesaj. Pentru testarea programelor se
lolosesc gratul neorientat G, si gratul orientat G
9
.
220 Implementarea structurllor de dat e
#include <f s t ream .L>
typedef s tiva [lOO J ;
int a[2 0 J [20 ] , 0 , k i a s , ev , x , e s t e e O,
s t i v a st ;
fstream f( "graf l .txt " , i o s : :in ) ;
void citeste() ( I I :;; e c i t.c st c me t .r i cee d e e d a acent.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 uc c e s o r ()
{! Ze s t e .i d e n t Lo a CD CEa de La c L i se rce Lan t u .. ri L c r e Lement a r e }
int vaLi d ()
{/ / s-s t e Ldent t ca ell cea c e La af t s e rea Lan t ur i.Lo r element are }
{return a [ s t[ k] ] j x ]==l && k>2 ; }
lise ob;;:ine solut;:iaatunci canci ultimlJl nodadaugat este adiacent
//nodu lui x in s t i vb eel 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 fixa a e Lqc r i t.mu l ui.
v oid main ()
{ c i t est e.t I : ,
for ( z=1:x<=n ;x++j { s t j Ll e x : bt () ; }
i f (Le s t.e j oout.c-cv Nu ex i.s t.e n.i c i. uri c .icl.uveLemeri uar" i }
1. i n exemp lul precedent, sunt afisate lanturi care tormeaza acelasi
cicl u (acelasi cicl u este afisat de mai multe ori: deosebirea consta
doar in nodul cu care se i ncepe se i nchei e ciclu l). Modificati
programul astfel tnca t sa se elimine afisarea inforrnatiei redu ndante (afisarea aceluia si
cicl u de mai multe ori ).
2. Scrieti un progra m care citeste din fisier ul text graI3 !x! lista muchiilor unui graf neori-
entat - si afiseaza toate cicl urile elementare care trec printr-un nod cu gradul minim.
3. Scrieti un prog ram care citeste din fisierul text graI3. !x! lista muchiilor unui grat neori-
entat si care verifica daca un sir de k numere cit ite de la tastatura reprezinta un cic lu
elementa 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 elementar, S8 afiseaza un mesaj.
b. Cauta toate cicluri!e elementare care tree prin toate noduri le grafului si Ie aflsea-
za. Daca nu exist a nici un eiclu elementar care trece prin toate nodurile grafului,
se afiseaza un mesaj.
c. Cauta toate ciclurile elementare de lungime maxi ma care tree prin nodul x - Ie
afiseaza. Etieheta nodului se citeste de la tastatura . Oaca nu exista nici un cielu
elementar care sa treaca 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 nd a succesiune
de noduri care au proprietatea ca - oric are ar f i doua noduri succesive-
ele sunt legate print r-un arc .
Daca, intr-un graf orientat , rnultimea nodur ilor este X={X1, X2, ... , x
n},
iar multirnea areelor
este U=(U" U2, ..., Urn}, un drum de la nodul d
,
la nodul d
k
- D(d
"d
k
) - va f definit prin
Infonnaticii 221
rnultimea nadurilar D(d
"d
k
) = {d
"
d" ..., dkJ, unde d,EU, pentru orice i (t si sk), iar arcele
[d
"
d, ], [d
2,d3
] , [d
3
,d4], ..., [dk- l ,dk) E U. Drumul poale fi privit ca un lant In care parcurgerea
de la un nod la altul trebuie sa S8 faca i n sensu! arcului care leaqa noduri le. Oaca exista
D(xj,xj), S8 spune ca nodul Xj este accesibil di n nodul x..
Terminologie:
-7 Lungimea unui drum este data de nurnarul de arce care i l compun . in cazul in care
arcele au asociate lunqirni, lungimea unui drum este data de suma lungimil or arcelor
care iI compun.
-7 Drumul de l ungi mc minima dintre nadul d, nadul d
J
- Dm,"(d" dj) - este drumul cu
numarul minim de aree din mult imea nevida de drumuri D(di,d
J
} .
-7 Subdrumul este format dintr-un sir cantinuu de noduri din drum. De exemplu, pent ru
lantul D(d
"
d
k
)={d
"
d" ..., d, ..., d
j
, ... , dk:, 0, (d" d
j
) definil astfel: D, (d" dj) = :d" d,., , _
dj_1 , d
J
) - este un subdrum al drumul ui D.
Drumul elementar este drumul in care nodurile sunt disti ncte doua cate doua, Drumul
simplu este drumu l i n care arcele sunt distincte doua cate doua.
Exemple - Pentru graful arientat Gzo.
-7 l.antul L,( 1,6) = (1, 2, 5, 6) nu este un drum deaarece parcurgerea nu se face i n
sensul 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 campus, 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, deaarece nu se repeta
nici un nod.
-7 t.antul L
9
(1,6) = (1, 2, 4, 5, 2, 3, 6}=D, este un drum sirnplu , deoa rece nici un arc nu
a fost parcurs de doua ori. dar este un drum neelementar, deoarece se repeta nodul
cu etichela 2.
Teorema 13
Daca un grat neorientat confine un drum intre doua noduri, x §i y,
atunci, contine §i un drum elementar, Intre nodurile x §i y.
nemonstrat!o - la fel ca demonstratia de la Teorema1 1 de la subcapitolul Lanturi.
Al go r it mi pentru determinarea drumurilor elemcntare intr-un g raf orientat
1. Aftsarea drumuri lor el ement are din grato
Algoribnul. Se va folosi algoritmul pentru determinarea tuturor lanturilor elementare din graft la
care elementul solutiei generat i n stiva, la nivelul k (k>1), va fi considerat valid numai daca
trecerea de la nadul de pe nivelul k-l la nodul de pe nivelul k se face, In graf, in sensul arcului.
Implementarea algoritmului. Se citeste di n fisierul graf2txt mat ricea de adiacenta a
unui graf orientat. Se cauta toate drumuril e elementare care exista i n graf - si se
afiseaz a. Daca nu exista nici un drum elementar , S8 afiseaza un mesaj . Pentru testarea
programului se foloseste graful oriental Go-
#inc lude <fs 'Cre am. h >
typedef
int a l20J [ 20} , n , k, a s , e v , x , e s t e =O;
s r j va st :
f s t r e a m f( "griJ.r 2 . t x t " , i o s : : i n ) ;
void c i t.e s t.e.l ) { / I s e cit.es t e rnat r i cee de c d i acen t a d i n f La i.e.r }
222 Implemcnt a r ea struct urt lor dc datc
void ini.t () {/ / coenttce ell cea de 'La atLsaroa Larrt.u.r i.Lor'< eLemerrt .ar e ]
int s uc c e s o r () {! lea c e e vcte 1a af i se rce Lant. u.ri.Lo r c Iemcnt ar-e )
int valid ( )
{if i k>l ) if (a[ st[ k- 1J] return 0 ;
for {i n t i"'=l ; i<k;i++l if ( s f [ k l==s t [ i J) return 0 ;
return I ; }
int s o l u t i e ( ) {return st[kl ''''''''"y; }
void t i p a r {)
{for (i n t i =l , e s t e ""=l ; i <=k ; i ++ ) cout «st[ i]« " II. cout« x«endl;}
void bt O {/ lpar teo fi xa a a Lqo.ri t rnul ui }
void main ()
{c i teste fi ;
f or (x=l; x<=n ;x++J
f o r I if bt. () ; }
i f { ! es t e I cout«" Nu e xi s ta " ; }
2. Algoritmul Roy-Warshall de determinare a rnatricei drumurilor.
Matricea drumurilor este 0 matrice patrat a binara de dimen siune n (n reprezentand
ordinul grafului), delinita astlel:
a[ilDl { 1, daca exista drum de la nodul i la nodul j
0, daca nu exista drum de la nodul i la nodul j
lnforrnati il e din rnatri cea drumurilor se pot f olosi pentru a verifica daca exi sta drum
i ntra doua noduri al e grafului
5 4 3 2
k=3
2 3 4 5
1
0 1 0 0 0
0 0 1 0 0
1 1 0 1 0
0 0 0 0 1
0 0 0 1 0
1 1 1
CeQ-
1 1 1 1 IQ
1 1 1 1 0


0 0 1
0 0 0
"
0
1
2
3
4
5
0 1 1 0 0
0 0 1 0 0
1 1 1 1 0
0 0 0 0 1
0 0 0 1 0
1
2
3
4
5
0 1 0 0 0
0 0 1 0 0
1 1 0 1 0
0 0 0 0 1
0 0 0 1 0
1
2
3
4
5
Algoritmul. Daca nu exists un arc de la nodul i la nodul j , considerarn ca exista drum de la
nodul i la nodul j , daca exista un nod k (ksel k*j) care are propri et atea ca exi sta un drum
de la nodul i la nodul k un drum de la nodul k la nodul j . Matneea
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 ] ark] [j]=1. in eaz afirmativ, i n matri - Fig , 26
cea de adiacenta S8 atribuie valoarea 1 elernentului a [i] [j].
G" Pentru graful G" din figu ra 26 matrieea de adiacenta sutera 1
urmatoarele cinei transformari. La fiecare transformare, daca 2
drumul de la nodul i la nodul j trece prin nodul intermediar k 3
(drumu l treee de la nodul i la nodul k si de la nodul k la nodul 4
J), atunci el ementului a [i] [j ) i se va atribui valoarea 1. 5
k=1 k=2
2345 2 345 1
k=4
2 3 4 5
k=5
2 3 4 5
1
2
3
4
5

1 1 1 0
1 1 1 1 0
1 1 1 1 0
0 0 0 0 1
0 0 0 1 1
1
2
3
4
5
- - --- - -----
- -

1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
0 0 0 1 1
0 0 0 1 1
I nf ormal ica 223
Interpretarea datelar di n matricea obtinuta in urma transformarilor se lace astfe l: exista
drum de la nadul i la nadul j daca a [i 1 [ j 1 De exemplu, exista drum de la nadul 2
la nadul 4. dar nu exists drum de la nadul 4 la nadul 2.
Implementarea al goritmul ui. Se citeste din fisieru l graf20.txt matricea de adiacenta 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 ] a rk] 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 elementeJor
care au valaarea 1. Pentru testarea pragramului se Ioloseste graful arientat G" .
#i nclude <fst ream.h>
int a[20 ] [20],n ;
fstream £( " g r a f 20. txt " f Lo s : : in) ;
void cit es te() { l i s e mat r i cea de adiacent5 din
void t r e ns tcrme () .
{for (int k=l; k<=n ; k++}
for {int i =l; i <=n; i + +)
for{int j = l ; j<=n;j++ l
if {a [ i ] && .il ek && a li. ] [k] *a[kl [j ] ; )
void a f i aea z a t)
{c o ut« " Exi 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 ] && .i ! cout;e;e;" ( " «i.« " , "« j «" ) "«" " ; )
voi d main() { c i.tes t. e t L: t. c a n a r o r ma ri . a f Ls eaza Ll : }
Compl exi tatea algarilmului Ray -Warshall
Algoritmul de transformare a matricei de adiacenta Tn matricea drumurilor are ordinul de com-
plexitate O(nxnxn)= O(n\ deoarece fiecare stru'ctura repetitiva for se executa de n ori, iar
structuri le for sunt imbricate.
Scrieti un program care citeste, din fisierul text graf4.txt, lista muchiilar
unui graf orientat - care
a. Verifica daca un sir de k numere cit ite de la tastatura reprezinta un
drum elementar pentru graf.
b. Cauta toate drumurile elementare cu lungimea cea mai mica dintre doua noduri x :;;i y
:;; i le afiseaza. Etichetele nodurilor se citesc de la tasta tura, Daca nu exista niciun
drum elementar, sa se afiseze un mesaj .
c. Cauta toate drumurile elementare de lungime maxima :;;i afiseaza cate drumuri s-au
gasit :;; i car e sunt ele. Daca nu exists niciu n drum elementar, sa se afise ze un mesaj .
2.7.7.4. Circuitul
lntr-un graf ori entat un drum care are toate arcele distincte
doua cate doua extrernitati care coincid se nurneste cir cuit.
Circuitul este un drum simplu (arcele sunt distincte doua cate doua
[d
"d
,]t[d
3
,d
4
] : ... ; [d
"d
, ] t [d
k
_
"d
ki; ...; in care extrernitatile caincid
224 Implement area st r uct ur ilor de date
Circuitul oternentar este circuitul i n care toate nodurile sunt distincte doua cate doua, cu
exceptia primului a ultimului - care coincid.
Exemple - Pentru gral ul ori entat G
20
:
-7 Lantul L
1O
(1,1) ={1, 2, 3, 6, 3, 6, 3, 7, 6, 5, 4, 1) nu este un circuit, deoarece arcele
[3,6) [6,3) au l ost parcurse de doua ori.
-7 Lantul L,, (1,1) = {1, 2, 3, 6, 3, 7, 6, 5, 2. 4, l}=C, est e un circuit neelementar,
deoarece se repeta eticheta nodurilor 3 si 6.
-7 Lantul L' 2(1,1) = { 1, 2, 3, 7, 6, 5, 4, 1) =C
2
este un circui t elementar , deoarece nu se
repeta eticheta niciunui nod.
Toorerna 14
Daca un graf co nt ine un ci rcuit, atunci contine un cir cuit elementar.
Demcnst rati e - Ia fel ca dernonstratia de la Teorema11 de la subcapitolul Lanturi.
Algoritm pentru determinarea circuitelor elementare intr-un graf orientat
Al goritimul. Se foloseste acelasi algoritm ca in cazul determinarii ciclurilor elementare intr-un
graf orientat, cu deosebirea ca se tine cont de orientarea arcului care leaqa doua noduri.
#i ncl ude
typedef st i va [lOO] ;
int a [ 20J (20] , :l, k, a s, e v, x ,es t e=O;
stiva st ;
f s tre am f ( "gra::2 . t x t " I ios : : in) ;
voi d c i t e s t e t ) { l i s e c i t e s t;e ma trLcea de ad Lacent.e di n f i.s i e r }
void ini t ( ) {! / i den tic B cu cca de la a f l.so rce Lantur j Lo.r c l ement.er e l
i nt succe sor () {/ / Jcenr t ca C'J cea de La afi serca Lant.ur i Lor e Lementa r e }
int VC11id ()
( i f l k>l ) if (a [st [k-l IJ l sr I kl r e turn 0 ;
for ( i n t i =l ;i<k ;i'H) if (s t[ k} ==s t [ i ] ) return 0 ;
r eturn 1 ; }
i n t s olutie ( ) {r e t n r n a [ s:::'[ kJ] [x]==l && k>l ; }
I /se ob t i.n e so Lu t La a tunc i, caner ultimul nod ac<'fJugat e s t e acl i a c en t
/ Inod"u lui x $1 1n e r Iva e x i are eel pu t Ln ooua nodur i
void t1E-'u I ( )
{for {Ln t; i =l,este"-:' ;i<=}: ;i++ } cout ccs t Li l c-c " " ; c o ut« x« endl ;}
void b t () ( / /pa r t e a f i xa <;). e I qo r j trnc Iui }
v oid ma i n ( ) {c ,i t e s t e ( \;
f or ( x = l; x <=n ; z -<--'-) {s '..: [ l ] =x; b t l ) ; }
if ( ! e s t e ) c out.c-C'Nu c x i s t e c Lr cui :''3 '' ; }
Scriet i un program care citeste, din fisierul text graf4. txt , lista arcelor
unui graf orientat - si care :
a. Cauta toate circuitele elementare care exista in graf si Ie afiseaza.
Oaca nu exi sta niciun circuit elementar, se afiseaza un mesaj .
b. Cauta toate circuitele elementare de lungime maxima care trec printr-un nod x si Ie
afiseaza. Eticheta nodului se citeste de la tastatura. Oaca nu exista niciun circuit
elemen tar care sa treaca prin nodu l x, S8 aflseaza un mesaj .
c. Cauta toate ci rcuite le elementare care trec prin toate nodurile grafului Ie afiseaza.
Daca nu exista nici un circuit elementar care trece prin toate nodurile grafului, se
afiseaza un mesaj .
InI'll rilla t i cil
225
d. Cauta toate circuitele elementare care tree numai prin noduri care au gradul intern
egal cu gradul extern - Ie afiseaza. Daca nu exists niciun circuit elementar, se
afiseaza un mesaj.
2.7.7 .5. Graful conex
Un graf G S8 numeste graf conex daca are propri etatea Ca l pentru
ariee pereche de noduri diferite intre ele, exlst a un lant care saIe lege.
Altfel spus, un graf este conex daca, pentru orice pereche de noduri {x, Xj}, care au
proprietatea XjTXj exista un lant de la Xi la X
J
.
"
I 1 2 \
I I
\. 4 3 /
-_ ... -'
G"

I 6 \ _ ...
1
5
It@\
I I .... ,/
\. __ C3
C2
Fi g. 27
C1
Exempl e:
1. Graful neori entat G' 9= (X,.,U' 9) definit anterior este un graf conex, deoarece oricare ar
fi doua noduri din rnultimea X" ele pot fi legate printr-un lant. De exempl u, (1,2) "" {1,2}
sau {1,5,2}; (1,3) "" {1,2,3} sau {1,6,3}; (1,3) "" {1,2,3} sau {1,6,3}; (1,4) "" {1,2,3,4}
sau {1,6,7,4}; (1,5) "" {1,5} sau {1,2,6,5} etc.
2. Graful orientat G
20
= (X20,U20) definit anterior este un graf conex, deoarece oricare ar fi
doua noduri din rnult imea X" ele pot fi legale printr-un lant. De exemplu, (1,2) "" {1,2}
sau {1,4,2}; (1,3) "" {1,2,3} sau {1,2,5,6,3}; (1,3) "" {1,2, 3} sau {1,2,5,6,3}; (1,4) "" (1,
4) sau (1,2,5,4); (1,5) "" (1,2,5) sau {1,4,5} etc.
3. Graful neoriental G
23
= (X
23
,U
23)
- figura 27 - defimt astfel:
-7 rnultimea nodurilor este X
23=
{1,2,3,4,5,6,7,8}.
-7 rnult imea muchiil or este U23 ={[1,2J, [1,4J, [2,3J,
[2,4J, [3,4J. [5,6J , [5,7J}.
nu este conex, deoarece nu exista niei un lant intre un
nod din rnultirnea C,={ l ,2,3,4} un nod din multi rnea
C
2
={5,6,7}, sau din muttimea C
3=
{8}.
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.
Daca un graf G=(X,U) nu este conex, se nurnest o componenta conexa a grafului un
subqraf co nex al sau C=(X' ,U'), maximal in raport cu aceasta proprietate [conti ne
numarul ma xim de nod uri din G care 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').
Observati 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 ,
C
2
si C
3
, inducecate 0 components conexa.
Daca un graf este definit prin multimea nodurilor si rnultirnea muchiilor,
-7 rnultirnea nod ur ilor este X
23
={1,2,3,4,5.6,7,8}.
-7 rnul timea muchiilor este U
23
={[1Z], llAJ, [231. [2.4J, [3.41,
pentru identificarea componentelor conexe, procedati astfel:
PAS1. Se formeaza prima components conexa , pornind de la prima muchie. Se scriu
nodurile incidente cu muchia i n prima cornponenta conexa - C, ={l ,2} - se mar-
cheaza rnuchia: [12]. Componentaconexa C
l
este componenta curenta.
226 Implementa rea struetllri lor de date
PAS2. Se parcu rg celelalle rnuchii. Dad; se qaseste a muchie nernarcata, care contine
noduri din componenta conexa curenta, 58 adauqa nodurile la cornponenta:
C, ; {1,2,4,3), ,i se rnarcheaza muchia: [11], ~ , !L±], QAj.
PAS3. Daca rna! exista muchii nemarcate, S8 identifica prima muchie nernarcata si S8 formea-
za urrnatoarea componenta conexa, scriind nodurile incidente cu muchia - C, ;{5,6} -
~ i S8 rnarcheaza muchia: [5•.6.1. Componenta conexa C
2
este componenta curenta.
PAS4. Se parcurg celelalte muchii . Daca se gase, te a muchie nernarcata care contine
noduri din componenta conexa curenta, S8 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 t 03 t 8 nodurile din rnultirnea nodurilor 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. C
3
;{8}.
Teorema 15
Numarul minim de muchii mmin necesar e pentru c a un g raf neorient at, eu n nodur i . sa fle
cortex este n.....1.
Altfel spus , intr-un graf neorientat conex cu m rnuchii 9i n noduri: rnzn -d .
Demonstratie. Notarn cele doua prop czitii, ast fel:
(1) - Graf ul G neorientat, cu n noduri, are n-1 muchii si este conex.
(2) - Graful G neorientat , cu n nodu ri, este conex ~ i minimal cu acoasta proprietate (daca se Inlatura
ori ce muchie din graf , el devine neconex).
Trebu ie sa oernoostra-n ca (1).:;::>( 2) - Se foloseste pnncipiul inductiei matematice (se noteaza cu Pi
propozitia i ):
P1 - Gr aful G1, cu un nod 9i nici 0 muchie (m=1-1=O), este conex sl este mini mal cu aceasta
proprietate (nu mai exist a muchii care sa fie eliminate)
P2 - Graful G2, cu doua noduri 9i a muchie (m::2-1=1), este cone x (muchia nu poate lega cecat cete
doua noduri) 9i este minimal cu aceasta propnetate (prin elimina rea muchiei, noduri le sunt izolate
cbtinandu-se coua componente conexe).
P3 - Graful G3, cu trei nod uri si coua muchii (m=3 -1=2), este conex (cele doua muchii sunt Inctdente:
unul dintre nod uri este adiacent cu ce\e doua much ii - ;;i prin el va trece lantu l care leaga celelalte
doua noduri) ~ i este min ima l cu aceasta proprietate (prin el imina rea unei muchii , unul dintre noduri
este izolat, obtmandu-se doua componente conexe).
Pn - Graful G
n
, cu n noduri ;;i n-1 muchii, este conex ~ i min imal cu aceasta proprietate (se presupune
adevarata).
P
n
+1 - Considerand prcpozitia Pn adevarata. trebuie sa demonstram ca graful G
n
+1 , cu n+1 noduri ~ i
n+2 muchi i, este conex 9i minimal cu aceasta propr ietate. Prin adauqarea unui nod s! a unei mucb li la
grafu l G
n,
se poate obtine un graf conex. Nodul adauqat se leaqa cu muchia noua de graful G
n
(;;i,
implicit, la lanturile din acest graf) , obtinandu-se un nou graf conex. Presupunem ca graful obtinut nu
este min imal cu aceasta propri etate. Inseamna ca, pr in eliminarea unei muchii, se obtine un graf
conex. Daca eliminarn muchia adauqata, se izoleaza nodul n+1, cbtinandu-se doua componente
cone xe. Daca se elirni na a muchie din graful G
n
, se obtin dOU8 comp onen te conexe, deoare ce graful
G
n
est e minima l cu aceasta proprietate. Rezulta ca graful G
n
este minimal cu aceasta proprietate.
Exemple de grafuri conexe cu n noduri 9i nurna r minim de muchii:
~ Fiecare nod este legat de aile doua. cu exceptla a doua nod uri terminale Exista n-2 noduri cu
gradul2 ~ i doua noduri cu qr adulf ;
2x( n -2) +2 x l
1lI " , in :::: 2
n - t
Informatica 227
Un nod este legat de celelalte n-1 noduri. Exista un nod cu gradul n-1 n-1 noduri cu gradul1 .
IX( I1 - I) +(I1 -I)xl
Ill",;" = 2 n -I
Propozitia 4. Daca un graf cu n noduri are p componente 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! minim 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, nurnai unul.
Demonstratie - prin reducere la absu rd. Graful G fiind conex , rnscamna ca exista eel puttn un lant
care leaqa cricare dou a noduri, x y. Presupunem ca exista eel putin doua lantur i i ntre ncdurile x
y: L1 L2. Insearrme ca. suprimand a much ie din lantul al doilea. graful rarnane conex , deoa rece
noduriIe x y vor fi legate prin lant ul L1. lnsearnna ca un graf cu n noduri s! n-2 muchii este conex,
ceea ce cont razice Teorema 15. Rezulta ca cele doua noduri, x y, nu sunt legate decaf printr-un
singur tent
Propozitia 6. Daca un graf neorientat cu n noduri m rnuchii este conex, nurnarul maxim
de muchii care se pot elimina pentru a obtine un graf partial conex este: m-n+1 .
Demonstratle. Oeoarece numaru l minim de muchii necesare pentru ca un graf sa fie conex este n-1,
atunei din graf se pot elimina restul much iilor: m-n+1 .
Teororna 16
Un graf neorientat conox cu n noduri n...:.1 muchll este aciclic
maximal cu aceasta proprietate.
Demonstratle: Notam eele coua propozi tii, astte l;
(1) - Graful G neor ientat, cu n noduri, este conex are n-1 muchi i.
(2) - Graful G neorientat , 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=lXl , 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 noduri din ciclu prin lantul X3, ..., Xi, x- } - ceea ce
cont razice teorema anterioa ra. CEl un graf cu n noduri n-1 muehii este eonex si minimal eu
aceesta proprietate.
2) Este maximal eu acea st a pr opriet at e (daca S8 adauqa 0 noca muehie, grafu l nu mai este
aciclic) - prin reducere la absurd. Presupunem ca prin adauparea unei muchii oarecare [x,y], se
obtine un graf aci clic. Graful fiind conex , tnseamna ca Intre nodurile x y exista un Ian! L(x,y) elx,
.., z, ... , y:, tar prin adauqarea muchiei [x.yjlantul se i nchide, torman d un ciclu Ceqx, ..., Z, . .. , y ,
x ) - ceea ee cont razice presupunerea ca graful este aciclic.
Propozit!a 7 . Daca un graf neorientat conex are n noduri m rnuchii, nurnarul de muchii
care trebuie eliminate, pent ru a obtine un graf partial eoncx aciclic , este egal cu m-n+1 .
nemon stratr e. Din Propozitia 6, rezutta CEl - i nlat urand din graf m-n+1 muchii - se obtine un graf
partial conex , iar din Teorema 16 rezulta ca acest graf este acidic. Graful fiind eonex , lnseamna ca
Intre oricare doua noduri. Xi Xj , exista un lant elementar 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
muchii care trebuie eliminate, pentru a obtine un graf partial aeie lic , este egal cu m-n+p.
Demonstratie. Fiecare cornponenta conexa i p) va avea nj noduri m, muchii, iar:
228 Implcmcnt urcn st r ucrur ilur de <l ate
I'
:;; i 2)n
j
= 111 .
;"'1
Nurnarul de muchii care trebuie eliminate din compon ent a conexa i , pentru a obtine un graf part ial
conex aciclic. este egal cu rn, - n: +1 (Propozina 7). Rezulta ca numarul total de rnuchii care trebuie
eliminate din grat, pentru a obfine graf partial conex acidi c, este egal cu:
I' II II
I(m, - n
i
+ I) = I Ill , - In, + P = m- 11+ "
j ", 1 j "' l i =]
Propozltia 9. Pentru a obtme, dintr-un gra! neerientat cenex, doua componente conexe,
nurnarul minim de muchii care trebuie inlaturate mmin este egal cu gradul minim din graf:
Hl mln = grad
mi n
.
Demonstrati e. Cele dOUE! componente conexe ale unui graf neorientat conex G=(X,U) S8 obtin astfel:
~ Componenta conexa C1=(X1,U1) S8 formeaza dintr-un nod izolat Xi - pent ru a elimina un numer
mi nim de mucnu, nodul S8 alege dintre nodurile care au gradul minim: X, ={Xi } ~ i U,=0 .
~ Campanenta conexa C2=(X2,U2) se forrneaza din restul nodurilor din graf: X2=X-{Xi} ~ i
card( U,}=rn-grad min
Teorema 17
Numarul maxim de muchii rn
max
dintr- un graf neorientat , cu n noduri ~ i p componente
conexe, este:
m = -,- I ' ,,- ' _- -'.I' :.c )_x-,: ( ' ,,- ' _- -'.1' _+:........:. 1)
ru3\ - 2
Dernon strati e - prin reducere la absurd. Numarul maxim de rnuchii corespunde unor p-1
componente conexe formate din naduri izolate s! a ccmponenta conexa fermata cu n-p+1 noduri.
Pentru ca sa se ab!ina nurnarul maxim de rnucttii. ultima componenta trebuie sa fie un graf complet
K
n
_
p
+, care are nurr-arul de much ii m:
(n -p) x (n -p +l )
III :::0 "--'-"-7'---'--"-
2
Sa presupunem ca exis ta Insa un graf format din p-2 componente conexe forma te din noduri izolate
~ i cu doua cornponente conex e C, cu n, noduri ~ i In, muchii ~ i C2 CU na noduri ~ i 1n2 muchIi, cu n , ~
n 2 ~ 2, n, + " 2 = n-p+2 care are numarul maxim de muchii m, + mz = mmax Cele doua componente
conexe pentru a avea un numar maxim de muchii trebuie sa fie qrafuri complete: C, =K
n
1 ~ i C2=K
n
2
Modificam acest qraf rnutand un nod din companenta C2 i n componenta C, . in componenta C, acest
nod trebuie unit prin much ii cu cel e n, noduri ale componentei. Nurnarul de muchii ale componentei
C, va fi m, + ", . in componenta C
2
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 m2- "2 + 1. Numarul
total de muchii al noului graf este In, + n, + m2 - ttz + 1 ~ 1n1 + m2 + 1 = mmax+ 1. Concluzia
contrazice ipoteza ca gratu l initial avea nurnarul maxim de muchii. lnsearnna ca graful care are
nurnarul maxim de muchii este cel care conune p-1 compo nente conexe formate din noduri izolate s!
o cornpcnenta 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 proprietat ea ca, pentru ori ce
pereche de noduri diferite i nt re ele, exi sta un drum care sa le lege.
Aillel 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
G'4
C3
-,
- -,
Fig. 28
C1
, - -
,
Daca un graf orientat G=(X,U) nu este tare conex , se poate
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
are proprietatea ca este tare conex.
Exemple:
1. Graful orientat G
20
= (X
20,U20
) , detinit anterior, este un graf tare conex, deoarece exista
un circuit elementar care trece prin toate nodurile grafului: (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:
-7 multimea nodurilor este X' 4=(1,2,3,4,5,6).
-7 rnultlmea arcel or 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 di n rnultimea C,=(1,2,3},
sau din rnultirne a C,=(6}.
Daca un graf G=(X,U) nu este conex, se nurn este componenta tare conexa a grafului
un subgraf conex C=(X' ,U') al sau, maximal i n raport cu aceasta 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 cornponenta 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 x
J
care nu apartine subgrafului C (XJ EX-X') .
Exem plu - i n graful orientat G24 defini t anter ior, fiecare dintre cele trei multirni de noduri -
C
1
, C
2
si C
3
- induce cate 0 cornponenta tare ccnexa.
Observatie : Un graf tare conex are 0 sinqura cornponenta tare conoxa (graful insusi) .
Terminologie:
-7 Subqraful predecesorilor unui nod este format din aceI nod si din multimea noduri lor
din care este accesibi l 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 acelui 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 subgraful succesorilor primului nod din primul arc (1n exemplu, nodul
1), folosind algoritmul de deter minare a unei componente conexe: S, =(1,2,3,4,5).
PAS2. Se identifica subgraful predecesori lor pri mului nod din primul arc (i n exemp lu,
nodul 1), folosind algoritmul de determinare a unei componente conexe, in care
se iau i n calcul numai nodurile care apar in arc in a doua pozitie: P1={1,2,3}.
PAS3. Se determine componenta tare conexa - prin intersectia celor doua rnult imi de
noduri: C
,=
S,n P, ={1,2,3).
PAS4. Se identifica, in multimea arcelor, primul nod care nu face parte din componenta
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 Implcrncnta rca struct ur ilor dc date
C3
Fig. 29
Fi g. 30
,
Algorilmi pentru delerminarea conexitatii grafurilor
1. Deter minarea componentelor conexe in t r-un graf.
Algoritmul. 0 components conexa este fermata din toate nodurile intre care exista un lant
elementar. Deoarece un nod nu poate sa apartina decat unei componente conexe, se va
folosi un vector cu n elemente - pentru a memora nodurile care au fast deja inregistrate intr-o
componenta conexa. Initial , elementele vectorului au valoarea 0 (nici un nod nu a fost
i nregistrat intr -o cornponenta conexa), iar daca un nod x va fi adauqat la 0 components
conexa, valoarea elementului x din vector va fi 1. Pentru a verifica dac a exi sta un lant
elementar intre dow! noduri x si y se folosese metoda backtracking.
sorilor nodul ui si apoi urmatoarea cornponenta conexa. prin intersectia celor doua
rnultirni (in exempl u, nodul 4 S2={4,5), P2={1 ,2,3A, 5} C2= S2" P
2
={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
components conexa. C,={6}.
Graful componentelor lare conexe ale unui graf care nu esle l are conex G=(X,U)
58 obtine prin reducer ea fiecarei componente conexe la un nod.
Identificarea grafului componentelor tare canexe este utila in rezolvarea unor prob leme,
prin descompunerea problemei in subprobleme (rezolvarea problernei pentru fiecare com-
ponenta tare conexa) combinarea solutiilor - strategia di vide et impera.
Exemplu:
in graful oriental G25= (X
25
,U'5) - figura 29 - definit astlel :
mult imea no durilor este X
25={
1,2,3A ,5,6,7}.
multi mea arcelor este U' 5 ={[1.2], [1A], [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} C,={?},
.' . iar graful componentelor tare conexe G
e2S
= (Xe2S,Ue2S) - figura
30 - este definit astfel.
mu lt irnea nodurilor este X
c25={
C
"
C" C,} .
rnultirnea arc elor este U
c25
={[ c, C
2]
, [C" C
,
I, [C" C
z]}
.
Observati e, Acest algoritm poate fi folosit atat in grafurile neorientate, cat si in grafurile
orientate. Mai poate fi folosit pentru a verifica daca un graf este conex: fie se verifica
daca intre nodul 1 si fiecare dintre celelalte noduri ale grafului exista un lant elementar , fie
se verifica daca prima components conexa obtinuta contine toate nodurile grafului.
Impl emenlarea al goril mul ui. Se citeste din fisierul graf19.txt matricea de adiacenta a unui
graf neorientat (varianta din fisierul graf20.txt - rnatricea de adiacenta a unui graf orientat)
se aflseaza componentele conexe. In vectorul v se mernoreaza nodurile care au fost deja
inregistrate tntr-o cornponenta conexa. Variabila este se foloseste pentru a verifica daca
s-a gasit un lant elementar intre coua noduri (are valoarea a - False, daca nu s-a gasit un
lant elementar). Variabila rn se foloseste pentru a nurnara componentele conexe identifi-
cate. Functia ci teste () se foloseste pentru a citi matricea de adiacenta din fisier. Functia
cornponen t e ( ) se foloseste pentru a afisa componentele conexe ale grafului: pentru fiecare
Informatica
231
nod x (1:5""n) care nu a fast afisat i ntr-o cornponenta conexa (v I x l =0), se cauta toate no-
durile y (1:5y:5n si y*x ) care sunt legate cu un lant elementar de nodul x . Pentru un nod y
gasit, se rnarcheaza i n vectorul v faptul ca a fast adauqat la a components conexa
(v [yJ Pentrutestarea programului se folosesc graful neorientat G, graful neorientat G
2
2.
#include <fs t r e am.h>
t ype def st iva[lOOJ ;
int a[20] [20] ,n,k,as ,ev, x , y ,v[20) ,este=O;
stiva st ;
f stream f ( "gr8a£19 . txt " , ios : : in) ;
void c.l t e s t e t ) {l i s e c Lt.est;e matricea de adi ecent a din r Ls Le r j
void init() {/ / i de nt i c a ell cea de 1a afi$area lanturilor elementare}
i nt succesor() {I / i dent i ca ell cea de 1a afi$area elementarel
int valid (} {I l i de nt i c a eu cea de 1a afi$area lanturilor elementare}
int so Lut.Le () {return st l k l ==y ; }
lI se obtine solu1;.ia atunci cand ultimul nod aciaugat in stiv;§. este y
void t i.pe r t ) {e s t e = l ;
Iidaed exista solut;.ie (un lant intre nodur ile x $i y ),
! /ve r i abi.La este va avea vaJoarea 1.
vo id bt(} { l l i dc nt i c a cu cea de 1a af i sa r ea Lant ur Ll.c r e Lemen t a r e }
void cOffiponente{)
{i n t m""' O;

if
(m++ ; v l x l e L,
c cut -ocvCompone n r a conexa "<cmcc": "<e x-ec" n ,

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 Lces t e t j • componente () ;}
2. Detenninarea componentel or conexe i ntr-un gr af oriental.
Algoritmui. 0 components conexa este fermata din toate nodurile i ntre care exista un
drum, eel putin de la un nod la altul (drumul nu trebuie sa asigure leqatura i n ambele
sensuri ). Altlel spus, daca exista un drum de la un nod x la un nod y , cele doua noduri x
y apartin aceleiasi componente conexe - chiar daca nu exista si un drum de la nodul y la
nodul x . $1 i n acest algoritm se foloseste un vector cu n elemente pentru a memora
nodurile care au fast deja lnreqistrate i ntr-o cornponenta conexa. Pentru a verifica daca
exists un drum de la nodut x la nodul y se tolososte mat ricea drurnurilor.
Pentru graful G
22
din Figura 26, i n matricea drumurilor se observe ca exists drum de la
nodul 1 la oricare celelalte patru noduri din grar. Graful are a sinqura cornponenta conexa.
5 4 3 2 1 . .
,
.
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
0 0 0 1 1
0 0 0 1 1
1
2
3
4
5
Impl cmentarca algoritmului. Se citeste din fisierul graf20.txt
matricea de adiacenta a unui graf orientat lii se determina
daca graful este conex. Oaca nu este, se afiseaza compo-
nentele conexe. in vectorul v S8 rnemoreaza nodurile care au
fast deja Inregistrate Intr-o components conexa. Functia
ci teste () se foloseste pentru a citi matricea de adiacenta in
fisier. Functia t ransforma () se foloseste pentru a transforma matricea de adiacenta in
matricea drumurilor. Functia component e () se foloseste pentru a afisa componentele conexe
ale grafului: pentru fiecare nod i (hi:5 n) care nu a fast afisat intr-o cornponenta conexa
232 Implcmcntareu st r uct ur ilur de date
(v [ i ] =O), se cauta toate nodunle j (1Sj'; n ~ i io'i) la care ajunge un drum ce porneste din nodul
i . Pentru un nod j gasit, se rnarcheaza in vectorul v faptul ca a fast adauqat la a cornponenta
conexa (v [j ] =1). Pentru testarea programului se foloseste graful orientat G" .
#include <fstrean.h>
typedef stiva[lOOl ;
int a(20] [20j,n,v[20] ;
fstream f ( "gra::20 . txt " , ios : : in) ;
vo i d c i. t c s te () {/ I se ci t e s t.e mer r tcea de ad.i acerrt.a din fi s ie r }
void transfonna ()
(for (int k=l i k<=n ;k++)
for (int i=l ; i <=n ;i++)
for (int j=l ; j <=n ;j++)
if (a [ i ] (j]==O && i !=k && j ! =k ) ali] [j]=a[i] [ k] ' a r k ] [j] ; )
void ccmponente(}
tint i ,j ,m=O;
for ( i nt i=l ;i<=n;i+T)
if (v[i)==O)
{m.... --- i v[i)=l ; c out-ccvCcn-ponent a ccnexe "<xmc-c'": " <x I -c-c " ";
for (int j =l ;j<=n ;jT+)
if l a [ i ) [jJ==l && i!=j) {v [ j J =L cout cc j c c" " ;)
call t«endl; } }
void main() {c i.t.ea t e t j : t rcns t'orma t j • corr.por.ente() ; }
3. Detenninar ea compon entelor tare conexe intr-un graf orien tal.
Algoritmul. 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 dej a 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 anta 1. Se folosese metoda backtracking.
Implementarea al gori tmului. 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- Fal se, 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 inregistrate intr-o components tare conexa. Variabila m
se foloseste pentru a numara componentele conexe identificate. Functia ci. teste () se folo-
seste pentru a citi matricea de adiacenta din fisier. Functia c omponente () 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 atid 233
#include <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 Lva s t :
f stream f( " g r a f1 9 . t x t " ,io:s : : i n };
void c i t e ste() {l i s e mat r i c e a de adiac en ;a di n f i s i e r }
void i ni t() {/ I :" de nt i ca ell cea de la drumur i l or elementare }
int succesor() {/ I i dent i ca cc cea de 1a drumurilor elementare }
int va l i .d () {/ / Ident i.ca eil c ea de la af i s e ree d rumurilor e Lement e r e I
int aoLu t i.e L) {re t urn s t[k] ===OY i }
lI se ob t i ne solutia atunei cand ultimul nod adaugat in stiva este y
vo i d t Lpe r () {e s t e =1;)
//da c3 exista (un intre nodurile x $i y j ,
// va r i a bi l a este va avea valoarea 1
void bt ( ) {/ i i d c n t i c 5 ell cea de La afi s ar-ee d r umu r i.Lo r e Lement e r c }
void coxponent e ()
l i n t i ,j , m=Oi
for ( i =li i <=n; i + +)
i f
{m++ ; v [ i ] = l ; cou t c c vCc mp o neri t a conexe " <c mc -cv : " <x i c c " II.
for ( j = l ; j <=n ; j t + )
if (j ! ;;o: i )
{z =i; y=j ; s t l l l e x • cstc;;o:O ; b tl) ; c s t.c l. ees 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 () ; )
_ .

Fig. 31
Matricea drumuri lor G22
1 2 3 4 5
Var ianta 2. Se fotoseste matri cea drumurilor. 5e deterrnina dOU8 matrice ale drurnurilor:
una corespunzat oare grafului G alta corespunzatoare unui graf i n care toate arcele au
sensul invers decal i n graful G (Gt - graful lranspus al grafului G). Din intersectia celor
doua matrice, se va obtme 0 matrice in care vor fi evidentiate numai drumurile care exista
in ambele sensuri, intre oricare doua noduri i j .
Pent ru graful Gn din figura 26, prin inversarea arcelor se obtine
graful transpus G22t din figura 31. Malricele de adi acenta matri-
cele drumuri lor pentru cele doua grafur i matricea intersectie sunt
prezent ate mai j os.
Matri cea de adiacenta G22
1 2 3 4 5
Matricea de adlacenta G22t
1 2 3 4 5
Matricea drumuril or G22t
1 2 3 4 5
1
2
3
4
5
1
2
3
4
5
0 1 0 0 0
0 0 1 0

1 0 0 1 0
0 0 0 0 1
0 0 0 1 0
0 0 1 0 0
1 0 0 0 0
0 1 0 0 0
0 0 1 0 1
0 0 0 1 0
1
2
3
4
5
1
2
3
4
5
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
0 0 0 1 1
0 0 0 1 1
1 1 1 0 0
1 1 1 0 0
1 1 1 0 0
1 1 1 1 1
1 1 1 1 1
1
2
3
4
5
Matri cea i ntersectie
1 2 3 45
1 1 1 0 0
e-!-
1 1 0 0
1 1 1 0 0
0 0 0 1 1
0 0 0 1 I 1
234
Implementa rea structurilor de date
Interpretarea datelor din mat ricea intersectie se tace astfel: doua noduri i j fac parte
din aceeasi cornponenta tare conexa - daca exista drum de la nodul i la nodul j
(a [i] [j] Pe matricea intersectie se pot identifica cele doua componente conexe:
C1={l, 2,3} C2={4,5}.
Impl 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 de la nodul j la nodul i , se obtine matricea b
care este intersectia celor doua matrice ale drumurilor: a 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 componente () se foloseste pentru a afisa camponentele 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 j o'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] Pentru testarea
programului se toloseste graful orientat G".
#include <fstream.h>
typedef s t i va [lOOj;
int a[20] [20 ] , n , v [20] ,ap[lDJ [ l D] , b [ l D] [ l O] , n r;
fstrearn f( "gre 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 predecBsor()
{for (int
for l i n t j=l ;j<=D;joHl april [j )=a[ j] I i ] ; }
vo.i.d vtr arre f'orrnej s.I )
{for (int k=l ; k<=n ;k++)
for {int i =1 ; i<=r: ;i++)
for (int
if( a l i ] [j ]==O && i! =k && j! =k) al i ] l le]*a [ k ] [j ] ; ]

(for (int k=l ; k<=n ; k++ l
for (int i=l ; i <=n ; i++)
for (int j=l ;j<=n ;jl- +I
if (a p l i ] && .i l e k && j !=k ) apri l [ J ) =a p [ i ] [ k ] *a p [ k] [ j] ; )
void i n t e r s e c t i e ( )
{for {int i =l; i <=Jl; .L++}
for l i n t b l i ] [j ] = as [i ] [j] *apli ] [j] ; )
void cornp'onerrt e ()
{for (int i =l ; i<=n ; i++)
if
( n r ++; v[i ] =l ; cout« endl«"Comp ooE: nt a "« nr«" : "« i.« "
for t i n t j=l ;j<=n ; j+·I:)
if (bli ] && i !=j l {coutx-c j c-c' ' ";
void main ()
{c i t e ste ( ); predecesor{)
i n t e Ls e c t i e ( ) ; componente() ; }
Infonnaticii
235
1. Scrieti un program care citeste din fisieru l text graf3.!x! (graf4.txt)
lista muchi ilor (arcelor) unui gral neorientat (orientat) - si care
verifica daca graful este conex ~ i afiseaza un mesaj de informare .
2. Scrieti un program care citeste din fisierul text graf14.!x! lista de
adiacenta a unui graf orientat - ~ i care verifica daca grafu! este tare conex si afiseaza
un mesaj de informare.
3. Cornparati , din punct de vedere al eflcientei , cei doi algoritmi de determinare a compo-
nentelor tare conexe dintr-un gral oriental.
4. Scrieti un program care citeste din fisierul text graf2.!xt mat ricea de adiacenta a unui
graf orientat - -?i care determine graful componentelor tare conexe !?i nurnarul minim
de arce care trebuie adauqate pentru ca gralul sa devina tare canex. Solutiile pentru
arcele care trebu ie adauqate S8 vor salva in fisierul text graf_comp.txt. lndi cati e: CeJe
p componente tare conexe vor f nodur i in noul graf - !?i vor fi reprezentate printr-un
vector eu p elemente de tip inregistrare:
struct camp {int n ;
int v flO] ; } ;
camp cIlO] ;
iar arcele vor fi reprezenate prin matrice de adiacenta . a cornponenta conexa , c [i]
are c [i] . n noduri ; un nod j al componentei i fiind c [i] . v [ j ] .
2.7.7 .7. Aplicatii practice
1. Din grupul de n persoane intre care s-au stabilit relatii de prietenie sl de vecinatate,
determinati grupurile de prieteni , grupurile de vecini si grupurile de vecini prieteni,
(Indicat ie. Se deterrruna componentele conexe pentru fiecare gral.)
2. Folosind informatiile din graful judetelor deterrninati nurnarul minim, respect iv numarul
maxim, de judete prin care trebuie sa treaca un turist care tranziteaza prin Romania,
stiind ca vine din Ungaria si trebuie sa ajunqa in Bulgaria. (Indicat ie. Se deterrnina un
lant de lungime minima , respectiv maxima, Tntre doua judete limitrafe, care sunt la
granila cu cele doua lari.)
3. Din gralul grotelor stabilif grotele care vor fi inundate de un parau subteran care izvoraste
dintr-o grata a carei eticheta se citeste de la tastatura. Precizati tunelul (sau tunelurile) prin
care paraul va ajunge In exteriorul muntelui. (Indicatie. 0 grata este inundata daca se
qaseste la acelasi nivel sau la un nivel mai jos decat 0 grata in care exists apa Se
transforms graful neorientat intr-un graf orientat, in care arcele vor pune in evidenta
relatia: grata x este in relatie cu grata y daca apa curge de la grata x la grata y. In acest
graf determinati toate drumurile care pornesc din grata din care izvoraste paraul).
4. i n reteaua de strazi a orasului, patru strazi se inchid pentru a fi reparate. Etichetele
intersectiilor care sunt legate de aceste strazi se citesc de la tastatura . Sa se verifice
daca prin i nchiderea acestor strazi nu se izoleaza unele zone ale orasuiui de alte zone.
(lndlcat ie. Se genereaza graful partial al traficului , prin eliminarea arcelor dintre nodurile
preci zate ~ i se verifica daca graful obtinut este tare conex.)
2.7.8. Parcurgcrca grufului
Parcurgerea grafului reprezinta operat ia prin care sunt examinate in mod sistemat ic
nodurile sale , pornind de la un nod dat i , astl el lncat liecare nod accesibi l din nodul i pe
muchiile (arcele) adiacente sa fie atins 0 sinqura data. Vecinii unui nod sunt repreze ntati
de toate nodurile adiacente lui si accesibile din el.
236 I mpl crncntarca struct urllor de date
Fi g. 32
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
nodurile:
Vizitarea sau traversarea unui graf este operatia prin care S8 parcurge graful trecandu-se
de la un nod i (nodul curent) la noduri Ie vecine lui, intr-o anurnita ardine, in vederea
prel ucrarii inforrnatiilor asocia te nodurilor. Pentru parcurgerea grafurilor , exista urrnatoa-
rele doua metode:
1, Metoda de parc urgere "i n l ati rne" - Breadth First (BF). Se vizi teaza mai Intai un nod
initi al i, apoi vecinii acestuia . apoi vecinii nevizitati ai acestora, 9i asa mai departe -
pana cano se parcurg toate nodurile grafului .
2. Metoda de parcurger 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" Exempl u - pentru graful neorientat G" = (X'6,U'6) - figura 32 - definit astlel:
-7 mult i rnea noduril or este X
26={1
,2,3,4,5 ,6,7,8,9j.
-7 rnultirnea rnuchi i lo 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]}
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
2,7,8.1. Parcurgerea in latlme - Breadth First
Pentru aceasta metoda de parcurgere a unui graf cu n noduri, S8 folosesc urrnatoarele
structuri de date si date elementare :
1. Vari abil ele de memori e: n pentru nurnarul de noduri al e grafului, k pentru nodul care
58 prelucreaza. i si j pentru parcurgerea matricei de adiacenta si a vectorilor.
2. Matri cea de adlaca nta a graf ul ui a.
3. Vect orul de vizit are vi z i tat . EI contine n elemente in car e S8 i nreqistreaza nodu-
rile vizita te. Elementele vectorului vizi tat [i] sunt definite astfel:
. it t "1 { 1, daca no dul i a fast vi zitat
\'I ZI a I =
0, daca nodul i nu a fo st vizit at inca
4. Coada de asteptare c a noduril or parcurse. Coada de asteptare c gestioneaza nodurile
prelucrate. Pentru coada de asteptare se foioseste implementarea statica cu un vector c
cu n elemente. Pentru gestionarea cozii de asteptare S8 folosesc doua variabile de
memorie p rim si ul tim care joaca rolul de indicatori pentru a memora adresa primului
element din lista (capul cozii) ~ i , respectiv, adresa ultirnului element din lista (coada cozii).
i n aceasta coada de asteptare vor fi inregistrate nodurile vizitate, in ordinea i n care au fast
vizitate. Initial , caada de asteptare contine un singur element care corespunde nodului cu
care lncepe parcurgerea qrafulul, iar valoarea indicatorilor p rim ;;i ul t im este 1. Pe
rnasura ce se parcurge graful , se cornpleteaza urmatoare.e elemente ale vectorului c.
Atunci cand se prelucreaza un nod k de la capul cozii de asteptare, prin coada cozii de
asteptare se introduc toate nodurile i vecine cu nodul k care nu au fast vizitate Inca.
Al gori tmul pentru parcurgerea grafului este urrnatorul:
PAS1 . Se citesc din fisier , valoarea pentru variabila n ~ i matricea de adiacenta a grafului.
Inf ormatiea
237
10
10
10
pri m= 3 e> ul t i rn=7 .
1
3
:H. I 1
1
C
C
v.i z i t ; ' _
v i z i t a t I I I ' ! ! ! _ ! ... I ... I
v izitat I I I • ! ' ! ! I U I U ! U I U I
C
PAS2 . Se initi atizeaza cu 0 elementele vectorului de vizitare vizi tat , deoarece initi al
nici unul dintre noduri nu a fast vizitat.
PAS3. Se int roduce de la tast atura valoarea variabilei de memori e k . corespunzatoare
primului nod eu care incepe parcurgerea grafului.
PAS4. Se lnitializeaza coada de astept are c (indicatorii continutul primului element intra-
dus i n coada de asteptars), astfel: pr Ime-L, u l l}i c [prim] «-k, deoarece,
in coada de asteptare c este i nregistrat doar nodul k cu care incepe parcurgerea.
PASS. Se actuali zeaza vect orul v i zi tat - atribuind elementului k al vectorul ui
valoar ea 1, deoarece a fost vizitat (v i z i tat [k] <-1).
PAS6. Cal li mp coada nu este vida (pr im<=u1 tim) executa
PAS7. Se extrage urrnatorul el ement di n coada de asteptare, corespunzator
nodu lui caruia i S8 vor vizita vecin ii (k e-.c [pr J.m] ;) .
PASS. Pentru toate nodurile i vecine ale varfu lui k, nevizitate inca , executa
PAS9. Se incrementeaza valoarea indicatorului u l t i m, pentru a inregis-
tra urrnatorul nod care va trebui vizitat prin adauqare la coada
cazii de asteptare [uLt irnt-ul tim+1 ; ).
PAS10Se acauqa la sfarsitu l cozii de asteptare c , nodul i vecin nodului
k care nu a fast inca vizitat (c [ul tim]
PAS11 Prin adauqarea nodului j la coada de asteptare c se considers ca
acest nod a fost vizitat - !?i se actualizeaza elementul din vectorul
de vizitare care corespunde acestui nod (v i z i tat [i] <- 1 ; ). Se
revine la Pasul 6.
PAS12Se preqatest e indi catorul prim pentru a se extrage urrnato rul nod din
coada de asteptare , ai carui vecini vor fi vizi tati (pr-Lme-pr-Lm- t r ). Se
revine la Pasul 7.
PAS13Se afisea za lista nodurilor vizitate, i n ordinea in care au fost vizitate, prin extrage-
rea lor din vectorul c , porni nd de la elementul 1 pana la elementul n.
Pentru graful G
26
• pornind din nodul 1. nodurile in coada de sunt adauqate astfel:
v izitat 1 0 0 0 0 0 0 0 0
1 2 3 4 5 6 7 8 9 10

C L...:.. 1-'-_ .,....,J__
l nit ializarea cozii de a;;teptare cu primul nod: prirn= l ; ul tim=l.

10
Prelucrarea nodul ui: prim=5 ~ ul tim=B.
c
Implemen tarea st ru ct uri lur lie dat e
c
vizi ta t '--'--'--::--.J'---:--'--'--'-O--'--:--'_,O--'--:--'---'o----'
238
vizi ta t '--'--'--::--.J'--:---'---'--'-o--'--:--'_,o--'--:--'_,,:-,
c
Pr elucrarea nodului : prim=6 e> ul t i m=9.
10
v izi ta t L--'---'----'----.JL--'-----'-----'-----'_-'----'-----=---'_,-'----L----=---'- '------'
c
c
vizi ta t ' - - ' - - ' - - : : - ~ ' - - - : - - - ' - - - ' - - ' - o - - ' - - : - - ' _ , o - - ' - - : - - ' _ , ' : - '
c
prim=9 :..:::- u l tim=9.
10
10
10
prirn-1 0 ::::::) ul tim-9. Tcnninarc: prirn>ul tim
Pentrn implementarea algoritmului se loloses c subprogramele:
-7 functia procedural a ci teste creeaza matri cea de adiacenta, prin preluarea infer-
rnatiilor din fisierul f (di mensiunea matricei de adiacenta l? i matricea);
-7 functia procedurala ini t init ializeaza coada de astepta re cu primul nod vizitat ;
-7 functia operand este_vida testeaza coada de asteptare daca este vida;
-7 lunclia procedurala adauga adau qa un nod la coada de astepare:
-7 funct ia proce durala e limi n a elimina nodul prelucrat din coada de asteptare:
-7 functia procedurala prelucrare prelucreaza primul nod din coada: adauqa la coada de
asteptare tal i vecinii nevizitati ai acestui nod ~ i apoi iI etimina din coada de asteptare:
-7 functia procedurala afisare afi seaza nodur ile graful ui i n ordinea prelucr arii.
Pentru testarea programului, S8 toloseste graful neorientat G26, a carui matrice de adia-
centa se ci teste din fisieru l text graf21 .txt.
int n , a [10] [10] , vi z i t a t [20) , c [20] , p r i m, u Lt Irn , 1: ,
fstream f{ "graf21 .t: xt " , i o s : :in) ;
void citeste() {l i s e c i t.es t.e ma t r i.cea de adi e cen t.a din f Ls Le r }
void init( i n t k) { p r j mcuLt.Lmcl , c l u Lr Lml e k: v i z i t a t l k l e- Lr I
I II for matid 239
i n t est e v i d a ( ) {return ul t im<pr i m; }
vo id ada uga ( i n t i) ( u l t i m++ ; vi zitat [ i] =l ; )
vo id e L'im.i ne () {p r i m++;}
voi d pre luc ra r e()
ti nt i ; k=c[pr im ] ;
for i f (a [ k J [iJ ==l && v i. z i t a t l i j ecOj adauga l i ) ;
el im i na{} ; }
void e r Ls e r e ()
{for {i nt i =1 ; i <=n; i ++} cout« c [ i ]«" ";}
void main()
( c i t e s t e () ; c o u c-ccvn o d d e p o r n i r e: "; c in» k; i n i t ( k) ;
while ( ! e s t e vida()) p r e l u crare{) ;
c out «"Nodu r i l e v i z i t a t e prIn metoda BF sunt : "«endl ; a f i s a r e() ; }

/\ tcnric Prin parcurgerea in l ati rne a unui graf , det erml nati l anturil e, res-
. pectiv drumurile de lungime minima.
Cornplcxitatca algoritmului de parcurgcre in latirne
Algoritmul const a i n eliminarea unui nod din coada de asteptare "i adauqarea vecinilor
(succesorilor) sai in coada 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. Complexitatea
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 nodul este
eliminat din coada de asteptare. Nurnarul total de vecini exarninati este egal cu m -
nurnarul de muchii (arce) ale gra!ului. Complexitatea operatiitor de adauqa re de noduri
este O(m). Comp lexitatea algoritmului este liniara O(m+n).
Determinarea drumurilor de lungime minima, intre oricare doua noduri din
gra!, cu ajutorul algoritmului de parcurqero in latime
Al goritmui. Pentru a gasi drumurile de lunqime minima care pornesc din fiecare nod, se
va parcurge gra!ul i n latirne de n ori (parcurgerea se va face pornind din fiecare dintre cele
n noduri ale gra!ului). Pentru a putea reconstitui drumul, se foloseste un vector (p) - pentru
a memora predecesorul unui nod in parcurgerea i n la\ime:
lrnpl ementaroa algoritmului. Se citeste, din fisierul graf21./x/, matricea de adiacenta a a
gra!ului neorientat G' 6. Se afiseaza drumurile de lungime minima dintre noduri. Se !olo-
seste variabila globala x , pentru nodul din care porrneste drumul, si implicit, parcurgerea in
latirne a gra!ului. Functia zero () se toloseste pentru a initiaiza cu valoarea 0 vectorii
v i zi tat si p inainte de a i ncepe 0 noua parcurgere a grafului, pornind din nodul x.
Functia adaug () a fost modificata prin adauqarea instructiuni i de actualizare a vectorului p
la adauqarea unui nod i n coada de asteptare (i n elementul corespunzator nodului vizitat i
S8 mernoreaza predecesorul sau in parcurgerea in latime - nodul k). Functia a fiseaza ()
S8 foloseste pentru a afisa drumurile de lungime minima de la nodul x pana la fiecare dintre
celelalte noduri ale gra!ului. i n aceasta functie se Iolosesc urmatoarele variabile locale: i -
pentru a parcurge coada de asteptare "i vectorul d: j - pentru a parcurge nodurile gra!ului
(aceste noduri sunt nodurile destinatie ale drumurilor care pornesc din nodul x ): d - un
vector in care se rnernoreaza nodurile drurnului (nodurile sunt inregistrate in ordine inversa:
240
Implcmenta rca structurilor de datc
de la predecesorul nodului j pana la nodul x); y - pentru predeceso rul unui nod si este -
a variabila de tip logic, pentru a verifica daca exista drum de la nodul x la nodul j.
Vectorul p
nod 1 2 3 4 5 6 7 8 9

#include
typedef sLiva[l OO] ;
int a [ 10j [ 1 OJ f vi z i .t.a t. [10 J,c [1 OJ, P l l OJ I n , p rim, u l tim, k I x ;
f s tre 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 adLac.ent a din f i$ier )
void ze r o() {for (i n t i=l ; i<=n;i++) {vi z i t e t Li.Le O', p[il =D; }}
void i n :if(i n t k ) [;Jl t i rn] .:= k ; '.Ii z i t a t lkl =l ; p [k ]=O; }
int est e j v i de () {return u Lt i.mcp.r Lmr }
void a d aug( i n ti, int }c) {u l t i rn++; c l ul t imj-ei , v i zi t .at Li l e l. : p[iJ .=k ; }
voi d p r e l uc r a r e ( )
{i n t i ; kvcLpr jml •
for (i;;;ol ;i<=Di i +-l ) i f L a j k ] [ 1 ] = = 1 && v i z lta t L i ls.eO ) a d auq l Li kr ,
prim++ ; }
void a r i s a re ( )
li nt i ,j , e st e , y ,d[lO) ;
cout-c-c't Drumu.I minim care porne s t e d .i n 'nod u I "« x« " : "<xend.l :
for {j =l ; j <e n : j++)
i f ( j !=x )
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 {y=p [j ]; i=O ;
while ( '1) ( i t +; d[i }=.y ; y=-p [ y] ; )
for (;i>=l ;i- - ) cout« d [ i ]«" "« j«" "; }
else cout.-oc vri u ex i.s t a d rum" ;
cout« endl ; }
cout«endl; }
void main ()
{ c Lt. es t e () ;
cou t-ocvDr-umur i.Le de LunqLme mi nimaintr e doua nodur i. sunt : "<Xerid.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 isare () ; } }
2.7.8.2. Parcurgerea in adancirne - Depth First
Pentru aceasta metod a de parcurgere a unui graf cu n nodur i se folosesc urrnatoarele
structuri de date date elementare:
1. Var i abil ele de memori e. n pentru nurnarul de noduri ale grafu lui , k pent ru nodul
care se pretucreaza, i j pentru parcurgerea matricei de adiacenta si a vectorilor .
2. Matri cea de adl acenta a gr afului a.
3 . Vectorul de vizitar e v izi tat. EI contine n elemente i n care S8 tnreqist reaza
noduriIe vizit ate. Elementel e vectorului vizi tat [i] sunt definite ca in metoda
precedenta de parcurgere.
4. Stiva st a nodurilor par curse. Stiva st gest ioneaza nodurile vecine parcurse in
adaricime. Pentru gestionarea stivei se Ioloseste variabila de memo rie vf pentru a
identifica ultimu l nod intrat in stiva. Pentru stiva se folosest e impl emen tarea staticacu
Informaticii 241
un vector st CU n elemente. in stiva vor fi Inreqistrate, In ordine, noduriIe vizitate in
adancirne, pe 0 directie Initial, stiva contine un singur element care corespunde
nodului cu care incepe parcurgerea grafulu i, iar valoarea vari abilei vf este 1. Pe
rnasura ce S8 parcurge graful , S8 completeaz8 urrnatoa rele elemente ale vectorului
5 t . Atunci cand S8 prelucreaz8 un nod k , pe la varful stivei S8 introduc in stiva toate
nodurile i vecine cu nodul k care nu au fost vizitate inca.
Algaritmul pent ru parcurgerea grafului este urrnatorul:
PAS1 . Se citesc di n fisier valaarea pentru n matricea de adiacenta a grafului.
PAS2 . Se lnitiallzeaza cu 0 elementele vectorului de vizitare v i zi t at, deoarece nici
unul dintre noduri nu a fost vizitat.
PAS3 . Se introduce de Ja tastatura valoarea variabilei de memorie k , corespunzatoare
primului nod cu care incepe parcu rgerea grafului , si se afiseaza eticheta lui.
PAS4 . Se initiallzeaza stiva st (varful si continutul varfului stivei ), astfel: vf<--l;
s ti l v f l e-ck : deoarece lnitial in stiva st este inregistrat doar nodul k cu care
inc epe parcurgerea.
PAS5. Se actualizeaza vectorul vizitat atribuind element uJui k al vectorului valoarea
1, deaarece a fast vizitat (vi zi tat [k] <--1).
PAS6 . Cat timp stiva nu este vida (vf<>O) executa
PAS7. Se extrage din varful stivei , elementul corespunzator nadului caruia I se
vor vizita vecini i (k e-e t. [vf] ;).
PAS8 . Se initlalizeaza nadul i cu care lncepe cautarea (i<-- l;).
PAS9. Cat timp nu s-a gasit un nod i vecin nodului k , nevizit at inca (i <=n ;;i
(a[i ] [ k ] =O sau (a[i] [k]=l vizitat[1]=1))) ex ecu ta
PAS10. Se trece la urrnatorul nod, in vederea verificarii se
revine la Pasul 9.
PAS11. Daca nu s-a mai gasit un nod i vecin nodului k nevizitat inca, atunci se
elirnina nodul k din stiva, prin coborarea varfului stivei altfe l se
afiseaza nodul gasit i , se adauqa in varful stivei st [vf]
si se actualizeaz a elementul din vectorul de vizitare care corespunde acestui
nod, deoarece prin adaugarea nodului i la stiva st se considera ca acest
nod a fast vizitat (v i z i tat [i] <--1; ) se revine la Pasul 6.
Pentru graful G'6, parni nd din nadul 1, naduril e i n stiva sunt adaugate as\fel :
vizi ta t IT1 0 I 0 I 0 I 0 I 0 I 0 1 0 I 0
1 2 3 4 5 6 7 8 9 10
st •• I 1==r_ :::J
l nitializarea stivei cu primul nod: vf-l.
v izitat I 1
1
1
I
0
1
0
I
0
I
0
1
0
1
0
1
0
1 2 3 4 5 6 7 8 9 10
st
1
1
1
I
1 I 1
I
1 I
J
Prelucrarea nodulu i: vf- l ::::? vf-2.
vizitat I 1
I 1
I
0
1
0
1
1
I
0
1
0
I
0
1
0
1 2 3 4 5 6 7 8 9 10
st

I
I

Prelucrarea nodului: vf=2 <> vf=3.
vizi tat I 1
1
1
I
1
I
0
I
1
I
0
I
0
I
- 0-10
1 2 3 4
5 6 7 8 9 10
st
1
1
1
2
I
5
I
3
I
::I.
I
r:=:::=:r
Prelucrarea nodului: vf=3 => v f=4 .
242
Implementurca st ru ct ur ilor de date
vi zi t at I 1 1 1 0 1
I
1
I
0
I
0 0
1 2 3
4
5 6 7 8 9 10
st 1
I
2
I
5
I
3
I
6
I
I I
Prel ucrarea nodului: vf=4
=>
vf=5 .
vi zita t I 1
I
1
I
1
I
0
I
1
I
1
I
0
I
1
0
1 2 3 4
5
6 7 B 9 10
st 1
I
2
I
5
I
3
I
6
I
8
I
I
Prel ucrarea nodului: vf=S c> vf=6.
v i z ita t I 1
I
1
I
1
I
0
I
1
I
1
I
0
I
1 0
1 2 3 4 5
6
7 8 9 10
st 1
I
2
I
5
I
3
I
6
I
8
I I
Prelucrarea nodului: vf-
6
:::::;. v f=5 .
viz itat I 1
I
1
I
1
I
0
I
1
I
1
I
0
I
1
1
1 2 3 4
5
6 7 8 9 10
st 1
I
2
I
5
I
3
I
6
I
9
I I
Prelucrarea nodului: vf=5 ::::::> vf= 6.
vizitat C1
I
1
I
1
I
0
I
1
I
1
I
0
I
1 1
1 2 3 4 5
6
7 8 9 10
s t 1
I
2
I
5
I
3
!
6
I
9
I I
Prelucrarea nodului: vf =6 c> vf= 5 .
vizitat I 1
I
1
I
1
I
0
I
1
I
1
I
0
I
1 1
1 2 3 4
5
6 7 8 9 10
st
n I
2
J
5
I
3
I 0 I
I
Pre lucrarea nodului: vf=5
v izi 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
Prel ucrarea nodului: vf _4 e> vf=5.
v i z i t a t 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
s t 1
I
2
I
5
I
3
I
7
I
4
I I

Prelucrarea nodului: vf=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
s t

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
s t 1
I
2
I
5
I
3
I
I I
I
Prelucrarea nodului: vf- 4 ::::::> v f-3 .
vizitat 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 5
I
I
I I I I
Prelucrarea nodului: vf::::: 3 c> vf=2 .
conditia structurii repetitive
i l I i
III formaticii 243
v i z i 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 : vf-2 => vf-l .
v izitat I 1
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
s t
I
1
I 1
I
I 1 I I 1
Prelu crarea nodului: v £ = l => vf=O. Term inar e: vf=O
Pentru implementarea 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 procedurala ini t lnitializeaza stiva cu primul nod vizitat;
-7 functia operand este_vida testeaza stiva daca este vi da;
-7 functia procedural a adauga adauqa un nod la stiva:
-7 functi a procedurala el imi na eli rnina nodul din varful stivei;
-7 functia procedurala pre l u crare prelucreaza nodul din varful stivei : cauta primul
veci n nevizitat daca un astfel de nod, i l afiseaza i l adauqa i n stiva:
altf el, nodul din varful stivei este eliminat (nu mai are vecini nevizitati) :
Pentru testarea programul ui se foloseste graful neorientat G
26
a carui matrice de adia-
cents se citeste din fisierul text graf21.txt.
Observati e. Pentru grafurile orientate, i n functia p relucrare ()
while este: Lcen ss I la[ k] I I ali]
a l i ] && v Lz i r et l i l e s Lj )
int n ,a [l O] [l Ol ,v i z i t a t r20 J ,st f2 0 1,v£,k;
fs t ream f ( " g :-a f21 . t x t " l i a s : : in) ;
v o id c i t e s t e() { l i s e c Lt est e matricea de adi acent.a din f i.s i.e r I
void 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 na () { v f - -;}
voi d preluc ra re( )
t i n t i.=l; k=st (v f ] ;
while && (a (k ] II la (k] && v.i zi t at l Ll e -e ll l ) i ++;
if (i==n+l) e limi na ( ) : e lse {cou t« i«" "; adauga(i ); } }
v oid ma in ( )
{c i t e s t e ( ) ; cocti-oc't n odu I de p o r n Lre : " ; cin» k ;
cout «"Nodu r i l e vlzitate prin met oda DF s un.t : "«endl;
oouti-c-ck-c-c" " ; init (k) ;
whil e ( ! e s t e _ v i da() prelucrare() ; }
Prin parcurgerea in adancime a unui graf detenni nati nodur ile
f tcnne care apart m acelei asi componente conexe, respectiv
de succesori ai unui nod .
Complexitatea algoritmului de parcurgere i n adancirne
Algoritmul consta i n extragerea unui nod din stiva adauqarea vecinilor (succesorilor) sai
i n 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
Implemcntarea st r uct ur i lo r!l c date
operatiilor de eliminare a celor n noduri din stiva este O(n). Pentru a adauqa noduri i n 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. Complexitalea operatiilor
de adauqare de noduri este O(m). Complexilatea algoritmului esle liniara O(m+n)
Determinarea conexi tatii grafurilor cu ajut orul algor itm u! ui de parc urgere in
adancime
1. Afi sarea componentalor conexe dinlr-un grato
Al gor itmui. Jdentificarea rnultimii de noduri care forrneaza 0 components conexa S8 face
parcurqand i n adanclrne gratul pornind de la un nod initial. Nodul cu care incepe parcurgerea
i n adancirne pentru 0 cornponenta conexa S8 cauta printre nodurile nevizitate inca. Graful S8
va parcurge in adanci rne pana cand vor fi vizitate toate noduri le. Daca graful este conex , S8
va afisa 0 sinqura cornponenta conexa - care va fi fermata din toate nodurile grafului.
Implemenl area al goril mul ui . Se citeste din fisierul graf2 1.txt matricea de adiacenta a a
qrafului neorienl al G26 se afiseaza loale componentele conexe ale gratului. Pe langa
variabilele sl structurile de dale tolosite de algoritmul de parcurgere in adancirne se mal
foloseste variabila globala m, pentru a nurnara componenlele conexe. Penlru a gasi nodul cu
care se initializeaza parcurgerea se foloseste functia cauta () care cauta primul nod
nevizitat, i n ordinea etichetelor nodurilor.
int n ,a[IOj
f s t r e a m f ( "gra f21 . ::'XL " , .i. o s : : in) ;
void c i t e s t e r ) {l i s e c i t e s c e mct r t cee de adjacen t a din f i s i.e r ]
i nt c a u t a ()
{f o r (i n t i=l ; i<=r:. ; i++ ) if (vi z i t at(i]==O) return i ;
r e t urn O; }
v o i d init{ i n t k ) {v f =1; st[vf} =k ; v i z i t e t l k l e-Lr I
int este_v i d a{) {ret u r n v f ==O; }
void adaug( i n t i) {v f ++; s t j v f l e i , v t z i.t.a t Lt j e l , }
v o id e Li mi n () {v : - - ;}
v oi d prelucr are{)
tint i=l ; k=s,,::vf] ;
whi le (i<=:1 && (a[K] [ i] ==O I I (a[ il[k}==l i s, vt zLce t Li j -v-Lj j j i++ ;
if (i-"'=n+l) elirnin() ; e lse { c ou t.c -ci c -c'' It ; ac a uq Li Lr } }
void main{)
{c i t. e s t e ( ) ; k e c au t a t r :
whi l e (k )
{mtt : i ni t (k ) ; cout«endl«"Compone n t a conexa "<x moc" : "<ck-oc " " .
while prelucr are() ;
o . }}
2. Afl saroa component el or tare conexe dintr-un graf oriental.
Algorit mui. Nodul cu care incepe parcurgerea in adancirne pentru a components tare
conexa se cauta printre nodurile nevizitate inca. Pentru acest nod S8 determine multimea
nodurilor care torrneaza subgraful succesorilor si multimea nodurilor care formeaza
subgratul predecesorilor. Prin intersectia celor doua subgraturi (rnuttirni de noduri) se obtine
componenta tare conexa. Identiflcarea celor doua rnultirni de noduri S8 face parcurqand in
adancime gratul pentru fiecare rnultirne, pornind de la un nod initial. Un nod se considera
[II forma tic a
245
vizitat numai daca a fast adaupat la 0 components tare conexa. Prelucrarea componen-
telor tare conexe prin parcurgerea i n adancirne a grafu[ui S8 va face pana cand vor fj
vizitate toate nodurile. Daca graful este tare conex, S8 va afisa 0 singura components
tare conexa care va fi fermata din toate noduri Ie grafului.
Imp lementarea algoritmului. Se citeste din fisierul graf20.txt matricea de adiacenta a a
grafului orientat G22 S8 afiseaza toate componentele tare conexe ale graful ui. Vectorii
pred 9i succ S8 foJosesc pentru a determina subgraful predecesorilor, respectiv
subgraful succesorilor nodu lui care S8 prelucreaza. Vectorii au n elemente. Fiecare
element i are valoarea 1 daca nodul i apartine subgrafului predecesorilor, respectiv
subgrafului succesorilor; altfel, are valoarea O. Functia zero () S8 toloseste pentru a
initializa cu valoarea 0 vecto rii pred si SliCC i nainte de prelucrarea unei componente tare
conexe. Pent ru a gasi nodul cu care se lnitlalizeaza 0 cornponenta tare conexa. se
tolcseste functia cauta () care cauta primul nod nevizitat, in ordinea etichetelor nodu-
rilor. Functiile prel ucrarel () :;; i prel ucrare2 () se folosesc pentru a parcurge graful
in adancirne in vederea deterrn inarii subgrafului predecesorilor, respectiv subgrafului
succesori lor nodului care se prelucreaza. Funct ia comp () se foloseste pentru a deter-
mina nodurile unei componente tare conexe prin intersectia vectorilor p.r ecl si succ.
int n ,a (l OJ IIO} ,vlzi tat [20 J ,st [20] ,vf , ITt ;
fstream i"( "graf20 .txt " , i o s : :in)·;
void ci t e s t e () ( l i s e c.l t e s t.e ma t r Lcee de -adfacent a din f i s Le r I
int ceut c () {I / e s t e .rdent Lc avcu cea deiLe exempIuI anter ior }
void z.e r o Li. n ti vx l ] -) {for {int i -=:= l ;i<=n ; i ++ } x[ i 1=O ; }
void init( i n t k ) {vf=l; s t[vfl = k ; }
int {return v f ==O ; }
void a deuq t a n t; i, i n t X l ]) {v f ++; st[vf] "='i;
void e Li ni.i n ( ) {v f --;}
void prel ucra rel ( i n t x [ J )
lint x I.k l e L,
while && (a[i] I I ( a [ i ] && i ++;
i f else adaug {i ,x) ;}
void pre lucr a re2( i n t x [])
lint
while && ( a [ k ] II l a[ k] && i ++ ;
if elimin ; else ada ug (i ,x ) ; }
void comp (i n t x I l . int y[ ])
(for (int
if ( x [ i ]"==l && y [ i ]== l) {cout.c-c i -oc " ". v t z i t ab l i j e l r j j
void main ()
lint k ,pred[lO] ,succ [lO] ;
c iteste ( ) ; k=cauta () ; m++; cout.ocvc omp one nt e I e t ars conexe : "<Xe nd 'l ,
wh ile ( k )
[cout«endl« m«": " ; i ni t ( k) ;zero (p r e d j ;
while pre l ucrarel(pred) ;
init(k) ; zero( s ucc ) ;
while ( !es t e..:..y i d a ()) p r e Luc r a r e Z ( s u c e) ;
comp Lp r-c d r s uccl : k=cauta() ; m+l:- ; } }
246 Implcmc ntarca structuril or lie date
1. Scriet i un program care citeste din fisierul text graf4.txt lista arcelor
unui gral orientat care. folosind algoritmul coresp unzator de par-
curgere a unui graf orientat, realizeaza:
a. Afiseaza lanturile de lungime mi nima dintre noduri.
b. Verifica daca doua noduri x y apartin aceleiasi componente conexe (sl variants. apar-
l in aceleiasi componente tare conexe). Etichetele nodurilor se citesc de la tastatura,
c. Veriflca daca graful este tare conex si afiseaza un mesa] de informare.
2. in nodurile unui graf S8 pastreaza numere naturale. Graful pune i n eviden ta divizorii unui
nurnar, astlel: numarul x memorat i n nodul i este i n relatie cu nurnarul y memorat in nodul
j, daca nurnarul y este divizor al nurnarului x. Sa se verifice daca i n gral se gasesc toti
divizorii unui nurnar p citit de la tastatura . (l ndicatie. Se parcurge mai i ntai gral ul, pornind
de la nodul eu eticheta 1 - pentru a qasi nurnarul - si, Tn cazul in care S8 S8 reia
parcurgerea grafului pornind eu nodul in care s-a gasit numaru l - S8 verifies daca au
fost gasiti toti divizorii. Pentru testarea programului S8 va crea un graf al divizorilor care
contine urrnatoarel e numere: (2,3,4,5,6,9,12.15,18.20,38} si se vor cauta divizorii
nurnarului 36 si apoi ai nurnarului 20.
2.7.8.3. Aplicatii practice
1. Din grupul de n persoane i ntre care s-au stabil it relat ii de prietenie, afl sati cel mai
mare grup de prieteni . (l ndicatie, Se deterrnina componenta conexa care confine cele
rnai rnulte noduri).
2. Din grupul de n persoane i ntre care s-au stab ilit relatii de cunostinta, afisati grupul
format din cele mai multe persoane care se cunosc reciproc. (ln dlcatie, Se deterrnina
componenta tare conexa care contine eele mai multe noduri.)
3. Din gralurile care pun in evidenta relatiile de vecinatate de prietenie ale satenilor care
au fanete , obtineti urmatoarele inforrnatii:
a. Care sunt satenii cei mai l ndepartati de drumu l satesc . (Indicati e. Gasi ti eel mai lung
lant din lanturile de lungime minima din graf ul fanetelor. )
b. Care sunt satenii izolatl. (l ndi cat ie. Satenii care nu se gases c in gralul de vecinata-
te i ntr-o components conexa i n care se afla un satean cu iesire la drumu l satesc .)
4. Din gralurile care pun in evidenta sosele din zona turistica, stablliti cate localitati raman
izolate daca se distr uge un pod pe care trece soseaua care leaqa doua localitati ale
carer etichete se citesc de la tastatura.
5. In reteaua de strazi a orasului, stabilit i eel rnai scurt drum intre doua intersectii ale carer
etichete se citesc de la tastatura.
2.7.9. Graful pondcrat
2.7.9.1. Dofinitia grafului ponderat
Consideram un gral G=(X.U) 0 functie I :U-> R+ care asociaza fiecarei muchii (arc) u un
nurnar real pozitiv (care poate avea sernnificatia de cost, dlstanta, timp, durat a). nurnita in
general costul muchiei. Functia f se numeste functia cost
Un graf G ={X,Uj pent ru care s- a defi ni t 0 functle cost se numeste pondorat
Observatii :
1. Graful ponderat se mai nurneste si graf cu costuri.
2. Grafurile ponderate se folosesc in aplicat ii i n care trebuie deterrninata valoarea
minima sau valoarea maxima a unei rnarirni asociate grafului, adica a functie i cost.
Informatica 247
3. Se defineste costul unui drum de la nodul x la nodul y ca fiind surna costurilor
muchiilor (arcelor) care torrneaza acel drum.
4. Metoda cea mai adecvata pentru reprezentarea unui graf ponderat
este rnatricca costurilor .
Exemplu - Graful G
27
din figura 32.
ISwdbhlL Ole Cal.Z I
GI 1.,f. F-VP'·
1l 'tJ$
Seop : exemplificarea unei aplicati i in care pentru reprezentarea datelor S8 foloseste un
graf ponderat.
Exemplul 1. a firma deline depozite de marfa in mai multe /oca/itali. a retee de sosete
leaga direct unele dintre aceste iocelitet '. Distente dintre aou« locaitali este masurata in
kilometri Sa se determine traseul pe care trebuie se-t parcurga a mesin« pentru a
transporta marfa de la depozitul din oresu' A la depozitul din oresut B astfel ince: distanla
percutsii in kilometri sa fie minima.
l.ocalitatlle forneaza nodurile unui graf neorientat in care fiecare muchie reprezinta 0 leqatura
directa pe sosea lntre doua localitati. Fiecare muchie are asociata 0 rnarirne - distanta,
Aceasta rnarirne este costul muchiei , iar graful este un graf ponderat. Cerinta problemei este
de a determina un drum cu lungime minima (cu cestui minim) intra doua noduri ale grafulu i.
Exemplul 2. a persoene irebuie sa se deplaseze cu autoturismul cat mai repede intre doua
intetsectii din ores. Traficul intre aou« iniersectii nu este intotdeauna in ambele sensuri . Cu-
noscent: timpul mediu de deplasare intre daua intersectli, sa se determine care este traseul
pe care trebuie s8-1 a/eaga pentru a ajunge de la intetsectie A la intersectie B cat mai repede.
lntersectiile forneaza nodurile unui graf orientat in care fiecare arc reprezinta sensuI de
circulate pe 0 strada care leaqa direct doua intersectii. Fiecare arc are asociata 0 rnarirne -
timpul mediu de parcurgere. Aceasta rnarirne este costul muchiei, iar graful este un graf
ponderat. Cerinta problemei este de a determina un drum cu tirnpul de parcurgere minim
(cu costul minim) intre doua noduri ale grafulu;
Obsurvat ie, Grice problema la care solutia este de a gasi drumul cu costul minim (sau
maxim) di ntre doua puncte se rezolva reprezentand datele printr-un graf ponderat _ '
folosind un algontm de determinare a drumului cu costul minim (respectlv'" . ...
maxim) dintre doua noduri ale grafulu;
2.7.9,2, Matricea costurilor
Matricea costurilor unui graf este 0 matrice patratica de dimensiune n (An,Il)'
ale carei el emente aiJ sun! definite astfel tncat sa puna i n evidenta
costul asociat fi ecarei muchii (arc),
i n functie de cerinta apl icatiei, exists doua forme de reprezentare a matricei costurilor:
..,. matricea costurilor minime - pentru a determina valoarea mini ma a functiei cost ;
..,. matri cea costuril or maxime - pentru a determina valoarea maxima a funct iei cost.
a) Matricca costurilor rninlrne. Elementele arj ale matricei sunt definlte astfel:
'{C' dac,aex. ista a m·uchie (un' .a.rc) T.,u.. costul c nodurile j , cu i *j
ai,j = • 0, daca 1= J . ' .t : .
"', daca nu exista a muchie (un arc) lntre noduril e i si j, cu i " j
.. . . .' -- .. < , . '. ',. >,-,. .. ' .-. . .- ";,,
248 Impl cmcntarca st r uct ur ilor de dat e
5 4 3 2 1
0 4 3
00 00
00
0
00
7 8
00 00
0
00 00
00 00
4 0
00
2
00 00
2 0
1
2
3
4
5
Fiecarei muchii (arc) care nu exista in gral i se asociaza 0 valoare loarte mare, deoarece,
cautancu-se costul minim, acea sta muchie (arc) nu va mai
fi selectata. Deoarece pentru implementarea matricei nu
S8 poate folosi simbolul 00, in locul lui S8 va folosi cea mai
mare valoare ce S8 poate reprezenta in calculator pentru
tipul de data asociat costului.
Exempl u. Pentru gralul ponderat G 27 din figura 32 matri-
cea costurilor minime este prezentata alaturat.
b) Matri cea costurilor maxime . Elementele a i,j ale rnatricei sunt definite astfel:
{
c, dac_a ~ x i s t a 0 muchie (un arc) cu costul c > 0 intre nodurile i si j , cu i " j
Hi, 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 mai fi selectata. Deoarece pentru
implementa rea matricei nu se poate l olosi simbolul - 00 , i n locul lui se va lol osi cea mai
mica valoa re ce se poate reprezenta in calculator pentru tipul de data asociat costului .
Scrieti matricea costurilor maxime pentru gralul din figura 32.
Algoritmul pentru c rearea matricei costurilor
Pentru a crea mat ricea costurilor trebuie sa se citeasca pentru fiecare muchie (arc)
nodurile de la extrernitati " i costul asociat fiecarei muchii (arc). Aces te inforrnatii se pot cit i
de la tastatura sau dintr-un fisi er. Algori!mul pentru crearea matricei costurilor este:
PAS1 . Se ini tializeaza matri cea astl el: toate elementele de pe di agonala principala cu
valoarea 0, iar restul elementelor cu valoarea corespunzatoare pentru 00 (-00).
PAS2 . Se act uali zeaza mat r icea cu informatiile despre costurile asociate muchiilor (ar-
celor) astlel: pentru fiecare muchie (arc) li ,n cu costul c. elementului alilU] ; se va
atribui valoarea costutui c.
Impl ementarea al goritmului pentru matrices costurilor minime a unui gral oriental. Pentru
initializarea matricei costurilor S8 foloseste functia init () , iar pentruactualizarea ei functia
c i t i re ( ) . Elementele matricei fiind de tip i nt nu se poate folosi pentru simbolul 00
constanta de sistem MAXINT, deoarece i n algoritmii de determinare a drumului cu costul
mini m prin adunarile repetate ale elementelor matricei (care pot avea sl valoarea MAXI NT)
se depaseste capacitatea de reprezentare a tipului int oExista doua solutil:
a. pentru eleme ntele matricei se alege tipul long, chiar daca acest tip de data nu este
justil icat de valori le loarte mici ale costurilor ( ~ i se obtine 0 utili zare ineficienta a
memoriei interne);
b. S8 defineste 0 constants cu 0 valoare foarte mare in comparatie cu celelalte costuri.
in implementarea agoritmului s-a ales varianta unei constante definite - loiAX. Datele S8
citesc din fislerul text cost.txt in care pe prima linie exists un nurnar care reprezinta
numa rul de noduri ale qrafului , iar pe urrnatoarele randuri cate trei valori numerice
separate prin spati u, care repr ezinta noduril e de la extremitatea unui arc - i si j - ;;i
costul asoci at arcului - C. Pentru testarea programului se foloseste gralul Gn
I II form " tid
249
# i ncl ude <fstr e a m. h>
i n t a [ l OOJ ( 100 ] , n ;
int con s t
f s tream f( "c o s t. t x t " , i o s :: i n );
v oi d in it t I / I s e Ln i. t.La.l i zeaza mat r i cee c os turil o r
{int L j : f» n ;
for ( i =l ; i <=n ; i ++}
if a[iJ [jJ=O ;
else ali] [j]=:'JAZ ; )
voi d citir e{) lise actuali zea z a costurilor eu date:e d i n
{int Lj ,c ;
wh i le ( f» i»j»c) a {L] l j l =c ; f .et oee () ; }
void ma i n () { . . . }
Scrieti un program care creeaz a matricea costurilor maxime pentru graf
neorientat. Pentru testare considerati i n graf ul din figura 32 ca arcele
sunt rnuchii .
2,7.9.3. Algoritmi pentru determinarea costului minim (maxim)
Pentru determinarea drumului cu costul minim (maxim) intre doua noduri ale unui graf se
poate folosi:
-7 al goritmul Roy -Floyd;
-7 al gor itmul Dijkstra
Ambii algoritmi folosesc principiul enuntat prin teorema lui Bellman: dru-
mul opti m (cu cost ul minim, respecti v maxim) intre doua noduri oarecare
i l?i j cont i ne numai drumuri parti al a opt i me (cu costuri min ime,
respectiv maxime) care trec prin alte noduri ale gratului. Altfel spus , daca
drumul optim dintre doua noduri oarecare i j trece printr-un nod k,
atunci drumuri le de la i la k de la k la j sunt optime. Cei doi algoritmi
difera prin modul in care se identifica noduri le intermediare k.
Fi g. 33
a) Algoritmul Roy-Floyd
Al gori tmul foloseste un principiu asernanator cu cel care a fast utilizat pentru determina-
rea matricei drumurilor: gasirea drumului optim i ntre 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 memora cost ul drumului minim dintre nodurile i si j .
PAS1. Penlru etichete ale nodului k de la 1 la n (adica pentru ari ce nod al grafului)
exec uta:
PAS2. Penlru ari ce pereche de noduri din graf i j (cu t sis n si t sj sn) executa:
i PAS3. Daca suma dintre costul drumului de la i la k si costul drumului 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 i n matricea costurilor cost ul drumului direct de
! la i la j este inlocuit cu costuI drumului care trece prin nodul k
i (a [ i ] [ j]= a li] [kJ+a [ k ] [ j J).
Pentru graful din figura 32 matricea costur ilar sutera urmatoarele cinci transforrnar i. La
fiecare transformare, daca drumul 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
0 4 3 11 12
co 0 eo
7 I 8
'"
5 0 12 13
'"
co 4 0 1 ",
2 6 5 2 I 0
0 4 3 11 12
co 0
'"
7 8
'"
5 0 12 13
co 9 4 0 17
2 6 5 2 0
1
2
3
4
5
k=1
2 34 5
0 4 3
'" '"
co 0 co 7 8
co 5 0 eo
'"
co co 4 0
'"
2 6 5 2 0
1
1
2
3
4
5
k=2
2 3 4 5
1
2
3
4
5
1
k=3
2 345
k=4
2 3 4 5
1
k=5
2 3 4 5
1
2
3
4
5
0 4 3 11 12
co 0 11 7 8
'"
5 0 12 13
'"
9 4 0 17
2 6 5 2 0
1
2
3
4
5
0 4 3 11 12
10 0 11 7 8
15 5 0 12 13
19 9 4 0 17
2 6 5 2 0
Interpretarea datelor din matricea obt inuta in urma transformarilor se face astfel: drumul
de la nodul i la nodul j are costuI minim a[ i ] [j ] . De exemplu, drumul cu costul minim
de la nodu l 2 la nodul la nodul 4 are costul minim 7. Matricea nu furnizeaza informati i
despre etichetele drumului cu costul minim.
Pentru im pl ement area al gor itm ului se folosesc subprogramele:
-7 funct ia procedurala init initial izeaza matricea costurilor:
-7 functia procedurala cit ire actualizeaza matricea costurilor cu date1e din fisier:
-7 functia procedura ta tra nsformare transforrna matricea costurilor;
7 functia procedural a afisare afiseaza lungimea drumu rilor minime i ntre toate nodurile
grafului .
#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 );
voi d init () { l i s e i n it i a l i zeaza mat ri cea c os t ur i l or l
void citir e(} {l I se actuali zea za mat r i cea costuri l or ell datel e din fi $ier}
void t r ans f o r ma r e ( ) li s e trans forma matr i cea costurilor
{ f or (i nt
for {int i =l ;i<=n;i++)
for (int
if (a [ i J[ k ] +a [ k J [j]<a[i] [jJ) ali) [k]+a[ k) [j] ; }
v oid afisare ()
{cout«"c o s t u l drumur ilor minime intre nodurile : "« e nd l;
f or {i nt
for (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() ; transforrnare ( ); a f isare{) ; }
lnformatiile din matricea cost uril or 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 caz afi rmat iv, se poate atrsa lungimea lui 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 j este eqala cu suma dintre lungimile minime a coua drumuri care
tree printr-un nod intermediar k (a [ i ] [k]+a[kj [j]=a[i] [j J). atunci nodul k face parte
Informatica 251
din drumul de lungime minima de la i la l Deoarece problema pentru determinarea nodurilor
care forrneaza drumul de lungime minima S8 descompune in doua subprobleme: deterrnina-
rea drumului minim de la nodul i la nodul k (cu k" i) determinarea drumului minim de la no-
dul k la nodul j (cu k.;j ), in implementareaalgoritmului se foloseste strategia divide et impora
Pentru implementarea al goritmului prin care se determina drumul mini m dintre doua
noduri x y (a carer eticheta se citeste de la tastatura) se folosesc subproqramele:
-7 funct ia procedurala init initializeaza matricea costurilor;
7 functia procedu rala citire actuali zeaza matricea costurilor cu datele din fisier:
-7 functia proced urala transformare transforms matricea costurilo r;
-7 func tia procedurala dr um deterrnina nodurile drumului eu cost minim;
-7 funct ia procedu rala afisare afiseaza costul drumului minim nodurile care torrneaza
drumul;
#include <fstream.h>
i nt a[lOOJ [lOOJ , n;
iot const MAX=5000 i
fstream f{ " c o s t . t x t " , i o s: : in) ;
void i ni t ( ) {! /se initializeaza me t r i.cee cost ur i.Lo r l
void c i t i r e {) {/ I st:: ectualLzeeze rnet r i cea costurilor cu datele 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 er mi. ne noduril e d rumu1ui mi nim
{int k , qas i.t :
for (k=l, gasi t=O ; kee-n && l.qe s Lt , k++)
&&
{d r uml i , k ); ·drum( 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 de 1a Dodul " « x«" 1a nod Ul " « Yi
c out; c c" a re co 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; cout« " y= It; c in» y;
i n i t n; c itire () ; t.rensIormere rj • a fisare(x,y) i }
Complexitatea alqoritrnului Roy -Floyd
Algoritmul de transformare a matricei costurilor are ordinul de complexitate 0 (n
3
)
deoarece fiecare structura repeti tiva for se executa de n ori , iar structurile for sunt imbricate.
Algoritmul de determinare a drumurilor cu costul minim din matricea costuri lor transtorrnata
are ordinul de complexitate al algoritmului di vide et impera: 0(nxlg2n). Ordinul algoritmului
este 0(n
3
)+ 0(nxlg2n) 0(n
3
+ nxlg2n) O(n').
Modificati programele care implementeaza algoritmul Roy Floyd astfel
lncat sa 5e determi ne dr umur ile cu costul maxim.
b) Alqoritmul Dij kstra
Algoritmul lui Dijkstra construieste drumurile cu costuI minim care pornesc de la un nod
oarecare x - nodul sursa - pana la fiecare nod din graful - nodul destinatie.
Algoritmul l ntretine 0 multirne cu nodurile care au fost deja selectate - S, si 0 coada de
priori tat i Q cu nodurile care nu au fast selectate inca: Q=X-S, astfel:
252
Im il cmcnt urca st r uct uril or de date
~ Un nod y este declarat select at atunci cand s-a det erminat costul final al drumul ui cu
cost ul minim de la nodul sursa x la el. Selectarea unui nod nu este echivalenta cu
gasirea drumului cu costul minim deoarece este posibil ca in urma calcularii 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 drumului are
valoarea cea mai mica dintre toate costurile de drurnuri care pornesc de la nodul x la
celelalte noduri neselectate i nca. La fiecare extragere a unui nod din coada de prioritati
Q, nodul este adauqat la rnultirnea S, iar coada de prioritati este reorqanizata i n functie
de acest nod (se recalculeaza costul drumuri lor de la nodul x la noduril e rarnase i n
coada, considerand 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 rnultime 0 in care S8 rnernoreaza costuI drumurilor de
la nodul x la nodurileneselectate, costuri care S8 reca tculeaza la
fiecare 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 intretina
numai multimea S. Aigoritmul 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 initial izeaz a multirnea D cu cost urile drumurilor de la nodul x la toate celelalte
noduri ale grafului (sunt preluate din matricea costurilor elementele a [xl [i i ).
PAS3. Cat timp coada de prioritati Q nu este vida (mai exista noduri neselectate) executa
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\l i Q) .
PASS. Se adauqa nodul y la rnultimea S: S=Su {y} (tnsearnna extragerea nodului y
din coada 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 nodul extras.
i PAsa, 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 :
{
D' caca nodul i nu a fost selectal
s(i) =
1, daca nodul i a fost selectat
lnitial , elementele vectorului s au valoarea O. cu exceptia etementului s [xl care are valoa-
rea 1. La terminareaexecutiei alqoritmului, toate elementele dinvectorul s vor ave a valoarea
1. Nodurile i pentru care s 1i ] =0 se consldera ca fac parte din coada de prioritati Q
~ Vectorul d contine costul drumurilor, astfel: d[i] = costul drumului mi nim gasit la un
moment dat de la nodul x la nodul i (co t s tsn ). lrutial d [ i ] =a [xl [ i 1. La terminarea
algoritmul ui , d [i ] = costul minim al drumului de la nodul x la nodul i.
~ v ectorulp mernoreaza drumurile gasite intre nodul x ~ i celelalte noduri i ale grafului .
Memorarea drumului se face prin leqatura cu predecesorul care este definite astfel :
p [i l rnemoreaza nodul j care este predecesorul nodului i pe drumul de ta x , cu
Info r ma tic a 253
exceptia nodului sursa pentru care p [ x l =0. Initial, pentru t08t8 noduriIe i care nu au
eostul infinit (pentru care exista un arc de la nodul x la nodul i), p [i] =><; altfel p [ i ] =0.
Nodul i care S8 extrage din coada de prioritati Q trebuie sa l ndeplinea sca urmatoarele conditii:
s I d j e u .
d[i]=min{d[ j] 1 1s:js:n; s [ j J=O) .
d[i ] reprezinta eostul minim al drumului de la nodul x la nodul i.
Pentru reorgan izarea eozii de prioritati se proceceaza astfel : pentru fieeare nod j eu
s [ j J=0 se calculeaza costuI drumului de la nodul x la nodul j care treee prin nodul i :
d [ i ] +a [i ] [j ] . Daca acest cost este mai mic decat d [j I . atunci aceasta va fi nova
valoa re a lui d [ j ] se actualizeaza veetoru l p : p [j ] =i.
Pentru graful din figur a 32, considerand x=1, algoritmul se excuta astfel :
lniti al :
1 0 1 0 0
0
4
3
""
cc
0 1 1 0 0
5 4
3
2 .
-
.
1 0 0
I
0 0
0 4
3 I co co
0 1 1 I 0 0
Vect orii
s
d
p
Drumul cu eostul eel mai mic este eu nodul 3: d [3 1=3. Nodul 3 se va extrage din eoada Q.
Se analizeaza nodurile care raman in coada de pnoritati:
Nodul 2. d [3] +a [ 3] [2] = 3+5 = 8 > 4. Nu se rnodifica nimie.
Nodul 4. d [ 3] +a [ 3] [4 ] = 3+r = a: > 4. Nu se rnodifica nimie.
Nodul 5. d [3] +a [ 3] [5 ] = 3+r , = r · > 4. Nu se modifies nimie.
Vectorii 1 2 3 4 5
s
d
p
Drumul eu costuI eel mai rnic este eu nodul 2: d[ 2] =4. Nodul 2 se va extrage din eoada Q .
Se analizeaza nodurile care raman in coada de prioritati :
NoduI 4. d [ 2 ] +a [2 ] [4J =4+7=11 <"·. Se modifiea: d [ 4] =11
Nodul 5. d [ 2 J+a [ 2} [ 5] = 4+8 = 12 < Y. . Se rnodifica : d [5] =12 si p [5] =2.
Vector ii 1 2 3 4 5
1 1 1 1 0
0 4 3 11
12
0 1 1 2 2
1 1 1 0 0
0 4 3
11
12
0 1 1 2 2
5
d
P
Drumul cu costuI eel mai mie este eu nodul 4: d [ 4] =11. Nodul 4 se va extrage din eoada Q .
Se analizeaza nodurile care ramanin coada de prioritati :
Nodul 5. d [4] +a [ 4] [5] = 11+,., = >J> 12. Nu se modi fica nimie.
Vcct orii 1 2 3 4 5
5
d
P
Drumul cu eostul eel mai mic este eu nodul 5: d [ 5] =15. Nodul 5 se va extrage din eoada Q.
Coada este vida S8 termina executia alqoritmului.
Fi nal:
5 4 3 2
1
. . .
1 1 1 1 1
0 4 3 11 12
0 1 1 2 2
Vectorii
s
d
P
254
Implcmentarea struetnrilor de date
Din datele care se qasesc i n vectorii d p la terminarea algoritmului se obtin urmatoa-
rele lnforrnatii:
-') d[i] reprezinta costul minim al drumului de la nodul x la nodul i. De exemplu, pentru
nodul 4 costul minim este 11.
-') Din vector ul predecesorilor se reconstituie drumul cu costul minim de la nodul x la nodul
i . De exemplu , pentru nodul 4: p [4] =2, iar p [2] =1. Drumul este 1--+ 2--+ 4.
Pentru implementarea algoritmului in care S8 deterrnina drumul cu costul minim dintre
doua noduri x si y (a carer eticheta se citeste de la tastatura) se folosesc subproqrarnele:
-7 funct ia procedurala init initializeaza matricea costurilor;
-7 tunctia procedurala cit ire actual izeaza matricea costurilor cu datele din fisier;
-7 funct ia procedura la generare_drum transforms vectorii d si p conform algoritmuJui
pentru a obtine drumur ile cu costul minim de la nodul x la oricare alt nod i din graf;
-7 functia procedu rala drum deterrnina noduriIe drumului cu cost minim de la nodul x
pana la un nod i din graf - folosind inforrnatiile din vectorull p;
-7 functia procedurala af isare afiseaza lungimea drumurilor minime care pornesc din
nodul x pana la fiecare nod i din graf si noduriIe care forrneaza drumul;
#include <f s t r e a m. h>
int a[ l OOJ [l00 ] , d [ l OOJ , s [ l OOJ , p I10 0 J ,n ;
i nt c onst MAX=5 000 ;
fstream f{ "cost .txt " , i o s : : i n) ;
void init() { l i s e ini t i a l i ze a za matr icea costuri 1or}
voi d ci tire() {l i se actua1i zeaza matricea cos t Bri1or cudatele din
vo i d gener are=drum(i n t xl lise genereaza drumuri1e
{int i ,j , min ,y;slxl=l ;
for ( i =l; i<=n ;i++.}
[ i J;
if & & d [i]<MAX!
fqr ( i =l ; i <=n- l; i ++)
{fo r ( j =l , mi n =MAX; j<=n; j++)
if (s [jJ==O && d[jJ<min! {mi n =d [j J ;
s l y l

i f && d[j J>d [yJ+a[yJ [il! [jl;
void drum( i nt i}
{if {p l i ] drum(p [i]) ; cout-oc i c-; " " ; }
void afisare( i nt xj
{for ( i nt
if (i.! =x)
if (p[i]
( c cut c cv dr umu l cu cos t.u I minim dela nodul "« x;
cout«H 1a nodul "«i«" are castu1 "« d [ i 1«endl ;
drum( i) ; c out« endl ;}
el s e c out «"Nu exista de 1a "« x«" 1a H« i« e nd l; }
voi d main ( )
{i nt x ; cout« "x= H; c i n » x;
.i n i.t.Ll : c itire () ; qe ne .rar-ej dr-umt x j , e r i.e e re (x) ; }
Co mplex itatea algoritmul ui lui Dijkst ra
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
Informa tica 255
fiecare nod selectat S8 analizeaza cel elalt e noduri , exec utandu -se: Pasul 4 de n ori (S8
cauta printre toate cele n noduri daca mai exists in coada de priorit ati, iar printre cele care
mai suntin coada de prior itati S8 cauta nodul cu costul drumul ui eel mai mic), iar Pasul 6 de
n ori deoarece trebuie identificate printre cele n noduri care mai sunt in coada de prioritati.
Ordinul de complexitate al algor itmului f. entru determinarea drumului cu costu l mi nim va fi:
O(II )+O(lI x( II+II )) = 0 (11)+0 (11
2
) =0(11 ). In algor itmul pentru afisarea drumu lui sunt anali-
zate toate cele II noduri ale grafului , iar pentru fiecare nod i se deter rnina recursiv drumul.
Complexitale a algoritmului de afisare va fi 0(11) x 0(lI xlg211) = 0(1I 2xI92n).
- - - - - - - - ~ Modificati programul care irnpl ernenteaza algoritmul Di jkstra astfel
, ~ J tncat sa S8 determine drumurile cu costul maxim.
2.7.9.4. Aplicatii practi ce
1. 0 persoana oficiala trebu ie sa se deplaseze i ntr-un eras intre doua puncte situate
fiecare lntr-o intersect ie. Traficul intre coua intersectii nu este intotdeauna in ambele
sensuri , dar intre oricare doua intersectii exista trafic prin intermediul altar inter sectii. Pe
fiecare str ada a traseului trebuie sa existe un anumit nurna r de aqenti care sa asigure
securitatea persoanei aficiale. Scrief un program care sa determine traseul astfel incat
nurnarul de aqenti sa fie minim. Datele se citesc dintr-un fisier, astfel: de pe primul rand,
nurnarul de intersectii, iar de pe urrnatoa rele randuri , triplete de numere x , y, z care
sernnifica faptul ca pentru traficul de la intersectia x pana la intersectia y sunt necesari z
aqenti (cele doua intersectii sunt legate direct).
2. 0 firma are mai mult e puncte de lucru lntr-o zona geografica. a retea de sosele leaqa
.direct unele dintre aceste puncte de lucru si intre oricare doua puncte de lucru exista a
legatura prin intermediul retelei de sosel e. Distanta dintre doua puncte de lucru lntre care
exista leqatura directa este rnasurata In ki lametri. Firma trebuie sa-si stabileasca lntr-unul
din punctele de lucru sediul central. Criteriul de alegere este ca suma dlstantelor la
celelalte puncte de lucru sa fie minima. Scrief un program care sa stabileasca punctul de
lucru care va fi ales ca sediu. Dal ele se citesc dintr-un fisier , astfel: de pe primul rand,
nurnarul de puncte de lucru, iar de pe urmatoa rele randuri , triplete de numere x, y , d care
semnifica faptul ca punctele de lucru x ~ i y sunt legate direct de 0 sosea cu lungimea d.
l ndi cati e. Pentru fiecare punct de lucru S8 deterrnina suma distantelor minime la taate
celelalte puncte de lucru, dupa care se deterrnina suma minima.
3. 0 firma trebuie sa colecteze ambalaje din mai multe puncte de lucru din oras, fiecare
punct de lucru gasi ndu-se pe 0 anumita strada. 0 retea de intersectii leaga direct unele
dintre aceste puncte de lucru ~ i lntre oricare doua puncte de lucru exista 0 leqatu ra prin
intermediul traficului pe strazi. Traficul lntre doua intersectii nu este lntotdeauna In ambe le
sensuri , dar lntre oricare doua intersectii exista trafi c prin intermediul altar intersectii.
Cantitatea de ambalaje care paate fi colectata intre doua intersectii lntre care exista trafic
direct este rnasurata In kilograme. Scrieti un program care sa gaseasca un traseu optim
Intre doua intersectii A ~ i B astfel lncat 0 rnasina care pleac a din intersectia A si trebuie sa
ajunqa In intersectia 8 sa calecteze0 cantitate cat mai mare de arnbalaje. Datele se citesc
dintr-un fisier, astfel: de pe primul rand, nurnarul de intersectii, iar de pe urrnatoarele
randuri, tripl ete de numere x, y , c care sernnifica faptul ca intersectia x este leqata direct
de intersectia y prin traficul de pe 0 strada de pe care se poate colecta cantitatea c de
amba laje. El ichetele intersectiilor A ~ i B se citesc de la tastatura.
256 Implcmentarea struct urilor de date
4. 0 firma se poate aproviziona cu trei sortimente de mater iale de la mai mul te depozite
situate i n localitati raspandite i ntr-o zona geografica. intr-un depozit nu este obligatoriu
sa existe toate cele trei sortimente . a retea de sosele leaga direct unele dintre aceste
locaii tati si intre oricare dcua localitati exista 0 legatura prin intermediul retelei de sosele.
Distanta dintre doua localitati intre care exists legatura directs este rnasurata in
kilometri. Firma trebuie sa S8 aprovizioneze cu unul dintre sortiment ele de materiale.
Scrieti un program care sa stabileasca depozitul de la care sa S8 aprovizioneze firma
astfel i ncat drumul care trebuie parcurs pentru aprovizionare sa alba lungimea minima.
Fiecarui sort iment de material i se atribuie un nurna r: 1, 2 si 3. Datele se citesc dintr-un
fisier text. De pe primul rand se citesc nurnarul de localitat i n i n care se gasesc depozite
~ i numarul de legaturi directe i ntre localitati. m. De pe urrnatoarele m randuri se citesc
triplete de numere x, y, d care sernnifica faptul ca localitatile x si y sunt legate direct de
o sosea cu lungimea d. De pe fiecare dintre ultimele trei randuri, in ordinea etichetelor
sortimentelor de materi ale, se citeste cate un slr de numere despartite prin spati u cu
inforrnatii despre locatiile depozitelor unde se g a s e ~ t e acel sortiment de material: primul
nurnar reprezin ta numarul de depozite, iar urrnatoarele numere etichetel e localitatilor in
care se qasesc aceste depozite. Nurnarul sortimentului de materiaIe p se cornunica de
la tastatura. lndicati e. Se deterrnina distants minima de la localitatea i n care se g a s e ~ t e
firma la localitatile i n care se gasesc depozitele si se alege dintre acest e distante cea
mai mica distanta care corespunde unui depoz it ce confine sortimentul de mat erial p.
2.7.1 . Grafuri spcciale
Exista urrnat oar ete grafur i speciale:
-7 graf uri bipartite ;
~ grafuri hamiltoniene:
~ grafuri euleriene:
-7 grafuri t urneu.
2.7.10.1. Graful bipartit
Graful G = (X,U) se numeste graf bipartit dac a exista doua rnul tirnl nevi de de noduri
A ~ i B care au urmatoarelo pr opriet ati : AuB=X ~ i A"B=0 ~ i
orice muchi e (arc) din rnultl mea U are 0 ext remitate in mul timea de noduri A
~ i 0 al ta ext remitate in rnul tirnea de noduri B.
Obs erv ati e. Nodurile izolate pot face parte din oricare dintre cele doua
rnultirni.
Example:
1. Graful neorientat G
4
definit anterior este un graf bipartit , deoarece exists
mult irnile A ~ i B 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,
7, 8, 9, 10, 11) = X
4
~ i Ar>B=0 ~ i ca fiecare muchie uEU, ={[ 1,2J, [1,4] ,
[2,3J, [3,4J, [3,5J, [5,6J, [5,7], [5,8J, [7,9]} are 0 extremite in rnulti rnea A ~ i
cealalta extremitate i n rnult irnea B:
Fig .35
,
,
,
,
I
,
,
,
,
1 ,
, @,
, ,
,
1
,
,
1
1
,
,
,
,
,
, '
' @O'
\ I
/
[2,3) "" 2eB ~ i 3eA
[5,6) "" 5eB ~ i 6EA
[7,9) c> t e». ~ i geB
[1,4) c> 1EA si 4eB
[3,5) <>3EA ~ i 5EB
[5,8) c> 5EB si 8EA
[1,2) c> 1EA si 2EB
[3,4) c> 3EA si 4EB
[5,7) c> 5EB si 7GA
I II for III aticii 257
-,
Fig. 36
[2,3J=> 2EB ~ i 3EA
[4,2J=> 4EA ~ i 2EB
[5,6] => 5EB si 6EA
[2,1] c> 2EB si 1EA
[3,5] => 3EA si 5EB
[5,3] => 5EB ~ i 3EA
[6,5J => 6EA si 5EB
[1,2] => 1EA ~ i 2EB
[2,4] => 2EB si 4EA
[4,5] => 4EA ~ i 5EB
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 observa ca: AuB ; (1, 2, 3, 4, 5, 6) ; Xg ~ 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 rnultimea A ~ i cealalta extre- I
mitate in multi mea B: I
. I
I ~
I
,
Graful bipartit G ; (X,U) se nurnests graf bipartit cornplet dac a - pentru
orice nod Xi EA §i orice nod xje B - exista 0 muchie (un arc) fermata din cele
doua nod uri care apartine rnultimii U; [Xi, Xj]EU,
Exempl e:
1. Graful neorientat G,,;(X
28
,U' 8) definit astlel : X
28
;{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 noddin multimea B.
2. Graful orientat G29 ; (X
29,U29)
definit astfel : X
29;{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 G 2 ~
rnultimile A ~ i B care sa Indeplineasca conditiile din definitie: A;{1 , 3) si 3 4
B;{2, 4). Se observe 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
Observat ie. Graful neori entat bipart it complet se noteaza cu Ka,b ~ i are axb
rnuchii, unde a; card(A) ~ i b; card(B). De exemplu, daca graful neorienta! are 3 noduri ,
S8 obt in urrnatoarele variante de grafuri bipartite complete:
Elementele multimii Muchiile Numaru! de
A 8 ar afului muchii ale arafului
1 2.3 [1 .2J. [1.3J
1/2-2
2 1,3
[2.1J. [2.3]
1x2=2
3 1.2 [3.1]. [3.2]
1/2-2
1.2 3 [1.3J. [2.3]
2x1 =2
1.3
2 [1.2]. [3.2]
2/ 1-2
2,3 1 [2.1]. [3.1] 2/1-2
1,2.3 0 nuexista, deoarece 8- 0 3xO- 0
0 1.2.3 nu exista. deoarece A- 0 Ox3-0
Algoritmi pentru prelucrarea grafurilor bipartite
1. Generare a tuturor graf urile neorientate bipartite compl ete cu n noduri.
Al goritmul. Problema se reduce la a genera toate subrnultimile care se pot obtine din
cele n elemente (exceptand rnultimea inltiala ~ i multimea vida). Nurnarul total de submul-
timi obtinute este 2
n
- 2. Solutia este de a genera intr-un vector nodurile care apart in
multimilor A ~ i B. astfel: daca un element are valoarea 1, nodul care are eticheta cores-
punzatcare indicelu i elemen tului apartine rnultirnii A; altfel , apartine multimii B.
Impl ementarea algoritmului. Functia gene r are () qenereaza grafurile bipartite complete.
Tn vectorul a se genereaza nodurile mult irnilor A si B. Initial elementele vectorului au
258
Implementarea st r uct ur ilor de date
valoarea O. Variabila posLbd L se foloseste pentru a verifies daca mai exista posibilitati
de generare de submultirni (are valoarea 1 - true, atunci cane mai este posibil sa se
genereze subrnultirni ).

#incl ude <ma t h. h>
voi d gene rar e ( i nt n)
lint
wh i l e (pos ibil)

wh ile (j>O && j - - ; }
if
e lse
if
{cout « "Cr a f u l ': « k«endl « "i' ·hl l t i me a A: ";
for (i =1; i <=n ; i +t) if (a [ i]) c ouu c c i, .cc " tI .
cout «"i1u l t i me a B: " .
for ( i =l ; i <=n ;i-tt) i f ( ! a[i]) cout c c i c c " If .
cout«end l ;
cout;c " Hu cb i i.Le sunt : " .
for {i=l ; i<=n ;i++)
if
f o r (j =l ;j<=n ;j-t+)
i f (a[jl==O && cout«" [ " «i « " , " «j « "] to;
cout«end l ;} }}}
void main {} ( i n t n ; cout«"n uma r de nodurL> 'I; cin» n ; c c nc r e re tnl r )
2. Ver ifi car ea un ui graf dac a este graf biparti t .
Algoritmul. Pentru a verifica daca graful este bipartit, se genereaza rnultimile de noduri A
B pana cand aceste mult irni i ndeplinesc conditia unui graf biparti t, sau pima cand s-au
generat toat e multimil e nici una dintre variante nu a i ndeplinit 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 xEA si YEB - exista muchi e care sa Ie lege in gra! ([X,y] EU). Pentru generarea
rnultirnilor de noduri A B se pot folosi doua variante:
Vari anta 1. Ca i n algoritmul precedent, se qenereaza lntr-un vector toate submultirni-
Ie care se pot obtine din cele n etichete de noduri (exceptand rnultirnea initiala multi-
mea vi da) se verifies daca nodurile apartinand celor doua rnultimi generate pot fi
rnultirnile unui graf bipartit.
Impleme ntarea algorit mul ui . Se citesc din fisierul text gb.txt inforrnatii despre un graf
neorientat (nurnarul de noduri matricea de adiacenta ). Functia bipart it () verifica
daca graful este bipartit furnizand un rezultat logic. Elementele vectorului x in care se
genereaza muttirnile A B sunt initial O. Variabila gasi t se foloseste pentru a veri!ica
daca s-au gasit cele doua rnultimi de noduri corespunzatoare unui gra! bipartit (are
valoarea 1- true, atunci cand s-au gasit).
#incl ude<: £s t r e am. h>
#include<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 ;
void ci t e s t e ( ) { l l c i t e C? t e matricea de a di acen1;.a di n
i nt biparti t ()
lint
wh i l e && ! gasit l
Informatica
259
{m=n;
while (m>O && (x[rn] =O; m- - ; )
if (m==OI
e lse

if
fo r ( i=l ,gas i t=l ;i<=n && gasit ; i ++)
for (j=l ;j<=n && gasi t ; j ++)
if (a[i]
if && x[j] =ll II && qesLt -O r l j
return gasit i }
void maine) {c i t e s t e ( j;
if (bi?art:'t()) cout« " Es t e bipa r t i t ";
else cout« " Nu este bipartit " ; }
Var ianta 2. Elementele multirnilor A B se genereaza separat , in doi vectori. Pentru gene-
rarea multirnii A se foloseste metoda backtracki ng (etichetele nodurilor multirnii A se
genereaza in stiva), Functia bt () este apelata de n-1 ori pentru a genera in stiva cele p
elemente ale rnultirnii A (t spsn- t) . Multirnea Beste fermata din nodurile gralulu; care nu se
gasesc in multirnea A.
Imp l omenta rea algorit rnului. Matricea A este matricea de adiacenta a grafului, iar in
vectorii a si b S8 genereaZ8 elementele multimilor A B. in functia t i par ( ) S8 copiaza
continutu' stivei in vectorul a si S8 scriu in vectorul b etichetele nodurilor care nu sunt in
vectorul a. Pentru a identifica etichetele nodurilor care nu sunt in vectorul a se tolo seste
variabila 10g;c13 gasi t . Tot in aceasta funct ie S8 verifica daca aceste rnultirni corespund
unui gral bipartit, asttel: se verifica, pentru toate elementele celor doi vectori , daca muchiile
generate cu un nod din vectorul a ;;i un nod din vectorul b sunt muchii in graf. in caz
afirmativ, se verifica daca muchiile astfel generate sunt toate muchiile grafului. Variabila nr .
se Ioloseste pentru a nurnara muchiile formate cu nodurile din cei doi vectori, iar variabila
logica este pentru a verifica da ca gral ul este bipartit. (are valoarea 1 - true, caca nurnarul
de muchii qasite este egal cu nurnarul total de muchii ale gralului m] .

fstream f( "gb .txt " , i o s : :in) ;
typedef int stiva[lOO] ;
int n , k , ev,as , f'..[lO] [10] , b [ l O] , a r l O] , ID, e s t e, p;
s c Lva s t ;
void c i Les t e ()
(int i, j ; f »n;
fo r ( i =l; i <=n; i ++ )
for [j] ; m=m+A[ i] [ j ]; J L c l ose [) ;
vo i d i niL() { st [ k] =O; J
int suc::::esor ()
{if (st[k]<nj return 1 ; } el se return OJ }
i nt valid ()
{i f n:>:1- && st[k]<st[k- l]} ret u r n 0 ;
for ( i n t i =1; i < k ; i + +) if (st[x.]==st[i}) r etu rn 0 ;
r eturn 1 ; )
int s o Lut i. e L) (return k= =p ; )
void t..i pa r {}
{int 1 j ,q=O,gasit ,nr=O;
for (
for ( =1 ; i<=n ; i++)
260 Implemcntarca st ru ct urllor de dat e
{f o r ij=l ,gasit=O; && 'gasit ; j++) if (a[jl==i) g asit=l ;
if i'gasit l {q ++; b[ q]=i ; ) )
f or ( i =l ; i<=P i i++)
f o r j<=q; j++) i f n r ++;
if {nr==m) este=l ; }
voi d b tO {/ /partea f ixa a algoritmului backtracking}
v o i d main () {c i t e s t e {) ;
f or (p=l i p<=n- l && ! e s t e; P+ +) bt {) ;
i f (este) c o ut«"Es t e bi pa rtit " ;
e lse cout«"Nu este b ipar t i t " ; }
1. Scrieti un progr am care citeste din fisierul graf.-b1.txt matricea de
adiacenta a unui gral neorientat si, de la tastatura, doua siruri de
numere ce reprezinta noduri din graf - si care verifies daca cele doua
siruri de numere pot reprezenta pentru gral cele doua rnultirni ale unui gral bipartit.
2, Comparati din punct de vedere al eficientei cei doi algorit mi prin care se deterrnina
daca un gral neorientat este bipartit .
3, Scrieti un program care citeste din fisierul graf.-b2.txt matricea de adiacenta a unui
gral orientat 'I i care verifies caca gralul este bipart it. in caz afirmativ, se afiseaza
rnultimile de noduri A 'Ii B.
2,7.10.2. Graful hamiltonian
Intr-un gral G=(X,Ul , se nurneste lant hamiltonian lantul elementar
care confine toate nodurile grafului.
Altl el spus, un lant este hamiltonian daca porneste de la un nod oarecare si parcurge a
sinqura data toate nodurile gralului.
l.antul hamiltonian in care nodul initial coincide cu nodul final se
nurneste ciclu hamiltonian.
Ca i ntr-un gral sa existe un ciclu hamiltonian este necesar ca pe langa un lant hamiltonian
sa mai existe 'Ii a muchie care sa lege primul nod allantului de ulti mul nod al lantului,
Un graf care contine un ciclu hami ltonian se nurn este 9raf hamiltonian
Altlel spus, un gral hamiltonian este un gral i n care - pomind de la un nod oarecare-
se pot parcurge 0 si nqura data toat e noduril e grafului, revenind 13 nodul initial .
G, o Gralu l G" din figur a 39 contine ciclul hamiltonian C= (1, 2, 3, 6, 4, 5, 1}.
Observatie. Un graf hamiltonian nu poate contine noduri izolate.
Propozitia 10
Gralul complet K, este hamiltonian.
Demonstratie. Graful complet K
n
poate f pnvit ca un poligon cu n raturi, i n care
fiecare varf al poligonului este legat de celelalte varfuri prin diagonale, iar varfurile
poligonului parcurse pe laturi forrneaza un ciclu hamiltonian.
$
W
Fig. 39
Seop: exempl ificarea unei aplicatii i n care solut ia problemei este un graf hamiltonian.
Problema voiajorului comercial. Un voiaj or 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 ajunga in toate loealitatile, astfel incat
Informatica 261
costuf deplasari i sa fie minim. voieiorut va trece 0 singura data prin fiecare focalitate si se
va tntoerce in locafitatea de pornire.
Localitatile torrneaza nodurile 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 (ci clul i n care suma cost urilor asociate muchiilor este minima).
Obs ervati e, 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 unui ciclu hami ltonian. De exemp lu:
-7 0 firma de mesagerie trebuie sa distribuie zilnic colete la mai multe adrese. care
distribuie aceste colele pleaca de la sediul firmei, ajunge la mai multe puncl e din eras
revine la sediul firmei. Leqatura directs dintre doua puncte este caracterizata prin
di stants rnasurata in kilometri (costul asociat fiecarei muchii). Trebuie sa S8 gaseasca
traseul de lungime minima pe care trebuie sa-l parcurqa masina.
-7 0 persoana doreste sa taca un circuit prin l ara sa viziteze mai multe puncle turistice,
plecand din localitatea de domiciliu Intorcandu-se in aceeasi localitate. Legatura directs
dintre doua puncte turistice este caracterizata prin distants rnasurata i n kilornetri (costul
asociat fiecarei muchii). Trebuie sa S8 gaseasca circuitul turistic de lungime minima.
-7 0 persoana doreste sa viziteze mai multe cabane, intorcandu-se la locul de plecare.
Leqat ura directa dintre doua cabane este caracterizata prin timpul necesa r parcurgerii
traseul ui de munt e (costul asociat fiecarei muchii). Trebuie sa se gaseasca *
circuitul de vizitare a cabanelor care sase faca i n timp minim. ....
Teorema 18
Daca grat ul G=(X,U) este un grat cu mal mult de doua noduri (n<:3) gradul
. flecarui nod X EX sat isface co nditia d(x)<:nf2, atunci gratul G este hamil tonia n,
Observatie. Aceasta teorema precizeaza numai condltia suficienta ca un graf sa fie
hamiltonian. Aceasta conditie nu este Insa necesara. Astfel, este posibil ca un graf sa nu
Indeplineasca aceasta conditie 9i sa fie totusi hamiltonian. Din aceast a cauza, teorema nu
poate fi folosita pentru a const rui un alqorit rn care sa verifice daca un grat este hamiltonian.
Demonstrat i e. Notarn cele doua propozitii, astfel :
(1) - Gr aful G are mai mult de dOU3nodun gradul fiecarui nod XEX satisface conditia
(2) - Graful G este hamiltonian.
Trebuie sa dernonstr arn ca (1)=>(2) - prin reducere la absu rd. Pres upunem ca graful G nu este hamil-
tonian. Adau gam muchii la acest gr af pima se obtine un graf hamiltonian (in eel mai rau caz se ajunge
la un gra f camplet , car e sigur este hamiltonian). Prin adauqarea de noi muchii , gradul unor noduri
creste, ceea ce in seamna ca se pastreaza inegalit atea din propozitia ( 1). Adauqarea acestor muchii
se face pa na cand se obtine graf ul G, care nu este hamiltonian, dar care. pr in adauqarea unei singure
muchii devine hamiltoni an. Acest graf nu este sigur un graf compte! !iii tnseemna ca exists eel putin
doua noduri neadi acent e. Luam dintre aceste noduri dou a noduri x y [X,Y] EU, care au propri-
et atea ca. prin adauqarea 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 elementar L(x,y) care con tine toate nodurile grafului.
Oeoar ece d(x):2:n/2, rezult a ca i n gra ful G, mai exista un nod xi cu care este adiacent. Acest nod face
parte din lantul Llx.y). Fie Xi., nodul care precede nodul Xi in lan1ul L(x,y). Daca nodurile xi.1 y
Iorrneaza 0 muchie ([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 presupunerea ca graful G, nu este hamiltonian. Rezulta
ca nodul y nu formeaza muchie cu nici unul dlntre nodurile care i l preced in L(x,y) care sunt
adiacente cu nodul Xi . inseamn a ca nodul y nu poate fi adiacent decat cu cel mult n- 1-d(xi) noduri , adica
n-1-d(x,). Dar, d(x;)2n/2. Rezulta ea n-1 -n/2=n/2-1, adlea ceea ce contrazice
ipoteza. Cont radictia a aparut din presupunerea ca gr aful G nu este hamiltonian.
262
Implcmentarea struct urilnr de date
1. verificati daca graful hamiltonian G, o din figura 39 lndeplineste
conditiile preciza te in teorerna.
2. Desenati toate grafurile hamiltoniene cu 4 noduri.
G31 3. Veriticati daca este hami ltonian graful G31 =(X
31
,U
31
) cu X
31=
{1,2, 3,4,5,6,7j si U
31={[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 hamiltonian 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 complet cu n noduri este I n I) ! .
Alqoritmul pentru parcurgerea unui graf hamiltonian
Algoritmul. Pentru a determina daca un graf este hamiltonian S8 verifies daca exista un clclu
hami ltonian. Este suficient sa S8 caute lanturile elementare care pornesc din nodul cu eticheta
1 .;;i S8 Inchid in acest nod. Se poate folosi fie metoda backtr ack i ng, fie metoda parcurge ri i
i n a graful ui. Prin aceste met ode S8 pot determina .;;i toate ciclurile hamiltoniene, caca
exista, astfel: se cauta toate ciclurile elementare care, pornind dintr-un nod, parcurg toate
celelalte noduri ale qrafului se i nchid printr-o muchie cu nodul de pornire.
Implement area algori t mul ui. Se citeste din fisierul graf_h.txt matricea de adiac enta a unui
graf neorientat. Daca graful este hamiltonian , se afrseaza ciclurile hamiltoniene gasite. Daca
nu exist a nici 0 solutie, se afi seaza un mesaj de informare. Pentru generarea lanturilor
elementare se foloseste metoda backt racking. Noduri le lantului elementar vor fi generate i n
stiva. Functia ci teste () se fotoseste pentru a citi matr icea de adiacenta in fisier, Variabila
e ste se foloseste pentru a verifica daca s-a gasit un ciclu hamiltonian pomind d.n nodu l cu
et icheta 1 (are valoarea a- False, daca nu s-a g5slt un cicluhamiltonian).

typedef s t i v a [ l OO];
int <'"1 [2 0 J [201 ,n,k,os ,e,t ,este=0 ;
s t i ve s.t ,
fstream f( "grafh .tx t " , i o s : :in};
void c i tes t e ( ) {/ / s e c i t e .:;o t e matricea de adiac en ta }
v o i d i n it ()
int s uc c e s 6r ()
{i f (st[KJ<n) {s t[ kJ =s t [kJ +l ; r e t u r n 1 ; } else r e t u r n 0 ; )
int valid ()
{if ( k>l && a [st[k-l ] J return C;
for (i n t i =l ; i <k; i ++) if (st lkJ==st li]) return 0;
r e t u r n 1 ; )
i n t solut ie() ( r e t u r n a[st[k} ] [l]==l && k ==n ; }
v oid tipar ()
( for (i n t cout« s t [ i J« ", " . c ou t « s t [ l ] « e nd.1; }
void bt(} {I / i cle n t i c a ell ceo de La qeoer.a rea Lan t u r i.Lor e Le me nt.a re l
void main() {c i t e s t e {); st[ l ]=l; fJt { ) ;
if ( ! este) ccu t c-c vrjr -a IuI nu este ha uu. Lt. on i.envr j
1. Scri eti un program care citeste din fisierul text graf.-M. txt matricea de
adiacenta a unui graf hamiltonian, verifica daca graful lndeplineste
con ditia precizata i n teorerna pentru un graf hamiltonian verifica daca
este hamiltonian - folosi nd metoda parcurgerii i n la1ime a grafului.
2. Scr ieti un program care citeste din fisierul text graf.-h2.txt matricea de adiacenta a unui
graf hami ltonian si . de pe ultimul rand , un sir de n+1 numere care reprezinta etichete de
noduri si care sa ver ifies daca sirul de etichete repr ezinta un ciclu hami ltonian.
Informatica
263
~
2 3
4 5
8
6 7 .
Fig.40
2.7.1Q.3. Graful eulerian
i ntr-un gr at G=(X,Uj , se numeste lant eulerian lantulcare confine
toate muchiile gratului, fiecare muchie fiind prezenta a slnqura data.
Un lant este eulerian daca porneste de la un nod oarecare 'Ii parcurge a singura data toate
rnuchiile grafului (este un Ian! simplu care parcurge toate muchiile grafului).
Lantul eulerian in car e nodul initial coincide cu nodul fina l se numsste ciclu
eulorian.
Ca i ntr-un graf sa existe un ciclu eulerian este necesar ca, pe langa un lant eulerian , sa mai
existe si a muchie care sa lege primul nod al lantului de ultimul nod al lantului, 'Ii acea
muchie sa nu rnai fi fast parcursa.
Un graf care conti ne un cicl u eulerian so numesto graf eulerian.
.Altl el spus, un graf eulerian este un graf in care, pornind de la un nod oarecare se pot
parcur ge 0 sinqura data toate muchi ile grafului , revenind la nodul initial.
Graful G" din figura 40 contine ciclul eulerian C= (1, 4, 6, 7, 4, 5, 7, 8, 3, 2, 8, 5, 2, 1}. GJi
Observ ati i
1. Un graf euleri an poate cont i ne noduri izolate
2. Pentru ca un graf sa poata fi tacut eulerian prin adEi ugarea muchii lor
trebuie sa fie i ndeplinite urmatoarele conditii:
-7 daca nurnarul de noduri este par, sa nu exi ste noduri cu gradu l maxim;
~ nurnarul de noduri cu grad impar sa fie par.
Nurnarul minim de muchii care trebuie adauqate este egal cu jumatate
din numarul de noduri eu grad impa r.
[ §1tuMjlju d e cezl
Scop: exempl ificarea aplicatiei In care solutia problemei este un graf eulerian.
Problema podurilor din orasu l Konigsberg. ~ . . s,
in acesl ores exist» septe poduri peste della . - ,
t eului Pregel care !oaga cele pal ru 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), ~ ~ ~ ~
intcrceti du-se in punclul de unde a pl ecat, ~ ~ ~ . ~ .
trecetid peste fiecare pod a singura data. 0... -"": $ ~ ~ _
~ , , "
Cele patru zone (notate ~ ~ Fig. 41 .",
a \ ~ cu A, S, C 'Ii D) 'Ii cele
, - sapte poduri (notate cu a, b. c. d, e, si f) reprezinta nodurile unui
e) graf neorientat G" (figura 42), lar muchiile reprezinta posibiiltatea de
a treee pe un pod dintr-o zona, In alta zona. Problema consta In a
gasi In aeest graf un ciclu care sa parcurqa toate muchiile a sinqura
data, adica un ciclu eulerian. Matematicianul Euler a demonstrat
F' 42 maternatic, in anul 1736, ca aceasta problema nu are soluni ~
Ig. (ca acest graf nu este eulerian). ~
264 I mplementarea strueturilor de date
Tcorema 19
Un graf G=(X,U), care nu confi ne noduri izolate, este eulerian daca numai
daca este concx si qradele tuturor nodurilor sunt nurnero parc.
n emonstrane. Notarn cele doua prcpozitii, astfel:
(1) - Graful G nu coniine noduri izolate este eulerian.
(2) - Graful G este conex :?i gradele tuturor nodurilor sunt numere pare
Trebuie sa dernonstrarn ca (1 )=>(2) .i (2)=>(1).
(1)=>(2) .
a. Graful este co nex. Trebuie sa demonstram ca, oricare ar fi nodurile x y din graf, exlsta un Ian;
L(x,y) care le leaga Pentru cele coua noduri poate sa apara una dintre urmatoare te sltuatii:
Sunt adiacente ([ X,Y] EU), lnseamna ca exista iantul L(x,y).
-7 Nu sunt adiacente Oeoa rece graful nu are noduri izolate, insearnna ca exlsta alte doua
noduri z w din graf care sunt adiacente ell cate unul dintre ele ([X,Z]E U :;;i [Y,W]EU). Deoarece
graful este eulerian, exista un ciclu care contine toate muchiile grafului , inclusiv muchiile [x,z] :;; i
lv.wl Fie acest ciclu C = { X1, ... , x, .. ., y, ..., xj}. Acest ciclu coni ine un tant L(x,Y)
Deoarece in ambele situatii exista un lant L(x,Y), tnsearnna ca graful este conex.
b. Gradele tuturor nodurilor sunt numere pare. Trebuie sa demonstra-n ca pentru un nod oarecare
XEX, d(x) este un numar par . Ciclul eulerian connnand toate muchi ile grafului, confine :;;i toate
noduri le qrafului. Acest ciclu se poate reorganiza astfel lncat nodul x sa nu fie primul nod: C = { Y, .. .,
x, . . " y}. Nodul x poate sa apara in acest ciclu de p ori. Fiecare aparitie a nodului x in acest cictu
Insearnna existenta a ooua muchii diferite incidente cu el . Rezulta ca d(x)=2xp, adica un numar par.
(2)=>(1) - prin reducere la absurd.
Presupu nem ca graful G nu este eulerian. Graful fiind conex, nu confine noduri izolate . Fie doua nodur i
oarecar e x :;;i Y lntre care exlsta 0 muchie ([ X,y] EU). Nodul Y evano gradul un numar par, tnscamna
CEl exista un nod z cu care formeaza 0 much ie ([ y,z] eU). Continuand in acest mod, se ajunge la un
nod W care forrneaza much ie cu nodul x ([ w,x] eU), deoarece :;;i grad ul nodului x este un numar par.
Rezulta ca in graful G exista un cic lu Vom cons idera, dintre ciclurile care exista i n acest graf, ciclu C
de lunqme maxima, dar care, conform presupunerii facute , nu confine toate rnuchiile grafului. Pentru
fiecare nod din acest ciclu se consume doua unitat i din gradul lui . cautarn 0 muchie care nu face
parte din ciclul C, dar este incidents cu un nod din ciclul C. Aceasta much ie exista deoarece oaca nu
ar fi, ciclul C ar forma 0 cornponenta ccnexa, ceea ce contrazice ipoteza ca graful G este conex. Fie
muchia [X,Y] EU, cu XEC. Pomind de la aceasta muchie, pe muchii care nu apartin ciclului C, trecand
prin noduri ale carer grade nu au fast epuizate , se obune. dupa un numar finit de past, un nou ciclul C1
care se inchide in nodul x. Prin concatenarea celor doua cicluri care au un nod comun (x) . se obtine
un cicJu de lungime mai mare deca f ciclul C, ceea ce contrazice presupunerea ca ciclu C are cea mai
mare lungime. lnsearnna ca el confine toate much iile grafului :;;1 graful este eulerian.
Observatie, Aceasta teorema. precizand conditiile necesare suficiente ca un graf sa
fi e eulerian, poate fi f olosita pentru a construi un algoritm care Sa verifice daca un graf es te
eulerian .
1. Verificati condititle din teorerna pentru graful eulerian G
32
din figura 40.
G34 2. Verificaf daca graful G
34
=(X34. U34) cu X
34={1
,2,3,4,5,6.7) "i U
34={[
1,2],
[1,3], [2,3], [2,4], [2,5], [3,5], [3,7], [4,5], [4,6], [4,7J, [5,6]) esle eulerian.
Daca gra ful este eulerian, gasiti un ciclu eulerian verificati daca graful Indeplineste condi-
tiile precizate i n teorerna.
3. Dernonstrati CEI l ntr-un graf conex G exista doua noduri diferite x si y legate printr-un lant
eulerian - daca si nu mai daca ele suntsi ngurele noduri cu grad impar di n graf.
4. Desenati toate grafurile euleriene cu 4 noduri.
G" 5. Verificati daca graful conex G
35
=(X
35
,U
3S
) cu X
3s
={1,2,3,4,5,6.7,8) "i U
3s={[
1,2], [1 ,4], [2,3],
[2,4], [2,5], [3,6], [4,5], [4,7], [5,6], [5,7J, [5,8], [6,8], [7,8]) poate fi facut eulerian prin adauqare
de muchii . in caz afirmativ, precizati cate rnuchii trebuie adaugate care sunt aceste muchii.
Informatica 265
6. Verificat i daca graful neconex G36=(X36,U36) cu X
36={1
,2,3,4,5,6.7,8,9,10, 11) ~ i U
36
={[ 1,2], ~
[2,4], [3,4], [4,5] , [4,6] , [5,61, [5,7], [6,7], [8,9], [8, 11], [9,10], [9,11] , [10, 111 } poate fi facut
eulerian pri n adauqare de muchii. In caz afirmativ, precizaf cate muchi i trebuie adauqate
~ i care sunt aceste muchi i. Gasit i un algoritm pentru generalizarea problemei.
7. Sa se dea exemple de urmatoarele grafuri:
3 . sa nu fie hamiltonian ~ i nici euler ian;
b. sa fie hami ltonian, dar nu eulerian:
c. sa nu fie hamiltonian, dar sa fie eulerian:
d. sa fie hamiltonian si eulerian.
Algoritmul pentru parcurgerea unui graf eulerian
Pent ru a implementa graful S8 foloseste matricea de adiacenta a si vectorul g in care S8
mernoreaza gradul fieca rui nod, care S8 calculeaza eu functia grad ( ). Algoritmul care
deterrnina daca un graf este eulerian verifica daca graful i ndeplineste conditii!e precizate
in teorerna:
-7 Nodurile izolate. Se verifies daca graful are sau nu noduri izolate. Daca "are noduri izo-
late S8 considers ca graful nu est e eulerian. in implementarea algoritmului se foloseste
functia i z o l a t () care testeaza gradul naduri lar ~ i furnizeaza un rezultat logic: true (1)
daca eel putin un nod are gradul °si false (1) daca nici un nod nu are gradul 0.
~ Gradul nodurilor. Se verifica daca gradul fiecarui nod este par. i n implementarea algorit -
mului se fol oseste functia grad_par () care furnizeaza un rezultat logic: false (0) daca eel
putin un nod are gradul impar si true (1) daca nici un nod nu are gradu l impar.
~ Conexltatea. Se verifica daca graful este conex . Pentru aceasta se va parcurge graful
in adancirne si se verifica daca raman noduri care nu au fost vizitate. i n implementarea
algoritmului se foloseste vectorul vi z i tat pentru a tine evi denta nodurilor vizitate.
Conexitatea se veri fica prin functia conex ( ) care furnizeaza un rezul tat logic: false (0)
daca eel putin un nad nu a fast vizitat ~ i true (1) daca toate nodunle au fast vizitate,
Pentru testarea conditiilor necesare ca un graf sa fie eulerian se fo.oses te variabi la e ulerian
care are valoarea loqica: false (0) daca gratul nu este eulerian ~ i true (1) daca graful este
euler ian .
Daca graful este eulerian se poate dctermina un ciclu eulerian Acest algori tm foloseste
dernonstratia de la teorema precedents. Construirea ciclului eulerian se face astfel:
PAS1 . Se porneste dintr-un nod aarecare din graf ~ i se construieste din aproape in aproape
ciclul C, pe muchii incidente care exista in graf, scazand gradele nodurilor prin care
trece si eliminand muchiile.
PAS2. Cat t imp mai exists muchii care nu fac parte din ciclul C executa: se alege un nad
din ciclul C pentru care mai exista muchii incidente care nu fac parte din ciclul C, se
construieste ciclul C1 ~ i se concateneaze ciclul C1 la ciclul C.
Sol utia se va obtine intr-un vecto r c care contine nodurile parcurse care au fast adauqate la
cicl ul eulerian. Vecto ru! c l se foloseste pentru extinderea ciclului eulerian. Se mai folosesc
urrnatoarele variabile de memorie:
-) n - nurnarul de noduri ~ i m- numarul de muchi i;
-) i, j , k - contori pentru parcurgerea matricei de adiacenta si a vectorilor tolositi ;
-) q - variabila in care se pastreaza nod ul de la care incepe ciclul c1;
-) p - variabila i n care se pastreaza lungimea loqica a vectorului cl.
266 I mplement area structurilor de date
Ai goritmul pentru dcte rminarea ciclului eulerian este urrnatorul:
PAS1. Se citesc valorile pentru variabilele de memorie n si m matri cea de adiacenta a.
PAS2. Se ver ifica daca graful este eulerian. adi ca daca l ndeplineste cond itia sa nu alba
noduri izolate, nodurile sa aiba grade pare sa fie conex : (in implementarea
algorit mului: e u l e ri a n = ! v izolat ( ) &&g r a d p ar () && oonex () ).
PAS3. Daca grafu! nu este' eul erian( variabila valoarea false), at unci S8 afi-
seaza mesaju! 'Grato! nu esle eulerian' fji S8 terrnina algoritmul; alttel , S8 serie mesa-
jul 'Graful este eulerian' si S8 trece la Pasul 4 pentru a determina un ciclu eulerian.
PAS4, Se pleaca dint r-un nod oarecare (de exempl u, nodul 1: e [ 1] =1)
PASS. Executa urrnatorii pas i pentru a construi i n vectorul c un prim cielu pri n parcu r-
gerea din aproape in aproape a muchiilor grafului, pornind de la nodul eu etieheta j
eqala cu 1: j (acest cielu exista, deoarece gradul nodului de porni re este par,
eeea ee lnsearnna ca orieare ar fi muehia pe care se porneste, mai exista cel
putin a muc hie care soseste i n acest nod) .
PAS6 . Cat t i mp nu s-a qasi t a muchie lntre nodul curent k din coada c (e
un alt nod j din graf (j<=n) exec ut a:
PAS? Daca exi sts a muchie i ntre nodul curent k din coad a C (c [ k ] ) un alt
nod j din graf (a [ e [ k] ] [j atunci se trece la Pasul 8; altfel , se
trece la Pasul 11.
PAS8. Se adauqa nodul j la coada C e [k] ;).
PAS9 , Se micsoreaza cu a unitate gradul celor doua noduri parcurse (g [ j ] -- ;
g[e[ k -1 ] ] -- ; ).
PAS10. Se sterqe din matricea de adi acenta muchi a parcursa (a [e [k ]] [ j ] =D ;
a[j] [e[k]] =D; ).
PAS11 . Se trece la urrnatcrul nod prin' incrementarea lui j si se
revine la Pasul 6.
Pana can d nodul curent din coada c (c[k]) este diferit de nodul de pornire.
PAS 2. Cat timp rnai exista muchii care nu au fast incl use i n ciclu (k - l <rn) executa
PAS13, Se cauta I n coada c un nod i de plecare pentru ciclu l c1 , adica un nod
pentru care mal exista muchii incidente cu el care nu au fast parcurse
(gr ad [ e [ i] ]>0).
PAS14. Se initializeaza cu acest nod ciclul c1 (e1 [1]= e[i )) si se rnerno reaza
acest nod i n variabila q.
PAS15. Se construieste un nou ciclu parcurqanc - din algoritm - pentru coada c1,
de la Pasu l 5 pana la Pasul 11. Acest ciclu va avea p elemente.
PAS 6. Se concateneaza cicl ul c1 cu ciclul c astfel: mai i ntai se deplasea z8 elementele
di n vectorul c, l ncepand din pozitia q, cu p pozi tli spre dreapta , dupa care S8
intercaleaza, lntre pozitia q sl pozi t ia q+p, elemen tele vectorului c1.
PAS1? Se afiseaza elementele vectorului c.

typedef s t i.va [20 J;
int n,o f20 1L2 0J , v i zi t a t [ 2 0 J , v f, k , r:l , g l 2 0 1 ,p=l, cf 2 01 , cl I 20 j;
stivu st ;
fs t r eam ;in ) ;
void c i t e s t e{ ) matricea d e
void i.n it(i r: t i) { v f = l ; s t j v f l e i : v.iz i t .at Lt l e-Lr }
i n t e s t e j v ida ': ) {retur n vf==O; }
voi d 2 daug( i n t i ,1 {v f ++; s t j v'fl e i : v i z i t at[i ] =1; }
v o id e Li.rni n t ) {v t':"'_;}
I nfo r mat ica
267
voi d p r .eLuc r-a re t)
l i nt I v fl .
&& I I (a[ i ] && i ++ ;
if ( i ==n +1 ) el f rrun (} ; e lse {p..j'+; a d a u g ( i ): }}
i n t c one'x ()
( k=).; .i n i t ( k );
while ( ! este v ida () ) prel ucrare \) ;
r etu r n (p==n) ; }
v o id g r a d ( )
{for (int i =l; i <=n; i ++)
f or (i n t if (a[i J [ j J ==l ) ( g [i J++;m++ ; I m=1n/2 ; 1
i n t Lz o La t t.)
{for (int i =l;i <=n; i ++} if return 1 ;
r e turn Of}
int crad pe r l )
{f o r {i n t i <""n; i ++ ) i f (g [i J %2==1 ) return 0 ;
return 1;}
void c I'c Lu L)
(int i, j ,k=l , p , g ,ga s i t ;
c[ 1]=1 ;
do for ( j=l, gasi t :::: O; j <=n && ! ga s i t; j ++)
if (a[ c[kJ][j]==1)
a[ c[ k -1 J hiJ =O; a [ jl
g[ jJ - - ; g [ c j k- 1 J l--; ga.i t=l ; 1
wh.i Le Lc l k.] !=1 ) ;
while (k- l<m)
&& q==O; i )
if (g[ c[ i Jl>O I { c l Ll l s c l i.i . q=L I
1"
= 1 -
."
do && !gasi t ;j++)
if (e l c L j p l ]
c Lj p j e j: a U J [ c l [1"- 1J J =0;
9( j ] -- ; 9 [ c lf1"Cl J J - - ; gasi t =1 ; )
while (e l [ p J '=c 1 [ lJ) ;
for (j =k; j -- I e [j +p -1J J;
for ( j =1; j<=1' - 1; i H) c !j+cjJ <c I [)"f1 J ;
1 ; II .
void main ()
( i n t euler ian ; c.i t.e s t.e t y , grad() ;
eu Le ri an> ! (izolat{}) && g La d , p a r (i && conex() ;
if ( !euleri a n) cout.c-c't q r a fu-I ::IU e s t e eulerian " ;
else {c o u c-c-C'rj r a f u Lces t.e eu Le r Lan "<cendl :
c .i c Lu j I : oou t-oc vc i cLu I e u ler i a n e s t e : " ;
for (int i = l; i<=m+ l ;i-H) cout-oc c l'i l «c :' " ;}}
Observatie. Daca graful contine noduri izolate, alqoritrnli anteriori se pot aplica pe subqra-
ful conex care se obtine dupa tnlaturarea nodur ilor izolate.
_....-... 1. Deterrninati complexitatea algoritmu!ui de qasire a unui ciclu eulerian.
2. Scrieti un program care citeste din fisierul text graf_e1.!x! matricea de
adiace nta a unui graf eulerian si, de pe ultirnul rand, un sir de numere
care reprezinta etichete de noduri - 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 adiacenta a unui
graf neorientat care poate contine nodur i izolate si care verifica daca graful este un graf
euleri an, iar daca este graf eulerian, aflseaza ciclul eulerian.
4. Scrieti un program care citest e din fisierul text grale3.txt matricea de adiacenta unui gral
neori entat conex ~ i care verific a daca graful este un graf eul erian, iar daca nu este, verifica
daca poate fi facut eulerian - In acest caz, S8 prec izeaza nurnarul de muchi i care trebuie
adauqate ~ i care sunt aceste muchii .
2.7.10.4. Graful turneu
Un graf orientat in care, intre oricare doua noduri exista un singur arc
~ i numai unul , S8 numeste grat turnou.
;;": Gj,. Exemplu - Gralui G
37
din figura 43
Observatli
1. Arcul dintre doua noduri poate avea oricare dintre cele doua orlentari .
2. Gral ul tumeu est e 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. Considerarn 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( xi, 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( xj,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,x
j) 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 D
3
(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 incat 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 gradul 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. lnseamna 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
Propozit ia 11
Pentru mice nod Xi dintr-un gral tumeu cu n noduri, d+( Xi) + d-(Xj) = n-1 .
Informatica 269
Demonstrat !e. in graful turneu. fiecare nod Xi fiind legal de celelalte n-1 noduri Xj din graf pnntr-un
arc s! numai unul, insearnna ca orice nod Xi esle incident cu n-1 arce si suma dintre gradul intern ~ i
gradul extern este eqala cu n-t .
Propozitia 12
n "
Intr-un gra! turneu cu n noduri Ld+( \ ,) = Ld- (\,) = C; , unde Xi este un nod din grato
i ~ 1 1=1
Dernonstrat ie. in orice graf nearientat suma dintre gradele interne ~ j gradele 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
i ntr-un gra! turneu Ld' ( \,)' = L .r(\, )' , unde Xi este un nod din grato
i", ) 1=1
Dernonst 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 nodurile Xi obunern:
n n n n
Ld+(\ , )' - Ld" (\ , )' = ( II - I) x (Ld' (\ , ) - Ld- ( \ ,» = (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. Scrieti 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 2 c ~ .
I SWWlLlL de CaLZ I
Scop: exemplificarea unei aplicatii i n care soluua problemei este un gra! tumeu.
Enuntul probl emei . Pentru un concurs hipic s-au montat n obstaco/e. Pentru a parcurge
traseul concursutui, catarelii pot incepe cu orice obstacol. trebuie sa treaca peste toate
obstaeolele, iet de 18 un obstacol la altul pot citcute intr-un singur sens, stabilit inaintea
concursului. Sa se precizeze ce trasee poate urm8 un cetsret.
Obstacolele forrneaza nodurile unui graf orientat, i n care fiecare doua noduri sunt legate de
un arc. Deoarece drumul dintre doua obstacote nu poate fi parcurs decat i ntr-un singur
sens, i nsearrma ca graful concursului este un graf turneu. A determina un traseu •
pentru parcurgerea obstacolelor , tnsearnna a determina i n gra!ul turneu un dr um-e ~ e-
elementar care trece prin toat e nodu rile gra! ului.
Algoritmul pentru parcurgerea grafului turneu
Pentru a determina drumul elementar care trece prin toate nodurile grafului se poate folosi
fie metoda backtracking, fie urmatorul algoritm, prin care se extrag eele n noduril ale
drumului intr-un vector D. i n acest algoritm, se initializeaza vectorul cu nodurile cu etiche-
tete 1 si 2 sau 2 ,i 1, in functie de arcul care exista [ 1,2]. respectiv [2,1], dupa care se
insereaza in vectorul drumului ~ i celelalte noduri, in functie de arcele care exista i n graf:
PAS1. Dad exists arcul [1 ,2], atunci D[ 1] =1,i D[2 ] =2: alttel, D [ 1 1 ~ 2 , i D[2]=1.
PAS2. Se inltializeaza lungimea drumului. m. cu 2.
270
lmplerncntarcu st r uct ur tlor de dat e
PAS Pentru noduril e cu eticheta i de la 3 pima la n execut a:
PAS4. Daca exista arcul [ i , 1], atunci poziti a de inserare k a nodului i este 1
se trece la Pasul 7; aItfel , pentru a parcurge nodurile din drum se initiall-
zeaza indicele j cu vaioarea 1 si S8 trece la Pasul 5.
PASS. Cat tirnp nu s-a ajuns la capatul vectorului 0 (indicele j nu are valoarea m)
nu s-a gasit pozitia de inserare a nodului .i.. executa:
j PAS6. Daca arcul i ntre nodul cu indicele j din drum nodul i
J exista arcul intre nodul i si nodul cu indicele j + l din drum, at unci
j pozitia de inserare k este j +l ; alttel , se trece la urrnatorul nod din
! drum prin incrementarea variabilei j se revine la Pasul 6.
! PAS7. Se deplaseaza elementele vectorului din pozitia k (de inserare) spre
, dreapta.
! PASa. Se insereaza nodul i In pozitia k.
! PAS9. Se incrementeaza lungimea m a drum