You are on page 1of 338

MINISTERUL EDUCATIEI ~I CERCETARII

Mariana Mllosescu

norma lea In enslv


I I

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 fos t apro bat prin Ord inu l ministru lui Educ atic i si Cerceta rii nr. 4742 d in

2 1.07.2006, in urma evaluiirii calitative organizmc de catre Consiliul National pentru Evaluarca si Difuzarca Manualelor si este realizat in confo rtni tate ell program a analitica aprobata prin Onli nu l rnin istr ului Edu catie i ~i Cercctarii nr, 3252 d in 13.02.2006.

Dcscrie rea e lr a Bibliotecii Nati on ale a Rom:iniei

M ILOS ESC U, MARIA NA


Informat ica intcnsiv: manu al pentru clasa ~I X l- a I Mariana Liliana Mi losescu. - Bucuresri: Editura Didactica ~i Pcd agogica, 2006 ISB N ( I0) 973 -30- 1567 -9; 15 13:" ( 13) 9 78-973-30- 1567-3 004(075.35) 007(0 75 .35)

L im bu j u l C++ [UP 2006. Toate drepturile asupra acestei edit ii sunt rezervate Edi tu rii Didactice si Ped agogi cc R.A ., Bucuresti. Orice preluare, partialf sau integrala, a textului sau a materialu lui gra fic din accasta lucrare se face nu ma i ell acordu l scris al edit uri i,

EDiTURA OIDA CT ICA S I PEOAGO GI CA, R.A.


SIr. Spiru Huret. nr. 12. sector 1, co d 0 10 176, Huc uresti Tel.: (0 2 1) 315 38 20 Tel./Fax: (02 1) 312 28 8 5; (02 1) 3 1573 98 E-mail: ed p@b .astra l.ro . ed pcom @b .astral.ro web : www.ed ituradp.ro

Comenzile pcn tru aceasta lucr are se prlmesc: prin po sta , pc ad resa editurii, eu men tiunea Comandis carte
prin e-mail: edpcom@.b.astral.ro .comenzi@edituradp.ro

prin tel. rfax : (02 1) 315 73 98 prin te l.: (021) 3 15 38 20


Referen ti: p rof g l: I E mma Gabrie la Dn rn cscu . Colegiul Tehni c Pet r u Rares, Bucuresti : rnetod ist de spe cial itate 1 1l rorl11 ati ca - I . ~ Jv1 . Bucu resti pro/ g/: I Geo rgi na Pat rasc u. Co legiul Nat ional S fa n tu l Sa va. Bucuresti Redactor: Lia na Faca Tehnoreductor: i\l a r ia na :\ l i1o~escu Desenator: Aur ica G eorgesc u Coperta: Ele na Dr a g uletei Dumit ru
Nr. de plan : 5 1263 ; Format 16'70 " 100 Bun de tillar: augu st 2006: Coli de t!p.lr: 21.

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 rez olvarea

aceleiasi prob leme

~i

trebuie ales aigoritmul cel mai eficient.

Eficienta unui algoritm este evaluate prin timpul necesar pentru executa rea algoritmului.
Pentru a compara - din punct de vede re al eficientei - doi algoritmi ca re rezolva ace easi problema, S8 foloseste aceeasi dimensiune a dat elor de intrare - n (acelasi nurna r de

valor! pentru date Ie de intrare) . Timpul de oxecutle al algoritmului se exprima prin nurnarul de operatil de baza exe cutate i n functie de dimen siunea dat elor de intra re : T(n) . Pentru a compara doi algoritmi din punct de vedere al timpului de executie, trebuie sa se stabileasca umtatea de rnasura care se va folosi, adica op eratia de baza executata in cadrul algoritmilor, dupa care. S8numara de cateon S8 executa ope ra~ia de baza in cazvl fieca ru i 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 intra re. Exista algoritmi la care tim pu J de executie depinde de distributia datel or de in tra re . Sa cons ider arn doi algoritmi de sorta re a unui vector cu n elemente - algoritmul de sortare prin metoda selectiei directe si algo ritmul de sortare prin metod a bule lor - ~i ca operatie de baz a cornparatla . Daca , in cazul primului algo ritm , timp ul de executie nu depinde de distributia datelor de intrare (modul in care sunt aranjate elementele vec toru lui in ainte de sortarea lui) , el fiind T(n) = n x In - J) , i n cazul celu i de al doilea algoritm timpul de exeZ cutie dep inde de distributia datelar de intrare (nurnarul de executii ale structurii repetitive w hile depind e de mod ul in care sunt aranj ate elementel e vecto rului in ainte de sortare). in cazu l in care nurnarul de executii ale operatiilor elementare depinde de distributia datelor de intrare . pentru ana liza algoritmului se folosesc : -7 timpul ma xim de execu t ie - timpul de executie pentru cazul cel rnai nefavorabil de distributie a datelor de intrare; in cazul sortarii prin metoda bulelor, cazul eel mai nefavorabil este atune i cane elementele vecto rului . sunt aranjat e i n ordine inversa decat aceea ceruta de criteriul de sortare ; ~ timpul med iu de execut ie - media timpiJ or de execu tie pentru fiecare caz de distnb utie a datelor de intrare.
Deoarece , i n analiza eficientei unui algoritrn, S8 urrnareste comportamentul lui pentru 0 c imensiune mare a datelor de intrare, pentru a cornpara doi algoritmi din punet de vedere al eficie ntei, este suficient sa S8 ia in considerare numa i factorul care dete rrnina timpul de exe c utie - ~i care este denumit ordinul de complexi tate.

T ehn ici d e p rogra ma rc


Ordinul de comp lexitatc al unui algo ritm ll reprezinta timpul de executie - estimat 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 exemp lu, daca - pentru algoritmul de sortare, prin metoda selectiei directe - timpul de ordinul de complexitate al algoritmului este 2 O{n \ deoarece in calcularea lui se ia in considerare numai factorul determinant din timpul de executie. executie este T{n) = in functie de ordinul de comp lex itate, exista urrnatoarele tipuri de algo ritmi: Ordin de complexita te O(n) O{n
m )

n X(~ - I) = n -~ '

Tipul algoritmului Algoritm liniar. Algorit m po linomia l. Daca m=2, algoritmul este patratic , iar dat a m=3, alqoritrnul este cubi c. A lgoritm exp onential. De exemplu: 2 , 3 etc. Algoritmul de tip O(n!) este tot de tip exponential, deoarece: , n- 1 1x2x 3x4x ...xn > 2x2x2x...x2 = 2 . Alqoritrn loqaritmic . Alqoritrn Iiniar loqarltmic.

O{k") O(logn) Otnloqn)

De exemplu , algoritmul de sortare prin metoda selectiei directe este un algoritm patratic. Ordinul de comp lexitate este determ inat de structur ile repetitive care se executa cu multimea de valori pentru date le de intrar e. in cazul structurilor repetitive imbricate, ordinul de complexitate este dat de produsul dintre nurnarul de repetitii ale fiecarei structuri repetitive.

Structura repetitiva

fo r \ i=l ; i<=n ; i=::'H: ) { ... . } fo r (i=l ;i < =n ;i =i ~kl { ... . } fo r (i=l1 ; i>=n ; i=i/l:) ( ... . ) fo r (i=n ; i <=n ;i=i +p) { .. .. } for (i =n ; l<=n ; i= j +q) { .. .. } fo r (i =:1 ; ' <=n ;i=i - +) { .... } fo r (; =i ; j <=n ;l=i"--"-) { .. .. }

Numarul de executf ale corpului structurii f(n)=n/k --) O(n)=n f(n)= log,n --) O(n)= logn f(n)= log,n --) O(n)= logn f(n)=(n/p)"{n/q) = n2/(p*q) - ) O(n)= n2 f(n)=1 +2+3+ ... +n =(n*(n+1 ))/2 - ) O(n)= n2

Tipul algoritmul ui Liniar


Loqar itrnic

Logar ilmic Polinomial


patratic

Polinomial
patrat ic

b. c. d. e. f. g. h.

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; inserarea unui element lntr-un vector, dupa un element cu valoa re precizata: sterqerea dintr-un vector a unui element cu valoare precizata, stabilirea daca un sir de numere confine numai numere distincte; sortarea unui vector folosind metoda bulelor; cautarea unui element cu valoare precizata, lntr-un vector nesort at; cautarea unui element cu valoare precizata, lntr-un vector sortat; determinarea tuturor perrnutarilor unei rnultirni de numere.

Infurm aticii

1.2. Metode de construire a algoritmilor


in functie de procesul de calcul necesar pentru rezolvarea unei probleme, exista urm atoarele clas e de problem e:

Probleme de enumerare prin care S8 gasesc toate solutiile posibile

Clase de probleme

...

Probleme de decizie prin care se precizeaza daca exista sau nu eel putin 0 soluue

Probleme de optimizare
prin care S 8 identifica solutia optima din mulnmea de solutii
posibile

""

Generarea tuturor pe rmutarilor unei multirni de numere este 0 problema de enumerare, cautarea unei valori prec izate intr-un sir de numere este 0 problema de decizie, iar qasirea modahtatii de plata a unei sume s cu un numar minim de bancnote de valori date este 0 problema de optimizare.
Pentru rezolvarea aceleiasi probleme S8 pot folosi mai multe metode de construire a algoritmilor. Ali invata t deja ca - pentru rezolvarea aceleiasi probleme - puteti lolosi un: -7 algo ritm iterativ ; ~ algoritm recursiv .

Solutiile recursive sunt mult mai clare, mai scurte ~i mal user de urmarit. Alegerea algoritmului recursiv in locul celui iterativ este mai avantajoasa in cazul in care solutiile problemei sunt definite recursiv sau daca cerintele problemei sunt formulate recursiv. Timpul de executie a unui algoritm recursiv este dat de 0 0(1) pentru n- O formula recursiva. De exemplu, pentru algoritmul de T(n) = calculare a sumei primeior n numere naturale. functia 0 (1)+T (n.1) pentru n,.O pentru timpul de executie este prezentata alaturat, unde 8( 1) reprezinta tirnpul de executie a unei ope ratii elementare de atribuire a unei valori sumei . Rezulta ca T(n)=(n+1) x0 (1), iar ordin ul de complexitate a algor itmulu i este O(n) la l ei ca si cel al algo ritmulu i iterativ, i n cazul irnplernen tarf recu rsive , lieca re apel al unui subprogram recurent tnseamna inca 0 zona de memorie rezervat a pentru e xec utia subprogramuiui (variabilele locale ~i instructiuniie). Din aceasta cauza , i n aleg erea intre un algoritm iterativ ~i un algoritm recursiv trebuie tinut cant nu numai de ordinul de complexitate, dar ~j de faptul ca , pentru 0 ada ncirn e mare a rocu rst v itatii , alqoritrnii recursivi nu mai sunt eficienti , deoarece tirnpul de executie creste. din cauza timpilor necesari pentru mecanismul de apel ~i pentru administrarea stivei de sistem .
Veti lnvata noi metode de construire a alqoritrnilor - care va ofera avantajul CEl prezinta fiecare 0 metoda gencrala de rezolvare care S8 poate aplica unci clase de probleme: -7 m etoda backtracking ; -7 metoda divide et irnpera: -7 metoda greedy; -7 metoda proqrarnar!l dinamicc.

Fiecare dintre aceste metode de construire a atgoritmilor se poate folosi pentru anumite erase de probleme , iar in cazul in care - pentru aceeasi clasa de probleme - se pot lolosi mai multe metodede construire a algoritmilor, criteriul de alegere va fi efic ienta algor itmului.

Tehnici de programare

1.3. Metoda backtracking


1.3 1. Descricrca metodei backtracking
Metoda backtracking se poate folosi pentru problemele in 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 rnultirni finite Ai (XiEA i), iar asupra elementelor unei solutii exista an umite restri ctii sp ecifice problemei ca re tre buie rezolvata, numite conditii interne . Mult irnile Ai sunt rnultirni ale carer elemen te sunt i n relatii bine stab ilite. Mult irnile Ai pot sa coin cid e sau nu. Pentru a qasi toa te solutiile un ei astfel de probleme folosind 0 metoda clasica de rezo lvare , se executa urrnatorul algoritm : PAS1. Se gene reaz a toate elementele produsului cartezian A1 x A 2 x A3 x . .. x An. PAS2. Se verific a fiecare elem ent al produsului carte zian, daca l ndeplineste c ond it iile interne impuse ca sa fie solutie a problemei.

Seop : identificarea prob lemelor pentru care trebuie enumera te to at e s ol utii le, fiecare solut ie fiind forrnata din n eleme nte Xi, care apa rtin fiec are unor rnultimi fin.te Ai ~ i care trebuie sa resp ecte anu mite c onditii interne . Enuntul prob lemei 1: Sa se ge ne rez e toate p etm utettte m ultimii {1, 2, 3}. Cer inta este de a enume ra toate posibilitatile de gen erare a 3 nu mere naturale din rnultirnea {1, 2, 3}, astfel i ncat numerele gen erate sa fie distincte (c on d itia in tern a a solutiei). 0 solutie a aces tei pro bleme va fi un vector cu 3 eleme nte: S {X1 ,X2,X3}, in care elementul Xi repre zinta nurn arul care se va qasi, i n permutare, pe pozit ia i, iar mul tirnea Ai reprezinta rnultimea nume relor din care se va alege un nurnar pent ru pozitia i. In acest exemp lu, rnultirnile Ai coincid. Ele au ace leasi 3 elemente, fiecare elem ent repreze ntand un numar. Ai {1, 2, 3} A

Daca s-ar rezolva c1 asic ac ea sta problema , ar in sem na sa se genereze toate elem entele produsului cartezian A1 x A2 x A3 = A x A x A = A 3, adica rnultirnea : {(1,1 ,1) , (1,1,2), (1,1,3) , (1,2 ,1), .. ., (3,3,2), (3,3 ,3)} dup a care se va verifica fiec are elemen t al mu ltimii dac a este 0 solutie a prob lemei, adica daca ce le trei numere dintr-o solutie sunt distincte . Soluti ile obt inute sunt: {(1,2,3) , (1,3,2), (2,1,3) , (2,3,1), (3,1,2), (3,2 ,1)} Enuntul prob leme i 2: Sa se gene roze toate erenjememele de 2 elemente ale mullill7ii {1, 2, 3}. Cerint a este de a enum era toate pos ibilitatile de gene rare a 2 nu mere naturale din multirnea {1, 2, 3}, astfel i ncat nume rele ge nerate sa fie distincte (c o nd it ia interna a solu{X1,X2}, In care tiel). 0 solutie a aces tei probl eme va fi un vector cu 2 elemente : S elementul Xi reprezinta nurnarul care se va gasi In aranjament pe pozi tia i, iar rnultimea Ai reprezinta rnultimea nume relor din care se va alege un nurnar pe ntru pozitia i. ;;;i In ace st exemp lu, multirnile A i coincid . Ele au aceleasi 3 elemen te, fieca re elemen t reprezentand un numa r. A i {1, 2, 3} A

Daca s-ar rezo lva clasic aceasta problem a, ar lnsemna sa se generez e toate elemente le produsului cartezia n A 1 x A2 = A x A = A 2, adica rnultim ea: {(1 ,1), (1, 2), (1,3), (2,1), ..., (3,2), (3,3)}

I II furill a ticii

dupa care se va verifica fiecare element a! multirnii, daca este 0 soiutie a problemei, adlca dac a cele doua numere dintr-o sol utie sunt distincle. Solutiile obtinu te sunt: ((1,2), (1,3) , (2.1), (2.3), (3.1) , P,2)} Enu nt ul problemei 3: Sa se gonereze toate combinarile de 2 elemente ale multiml! (l , 2, 3). Cerinta este de a enumera toate posibilitatile de generare a 2 numere naturale din multimea {1,2,3}, astlel tncat numerele generate sa fie distincte (c ond it ia interna a solutiei), iar solutiile obtinute sa fie distincte. Doua solutii sunt considerate distincte daca nu cont in ace leasi nurnere . 0 solutio a acestei problems va Ii un vector cu 2 elemente : S = {Xl ,X2}, in care elementul Xi reprezinta nurnarul care se va gasi in combinare pe pozitia i, iar multimea 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 reprezentand un nurnar. A i = {1, 2, 3} = A
Daca s-ar rezolva ci asic aceasta problema , ar insemna sa se genereze toate elementele produsu lui cartezian A1 x A2 = A x A = A 2, adica rnultirnea: {(1.1 ), (1, 2). (1.3) , (2.1) ... (3.2) . (3.3)} dupa care se va veri fic a fiecare element al m ultirnii da ca este 0 solu tie a problemei, ad ica daca cele doua numere dintr-o sc lutie sunt distincte ~ i daca sol utia obunuta este distin cta de solut iile obtinute anterior. Sol utiile obtinut e sunt: {(1.2), (1,3) . (2.3)}

Enuntu l problem ei 4: Sa se qenorez e toate petmuterlte multitnii {l,2,3,4} care indeplinesc cond1ia ca 1 nu este vecin eu 3. i 2 nu este veein eu 4.
Cerinta este de a enumera toate posibilitatile de gene rare a 4 numere naturale din multirnea {1, 2, 3, 4}, astlel tncat numerele generate sa fie dlstincte, iar 1 sa nu se invecineze cu 3, si 2 sa nu se invecineze cu 4 (co ndltia interna a solutiel), 0 solutie a acestei probleme va fi un vector cu 4 e!emente: S = {X1 ,X2,X3 ,X4} , in care elementul Xi repre zmta nu rnarul care se va gasi in permutare pe pozitia i, iar multimea A i reprezinta multirnea numerelor din care se va alege un nurnar pentru pozitia i. in acest exemplu, rnultirnile Ai coincid . Ele au aceteasi 4 elernente. fiecare eleme nt reprezentand un numar. Ai = {1 , 2. 3. 4} = A

Dac a s-ar rezolva clasic aceasta problema, ar insemna sa se genereze toate elementele produsulu i cartezian A, x A2 x A3 x A4 = A x A x A x A = A 4, adica rnultirnea: ((1 .1.1,1). (1.1.1.2) . (1.1 .1.3). (1.1. 1,4), .. .,(4,4.4,3). (4.4.4.4)} dupa care se va verifica fiecare element al multimii daca este 0 solutie a probtemei , adica daca cele patru numere dintr-o soluti e sunt distincte si daca 1 nu se lnvecineaza cu 3. iar 2 cu 4. Solutiile obtinu te sunt: ((1 .2,3,4) , (1,4,3.2 ), (2,1,4 ,3), (2,3,4,1), (3.2.1,4), (3.4,1 ,2), (4,1 ,2,3) , (4,3,2,1)} Enuntu l problem ei 5: Sa se aranje ze pe tabla de ah opt dame care nu se ataca intre ele (problema celor 8 dame) , Cerinta este de a enumera toate posibilitatile de aranjare a 8 dame pe 0 tabla de sah cu dimensiunea 8x8 (8 linii ~ i 8 coloane), astfel i ncat toate cele 8 dame sa nu se atace i ntre ele (conditia inter na a solutiei), Deoarece nu se pot aranja doua dame pe aceea si coloana (s-ar ataca intre ere) . tns ea rnna ca pe fiecare colo ana a tablei de san se va pune a darna . 0 solutie a acestei probleme va fi un vector cu 8 elemente, S = {X1 ,X2 .X3,X4,XS,X6,X7,Xa} . in care eJementul Xi reprezinta numarul liniei pe care se va pune dama in calaana i, lar rnultimea Ai reprezinta rnultirnea liniilor pe care se poate aranja dama din coloana i. $i in acest caz multirnile Ai coincid. Ele au aceleasi opt elements. fiecare element reprezentand un nurnar de linie: A i = {1, 2. 3.4.5.6.7, 8} = A

Tchnici de programarc

Daca soar rezolva clasic aceasta prob lema, ar i nsem na sa se genereze toate elem entele produs ului cartezian A, x A 2 x A3 x '" x As = A x A x A x ". x A = AS, adica mult imea: {(1,1, 1, 1, 1, 1, 1,1), (1, 1, 1,1, 1, 1, 1,2), (1, 1, 1, 1, 1, 1, 1,3), " ' , (8,8, 8,8,8,8,8, 7), (8,8, 8,8,8,8,8,8) } dupa care S8 va verifica fiecare element al rnult imii, daca este 0 solutie a problemei, adi ca daca cele opt nu mere dintr-o solutie pot reprezenta coloanele pe care pot fi aranjate dame le pe fiecare linie, astfel tncat sa nu se atace intre ele. Solutiile obtinute sunt: {(1,5 ,8,6 ,3,7,2,4), (1,6 ,8,3,7,4,2,5), (1,7,4 ,6,8,2,5,3), " ., (8,3,1,6,2 ,5,7,4) , (8,4,1,3,6,2,7,5)} Ob serv ati e Metoda cia sica de rezolvare a acestui tip de probleme necesita loarte mulle
operatu din partea calculatorului, pentru a verifica fie care element al produsului cartezian . Presupunand (pentru simplificare) ca fieca re mult irne A i are m elemente , atunci algoritmul de generare a elementelor produsului cartezian are cornplexitatea O(card (A,) x ca rd(A2) x ... x

n) card(A n)) = Q(m x m x m x " . x m) = O(m Considerand ca algoritmul prin care se verifica daca un element al produsul ui cartezian este 0 solutie a problemei (respecta co n d it ia interne a solutie i) are complexitatea O(p), atunci co mp lcx itato a algoritmulu i de rezolvare a problemei va fi Otp xm" ). De exemplu, i n algoritmul de generare a permutarilor, complexitatea algoritmului de verificare a conditiei interne este data de complexitatea algoritmu lui prin care S8 verifica da ca numerele dintr-un sir sunt distincte. in acest algoritm , S8 parcurge sirul de m numere - !?i pentru fiecare nurnar din slr - se parcurge din nou sirul pentru a verifica ~ daca ace I nurna r mai exista in sir. Complexitatea algoritmului este data de cele doua-e ~ I> 2) 2 structuri for imbricate: O(m _ > p = m . . Metoda rccomandata pentru acest gen de probleme este metoda backtracking sau metoda c au ta ri i cu rev enire - prin care se reduce volumul operatiilor de gasire a tuturor solutitlor. Met od a backtracking const ruleste pro gres iv vect orul solutiei , p ornind de la primul el ement sl ada uqand la vector urmatoarole elem ente, cu revenire la elemc ntul anterior din vector, in caz de insucces. Elernentul ca re trebuie ad auq at se cauta in multime, printr e elementele care respecta conditi lle intern e.
Prin metoda back track ing se obtin toatc solutute problcmci, da ca ele exista. Pentru exe mplificarea modu lui in ca re sunt construite solut iile, cons ider arn problema generarii perrnutar ilor rnult irnil {1, 2, 3, "" nJ (A, =A 2= '" =A n=A= {l, 2, 3, .. .. n} ). PAS1 . Se alege primul element al solutiei ca fiind primu l element din rnultirn ea A. in exem plu, x1=1 , adica primul nurnar din perm utare este 1. PAS2. Se cauta al doilea element al solutiei (X2). Pentru a-l gasi, se parcurg pe rand elementele rnultirnii A .i, pentru fiecare element i al mul\imii, se verifica daca respecta con dit iile interne . Cautarea continua pima cane 58 gase!?te primul element din rnullimea A care Indephneste co ndtti a lnterna, dupa care se opreste. in exemplu, se cauta nurnarul de pe a doua pozitie a perrnutarii, verificandu-se caca al doilea nurnar din permutare este diterit de primul nurnar. Se parcurg prirnele doua elemente ale rnultirnii A si se gase.te elementul x2=2, dupa care procesul de cautare se opreste. PAS3 . Se cauta al treilea element al solu tiei (X3). Cautarea va lo losi acela si algoritm de la Pasul 2. in exemplu, se cauta nurnarul din pozitia a treia din pe rmutare. Se gase.te elementul x3=3 PA S4. Presupunand ca s-au ga sit primele k eleme nte ale solutiei, X1 , X2 , X3 , ... , Xk . se trece la cautarea celui de al k+1-lea element al soluliei, Xk+1. Cautarea se va face astfel: se atribuie pe rand lui Xk+1 elemente!e multirnii A , pa na se gase ~t e primul element i care l ndeplineste co nditia interna. in exernplu , co nditia mterna este ca

Informatica

numarul din po zitia k+1 a perrnutarii sa nu fie ega l cu nici un ul dintre numerele din pozitiile anter ioare lui k+1 . Pot sa apa ra dou a situatii: a. Exista un eleme nt i i n rnultirnea A . astfel Incat Xk+1 = i sa fie element al solutie i prob lemei . i n acest caz , se atribuie elementului Xk+1 al solut iei valoarea i, dupa care se verifies dac a s-a gasit solutia problemei. in exempl u, presupunem ca pe nivelul k+1 s-a gasit nurnarul 4. Se verifica dac a s-au generat toate cele n elemente ale multi rnii S, adica daca s-au gasit num ere pent ru toate cele n pozitii din permuta re (k=n). Dad! s-a qasit solutia problemei , atunci se afiseaza solutia : altfel , se cauta urrnatorul element al solutiei. reluandu-se opera tiile de la Pasu l4 . b. S-au parcurs toate elementele rnultirnii A ~ i nu s-a gasit nici un element i care sa fie elementul Xk+1 al soluuei problemei. Insearnna ca trebuie sa revenim la elementul k al solutiei - Xk . Asadar, se considera generate primele k-1 elemente ale solutiei: X1, X2, . . ., Xk-1 si, pentru element ul Xk al solufiei, se reia cautarea , cu urrnatorul element din multirnea A , adica se reiau operatiile de la Pasul 4 pentru elementul Xk al solutiei, Insa nu cu primul element din multirnea A, ci cu elementul din multimea A care se ga se~te imediat dupa eel care a fost atribuit anterior pentru elementul Xk al solutiei in exemplu, luand in considerare modul in care au fost generate primele k numere ale permutarii, in poziua k+1 , orice num ar soar alege, el mai exista pe una dintre cele k pozitii anterioare , ~i se revine la elementul k, care presupunem ca are valoarea 3. Se qenereaza in aceasta pozitie urmatorul nurnar din rnultirnea A (4) si se verifica oaca el nu mai exists pe primele k-1 pozitii ale permutarii, iar daca exista, se gene reaza urrnatorul element din rnultimea A (5) s.a.rn.d. PASS . Algoritm ul se incheie dup a ce au fost par curs e toa te elemente le rnulti rnii A pentru ele mentu l X1 al solut iei . in exemplu , algoritmul se incheie dupa ce s-au atribuit pe rand valorile 1, 2. .. ., n, ele mentului de pe prima poz itie a per mu tar ii. Generarea tuturor perrnutarilor rnultirnii {1, 2, 3}

Ij~ , ~~ 23ffi0 >~3 ~~ ' ~3 . ~0>

W ,

1~23
_ . ~
1 3

. , 1 2 ~ 3 J,

-1 3

~'

~
3 2

2 3 .!. ffi 3 0 .!.


2

W 3 @~

AU fast parcurse toate elementelc rnultirnii A pen3 0 .!. tru elementu l Xl al solutiei.

Observatie. in metoda backtracking , daca s-a gasit elementul Xk al solu tiei, ele mentului Xk+1 al solutiei i se atribuie 0 valoare nu mai daca mai exista 0 valoare ca re sa i nde plinea sca conditia de continuare a co nstruirii solutiei - adica daca , prin atribuir ea acelei valori , se poate aju nge la 0 solutie finala pentru care cond itiile 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 perrnuta rilor rnultirnii {1, 2, 3, 4} care indepl inesc condiiia ca 1 nu este vecin cu 3, ~ i 2 nu este vecin cu 4.

10

Tch nici d e programarc

Algo ritmul metodei bac ktrac king poate fi gene ralizat pentru oric e problema care i ndeplineste urrnatoarele cond itii: 1. Sotutia proble mei poat e f, pusa sub forma unui vector S = (Xl . X2 ... Xn} ale caru i elemente Xi apartin - fieca re - unei mut tirni A i. astfel: X1 EA1, X2 EA2, ... XnE An . 2. Multimile A i sunt f inite. iar elementele lor sunt numer e intreg i :;;i S8 qasesc Int r-o ord in e bi ne s tabi lita . Aigoritmu l backtracking est e urrnato rul: PAS1 . Se ale ge primul element al solutiei S: X1EA,. PAS2 . Cat t im p nu au fost parcurse toate elemen tele mult imi i Al (nu au fost gasite toate sol utiile) ex ec uta: ! PAS3 . Pentru fiecare element al solutiei exec uta: PAS4 . Se presupune ca s-au gasit primele k elemente ale solutiei (Xl . X2 ... Xk) apartinand rrurltimilor Al . A 2, A3, "' , Ak ~i se trece la cauta rea celui de al : k+1 -1 ea element al solutiei, Xk+1, printre elementele rnultimii A k+1. Cautarea se va face astlel : se atribuie. pe rand. lui Xk+1- elementele multirnii Ak+l . pana se g ase~te primul element care ind eplineste conditia de conlinua re. PASS . Dac a exista un element aj i n multi mea Ak+' , astfel i nca t Xk+1 = aj sa apa rnna soluue i prob leme i, at unci S8 atribui e elementului Xk+1 valoarea a, si se trece la Pasul 7: altfe l. se trece la Pasul 6. PAS6. Oeoarece s-au parcurs toate elemen tele multirnii Ak+l si nu s-a gasit nici un element a, care lndeplineasca condi tia de continuare, S8 revine la eleme ntul Xk ~i se considera gene rate primele k-1 elemente ale sol utie i: X1. Xz, ..., Xk.1 . ~i pentru elementu l Xk se reia cautarea cu ur rnato rul element din rnultimea Ak. adica se reia u op e ratiile de la Pasul 4 pentru elementul Xk al sol utiei , tnsa nu cu primul element din rnuttim ea A k ci cu eleme ntul din rnultirnea Ak care se g ase ~t e imediat dupa cel care a fa st atribuit ante rior elem ent ului Xk . PAS7 . Se verifica daca s-a gasit solutia problern ei, adica daca s-au gasit toat e eleme ntele rnultimii S. Daca s-a gas it soluti a prob lernei, atunci se afiseaza solutia ; altfcl , se trece la cau tarea urrnatorului element al solutiei, reluandu-se ope ratii le de la Pasul 4 .

i i

sa

I..t2. 1m plcmcntu rca metndei backtracking


Pen tru implementarea meto dei se foloses c urrnatoarele structu ri de date l;ii subproqra me .

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 folose ste variabila k Cand s-a qas it 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 decremen tarea varfului cu 1 (k-- ). Initial, stiva are dimensiunea 1 (k min=1), corespunzatoare pozitiel de pornire, ~ i contine valoarea primului element al solut.ei Pentru elementul din varful stivei (care corespunde elementulu i 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) coresp unzato are nurnarutui

I II for ma t ira

11

de eleme nte ale scl utiei. Varful stivei va fi initial 1, la gasirea unei solutij va avea valoarea n, iar la terminare a algor itm ului varful stivei va avea valoarea O. Se ma i folose sc urrnatoarele va ria bile de memorie:

-7 as - pentru a

~ ti

daca pentru elementul Xk al solufiei mai exista un succesor, adica daca

mai exista un eleme nt i n multirnea A k care ar putea fi eleme ntul Xk al solutiei (este a variabila 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 c o nt in uare ~i poate fi elementul Xk al solutiei (este 0 variabila logica ce are valoarea 1 - true, daca succesorul este element al solutie i: altfel, are valoarea 0 - false) ~i

-7 n - pentru dimensiunea solutiei (nurnarul de elemente ale solutiei, in cazul problemelor in care loate solutiile au acelas i nurnar de elemente).
typede f int st iva [ l OOj ;

st i va s t ; //s t ~stiva int n ,k ,ev .as ; //k=vArful s ti vei


in cazu l problem elor prezentate in studiul de C3 Z , un element Xk al solutiei este lormat dintr-o sinqura vatoare: nurnarul din pozitia k (in cazul permutarilor, al aranja mentelor si al comb inarilor) , respectiv numarul liniei pe care va fi pusa dama din coloa na k. in preblemele in care trebuie gas1t un traseu, un element Xk al solutiei este format din c oua valori care reprezinta coordonatele pozitiei in care se face urrnatoarea de plasare. in acest caz. pentru memo rarea elemen telor Xk ale solutiei se va fotosi a stiva dub la:
t ype de f i nt st i ".;a[ lOOj [3] ;

sau

inregistrare in care cele doua carnpuri reprezinta eoordonate le deplasarii:


struct clenent { i n t X/ Yi }; typedef e Leme n t s t Lva [100J ; s t.Lva s t. .

Elementele rnult im il Ak vor Ii perechi de valori (i,j) ~ i vor reprezenla coordonatele unei pozitii, iar pentru elementul din varful stivei 5 8 va atribui 0 valo are, din rnultimea Ak, care poate f un eleme nt al solutiei, astl el: st[ k] [ l] ~i ~i st( k ] [2 ]=j . respectiv
s t(k ] . x = i ~i st[ k ] . y = j .

Pentru simplificarea implernentarii, toate aeeste date ~i structur i de date sunt deelarate globale . deoareee valoarea pentru varful stivei 5 8 va transmite mai use r, int re subprograme - ca variabila globala. bprograme Algoritm ul va Ii implementat prin: -7 un subprog ram - care va fi acelasi pentru to\i algoritmii de rezolvare prin metoda backtr acking (parte fi xa) ~i care descrie strategia general a backtracking si -7 subprogramele care au ac eeasi sernniti cat ie pentru toti algoritmii , dar al carer continut difera de la 0 problema la alta, depinzand de condltlile interne ale solutie i.
Sernni frcaua subprog ra melor folosite este (se va considera ea exemplu generare a permut arilor rnultirnii { 1, 2, 3, ... , n}}:

-7 Subprogramul an i. t (tunctie proce curala). Se initializeaza elementul din varful stivei


(elementul k). in acest element se va imegistra urmatorul element al solutiei, Acest element S8 initializeaz a cu a valoare care nu face parte din rnultime a Ak considerata, urrnand ca in urrnatoru pasi ai atqcntmutui sa se atribuie ace stui element prima

12

T ch nici de progr umare


valoare din rnultirne a Ak. in exemp lu, nivelu l k al stivei S8 va initia liza cu valoarea 0 (s t [k] = 0). urmand ca la pasul urrnator sa i se atribuie ca valoare 1. ad icii primul numii r din rnultimea (1. 2. 3 ... n}.
void i n i t () { s t[ k ] ~ O ; }

~ Subproqramul su cce s or (functie ope rand) . Verifica daca rna i exis ta in multirnea Ak

un element pent ru nive lul k al solutiei (un succesor). Daca mai exista un succesor, S8 trece la urmatorul element din rnuttirnea Ak . iar functia va returna valoare a 1 (tru e). Dacii nu mai exist a un succes or. functia va returna valoarea (false). Valoarea retu rnata de fun ctie S8 va atribui variabilei as . Initial , valoarea variabilei de memorie as este 1 (true) - se presupu ne ca mai exista un succesor. in exemplu , subproqra rnul succes or va verifi ca daca pentru pozitia k din permutare mai exists un nurnar. Dac a nurnarul i de pe nive lul k este rnai mic dec at n , pozitiei k i S8 va atribui numarut urrnat or , i+ 1. ~ i fun ctia va retu rna valoarea 1 (Irue). iar daca nurnarul de pe nivelul k este n , lnsearrma ca pe aceasta pozitie din permutare nu mai poate fi pus nici un nurnar - si functi a va returna valoarea (false). i nt succesor ( ) { i f r s t l k l c n) ( s t [ k ] + -; r e tu r n l; ) e l se r eturn 0 ; )

-7 Subproqrarnu l va L'i d (functie operan d). Ver ifica dac a valoarea atribuita elem entului Xk al solutiei Indeptineste co n ditla d e cont in uare , adica poat e fi con siderate eel face parte dm solutia prob lemei (daca succesorul ga sit este element al solutiei). Daca este Indeplinita conditia ( S 8 eva luea za exp resi a prin care este des crisa cond itia), functia va returna valoarea 1 (true); altfel , va return a valoarea a (false). Valoa rea ret urnata de fun ctie S8 va atribui va riabilei ev . Initial , valoa rea va riabile i ev este 0 (fa lse ) - S8 presupune ca succe soru l gasit nu este elementu l k al solutiei , in exemplu, subprogramul valid va verifi ca daca num arul din pozitia k nu mai exis ta in cel e k-1 pozitii ant erioare. Daca num arul nu i ndeplines te aceasta conditie , functia va returna valoarea a (falsa ).
int valid ()

(for
i f

int

i -l ; i ~ k ; i ~ +

bt[l]=::. .,.,; t [ LJ)

retu rn 0 ;

return 1 ; }

-7 Subprogramul sol u t.r e (Iunc tie opera nd). Verific a daca s-au obt inut toate elemen tele solu tiei . i n exemp lu, subprogramul s olutie va verifica dace au fost gasite toate cere n elemente ale soluliei , adica daca s-au gasit solutii de aranjare i n permutare pen tru toat e cere n numere . Daca s-a gasit solutia , subprogramul intoarce valoa rea 1 (t ru e): altfel , in toa rce valoarea 0 (falsa). int solutie () {return ):= =:1 ; } -7 Subprogramul tipar (functie proc ecurala). Afiseaz a elementele sol utiei, De obicei , afisarea solu tiei consta i n afis area valorilor din stiva.
void tipar ()

{for (int

i=l ; i ~ =n ; i - + )

cout s L [ i } "

" .

c o utendl ;}

Info rmatica
Num aru l de o rdi ne al ele mentelor s olut ie;

13
Eteme nte le s o lut iei

I
Xn

an1

an 2

Parcu rgerea elemente lor se face cu


sub programul s uc cesor
8i1 a i2 8ij

aim

k=k+1

I I
....
X; X2

k= k-1

2
1

a21 a11

a22
a12

a 2j a 1j

82m

atm

x,

m/

t
Stiva - s t [k]

Nu rna ru l de ord ine al ele me nte lo r din rnultim ea Ak Subprogramul fix poate fi irnplementat iterativ sau re cu rsiv . Im pl em entarea iterat lva

Subprogramu l valid verifica caca este element al solutiei

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 n t a l soJ ut i e i whi le (J.-:>O ) Ile a l L i mp s t t va n u s -a g ol i t {a s = l; ev e O, while {a s && ! e v i II c a t t imp are succeso r $ i n u s -a ga sit
{ a s > SUCCGsor () ,.

i f (a s ) ev e va L'i d L j l ise iese d in s t r u c t u r a r e p et lti va while dac e. TIU ma l ex is ta II s ucces o r sau dac5 s -a gaslt el emer ltul s o 1ut ie i i f (a s ) I I da c a a rc s u c co so r , a tunc i i f ( s o l u tie ( ) I l da ca. s-i eu ob t i n u t t.oa t.e e.tee.e n cet e ao Lu r.i .ei , tipar () ; I I a tunci se af i $eaza e Leme nt. e Le s o lu t.de i. , else { k + +; 1/ altfel , se ure a in e t t va pentru a. Lnr e q i .s t r a I I ur-r.a t.oru l e lemen t 01 ao.Iu t i.e i. init() ; } / 1 ~i se in i t,: i al i z e a z a s ti va pe rl t r u I I u r ma t.o t-u L e Le men t; 211 s o l u tI e t, els e k- - ; ) I I altfel , s e cobo a 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 a n te r ior 0. 1 30 111<; i e i v oi d main () .. ._ bt () ; . . . } Im p lem enta re a rccu rslva - Prelu cranle care se fac pentru elementul k al solutiei se fac si pentru elementul k+1 al solutiei ~i aceste prelucrari pot f apelate pentru elementul k+1 al solutiei , iar trecerea de la elementul k al solut iei la elementul k+1 al solutiei se face prin apelul recursiv al acestor prelucrari. i n algoritmu l backtrac king implementat iterativ, revenirea la nivelul k -1 trebuie sa se taca atunci cand pe nive lul k nu se gase ~te a valoa re care sa l ndeplineasca co nd lt ll le i nte rn e. In caz ul implernentarii recursive. co nditia de

I I elemen tu l k a l ~ o lu~ ie i II se cau ta SUCC9 sor II daca a r e s u cceso~ , a t un c i r } 1/ se ve.r i .fi ce oaca este e lemen t a l ao.Lu ti.e.i.

14

T ch nici de p rogra marc

b aza este ca pe nivelul k sa nu S8 gaseasca 0 valoare care sa ln depline asca co nd iti il e i nte rn e. Cand S8 ajunge la con ditia de baza , lnce te aza ape lul recu rsiv ~ j S8 revine la subprogram ul apel ant, adic a la subpro qrarnul i n ca re se pre lucreaz a elemen tul k-1 al solu tiei, iar i n stiva S 8 vor reqasi valorile prel ucrate anteri or i n ace st subprogram. Deoar ece apelu l recursiv S8 face in funct ie de valoarea varfulu i stive i (k) . aceasta valoare S 8 va transmite, intr e subprograme, prin intermediul pararnetrilorde cornu nic atie.
void bt(int k ) /Ipartea fixa a al gor i tm u lui { Ln .i,t (k) ; /Ise .i n i t Lc Li zee ze 's t i.v a pentru elementul k a1 so.Iut.Le i
while { s uc.ce s ox ( k})

/Icat t irnp segase;;; te s uc c e s or pe ntr-u elemen tul k a l $olu~ie i i f (v a l i d (k ) ~ac ~ sllccesorul este element al solDt iei i f {ssc Lu t.Le (k )) I/daca s -au ob t;:. i nut t oa t e elernent ele so I ut i e .i tipar (k ) ; II atunci 5e afi~eaza elementele sOlut;:.iei ;
e l s e bt (k + l ) ; // a l t f e l , s e ape Leaz a .subp.roq remu.l pen t ru a qas i

Ilel ementul k+l a l .'301\)1;-ie1


vo i d ma i n () { .. . bt(l) ; '" )

Complexitatea algoritmului metodei ba cktracking Daca fiecare solutie are n elemente ~ i fiecare multirne Ai din care se alege un elem ent al solut iei are m ele mente, atunci complexitatea algo ritmu lui metodei backtra cking este n) O(card(A,) x card(A2) x .. . x card(A n)) = Q(m x m x m x ... x m) = O(m . Daca nurnarul de ele mente ale rnultirnilor Ai este diferit si notarn cu: mm;n= m in (card(A1), card(A2), ' '' , card(A n)) mmax= m ax (card(A,) , card(A 2), .. ., car d(A n)) atunci com plexit atea algoritmului va fi cuprinsa ln tre 0 complexitate minima O(mminn) ~i 0 complexitate maxima O(m rnax'\ Rezulta ca algoritmul metode i bac ktrack ing este un algoritm exponentia l , Av'and 0 complexi tate exponential a, metoda bac ktracking se recomand a num ai daca nu S8 cun oaste un alg orit m m ai ef ic ient.

1.3.3. I'roblcmc rczolvabilc prin metoda backtracking


Metod a backtrackin g este recornandata In caz ul problemelor care au urma toarele caracteristici: -7 se cere g as irea tu turor s olutlil or pos ibil e; -7 nu se cunoas te un alg oritm mai eficient. Alte exemple de pro blem e clasice care se pot rezolva folosind metoda backtrackin g : -7 gene rarea tuturor elementelor unui produs cartezia n; -7 generarea tuturor partitiilor unui nurnar natural; -7 generarea tut uror partitillor une i rnultimi; -7 generarea tuturor functiilor surjective ; -7 gene rare a tuturor functiilor injective; -7 generarea tuturor pos ibititatilor de plata a unei sume cu bancnote de valori date ; -7 gener area tuturor posibilitatilor de acope rire a tablei de sah prin saritura calului (parcurgerea 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;

Inform atica 1.3.3.1. Generarea pormutarilor

15

Prin asamblarea subprcqra rnelor definite anterior, programul pentru genera rea tuturor perrnuta rilor rnutirnli (1, 2, 3, .. ., n] va fi: Implcrnentarea itorativa Implementarca rccurslva #include< i o s t r e a rn . ~ > #incl ude < i o s t r e a m . h > typedef int s t i va[ lOO] ; typedef int s tiva[l OO) i int n ,k ,ev ,a s ; int n ; s t ive s t , e t i va s t , vo id .i.n t t t ) void i n i t ( i n t k)
( s t [ k l ~ O ;)

iot s ucce s o r () (if ( s t [ k) <ni ( s t [ k ] = s t [ k ] + l ; return 1 ; ) el s e return O; } int v a l i d () ( fo r ( i n t ~= l ; i < ~ ; i++) if ( ~ L[ k]==s t( i}) retu rn 0 ; retu rn I ; } .i.n t; sol u::i e ()
{return k = =n ; }

v oid t i.pe r t ) (for (int :=l ; i <=n ; il+l c cu t.c-c s t Li l c-c" c outendl ;) vo i d bt; ( ) ( k=l ; i n i t () ; while (k> O)
{ a s = 1; ev = O;

If;

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 (s olutie {} ) t i p a r () ; e lse ( k ++; .i n i t () ; ) else k- - ; ) ) v oid main () (cou t" n = " ; ci n n; bt . ) ; )

( s t [ k J ~ O; ) 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 v a l id( i n t k ) {fo r {i n t i =l ii<k ; i+ + ) if Is t[ k] == s t[i J) return 0 ; re turn l ; } i n t Solllti e( i n t k ) {return k= =n ; } v oid t Lpa r () {f or {int i = l ; i~=n ; it+ ) c oc e-ccs t [ :. 1 " c outendl i } void bt (i n t k ) ( i n i t Ik ) ; while ( s u c c e s o r {k ) ) if (vali d I k i ) if l s o l u t i e ( k ) ) tipar ( ) ; e l se D-c (k..,.l ) i } v oid ma i n () {cou t " n = n . cin n; btl l) ; )
II .

Algoritmul de generare a permutarilor poate fi folosit ~i in alte probleme. De exemplu. sa se genereze toate perrnutarne mu ltimii {1, 2, 3, ... , n} in care nu apar nume re consecutive. Aceasta problema face. parte din categoria de probleme de generare a permutarilor cu conditie - solutia contine 0 conditle interna s up lirne ntara 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 gase~te pe nivelul k-t al solutiei. Modificarea apare in subprogramul v alid ( ) :

16

T chnici de programarc

i nt v a li d () {i f (k >1 & & abs ( s t [ k ] - s t [ k - 1 ] ) = = 1l r etu r 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 ; }

2. 3.

4. 5.

6.

Scrieti urmatoarele programe, in care sa folositi metoda backtracking pentru generarea tuturor perrnutarilor. 1. Sa se genereze toate perrnutarile unei rnultirni de num ere oarecare. Numerele se rnernoreaza i ntr-un vector. (ln d icatie, Se permute indicii elementelor din vectorul v , ~i i n subprogramul tipar () se afiseaza elementele v [s t [i I I ). Sa se afiseze toate anagramele unui cuvand citit de la tastatura . Sa se genereze toate matric ele binare patrate , de dimensiune n , car e au un singur element de 1 pe linie ~i un singu r elem ent de 1 pe coloana , a matric e 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 g as e~ te elementul cu valoa rea 1. Sa se gene reze toate functiile bijec tive f : A ~B , unde card (A)=card(B )=n . Sa se genereze toate posibilitatile de aranjare pe 0 tabla de san. cu dimen siunea nxn , a n ture care sa nu se atac e i ntre ele. Deoarece tura se poate depla sa numai pe linia sau pe coloana pe care a fest plasata, turele se pot ataca i ntre ele pe linie ~i pe coloan a, lndi catie . Se observa ca fiecar e tura trebuie sa fie plasat a sinq ura pe 0 colo ana, ca sa nu se ata ce in tre ele. Solutia prob lemei este data de mu ltirnea cu n elem ente {X1 , X2, ., xn} care se rnernoreaza i n stiva. Elementul solutiei Xk repr ezin ta numa rul liniei i n care se asaza ura din coloan a k - ~ i se rnernore aza pe niv elul k al slivei s t . Deo arece doua ture nu pot fi asezate pe aceeasi linie, stiva trebuie sa contina element e disti ncte. Probl ema se reduce la genera rea perrnutarilor rnultimii {1, 2, 3, ... , n}. Interpretarea solutiei este: fiecare tura se plase aza in coloana k , pe Iinia s t [ k I . 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. lndic atie. In subpro gram ul v alid ( ) se mai verifica si conditi a suplirnentara de vecinatate.
(st[k -1]%2=O && st[k] .2-=0) I I (st ik-1] :2 ==1 & & st [k] .2=1)) r eturn 0 ; i=l ;i<k ; ltt l if (st[ i ]=~s t [ k l) retu rn 0 ;

int val i d() (if 'k>l & &

f o r (i n t r eturn I ; } 7. Sa se gene reze toate 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 valoarea -1, iar in subprogramul suc cesor () se rnodifica modul de determ inare a succesorului. in t s uccesor () {i f (stf k]<2 'n + 1) ( s t [ k ] = st [ k]+2 ; r e tur n 1; ) e ls e r eturn O; } 8. Sa se genereze toate perrnutarile une i rnultirni de numere oareca re, astfel tncat cea mai mica ~ i cea mai mare valoare sa-si pastreze pozitiile initiate. 9. Intr-un ~ ir sunt aranjate n persoane . Sa se genereze toate posibilitatile de rearanjare in sir a acestor persoane , astfel lncat fiecare persoana din sir: a. sa nu aiba i n fata sa aceeasi persoa na pe care a avut-o i n sirul initial: b. sa nu aiba aceiasi vecini ca in sirul initial:

lntorm atica
C.

17

sa nu aiba in rata sa persoanele pe care le-a avut in sirul initial;


persoa ne ; valoarea pentr u p se cites te de la tastatura .

d. sa fie desp artita - de vecinii pe care i-a avut in sirul initia l - de una sau eel mult p

1.3.3.2. Generarea produ sului cartezian


Se genereaza to ate elementele produsului cartezian A1 x A2 x A3 x ... x An. unde A;=(1, 2, . . " ru] .

so luti e a problemei va fi un element al pro dusulu i cartez ian ~ i va fi fermata d in n

ere-

mente. Un element Xk al solutiei poate fi once element din rnultirnea A k (nu exists condi ti i intern e). Nurnarul de elemente ale fieca rei multiml A i va fj memorat intr-un
vecto r rn cu lungimea loqica n . unde m [ i ] =ni . Fata de algoritmul pentru genera rea perrnutarilor , apar urrnatoarel e diferente : -7 Deoa rece fiecare rnultirne Ak are un numar diferit de clemente . elementul de pe nivelui k are succesor caca nurnarul i de pe acest nivel est e ma l rnic decal m [k] . -7 Deoarece nu exista con d it ii inte rne , nu exista restr ictii nici pentru conditia de continuare, ~i su bprogramul valid () va furn iza valo area 1.

Im plcm entarea itorativa


#in clude < i o s t r e ~ :! I. h >

typ edef int s t Iv e [ l Ol ; int 11, k ,ev , a s , m[l OJ ;

t5tiva st ;
v o id .i n.i t t )
( S L [ " ~ G;

Implemcntar ea recurs ive # include < i o s t r e a ln . h > typede f i nt s t i va [1 0 1 ; i nt n: s tiv a st ; v o i d i n~ t \ i n t k)


{ .:3 t [ k l= O; }

int sccc e so r { (i f s::, ~]<m~k:) {s : : < = s t { k ] + li r eturn I ; } else re turn C; } i n t va L'i.d () (r e tur n 1 ; )

i n t succ eso r{ i n t
(i f

k)

(s t[ i:]<rc.[k]) Ls r l k l c.s t I kl-e l r return I ; } else return 0 ; )

int 2-:JLE.":"'e {return ~:--n ;

v oid i..iPd~-( {Eo r r Ln t; i=l ;l<"-n ; i. 1-) c oc t .c-c.s t Lj ] c" " . cou te n dl ; } v o id b t I: ) {/ (par tes fi;-;a a a Lqori t .mu Lu .i I void main (, {ccu t.c-c "n> " ; c L rc- o n : f or i n t i=l ;:<-n ;i+~\ {cout-ccvtcr . de e.lesnente muI t imea "

in t val id{ i n t ~ ) {retu rn : ; } i n t so:utie{ i n t k) { re tu rn k:..--r. ; } void t i pe r t ' (for (i nt i=l ;i<=n ; :+"+) c ou t s t [ i ] " cou t e n d l; } vo i d Lt f Ln t; k)

".

{/ I pa r t e a f iz a a algor i trnuJ.ui }
void ma in {l {co u t.c-c"n > "; ci n n ; for in t i l ;i<=~ ;i++ {cout.oc vn r . de ej.erente mu.Lt imea

i" ";
cin m
b r. , ; }
.1 ;}

i. " " ;

c r rc->: ] i i .:
be 1) ; )
~i

Algoritmul de generare a produsului cartezian peate f folosit

in alte probl em e. De exemplu,

pentrugenerarea tuturo r subrnultirnllcr unei rnultimi .

18

Tchn ici de programarc

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 Submullimile Sl iva I:A-> B, astle l: daca elementul i din multimea A apartine sub000 0= 0 multirnii, atunci l (i)=1 ; altlel, l (i)=O . Problema se reduce la 00 1 {3} generarea produsu lui cartezian a''. Solutia va fi rnemorata in o1 a {2} a11 suva si va avea n elemente , fiecare element k at solut rei avanc {2,3} 10 0 {1} valoarea 0 sau 1, cu sernnificatia ca elementul k din rnultirnea 1a1 {1,3} A apartine, respect iv nu apartine submultirnii. Alaturat, sunt 11a {1,2} prezenlate toate subrnultimile multim ii {1,2,3} ~ i continutu I 111 (i,2.3\ stivei pentru fiecare dintre ele.
Fa ~a

o su brnut tirne este fermata din elemente

de programul anterior, apar urmatoarele rnodificari : -7 Deoarec e rnultirnile produsu lui cartezian sunt identice (B={O,1}), s-au mo dificat: subprogra mul ini t () - initializa rea nivelului k at stivei S8 face cu valoarea -1 , CU 1 mai mic decat a - si subp rogramul suc ces or () - elementul are succe sor numai daca este mai mic decat ultirnul element din multime , 1. -7 in subprogramu l de afisare a sciutiei, va Ii afisat nurnarul nivelului i pentru care, i n stiva, se mernoreaz a valoarea 1. Imolementarea rocursiva #include < i o s t r e a m. h > typedef i nt s t i ? a [ : OO] ; in t n ; s t i ve s t, v o i d 'i n.i t ( i n t k)
( s l:[ k l ~ O ;)

Imolementarea iterativa #incl u de < i o s t r e a m. r.> t ype d e f in t s:iva[lOO} ; int f:,k ,ev ,as ; s t Lve s t .
v oid Ln t t j ) ( s l [ k l ~- I; I int s u c c e so r () {if ( s t [ k ]< I ) ( s t I k ] < s t [k] +1 ; retu rn I ; ) el s e retur n O; l

int valid () {r e t u r n t ; l in t solu:ie I.) { retu r n ;:""-"'!1; } v oid t i pe r () li n t i ,x=O ; cout " { "; for (i=l ;i< = n ; i++)
if
(st [ i]~ ~ l)

i n t 3ucceso r( 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 re t u r n O ; } in t valid() { r etu r n l ; } i n t 301utie( i n t k} { r eturn k== n ; } v oi d t i par') l i n t i , x=O ; c o ut " { " ; f or (i='1. ;i<=n ; i++)
if
(str il ~~I)

{c ou t i " I

";

x=l ; }

{c ou t c c i c c" t" ; x =l ; } i f ( x) cc u 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,) ; }

if (x ) c out ' \ b ';


coo t .c-c'" ) " < ce n cn , } coutend l ;} v oid bt ( i n t ~:)

{ / / p a r c. e a

~ixa

a algor i tmelui }
c i n n ; bt. r Lj r }

v oi d main l) {cout" n =";

Ob s e r va t i e. Caracterul escape ' \ b ' es~e c a ract0rul Backspace ($ terae u ltimul caracte r di~ $~r\

111 fo 1"111 a t i eli

19

Scrieti urmatoarele programe, in care sa folositi metoda backtracking pentru generarea produsului cartezian. 1. Se considers n rnultimi de cuvinte Ai, fiecare mult irne avand nj cuvinte. Sa se genereze toate textele de n cuvinte care se pot forma cu cuvintele din aceste rnultimi, cuvan tul i din text apartinand muttirnii Ai. 2. i ntr-un restaurant, un meniu este format din trei feluri de rnancare. Exista patru preparate culinare pentru felul unu , cinci preparate culinare pentru felul doi ~i trei preparate culinare pent ru felul 3. Sa se gen ereze toate men iurile care se pot forma cu aceste preparate cul inare . 3. fntr-un restaurant, un meniu este format din trei feluri de rnancare. Exista patru preparate culinare pentru felul unu, cinci preparate culinare pentru felul doi :;;i trei preparate culinare pentru felul 3. Fiecare preparat culinar are un pret :;;i un nurnar de calorii. Sa se genereze toate meniurile pe care Ie poate comanda 0 persoana, care sa nu depase asca suma s :;;i nurnarul de calorii c. Datele se citesc dintr-un fisier text, astfel: de pe primul rand suma s si nurnarul de calorii, de pe randul urmator, in ordine, pretul fiecarui preparat culinar, :;;i de pe ultimul rand, in aceeasi ordine, calariile fiecarui preparat culinar. 4. Pen ru 0 rnultim e oarecare A , cu n eiemente , sa se genere ze toate submu ltirnile care au suma elementelor eqala cu s . Numarul de elemente ale rnultimii, elementele rnultimii A si valoare a pentru suma s se citesc de la tastatura . 5. Sa se afiseze toate numerel e cu n cifre (1~ n~ 1 0) care au proprietatea ca sunt formate numai din cifre pare, in ordine descrescatoare . 6. Sa se afiseze toate numerele format e din cifre distincte cu proprietatea ca suma cifrelor este S. Valoarea variabilei S se citeste de la tastatu ra. Sa se afiseze toate secvente le de n Iitere (n nurnar natural par , citit de la tastatura ) din rnultirnea {A ,B,C,D}, secvente care se con struiesc astfe l: nu se asa za dou a litere identice una langa alta ~i trebuie sa se foloseasca exact n/2 litere A. 8. Se citesc de la tastatura un nurnar na ural n ( 0 < n ~ 1 0) ~ i apoi n numere naturale a" a2, a3, ..., an. Sa se afise ze pe ecran toa e posibilitatile de a in ercala intre taa te cele n numere opera orii + ~ i - astfe l l ncat, eva luand expresia obt inuta , de la stanqa la dreapta, la fiecare pas , rezultatul obti nut sa fie strict pozi tiv. 9. Sa se rezalve - in rnultirnea numerelor naturale - ecuatia 4x+3y+2xy=48. lndlcatle. Solutia are 2 elemente: x ~ i y. Ele pot lua valori in intervalul (0,16]. Limita inferioara a intervalului este 0, pentru ca numere le sunt naturale. Limita superioara s-a deterrninat considerand, pe rand, situatiile lirnita x=O si y=O. Consideram rnultirnea A={0,2,3,... ,16}. Problema se reduce la generarea produsului cartezian cu conditi e A xA - solutia contine o conditie intem a su plime ntar a: elementele ei trebuie sa verifice ecuatia. O. Se citesc n cifre distincte ;:;i un nurnar natural x . Sa se generez e toate numerele care se pot forma cu ace ste cifre ~ i sunt mai mici decal nurnarul x De exemplu, pentru cifrele 0, 1 ~ i 3 ~ i nurnarul x= 157, se genereaz a 1, 3,1 0,11 ,13,30 ,31 ,33,100,1 01,103, 110, 111, 113, 130, 131, 133. Indicalie. Se calcu leaza nurnarut de cifre male nurnarulu i x . Pentru rnultirnea A fermata din ~el e n cifre, se qenereaza produs ele carte ziene A P, cu t sp sm . Elementele produsul ui cartezian sunt cifrele nurnarului care se forrneaza. Pentru ca un elem ent al produsulu i cartezian sa fie solutie, trebu ie ca primu l element sa fie diferit de 0 (cifra cea mai sernnificativa din nurnar nu rebuie sa fie 0), iar numarul format cu m cifre sa fie mai mic decat nurnarul x. 1.Sa se gene reze toate num erele naturale , cu cel mult n cifre ( n ~ 1 0), care sunt formate numai din cifre pare, in ordine strict cresca toare.

20

Te h nici de programare

12.Sa se genereze toate numerele naturale , cu n cifre , care cont in p cifre k . Valorile pentru n, p ~ i k se citesc de la tastatura. 13.Se citeste un nurnar natural n. Sa se genereze toate numerele naturale care, repre zentate i n baza 2, au acelasi nurnar de cifre de 0 ~i acelasi nurnar de cifre de 1 ca ~ i reprezentarea in baza 2 a nurnarulu i n. 14. Pe un bilet exista 12 pozitii care pot fi perforate. aranjate pe 4 linii si 3 coloan e. Sa se generez e toate posibilitatile de perforare a celor 12 pozitii, astfel tncat sa nu existe doua pozitii alaturate neperforate. lndicatie. Considerarn rnultirnea A , fermata din 12 elemente, fiecare element reprezentand 0 pozitie care poate fi perforata, si multimea B={0.1}. Se defineste Iunctia f :A-;B astfel: daca pozitia i este perforate , atunc i f(i)=1: altfel, f(i) =O. Problema se reduce la generarea produ su lu i cartezian B 12 - solutia coni ine 0 conditie interna supl irne ntara: pozitia k care se adauqa, nu trebuie sa fie neperforata (nu trebuie sa aiba valoarea 0) daca pozitia k-1 sau pozitia k-3 este neperforata (are valoarea 0).

1,3.3.3. Generarea aranjamentelor


Se qenereaza toate aranjamente le de m efemente ale rnultirnii {1, 2, 3,
" ' !

n}.

solutie a problemei va fi un aranjament - ~ i va avea m elemente . Fa\a de algoritmul pentru genera rea perrnutarilor , se rnodifica doar condi tia prin care se ver ifica daca s-au obtinu t toate eleme ntele solutiei. Implementarea iterative
#include < i o s t r e a rn. h ~

t yp e d e f i n t

stivu[lO O] ;

int n , I1l , }:, e"" ,as ; s: : .ra st ;

Implementarea recursiva #include< i str eam .h > typedef i n t stiva[ 00] ; i n t 11, :n;
S t1 ',3 S :: ;

vo id .i n i t {I {s t [}: 1= 0 ; } int s i cee so r ()


{ ~f

., r v : . ,

void ';'r. it i n t 'j {s t [ :':J =0 ; } int sue ceso r( i n t (if s t j k l cn)


-+ 1; r eturn =- ; } el s e r e t u r n o ; }

k)

t s : 1-:

'..

{ .'

I ,: =,0 ::'

i n t v a id ( ) {fo r int :-: ; i< k ; i+; if -c.~k ==S ' ':'JI retu rn C; retu rn . ; } int SUe ::l':() {re t u r n y.-'=-m ; } vo i d ti J'l:- ) {f o r i n t . = .; i . = , . c ou t c -cs t, i " "; cou t e n d l ; } vo i d bt () { p~: tea ~i xa 3 31 - r ~t~ului } v o i d ' a i.r; (cout " r.= "; c in r ; co u t " m= "; c i n m; b t () ; }

int va lid( i n t ( f o r li n t i- 1 ;: k ; i l l ) if ~_.: =~ TjJ return " re tu rn _ ;} in t s~l~t~~( i n t k ) {return k = - l ; } void Llp"r I {fo r int _ ~ ; .'~=;'l ; ~ t", . cou t. c-c s t, 1 " cou t endl; } void b t (i n t J.: )
{ J ! p~ r te ~ f i x~

.--1 ; r e t urn ; } e l se return O ; } k)

a:go~i

ffiJl_: }

vo i d !1",in {c ou t" = " . c o u t " m= ";

cin r. ; ci n rn; b t (1) ; )

I n fo r mutica
Algoritmul de gen erare a aranjamentelor poate fi folosit si in alte probleme. De exemp lu, pentru gcneraraa tuturor functillor injective. Se gene reaz a toate func tiile inje ctive f:A ~B , unde card(A)=m si card(B)=n . Pentru sim plifica rea algoritm ului vom consid era multimile A ={1,2,3,.. .,m} :;;i B={ 1,2,3,.. ..n}. 0 solutie este ferma ta din m elemente. Elementul k al solutiei reprezinta valoare a fun ctiei f(k) . Deoarece valoarea functiei f (k) apartine rnult imii B, in stiva se vor genera numere din multirnea {1,2,3,... .n}. Din defin itia funct iei injective . f (i);:f(j ). pentru or ice i;toj . Rezulta ca . pentru ca functia sa fie injectiva, treb uie ca rnsn. Prob lema se reduce la generarea i n stiva a uturor aran jamentelor de n elemente luate cate m . Solutiile vor fi afisate sub forma ta be lului de v ariati e al fun ct iei . De exernplu, daca A={1.2} :;;i B={1 ,2.3}. solutiile :;;i modul in care vor fi afisate sunt prezentate ataturat . Fa\a de pro gramul anterior. nu se va mod ifica deca t subprogramul de afisare a solutiilor tipa r () .
v o id {in t fo r f or f or
Solu~ia

21
Afisarea

12 13 21 23 31 32

~
f{x) 12

~
f{x) f {x) f{ x)

12 13 2 1

-ilH+
23 1 12 31 12 32

t i.pa r ( i . i; o ou ti-cc " x (i = 1 ; i <= m; L++) ( .i=l ; i<=m ; i ++) ( i = 1 ; i <=m; i ++ )

I "; c o u t i " "; cou t end l; cout" - - - - - "; c ou t e n dl " [ (x ) I n cout s t [ i ] " "; coutendle ndl ; }
c i. n>'>: ;

void mai n () (cout" n uma l:1... J de elemen te ale mu l t.Lru .i i l-.= "; cou c-c-cvn ums r t.I ie e Le rne n t.e a e In'J t":'mii E= ";

c in n; b t:. ( ) ; }

2. 3.

4. 5. 6.

7.

8.

Scrieti urmatoarele programe. i n care sa folositi metoda backtracking pen ru gene rarea tuturor aranjamentelor. 1. Sa se genereze toate pos ibilitat ile de aranjare pe m sca une an persoane (rns n). Valorile pe ntru n :;;i m ~ i nume le persoanelor se citesc dintr-un fisier text. Se citesc de la tastatura n cifre distincte . Sa se genereze toate numerele de m cifre (msn) care se pot forma cu aceste cifre - ~ i care contin toate cele n cifr e. Sa se genereze toa te an ag ram ele unui cuvant , din care se efirnina p litere oareca re. Valoarea minima a nurnarului p este 1. iar va loarea maxima este cu 1 mai mica decat lungimea cuvantului, Se citesc de la tas tatura cuvan tul :;;i valoarea nurnarului p . Se citesc de la tasta tura n caractere distincte. Sa se gen ereze toate cuv inte le de m caractere (m s n) care se pot forma cu aceste caractere si care contin toate cele n car actere. Se cites te un nu rnar n care are m cifre . Sa se genereze toat e nurnere le, cu cel mult m cifre, ca re se pot forma cu cifrele nurnar ului initial. Dintr-o rnultirne de n persoane , aranjate intr-un sir, se elirnina p perso ane. Sa se genereze toate posibilitatile de aranjare intr-un sir a persoanelor rarna se. astfel tncat fiecare persoana sa nu alba ace iasi vecin i ca i n sirul initial. Valorile pentru n si p se citesc de la tastatura . Sa se genereze toate aranjamentele. de m numere , ale unei multirni de n num ere oarecare asUel lncat 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 . Sa se genereze toate drapelele cu trei cu lori care se pot forma cu sase culori: alb, galben , rosu , verde , albastru ~ i neqru , care au in mij loc culoarea alb . verd e sau ro su. lndi ca ti e. Solutia are 3 elemente . un element al solutiei fiind indicele din vector al une i

22

Tc hnici de programarc

cu lori. Se genereaza aranja me nte cu con di tie de 6 obiecte luate cate 3 - solutia confine 0 co nd itle inte rna su pllrnen tara fa!a de cea impusa de aranjamente: elementul 2 al solutiei trebu ie sa fie indicele culori i alb , verde sau rosu. 9. Se considera n cuburi. Fiecare cub i are latura Li ~i culoare a Ci. Sa S8 construiasca toate turnuri le stabile, formate cu m cuburi, astfel tncat dOU8 cubu ri vecine in turn sa nu eiba aceeasi culoare. Valorile pentru n "i m "i atributele celor n cuburi se citesc de la tastatura. lndicatle. lnforrnatiile despre cuburi S8 mernoreaza intr- un vec tor de l nreqistrari cu n elemente. Solutia are m elemente. Un element al solutiei este indicele din vector al unui cub . Se genereaza aranj amente cu conditie de n obiecte luate cate m - solutia contine 0 con ditie in tern a 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} . a problemei va fi 0 co mbina re "i va avea m elem ente. Fa\a de algoritmul pentru generarea aranjamentelo r, apare 0 conditie suplimentara: aceea ca solutiile obtinute sa fie distincte , adica doua solutii sa nu cantina aceleasi numere. Pen tru aceasta. se va adauqa 0 co nditie de co nt inuare suplimenta ra: 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 indepllnita daca elementul de pe nivelul k va avea 0 valoare strict mai mare cecat valoarea elementului de pe nive lul k- 1 (se irutializea za cu 0 valoare egala cu cea a elementului de pe nivelul k-1) si 0 valoa re ma i mica deca t n- m+ k (se cauta succesorul pana la valoarea n -m+k).

o sotutie

rc,_-:--:", Im .".p.:lem en tarea iterativa #include < i o s t r e a rn . h > typedef i n t sLiva (l OO] ; int rl, lll, k, e v, a s; s t dv a s t .
vo i d ini:: () { i f ( k==l) s t[k]=O ; else s t[k]=st[k -l] ; } in t succe sc r () {if (sL[k l<n -m.kj

Imnlemcntarca recursiva
#include < i 0SL ~ e am . h >

typ e d ef int s tiv D [ l OO] ; i nt n ,f:\; s t i.v a s t :


void init ( i n t k ) { if { k = = l j st [k ] = O; else s ::[ kJ=st[k -12 ; } int su cceso~ { i n t k) (if ( s t l k j < n - m+ kl ( SL [ k ] - s : [ k J 1 ; r e t ur n 1 ; ) e lse return O; } i nt ve Li d t ) {retu rn 1;} in t solu ti c (i n t k ) {re tur n k==m; } void tipar ()

{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 etu r 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 n dl ; }
void btl }

{fo r (int

i =l ; ~<:m ; ~ + +)

cou c-cc s t l i l c-c"

It.

( I l p a r t e a f ix a a algori ~ffiului ) voi d ma i n (l {cout " n = " ; cin n; cou t " m= b t () ; ) c i n m:

coutendl ; } void b t (i n t .K.) {/ / p a r t e a fi xa a algo~ i tmulu ~ } void main () {cout.cc "n > " . cin n ; c c u t.c-cv n;-. ": bt ( 1 ) ; ) __~ c in ~, ~ ~~~~

Informutica

23

Algoritmul de gen erare a combinarilor poate fi folosit i n problemele de gen erare a tuturor posibilitatilor de a forma din n obiecte grupuri de m obiecte care sa aiba anumite proprtotati , De exem plu, din n obiecte trebuie sa se distribu ie unei persoane m obiecte, care sa contina obligatoriu obiectul p ~i sa nu cont ina obiectul q. Sa se genereze toate posib ilitatile de a forma grupuri de m astfel de obiecte. Pentru simplifica re vom considera rnultimea obiectelor ca fiind {1 , 2, 3, ..., n} . Valorile pentru nurnarul de obiecte n, nurnarul de obiecte din grup . rn, ~i indicii obiectelor p ~ i q - se citesc de la tastatura. Deoarece obiectul p face parte obligatoriu din grupul de obiecte, el va fi memorat ca prim element al solutiei (s t [ 1 ] =p ), iar subprogramul bt () va genera numai urrnatoarele m-1 elemente ale solutiei. Se rnodifica ~ i conditia de continuare a construirii solutie: (subprogramul va l i d () ), deoarece obiectele p si q nu pot fi elemente ale solutiel.
#incl u de < i o s t r e a m . h > t ype d e f in t s t i va Ll Ou l . , m, p, \ , k , e v ,a s ; i nt s ti v a s ; void Ln i r t ) { if ( k ==2 ;: [ k ] = Oi else s: l kJ =sl:[k-l~ int s acce so r () {! 11 - tel ca :'n ex ernp Lu I a n e r i o r } in t va lid () (re tu rn s t I k ] ! = p && st [ k] ! = q; ) in t sol u tle() ( l il a .e l c a in e x emp Lu L an t e r i.o r l void : :'?a r ( ) { Ili a f e L c a :'!1 e xemp Lu I an te r ior } voi d bt (I {k = 2; a n i t . ; wh i le (k > l . IlIa :-e : ca ::1 e xe rnp Lu a n t e r i.o r } vo i d mai n () {cout" n = " ; c i n n; cou t " m=- " ; c in :n; cout" p = " ; c in pi c ou t " q = " ; cin q i s t [ l ]=p ; bt(1 ; }

i }

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 ~ i n , despartite printr-un spatiu, iar pe urrnatoarele randuri numele persoanelor. cate un nume pe un rand. 2. Ooua persoane i~i impart 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 V i . Sa se genereze toate posibilitatile de distribuire a celor n obiecte. intre cele doua persoane, astfel incat fiecare persoana sa primeasca obiecte, care sa aiba aceeasi valoare totala. 4. Doua persoane i~ i 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, intre 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 num erele binare de n cifre care au m cil re de O. lndlcatl e. 0 solutie este fermata din m elemen te. un element fiind pozitia din numar in care S8 poate gasi cil ra 0 - exceptand prima pozitie. 6. Din n obiec te date. sa se gene reze toate grupurile de m obiec te care in deplinesc urrnatoa rele conditii: 8 . con tin exact p obiecte preciza te ; b . nu contin nici unu l din p obiecte precizate; c. con tin numai un ob iect din p obiecte precizate : d. contin cel putin un obiect din p obiecte precizate; e. contm exact q obiec te 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 prec izate ~ i nu contin 5 obiecte din r obiecte precizate .

1.3.3 .5. Generarea tuturor partitiilor unu i numar natural


partitie a unui nurnar natural nenul n este 0 descompunere a numarului n in surna de m numere naturale nenu le. Solutiile care nu difera dedit prin ordinea termenilor nu sunt cons iderate distincte. Ataturat sunt prezenta te toate partitiile num arului 4.

elem ente a carer surna este eqala eu nurnaru l n. Elem entele solutiei reprezinta term enii unei descom puneri. Numarul de elemente ale unei solutii (m) este egal cu valoarea varfului stivei k atunci cand s-a obtinu t solutia Solutia se obt ine atunc i cand suma elementelor din stiva este egala cu n. Altlel spus , solutia se obtine atunci cane suma s=sl[1 ]+sl[2]+ ... +s l [k -1]+sl[k] are valo area n. Pentru a evita repetarea aceleiasi descom puneri, valoarea de pe nivelu l k trebuie sa fie ma i mare sau ega la eu oricare dintre valorile de pe nivele!e inferioare. Altfel spus, elemen tele solutiei trebuie sa fie ordonate: st [1]->sl[21-> ... ->sl [k-1] ->sl [k] . Ace asta 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 descompu nerii gasi\i pim a la nivelul k , s=st[1]+sl [2]+ ... +st[k-1] .

o sol utie a problem ei va fi fermata din m

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)

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 atun ci cane s =n . Initial, suma s are valoarea o ~ i ea trebu ie actuatizata in perrnan en ta. Exista c oua cazuri de actu alizare: -7 Atun ci cane se adauqa i n stiva un nou terme n. acesta se ada uqa si la surna . AIHel spus, cac a succe sorul qasit poate fi elem ent al solutiei (prin adauq area lui la surna aceasta nu va depasi va loa rea nurnarului n), atunci el se adauqa la surna. Actua lizarea sume i se va face i n subprog ram ul va l id () (termenul se ad auq a la s urna nu mai daca l ace parte din descompunere): s+=s t [ k] . -7' Atunc i cane se coboara i n stiva , trebuie scazute din surna dou a val ori: valoarea eleme ntului din varful stivei (k) ,i valoare a elementulu i de pe nivelul pre cedent (k-1). Deoarec e in stiva se coboara in totdeauna dupa ce s-a obtinut 0 so lutie corn pleta si nu se mai poate gasi un elemen t pentr u nivelul k cu care sa se continue dezvoltarea solutiei, scaderea din surna a termenului cure nt se va face du pa ce se afiseaz a 0 solutie comp lete i n subp roqrarnul ti p ar () : s - =st [k J, iar scac erea din surna a

[II f urm a ticii

25

termenul ui precedent S8 face in subprogramul succesor () , atune! cand nu S 8 gase~te succesor pentru elernentu Jdin varful stivei : - s-=st[k-l ) .
Implementarea iterativa Implementarea recursiva

#i n c lude < i o s t r e a m. h > typedef int at iva[lOO] ; int n ,s=O ,k ,cv ,a s ; s t iva s t ;
void init () {if ik ~ ~ll st else st
{if
l kJ ~O ;

#include <l o s t r e a m. h > typedef int s tiva fl00 J ; int n ,s=O ; sti va 3t ;
void .i.n i. t; (i n t k) (if ( k ~~ l ) st [ kl ~ D ; else st [k l~s t[ k - l

[ kl~s,_ [k - 1 J - l; )

l -l ; )

int su c c e s c r ()
(st[k ]< n -s)
( s t [ k l ~ s t [): J +l; retu rn 1 ; ) else { s - =;5t l k - lj; return OJ } } int v a .l i d t ) {if (s+st [ kJ<= n) {s += s t [ k ]; return I ; } e l s e return O; } in t s o l u t i e U (retu rn s=,::=n; ) v oid t. i p a r () ( fo r{int i= l ; <k ; i ~+ )

i nt succe s c r (i n t k ) {if ( s t Lk l c nv s )
( s t [ ): I ~ s ti k l +1; re tu rn l; ) else { s - = s t [ k .,.- l ] ; r e t u r n Ov J} int v al i.d ( i n t k ) {if ( s +st [k]<""n) {s += s t [ k]; return 1; } e lse r e t ur n O; } int s o Lu t i.e ( i n t k.) (return s "" =n i } v o i d r i p a rj i.n t; Yo) (for(int i= li < ki i++ ) cou t cc a r j i l c" - " i cout st [ k ]endl;
s-~s t [ k ! ; }

cout.cc s t Li l -cc" } " ;


cout s ~ [ k lendl;
s -~ s t [ k j; )

void bt ()

void bt : i n t
fi x~
3

k)

{/ / pa r t e a

al goritmul ui }
bt() r I

( / Ipar t ea

fix~

a al g o ritmul u i )
c i. ncc- n , bt (l j ; }

void ma i.n ()
{cc u t.c".n> "; c i. noc- n :

void rna i n ( ) (cout" n =!l i

A!go ritmul de generare a tuturo r partiti ilor unui nurnar natural poa te fi folosit 'Ii in alte probleme. De exemplu , gc nerarea t utu ror post bitl ta ti lor de p lata a unei sume cu ba nc no te de va lori date. Problema se reduce la gene rarea tuturo r partitiilor unui nu- 25 = 5+5+5+5+5 (01=5) mar natural nenul s u m a, a partitie fiind 0 descompunere a 25 = 5+5+5+10 (01=4) numarului suma in surna de m numere naturale, nenule , cu 25 = 5+10 +10 (01=3) .., an}. Alaturat, sunt valari apartinand rnultim ii A={a1,a2, _ prezenta te toate partitiile sume i 25 pentru bancnate cu valori apartinand rnultimii A={5, 1OJ. Fala de problema anterioara , apar urrnatoarele modificari: -7 Deoarece suma suma se descompune in valori precizate , apartinand rnultimii A , aces te valori se memoreaza in vectorul a, care are lungimea loqica n (numarul de valori ale banenotelor) . -7 Un elem ent al solutiei este indicele valori i bancnotei din vectorul a, adica un element din multimea {1 ,2, , n} . -7 0 solutie a problemei va fi fermata din m elemente , alese astfel l ncat suma valorilor bancnotelor corespunzatoare lor sa fie eqala cu nurnarul suma. Altfel spus: solutia se obtine atunei cane surna s=a[st[1]] +a[st[2]]+ .-. + a[st[k-1]]+ a[st[k]] are valoarea suma .

26
~

Tehnici de progra ma r e

Co n dit ia de co ntinuare este ca suma valorilor termenilor qenerati, 5 , sa fie mai mica sau eqa la cu surna (sss u rna). 0 sclutie cornpleta obtinandu -se atunci cane s=suma . Atun ci cand S8 urea In stiva , S 8 adu na la surna valoarea bancnotei cLJ indicele k : s t e e Est [k ) ] , iar cand S8 coboara i n stiva, 58 scade din surna valo area bancnote i cu indicele k : s - =a [s t [ k] ] si valoarea bancnotei cu indicele k-1 : 5+ = a [s t [ k -1] ] . -7 Deoarece este pos ibil ca - pentru anumite valori ale sumei suma ~i ale valorilor bancnot elor nu existe nici 0 solutie, 5 8 folos este variabila de tip logic est e, care are valoa rea 1 (true), daca exista cel putin 0 solutie , ~ i 0 (false), In ca z contr ar

sa

# includ e <l o s t r e a m . h > t ype d e f int s t iv a [ lOO ] ; int n , k , ev , as / s= O ,su ma ,e sLe~O ,a[ lOJ ; stiva st; vo id .i n i.t; (i { i f ( k ~~l) s t [k J ~ D ; e l se s t[k] =s t[k -l] -l ; } i nt s u c c e so r- () { i f \s t[k]<n) { s t [ k] = s t [ k ] + 1; r e t urn I ; } else { s- = n [st [ k- l ] ]; retu r n Oi l } int va l i d () { if ( s l'a [s t [ k ]] < = s u ma ) { s + = a [ s t [ k ] ]; r etu r n I ; } e l se re t urn O; } int s ol ut i e ( ) {retu rn s==suma ; } void t Lpe r L) {int i , j ,p ,es:e=i ; fo r ( i=l ;i<=c: n ;i+l ) (for ( J ~ ], p ~ C; j < ~ k ; j ++ ) if (i~~ s tl j J ) P++ ; if (p != O) co u t p" "''' a [ i J'' + ";} cout ' \ b ' ' \ b ' " " endl; s -:- =a [st [k] ] ; } void bt( ) { l l p b c t e a fi x ~ a al g o r i trnu l ui } void mai n ( ) {cou t " n = " ; ci n n; for (i nt i=l ;i<=n ;i'~ + ) {cou t .c-c vv c Ioc r c benc not a "<c i c-c'": cin a [ i ];} coun-ce " suma " ; cin s u ma; b t () ; i f ( !este) oou t-c-c vI mp o s i.b iL'" : }
II .

Scrieti urmatoarele programe, in care sa tolositi metoda backtracking pentru generarea tuturor partitiior unui numar natural. 1. Sa se genereze toate descompuneri le unui numar natural n in nume re naturale distincte. 2. Sa se genereze toate des compunerile unui nurnar natural n in numere prime . 3. Sa se genereze toate descompunerile unui nurnar natural n in surna de 3 si 5 4. 0 bara are lungimea L. Se considera n repere de lungimi diferite . Sa se genereze toate posibilitatile de a tara bara dupa reperele existente , fara sa rarnana rest ta taiere , un reper putand fi folosit de mai rnulte mi. Se poate ca unele reper e sa nu fie folosite Se citesc dintr-un fisie r text, de pe primul rand , lungi mea barei - L si numarul de repere - n. iar de pe urrnatorul rand, reperele . Numere le de pe un rand sunt separate prin spatiu.
T CIJ1l1

.---- -.../."0

Informat icii

27

5. Pentru realizarea unu i chestionar exists n Intrebari , fieca re int rebare avanc un punctaj . Nurnarul de i ntrebari lli pun ctajul fiecarei Intrebari S8 cttesc dintr-un fisier tex t. Sa S8 genereze toate chestiona rele care au i ntre a ~ i b Intrebari distlncte ~ i un punctaj total intre p si q puncte. Valo rile pentru a, b , p ~i q se citesc de la tastatura. 6. Sa S8 gas easca mo dalitatea de plata a une i sume cu un numar minim de ban cnote cu valo ri date.

1.3.3 .6. Generarea tuturor partitiilor unci rnultimi

o partitie a unei rnulti mi A ,\;=" este rnultirnea A : U


;", 1

este forrnata din rnultimile nevi de disjuncte A i a care r reuniune

~i

";

n" =IZI pentru orice i,j = t -m .


j

Pentru simplificarea algoritmului vom considera rnulnrnea A={1,2,3, " " n}. 0 partitie va fi fermata din m rnultimi, cu t srnsn . Solutia va fi rnernorata i n stiva ~i va avea n eleme nte, fiecare element k al solutiei reprezentand rnultirnea i (1,;i'; n) careia ii apartine elementul k din multirnea care se partifioneaza : sl[k]=i In searnna eli elementul k din rnu ltirnea A face parte din rnultim ea i a part itiei . in c adrul un ei pa rtitii nu intereseaza ordinea in care apa r elementele rnultimii A . Cel ma i mare nurnar care va fi generat i n stiva reprezinta nurnarul de rnultirni m in care a fast descornpus a rnultirnea A . i n plus, numerele generate i n stiva trebuie sa apartina unei multimi de numere consecutive care incepe eu 1, deoarece Sliva partitia nu conune rnultim i vide. Ala turat , sunt prezentate toate Parti!iile 111 (1, 2, 3} partitnle mu ltim ii ( 1,2,3) si con tinu tul stivei pentru fiecare dintre ere. i n 112 exemplu, nu exista solutia 1 3 3 deoa rece aceste valori nu apartin (1,2}{3) 12 1 unei multirni de numere consecutive (nu se poate ca un element din (1,3}{2) . {1}{2, 3) 122 multimea A sa apart ina rnultirnii A 1, ~i alte doua elemente rnu ltirni I _(1 ) (?H3 ) 123 A3, deoarece ar insemna ca rnultimea A2 este vida).
Conditi a de conti nua rc este asiqurat a pr in modul in care es te ales succesor ul s t [ k]:S;k , ceea ce Ins earnn a ca elementul k din multirnea A nu poate apartine dec at unei partitii a! carer numar este mai mic sau cel mult egal cu numarul de ordine al elementulu i. Altfel spus, daca pana la nivelul k numarul maxim atribuit pentru 0 partitie este i, acest nurnar reprezentand nurnarul de rnultimi ale partitiei care exista i n solutia partiala , pe nivelul k+1 elementul poate avea una dintre urrnatoare le val ori: -7 Orice valoare de la 1 la i , ceea ce tns ea rnn a ca elementul k+1 din rnultirnea A se adauqa la una dintre multirnile care exis ta deja . -7 Valoa rea i+1, ceea ce insearnna ca elementul k+ 1 din rnultirnea A va gen era 0 noua rnultirn e i n partitie.

Imolcmentarca iteratlva #incl ude < i o s t r e a m. h > typede f i nt s:iva[lOO] ; in t n ,k ,e'l ,as ; sLivd st ; v o i d Ln i tt j { s t l k l = ();} int s u c c e s o r ()
( if

lmnlornentarea recurs iva #incl ude <i o s c =e a m. h > t ype d ef in t sc iva[ lOO] ; i nt n, s tiv a s c ;
v oi d .i n .i t. ( i n t k ) { s t in t su c c esor ( i n t k ) (i f (st[k]<s:[ J:-l] +l)
[ k. l ~ O ; }

(st[ <]<3t[k -1J+ll


{ s : [k]=-st[ k) +l ;

r eturn :. ; }

{ s ~ [ k l ~ sL [ k ] + l; r etur n

I ; }

e lse re tu rn Oi l

el s e re t ur n O; }

28
in t v a Li, () {re tu r n 1; l i n t s oLu t i.e r ) (retu r n :: ==:l ; ) voi d ::i;:;ar { \ lint i ,j ,l.a~:=st [l];
for ( 1 = 2; ~ < = n; i l

Te hnic i de progrumare
int v a l i d ( ) {return : ; ) in t solut~e l i n t k ) {retu r n k==n ; ) v o id t i pa r ( ) {i nt i ,j ,max~st [l] ; for (1 =2 ; i <= n ; i 4 1 ) i f Is [i l>max) rnaz=st ~i. ] ; fo r (i =l ; i <=m x ;i++) {co ut " [ " ; f o r I j = l ; j <=n ; j 1 +) if I st [ j] == i) cou t j ", "; c ou t -c-c' \b ' " l "; ) c o uten d l; ) v o id bt ( i n t k ) I I / p a r t e a f i x a a a~g oritmul 'i l void ma in () {cou t" n = "; cin n; bt l: ) ; )

. j

if (s t [ ~ ]> llla ~:) m x "-s t [ : j ; fo r 'i=l ;i<=max ;iTT ) {cout " { " ; f or (j = l ; j<=n ;j l+) i f (s t l. j j==i) co u t j " , " ; cout ' \ b ' " ) " ;l cou te n d l; ) void bt ( ) {! ~ 6 1t e fi x5 a a ! go r i : rnul u i l void .na i n I; {cou t " :1 ~ "; cin n; bt:. ( ;)

Scrieti urrnatoarele programe . in care sa folosif metoda backtracking pentru generarea tuturor partitiilor unei rnultirni . Se cons idera rnultirnea A . cu n numere i ntregi. Valorile pentru n ~i m ~ i pentru elemen tele rnultirnii A se citesc de la tastatura . 1. Sa se genereze toate partitiile rnultirnii A form ate din doua subrnultirni care au suma eleme ntelor egale. 2. Sa se genereze toate pa rtitiile rnultirnii A formate din m sub rnultirni. 3. Sa se gene reze toate partitiile rnuttimii A formate din subrn ultirni care au ace lasi nu rnar de elemente.

1.3.3.7. Generarea tuturor funct iilor surjective


Se genereaza toa te fun ctilte surject ive f:A -tB unde card(A)=m ~i ca rd( B) =n. Pe ntru simplificarea algoritmului vom con sider a multimile A={1 .2.3.... .m} ~i B={1 .2.3..... n}. 0 solutie este fermata din m elemente. Elementul k al solutiei reprez inta valoarea functlei; f(k) . Deoarece valoarea functiei f(k) apartine multirnii B. in stiva se vor genera numere din rnultirnea {1.2.3..... n}. Din defini tia funct iei surjective. trebuie ca . pentru orice j EB . sa existe i EA . astfel tncat f(i)=j . Rezulta ca - pent ru ca functia sa fie surject ive - trebu ie ca nsm . Prob lem a se reduce la gene rarea in stiva a tutu ror elemenm telor produsului carte zian B din care vor fi con siderate solutii num ai cele care contin toate elementele din mul timea B. Solutiile vor fi afisa te sub forma tabe lului de variatie a functiei . De exe mplu, daca A={1.2.3} ~ i B={1.2}. solutille ~i modul in care vor fi afisate sunt prezentate alatur at.
Conditia de continuare este asiqurata prin modul in care este ales succesorul ca element din m ultirnea B , singurul caz special fiind al elementului care se adauq a pe ultimul nivel din stiva (m) . Prin adaugarea acestui element, trebuie ca in stiva sa existe toate eleme ntele

Solutia

Aflsarea

112 121 122 211

x j1 23
f(x ) 1 1 2

. x _-' 1 2 3

f(X)]1
x
f(x)

21

1 23

122

x 1 1 23 f(X)1211

221

f(X)l221

x_J~

21 2 221

~(~)- 11~;x /1 23 f(x) 2 2 1

Informatica

29

rnultirnii B. Aceast a conditie este verificata prin functia surjectiva () care furnizeaza un rezultat logic: 1 (tru e) , daca i n stlva exista toate cele n elemente ale rnultimii B , ~i 0 (false), in caz contrar. Implementarea iterativa Implementarea rocursiva
# inc l u d e < i o s t r e a m , h > typedef int s t i va [100] ; in t n ,Hl ,k , e v , as i s tL ve s t ; i n t 2u r jec t 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 ; } vo i d Ln i c t ) { s L [ k ] = O;} i n t succ e 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 (k~=' m) i f ( !su rject i va()) return 0 ; r eturn :.. ; ) i n t s o Lu t i.et ) ( re t urn f~==H\ ; ) voi d ti pa r t ) ( int .i : c out " }: I "; f or (i=l ;i<=m ;i-I~) cou t i " " ; coutendl ; for (i=J ; i<==rll ; i -H ) cou t "- - - - - " ; coutendl " l (x) I "; for (1=1 ; i<.=m ; i++) cout s t l i l " II ; coutendlendl; ) void bt () ( / / p a r t e et fL-:5 a oLq o r i t mu Lu i. } void main () {co ut" e l e me r. t e mu l.c.L me a 7\= "; c i n . m; co ut" e l e mc n t c mul t i me a B= " ; cin n; o.t; (i ; ) #in c lud e < i o s t r e a m. h > t yp e d e f i nt s tiva [100 ] ; i nt D,m ; s t i va e z , i n t su r jectiva( ) {int l ,j , x ; for ( j =l ; j < = n ; j + + l (for (i = l , ;~ =O ; i< = m &f, I >: ; l++) if (st [ i J~= j) x=l ; if ( ! x) r e t urn 0 ; ) r e t ur 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 v a () ) re t urn 0 ; r etu r n 1 ; ) in t soluti~( i n t k ) ( r e tur n k = = n ; ) vo i d t i. car () (i nt i: co u t" x I "; fo r (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++) = u t s t [i ] " " ; c o u t e n dl endl ; } v o i d b t (i n t k ) ( / / p a r t e a fixa a a l g or it m u l. u ~ ) v oi d rna in () (cout " c l e me n -_e mu L ti me a 7\= "; ci n m;
c ou t-cc e Lernen t e mu I t.Lrue a 5""
v

- ----_.-'----_.~-------- --...-,

" ;

ci n 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 numerele de III cifre (nsrn) care se pot forma cu acesle cifre ~ i care contin toate cele n cifre. 2. Se citesc de la tastatu ra n caractere distincte. Sa se genereze toate cuvintele de In caractere (nsm) care se pot forma cu aceste caractere ~i care contin toate cele n caractere .

30

Tehni ci d e programarc

3. Profesorul de infor matica a preqatit m teme, pentru proiecte pe care trebuie sa Ie repartizeze 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 rep artizare a temelor pentru pro tect. 4. 0 bara are lungimea L. Se considera n repere de lungim i difer ite . Sa S8 genereze toate posibilitatile de a ta la bara dupa reperele existente, fara sa rarnana rest la taiere, fiecare repe r fiind folos it cel putin a data. Se cite sc 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 sp atiu . 5. Sa se genereze toate constructiile corecte de paranteze ( si ); n este nurna r par ~i se citeste de la tas tatura, 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 pozitiilo r ocupate de paranteze, ~i B = {G .1} = multimea parantezeJ or - (=0 si )=1 - care indeplinesc urrnato arele conditii: -7 1(1)=0 ~i l(n)=1 (expresia i ncepe cu paranteza deschisa ~i se terrn ina cu a paran teza inch isa) -) 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 inchise). -7 In timpu! construirii solutiei , nu trebuie ca nurnaru l de valori 1 ale fun ctiei fie mai mare decat nurnarul de valori 0 generate pana la acel moment (num arul de paranteze inchise este intotdeauna eel mult ega1cu numarul de paranteze deschise).

sa

1.3.3.8. Prob lema celor n dame


Se qen ereaza 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.
Se observa ca fiecare darna trebuie sa fie plasata sinqura pe 0 colcana, ca sa nu S8 atace intre ele . Solutia preble-__ mei este data de multi mea cu n elemente { X1, X2, .. ., xn} care S8 mernoreaza in stiva. Elementul solutie i Xk reprez inta nurnarul liniei in care S8 asaza dama din coloana k , si se rnernoreaza pe nivelul k al stivei st. De exemplu , pentru n=8 , 0 solutie este S={4,8 ,1,5,7,2 ,6 ,3j si damele sunt aranjate pe tabla de sah ca in figura alaturata.

7 6


5 6 7 8

5 4 3 2 1 1 2 3 4

Date fiind coordon atele i .j , de pe tabla de sah ale pozinei unei dame care a fast asezata anterior (lini a i este mernorata pe nive lul j in stiva - i=sIO] ), ca ea sa nu atace dama care urrneaza sa fie pusa i n colo ana k - trebuie sa fie indeplinite urrnatoa rele conditii i nte r ne: -;. Dama din coloana k nu trebuie sa S8 qaseasca pe linia i . -;. Dama din coloana k nu trebu ie sa se g<3seas ca pe diagon ala cu dama din coloana J. ad .ca triung hiul ABC nu trebuie sa fie isoscel. Pentr u ca triunghiul ABC sa

,................. ..
C i+p""k

~.
A i,i

.... .'

..

." ......... ......... ...

.........

.'

<.

i;~j

" i-p, k

Informaticii

31

nu fie isoscel , cond itia pe care trebuie sa 0 indeplineasca dam a din coloana k se poate exprima astfel: oricare ar fi j<k , Xj *- Xk ~i IXk - xjl *- k-j . Aceste conditii interne ale solutiei trebuie sa se reqaseasca in conditia de continuare a solutiei - care se verifica in subprogramul valid (} : stUJ*-st[k] ~i abs(st[k]-stUJ)*-k-j , pentru orice j*-k.
# includ e < i o s l r e a m . h > # in c l ude<ma t h . ! > typede f i n t s~ival :OO]
i nt !1 , k /e'.~ ,as ; s t i : - st. ; void .i n i. t; 'J< { !<

r I:, -0 ; } int succesor ~ {i f Is,- :::~<-n { s c , ~ . = s c : ~ ] :'; return :. ; } else r e t urn .: ; } int v a Li.d M. {for (i n t i= . ;i<k ; 'H) i f (s c[ k]==ac[i] II a b s ( s t l k ] - s c [ i ] ) = = k - i ) return 0 ; re turn I ; } i n t so l u tie i<l {r e turn I:==n ; } vo i d t.Lpar ( ) {for (i nt i=1; i <=, n ; .i + ) c ou t .c-cs t l i l c-c" " ; c o u t e ndl; } {1 / p a r c e 3 ~i xa a algo~itmulu i } v o i d bt (( v oid ma i n () {co u t" n = "; c i n n ; be ,:1\' ; }

Sa se genereze toate posibilitatile de aranjare , pe 0 tabla de sah, cu dimens iunea nxn, a n nebuni, care sa nu se atace intre 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 n xn , iar pozitia iniliala a calului este data de i - nurnarul liniei si j - numarul coloanei. Se citesc de la tastatura valorile pentru n, i ~ i j. Solutia problemei este data de multirnea cu nxn elemen te {X1, X2 . . . , x nxn} care se rnernoreaza in stiva. Ele mentul solutiei Xk reprezinta coordonatele i ~i j ale patratului in care se deplase aza calul la mutar ea k - ~i se rnerno reaza pe nivelul k al stivei 51. Pentru a inregistra traseul strabatut de cal, elementele stivei vor fi de tip inreg istrare cu doua carnpuri, x ~i y , corespunzatoare celor doua coordonate ale patratu lui.
struct element { i n t x , y; } ; typedef e 2.eIi,en t sri " r 1 I

1;

Stiva va avea dimensiunea nxn , coresp unzatoare parcurge rii intregii table de san (kmax=nx n) , ~ i va cont ine. in ordine. coordo natele tuturor patratelor de pe trase ul de parcurge re: s t [ 1] . x ~ i s t [1] . Y corespund primei pozitii de pe tabla , s t [2] . x ~ i st[2]. y corespund celei de a doua poz itii de pe tabla, ... , s t [ n * n ] .x ~i s t [ n *n ] . y corespund ultimei pozitil de pe tabla.

32

Te h u ici de programarc

De exemp lu, pent ru n=5 - ~ i ea poz itie de pornire patratul de pe linia 1 ~ i eoloana 1 - 0 solutie va ave a 25 de elemente. Prima dint re solutiile obt inute este prezentata mai jos : Ordinea de ocu oare a table i d e 1,1 3,4 2,2 1,2 1,3 3,2 4,2 4,1 3,1 2,5
Sol utia 5,1 5,4 5,3 5,2 4,4
~a h

1
4 ,3 3,5 4 ,5 3,3 2,3 5,5 1,4 2,4 2,1 1,5

16 11 2 7 18

21 24 19 4 13

10 15 6 23 8 4

25 22 9 14

2 20
3 17
4 5 12 3

5
5

1
Data fiind 0 pozitie curenta i,j a traseului, variante le posibile pentru urrnatoarea pozit ie a ealului pe tabla de sah sunt prezentate alat urat . Se obs erva ca exis ta 8 variante posi bile pen tru con tinua rea drumului. Coordonatele urmatorului pat rat de pe tab la de san in care poate sari calul , pentru fiecare dintre cele 8 variante, sunt prezentate in tabe l.
Varianta 1 2 3 4 Co ord on at c i-l ,j+ 2 i+ 1, j +2 ;+2, j +l i+2, j -1 Va rla nta 5 6 7

4 i+2 , i-l 5 i+1, j-2

.....

; ,

r..
i,J

3 i+2, i+l 2 i+ 1, ;+2

........... ................-- .. ........... ......


6 i-l , j-2 7 i-2, ;-1

1 :::::::::::::::::::: .........
1 i-1, j+2 8
~

......

......

r-z, j+l

i n vectorul p, de dimensiune n xn S8 pastreaz a varianta care s-a ales pentru continuarea drumului. Elementele sale sunt de tip i ntreg. Ele mentul k di n vector arata care 8 dintre cele 8 variante 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.
Coord o nate ;+1, j- 2 i-1, j-2 r-z, j -1 i-z, j +l

Fieeare dintre cere 8 varian te de dep lasare din patra tul k-l i n patr atul k tnsea rnna adauqarea unei con stante de de plasare la coord onata x, respectiv v, a patratului k-1 . Aceste constan te sunt memo rate i n vectorul d (pentru variant a 0, care nu exista , deplasarea 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 log iea es te se Iolose ste pentr u a sti daca s-a gasit eel put in 0 solutie (de exernptu, pentru 11=4 problema nu are solutii) . Este initializata eu va loarea 0 (nu s-a gasi t i nca nici 0 solu tie), Va Iua val oarea 1 (s-a qasi t 0 solutie) i n subproq ramul tipar () care S8 ex ecuta numai daca S-3 gasit 0 soluti e a problemei . Subp rogram elc 7 Subprogramul in i t () . Se lnitiallzeaza varianta eu care S8 trece din patratul k-1 i n patratul k . adi ca elementul k din veetoru l p : p [k 1~o .

lnfurmat icii

33

-) SUbprogra mul succesor () . Se cons idera ca mai exists 0 pos ibilitate de continuare a cons truirii soluti ei pe niveJ ul k daca mai exista 0 varianta de mutare din pat ratul k-1 i n patratu l k , adica daca p [k] <8 . Daca mai exista 0 varianta de mu tare , pe nivelul k din stiva , S8 trece la aceasta variants (p [k] =p [k] +1) ~i S8 i nregistreaza coordonatele patratul ui k , care S8 vo r obtine prin adauqa rea , la coo rdonate le patratului k-1 , a dep lasarilor corespunzatoare acestei variante (st[k] . x=st[ k-l ].x+d[p [k]] . x ~ i
st[k] .y=st[k-l] .y+d[p[k]] . y ).

-7 Subprogramul va l i d () . Se considera ca patratul k In care s-a ajuns poate fi cons iderat ca este bun pe ntru a continua con struirea solut iei, dac a coordonatele sale nu sunt In afara tab lei de sah (coordonatele st[k] .x ~i st[k].y iau valori In intervalul [1,n] ) ~i prin pat ratu l k nu s-a mai trec ut (S8 ver ifica daca i n stiva, pe nivelurile ante rioare , nu ma i exista un patrat cu coor donatele patratulu i ~ ) . -7 Subp rogr amul s oLu t i.e () . Se ve rifies daca a fast parcursa toata tabla de sah , adica caca varf ul stivei k are vaJoarea n- n. -7 Subprogramul bt () . Deoa rece coord onate le primului patrat nu trebuie mod ificate , primul ui element al solu tiei (k=1) i se atribuie coordonatele in subprogramul main ( ) , iar in subprogram se va i ncepe cu initia lizarea nivelului 2 din stiva (k=2); cautarea tuturor solutiilor se va face pana cand varful stivei coboara pan a la primul element al solu tiei : while ( k > l ) .
#incl ude -c Los Lr-c am . h > str u 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 , l }, int D,k , ev ,u s ,p [ lOOJ ,este = O; typedef e Lem e rrt st iv u [ l OO J;
-r

{ ~ 2 ,l } ) ;

.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 v p j k ] 11; s t.j k ] . x ~ s t [ k- l l . x + d [ p [ k J ] . x ; .s t j k ] . y ~ s t [ k -l l . y ;' d [p [ k J ] . y ; return 1.; ) else return O ; } int va Li d L) {if Ls t j kj x c I II s t j k ] . y < l I I s t Lk ] .x >n II s r j k ] . y > n ) return C; 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= =nn ; } v o id tipar () { in t i ; e s t e '<L : " . for ( i = l ; i< = n""' n ; iH) cou t cc s t Lt ] . ::", " s t [ i ] . y" cou tendl; } void bt () { k ~ 2; Lni t t j while ( k> i ) {a s = l; cv=O ; while ( a s && l e v ) {e s e s u c ce s o r I ) ; i f ( a s l ev = val id ( ) ; }
v

34
i f (.:i s ) i f (solutie ())

Te h nici d e p rog ra ma re

t i pa r () ; else ( .: - T; initr) ; } el se k - - ; } } void main ( ) lint i ,j ; cout " n = " ; c in n ; cout " l i .,i a de : o r n i r e "; c i n i ; s [::'j . x =i ; cout " c o l o a na de parnire "; cin j ; st[l] . y=1; bt(l ; if ( !es~e) cout " Nu e x is t a solucii " ; }

Observatie. Daca se dore ste numai afisarea primei solutii, cautarea solutie: se face pana cand variabila es te trece de la valoarea 0 (nu s-a gasit solutie) la valoarea 1 (s-a gasit solutie), rnoditicandu-se in subprogra mul btO conditia de terminare a cautarii tuturor solutiilor trn loc de wru Le (k>1 1 sevascrie whi l e ( k > l && ! e stel ) . Sa se generez e toate posibititatile de aranjare pe a tabla de sah , cu dimens iunea nxn, a n cai care sa nu se atace i ntre ei.

1.3.3.10. Generarea uturor solutulor d iesire din labtru t


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 dimeniune a nxm . Pozitia initiala este data de X1 - numaru l liniei - si Y1 - nurnarul Plecare .. coloanei - care se cornunica de la tastatura. Pozitia finala coresp unzatoare iesirii din labirint este data de X2 - nurnaru l liniei - si Y2 - nurnarul colo anei - care vor fi determinate in urma qasini traseului. Deplasare a 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, care se mernor eaza i n stiva. Nurnarul de elemente ale solutiei depinde de solutia gasita. Elementul solutiei Xk reprezinta coordonatele i ~ i j ale patratului in care se deplaseaza a persoana in labirint ~ i se mernoreaza pe nivelul k al stivei st . Sosi re Pentru a i nregistra traseu l strabatut, elemente le stivei vor fi de tip i nregistrare cu doua carnpuri, x ~ i y , corespunzatoare celor dou a coo rdona e ale patratulu i, Stiva va avea dimens iunea t corespunzatoare parcu rgerii intregului traseu, ~ de la patratul de plecare pana la patratul de INo rd sosire, si va contine, i n ordine . coordonate le i -1, j tuturor patratelor de pe traseul de parcurge re: f s t [ 1 ] . x ~ i s t [ 1] . Y corespund patratului de Vest Est ,...,.. plecare, s t[2 ]. x ~i st[2].y corespund celui 4-- L- .. 2 I,J de al doilea patrat in care se trece, ... , i, j-1 i, j+1 I t st [t ] . x si st [ t ] . Y coresp und patratului de sosire, prin care se iese din labirint. 3 i+1 , i Sud Data fiind 0 pozitie curenta i,j a traseul ui, . a antele posibile pentru urrnatoarea pozitie Su" : orezentate alaturat.

..., Xu

10-10---1

...

Illr(1! :!!m!ic" ii

35

Se observa ca exista 4 variante posibile pentru continuarea drumului. Coo rdonatele urrnatorului patrat de pe traseu in care poate sa treaca pe rsoa na , pentru fiecar e dintre cele 8 variante, sunt prezentate i n tabel. in vectorul p . de dimensiune nxm , S8 pastreaza varianta Varlanta Coordonate care s-a ales pentru continuarea drumului. Eleme ntele sale i+1, j 1 sunt de tip intreg. Elementul k din vector arata care dintre i, j+1 2 cele 4 variante s-a ales pen tru a ajung e de la po zitia k-1 la i+1 , j 3 pozitia k Orice elem ent k al vectorului trebu ie sa in dei , j-1 4 plineasca urrnatoarea con ditie: 1;; p [k) ;; 4.

Fiecare dintre cele 4 variante de deplasare din patratu l k -1 i n patrat ul k in searnna adauqarea unei constante de dep lasare [a coordonata x, repsecti v y , a patr atului k-1. Aceste constante sunt memorate in vectorul d (pentru varianta 0 , care nu exista, dep lasare a este 0): etenent d [ 5 J ~ {{0 , OJ. {- I, 0 J. { O, 1 J. II, 0 J. { 0 , - 1 ) ) ; Deoarece din patrat ul k-1 se poa te trece in patratul k , qasit pe una dintre cele patru directii de depla sare nu mai 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 n xrn . Vor fi prezentate doua metode de reprezentare a labir intului . Varianta 1 Nord : cale bloc ata: Fiecare element al matricei L corespunde unui patrat din labirint l?i rnernoreaza inferma\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 urrnatoare le reguli:
~

a patrl cifra: 0

prima citra: are valoarea 1, caca se poate executa un pas spre Vest ; ~ a doua citra: are valoarea 1, dace. se Sud ; cale blocata : poate executa un pas spre Sud ; a doua citra: a ~ a treia cifra : are va loarea 1, daca se poate executa un pas spre Est ; -7 a patra citra : are valcarea 1, daca se poate executa un pas spre Nord .

Vest : cale ribera: ...... prima citra: 1

Est :
--.... cate tioera ;
a tre ia

crrra : 1

Pentru patratul din exemplu este prezenta ta alaturat valoarea etementului care i se asociaza in rnatricea L. Sirul de patru cilre binare tormeaza un nurnar binar, care va fi transformat intr-un nurnar zecimal.

Elem entul matrice i co res p unzat o r pa t ra tu lul

prima

~ J \ :~tra
a doua cifra a treia citra

afra

0011 0100 0101 0111 0111 0111 0011

1110 0101 0111 1001 1110 1001 1000

1010 0010 1010 0010 1000 0010 0010

1010 1010 1010 1100 0101

1010 1010 1100 0101 0111 1101 0111 1011 1011

1010 1100 0101 0011 1100 1011 1010

1100 0111 0011 1110 0011 1010 1010

0100 3 14 10 10 10 10 12 4 1001 4 5 2 10 10 12 7 9 1100 5 7 10 10 12 5 3 12 1001 7 9 2 12 5 3 14 9 1000 f---. 7 14 8 5 7 10 3 8 1000 7 9 2 13 7 11 10 8 1100 3 8 2 11 11 10 10 12

36

T chnici d e programarc

Pentru a simp li!ica veri!ic area cond itiei de iesire din labirint, matricea L este c ordata cu 0 valoare pe car e nu 0 poate lua nici unu l dintre elem entele ei (de exemplu, valoarea 16). Matncea L are 7 linii ~i 8 coloan e. 1 1 2 Solutia obtinuta va afisa coo rdo natele patratel or 3 2 ,,;;.. prin care S8 trece : C""7 3 ;;..+ 4 5 6 7 Sol uti a 4 8 1,1 1,2 2,2 3,2 3,3 i 9 5 3,4 3,5 4,5 5,5 6,5 6 10 7,8 7,5 7,6 7,7 7 11 12 13 14 Subp ro gram el e 1 2 3 4 5 6 7 8 7 Su bprogra mul i ni t ( ) . Se initiatizeaza varianta cu care se trece din patratul k-1 in patra tul k , adica elementul k din vectonul p : p [ k] =0. -7 Subprogramul su c c es o r () _ Se consid era ca mai exists a posib ilitate de continuare a con struirii solutiei pe nivelul k daca mai exi sta 0 varianta de dep lasare din patratul k -1 i n patratul k , ad ica daca p [ k ]< 4 . Daca mai exi sta 0 variants de dep lasare , pe nivel ul k din suva, se trece la aceas ta variants (p [ k ] = p [ k ] + l) ~ i se i nreg istreaza cco rdonatele patratul ui k , care se vo r obtine prin adauqa rea , la coordon ate Ie patratului k-1, a deplasarilor corespun zato are acestei var iante (e t [k] , x ~ s t [k - 1 ] . x +d [p [k ] ] . x ~ i

--

I I Ie

st [ k ] . y =s t [ k - l ] . y +d [ p [ k ] ] .y).

-7 SUbprogramu l valid ( ) . Se conside ra ca patratul k, i n care s-a ajuns , poate fi


considerat ca este bun, pentru a continua construi rea solutiei, numa i daca exista culoar de trecere i ntre patratul k-1 ~i patratul k - pe directia de deplasare aleasa (daca i n matricea L, i n elemen tul asociat patratului k-1, bitul corespunzator directiei de deplasare are valoarea 1) - ~i daca prin patratut k nu s-a mai trecu t (se verifica daca in stiva . pe niveluril e ante rioare , nu rnai exista un patrat cu coo rdo natele patratutui k). -7 Subpro gramu l so Lu t.i. e ( ) . Se ve rifica dac a patrat ul in care s-a ajun s S8 afla i n afara matricei (eleme ntul asociat lui in matricea L are valoarea cu care a fast bordata matricea: L [st[k] .K ] [ st[k ] .y ]=1 6 ). Pentru a evita solutia prin care se iese din labirint prin patratul prin care s-a intrat, in stiva trebuie sa exis te eel putin doua elemente (k>2 ). Deoa rece ultimul patrat din stiva nu face parte din solutia prob lemei (este ca un terminator al solutiei), coo rdonatele lui nu vor fi afisate i n subpr c qrarnul t ipar ( ) . -7 Subprogramul bt () . Deoarece coordonatele primului patrat nu trebuie modificate, primului element al solutiei (k=1) i se atribuie eoordonatele in subprogramul main () . iar i n subprogram se va incepe cu inilializarea nivelului 2 din stiva (k=2); caut area tuturor solutiilor se va face pima cand varful stivei cobo ara pana la primu! element al solutiei: wh il e (k>l ) .
Ui nc I ude < f s Lr e a m . h > str uct e leme nt ( i n t :-: ,y ; } ; elemen t d [ 5 J ~ { {O , 0 J , l -l ,O } , i 0 , 1 ) r 11 ,0) , 10 , -1 } J ; in t !l , lll,k ,ev , as ,p[100] , e s t e = O, :./10J [IO} ; typed ef e l e ment stiva[ lDO] ; sLi v a st ; f s t ream f( " l abiri ntl . tzt " ,io s : : i n );
void i n i t () { p I k] ~ O ; ) in t su c c eso r{} ( i f I p[ k J < 4) { p [ k ] ~ p [ I: ] + l; s t [ k l . x ~ s t l l:- l ] . x e d Lp l kl l . >: ; st[k] .Y=3t [~ -l} . y +d [ p [ k ] ] . y ; r e tu r n 1; )

Info rm a tic a
else return O; } int val i d ( ) tint x e 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 ] . x ~ ~ st [ i].x && st[k ] . y ~ ~ s t [ i } . y ) return 0 ; switch { p l k ] ) {case 1 : if IL[ x} [y} & 1 ) r e t u r n 1 ; break; I is pre N case 2 : if IL [x ) [y} & 2) return 1 i break; Ii s pre E case 3 : if (L[x ] [y} & 4 ) return 1 ; break; / / s p r e S I i spre V case -l : if { L j x l j y ] & 8) return 1 ; } return 0 ; } int s o Lu t i.c I') {return k>2 && Lj s t I k ] . x } [ st [k ] . y } ~ ~ 1 6 ; ) void tipar () { i n t i; e s .t e -e L: for (i=l ;i<k ;i + +J cout s t [ i ] .x ", " st [i ] . y" ".

37

c ou t endl; } v o i d bt() { / l p a r t c iJ fixE! a a l co r Ltmu l u i. co in e xemp Lu L a n t e r i o rI voi d ma in ()


ti n t i ,j; f nlH ; f or (i;;; l ;i<=n ; i+-::") f or (j ~1 ;j<==r:1 ;j +-I-) f L [ i l f j] ; ccu t.c-cv In t ra rce in .Lab.i rLn t : "<cendl : c ou t.x-c ".> " ; c Lrc-o i s t [ L] .z=l ; cou t c cvy> " ; cin j; f o r (i =1;i< =n ;i++) { L [i ] [ OJ=1 6; L [i ] [m+ l ]=1 6 ; } for li~l ;i< ~m ; i+ + ) ( L [ O) [i ) ~16 ; L [n+l ) [ i]~16 ; ) bt {) ; if ( ! c c t c ) oou t c -C'N u existaso lut ii " ; }

st j L] . y := :j ;

Varianta 2 Fiecare element al matricei L corespunde unei pozitii din labirint

tli , j) ~ { 1, d ae~ se poate treee prin pozitia O,j} :-este euloar


. 0, daea nu se poat e treee pnn pozitia (i.j) - este zid)
58

Matricea L are 15 llnii si 17 coloane . Punctul de intrare In labirint i n coloana 2

qa seste pe Ji nia 1 $i

r-',--, ... .
I'

-- . . , .".,

'

,
,..

," - .. '- ' T'..

0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

"' 1 -

I-.. -I " - k,'..,. ,.. _...."" ~ ~


~C
_ _

1 I' " "" 0 1 J 0 1 cl- .... I 0 1

'hHI+t "b"b'H t t t~ +t+ * o


0 0 0 1 1 1 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 0 101 1 0 1 1 0 1 1 0 0 0 0 1 0 00 0 0 10 1 0 0 1 1 1 0 1 1 1 0 10 1 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0

1 + "- 1'_-.(~ ~ .. f- f- - h ' -r- -

"" ~ "" ~

1--' -I .. ~ '-'

f- -

-~

H +-1 --1 -1-1- 1-1-++-1 I I I-++--

..! ..1..-!c~ 0 1 0 1 1 0 1 1 1 1 0 1 1 0 0 0 0 1 0 1 10 0 0 0 0 011 01 1 11 0 1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 01 10 1 1 1 1 1 1 1 1 1 1 1 1 0 0000 0 0 0 0 0 0 00 0 01

0 0 0 0 0 0

38
So lutia 1 ,2 4,4 6,7 8, 1 0 12 ,11 14 ,12 15 ,16 1 1 0 1 1 1 1 1 1 o1 ll- 1 o1 o1 o1 o0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0

Tehnici de programare
0 0 1 1 0 0 1 1 0- ._ 0 _. 1 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 O~ 1 0 1 0

Solutia o btinuta va afisa coo rdo natele punctelo r prin ca re se trece :

2,2
5,4 6, 8 9 ,10 12 ,10 14,13

2,3
6,4 6,9 10,10 1 3 ,10 14,14

2 ,4 6,5 6, 10 1 0 ,11 14 ,10 14 ,15

3,4 6 ,6 7 ,10 1 1 ,11 14, 11 14,1 6

SUbprog ra me le (sunt prezenta te num ai rnodiflcarile fa ~ a de varianta ante ricara) : -7 Subp rog ram ul valid () . Se considers ca pozitia k, in care s-a ajuns. poate fi consio 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] ~~1) si daca prin poz itia k nu s-a mai trecut (S8 verifica daca in stiva, pe nive lurile anterioare, nu mai exista 0 poz itie cu coordo natele pozitiei k). -7 Subp rog ramu l so l u t i.e ( ) . Se verifica daca pozitia i n care s-a aju ns nu S8 afla la i8$ irea 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 sa u st[k] .y==m) .

#i n c l u de < f s t r e a m. h > str uc t element {i n t x ,y ; } ; e 1 emen t 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 lem e nt stiva [l OO ] ; s t iv i'i st: ;

fstream f ( " 1 abi r int l .txt " ,ios : : i n );


void ini t ( 1 { p [ k ] ~ O ; } int s u cc e s o r () { i f ( p[ k l <41 {p l kl e-p j kl t -L r s t j k ] . x ~ s L l k - 1 J . x +d [p l k l ] . x; s t j k] . y ~ s t [ k - 1 J . 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 . y ) ~ ~ O ) return 0; for (int i = l ;i<k ;i++ ) if (st[k ] .x"'=st" [ i] . x && s t[k ] .y= =st (il .y) retur n 0 ;

return I ; } int s o l u t Le I ) {return s t j k ]


void tipar ( )

. F~ l

I I s t[k ]

. x~~n

I t st [ k ]

.y~~ l

II

t j

k]

. y ~ ~ lll;}

{for (i n t i=l ,este=l ;i <=k ;i++) cout s t [ i ]. x"," s t [ i ] . y"


coutendl; } void bt() { / / p a r t e a f i x E! a algoritmulu i

".

ca i n exemplul an terio r }

void mai n ( ) {in t i, j; Cn m; for ( i=l ;i < = ~ ; i + +)


for
( j~1;j < ~m ; j H I

f L[i ] [ j ] ;

Inform at icii
c cu e-ccv r nt rc r e c in Lab.i r i.n t : "endl; oou t-c-c" >; ",' cin i; .':ltfl ] .x= i ; cou t-cc vy-. " ; cin j; bt() ; i f t I es t ej cout" Nu e x is ta s o.l u t ii " ; )

39
s t r j j . y=j ;

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 ~i 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. Pentru simplificare, vom considera fiecare zona ca fiind un patrat cu aceeasi dimensiune . Terenul poate fi reprezentat sub forma unei matrice cu n linii ~i m coloane , fiecare element al matricei reprezentand ina1timea unei zone de teren. 0 bila S8 gase!?te intr-a zona cu coordonatele x (nurnaru l 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. ln di cat ie. Construirea solutiei traseului are urrnatoarele caracteristici: ~ 0 soiut ie este fermat a din coord onatele zonelor prin care se rostoqoteste bila. 7 Fiecare solutie are un numar variabil de elemente. Primu l element al solutiei contine coordonatele zonei de plecare a bilei, iar ultimul element al solutie i contine coordonatele unei zone de la marginea terenului. ~ Bila se poate rostogoli in 8 directii (corespunzatoare celor 8 patrate adiacente patratului i n care se g ase ~ te ) . fiecare directie de deplasare corespunzand unei can stante de dep lasare care se adauq a la coordonata x, respe ctiv v- a patratului i n care se ga s e~te bila . 7 Co ndi tia de cont inua re a construirii soluliei este ca patratul i n care a ajuns bila sa aiba ln altimea 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 ~i m coloane, fiecare element al matrjcei reprezentand un patrat de teren. Anum ite patrate contin diverse capcan e ascunse. 0 persoana se gase~te in patratul cu coordonatele X1 (nurnarul liniei) ~i y, (nurnarul coloanei) ~ i trebuie sa ajunqa i n patratul cu coordonatele xz ~ i y z deplasandu-se ortogonal si fara sa calce i n patratele cu capcane. Datele se citesc dintr-un fisie r text, astfel: de pe primul rand, n, rn si coordonatele patratului de pornire ~i ale patratu lui 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 ica t 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 eleme nt al solutiei contine coordonate Ie patratului din care pleaca persoana , iar ultimu l 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 diagona la patratului in care se qaseste), fiecare directie de depla sare corespunzand unei constante de depl asare care se adauqa [a coordonata X , respectiv Y a patratului in care se gase~t e persoana . ~ Condit ia de continuare a construirii solutiei este ca patratul in care a ajuns persoana sa nu cantina capcane.
I

------- ".-.....

40

Tehnici dc programarc

1.4. Metoda "Divide et Impera"


1.4.I. Dcscricrca mctodci .Divide et Impcra"
Metod a d ivide et impera se paate folosi pentru prable mele care pot Ii descompuse in subprobleme similare cu problema ini\ial;; (care se rezolva prin ace easi metoda) ~ i care pretucreaz a rnultirni de da te de dimensiun i mai rnici, independente uncle de altele (care folose sc multimi de date de i nt rare disjuncte).

[ Sm.dJJiu de caz I
Seop: identificarea probleme lor care pot fidescompuse in subprobleme s imil are care folo sesc rnultimi de date d e intrare d is juncte. Enuntul problcmei 1: Sa se caJ culeze suma elemente/o r dintr-un vector v cafe num ere intregi.

cotuine

Multimea datelor de intrare 0 repre zinta cele n elemente ale vectorulu i v . Ele pot fi diviza te i n cate doua submultimi disjuncte, prin divizare a multimii indicilor i n do ua subrnuttimi, Mul\imea iniliala a indic ilar este determinata de prim ul indice (s) ~i de ultimul indice (d) , iar intervalul indicilo r care S8 divizeaza este [s ,d]. EI se divizeaza in doua subrnultirni disjuncte , [s,m] ~i [m+1 ,d] . unde m este indicele din miilocullntervalulut m=(s+d)/2 . Astlel , problema initiala este descornpu sa in doua subprob leme, fiecare dintre ere con stanc i n calcularea surnei numer elor dintr-o subrnultime de elernente (care corespunde unui subinterval al indicilor). Desco mpunere a continua pana cane fiecare subrnultime cont ine un singur element - ~ i se poate calcula suma , obtinandu-se solutia subproblemei . Enuntut problemei 2: Sa se cetcotoze suma 1x2+2 x3 + ... +n x(n+1). Multirnea datelor de intrare a reprezi nta primele n numer e naturale. Mul ~ lme a inifiala este determmata de primul numa r (s =1) ~i de ultirnul nurnar (d=n), iar interv alul care se divizeaza este [s,d] . EI se divizeaza i n doua submultimi disjuncte, [s ,m] ~i [m+1 ,d] , unde m este nurnarul din mijlacul intervalu lui: m=(s+ d)/2. Astle l, proble ma initiala esle descornp usa i n doua subprobleme, fiecare dintre ele constand in calcularea sumei produselor dintre doua nume re consecutive dintr-o subrnultime de elemente (care cores punde unui subinterval al numerelor). Desco mpunerea continua pana cand fiecare subrnuttime contine un singur element - ~i se poate calcu la produsul , care se va adauq a la surna, pentru a obtine solutia subproblemei. Enuntul probl em ei 3: Sa 58 genereze termenuf n al suului lui Fib onacci. Sirul lui Fibonac ci este definit recursiv: 1,=1, 12=1 ~i I n= I n-2+ I n.1, pent ru n;,3 . Problema determina rii termenului n al sirului lui Fibonacci se poate de scompu ne Tn doua subpro bleme : determinarea termenului n-1 si determinarea termenului n-2. Descompunerea continua pana cand trebu ie deterrninati terme nii f1 si Iz. a carer valoare este ~ ~ cunoscuta.

*.

Metoda Divide et impera se bazeaz a pe des c ompun ere a unci problem e i n subproblem e sirnilare, prin inte nned iu l unui pr oces recursiv . Procesul recursi v de descompunere a unei s ubpro bleme i n alte s ubproblcm e co ntin ua pan a se obtin e o subproblem a cu rezol varea irnediata (caz ul de baza), dupa care se com pun s olutiile subprobl em elor pan a so obtine s olutia pro blemoi initiale .

III Iorill a ti ciI

41

Pasii algoritmului s unt : PAS1 . Se des compun e problema in subprobleme similare problemei initiale , de dirnensiuni mai rnici, independente unele de altere (care folosese multim i de date de intrare disjuncts - d.). . PAS2. Dac a subproblem a permite rezo lvarea irnediata (corespunde cazului de baza ), atun ci S8 rezolva obt inandu -se solutia s : altfe l , S8 revine Ia Pas 1. PAS3 . Se cornbina solutiile subprobleme lor in care a fost descornpusa (5,) 0 subproblerna, pana c an d S8 obtine solutia probleme i initiate .

1.4.2. Implementarca metodei Divide et lmpera


Deoa rece subproblernele i n care S 8 descompune problema sunt sirnilare cu problema initiala , algor itmul divid e et imper a poate fi imp lementat recursiv. Subprogramu l recu rsiv div ide _et_im pe ra( d,s), unde d reprezinta dimensiunea subproblemei (cores punde multirnii datelor de intrare), iar 5 solutia subpro blemei, poate fi descris in pseudocod astfe l:

divide_et_impera(d , s) i nc e p u t da ca d i.me n s iune a drco r cap uridc UfL.:.i.C:l Z d e t. a aa atunci s e delerffi jn~ sol u ~la S a prob le~ei ; altfel pentru i=l , r. execu ta c e det e r m.ina d imens i unec d i a s uopz ob Le me L p.;...i ;
~; 0 d e l e n [\. iJ ~ a s oLu t i. a s ~i i:l aubp r-ob Le ruc i P~i p.ri.n ape Lu I d ivi d e_et~irnpe ra (d_ i , s _ i ) ; s t a r s i. t~ pe n t r u; s e c omb i n a s o Lu tLj. Le 5_ 1 , 5_ 2, 5_3 , . . , 3 _ n;

sfar~it.-"--daca;

sf

a r-s i. t;

Imp tomenta roa acestui alg oritm in limbajul C++ se face astf el:
/ 7dcclara r;-.ij c;lobaJe pe n t r u da t e Ie de i nt r a r evcc v or- f j d iv i ze t.e vi n submu . L t.dm.i o is j un c t e p e n t r u ts ubprob LemcLe In care se descornpune pr cb l cme v Z v o id di viz ea za {c p e r-ame t.r-L : s ubm ul t.i.m.i Le> -s. { / / .s> 2 d1.\r1::ea7.0 mul ti mca eke' date d e dn t ra re i n sucmuL t imi d i s jpnct e d_ i} vo~d comb~na l < p a r a m e t r 1 . solutllle 5_1 care s e comblna? ) { '/ 3 8 comb i na 30 11, t~ 1 1 1 iC cbt .i nut;e S_l.}

void de i p a r a me t r i : multimea de date d $i 501 ut i a s > l


[l ldccl ara~ii

de vari abi le

!a c~le

if

(c os te ca z d e be z a> {,lI s e obt i ne so lut.La cor.espunaaroare eubprob.lcme i I e lse {d ivizeaz a parame tr i: k submultimi ; for ( 1. =1 ; .i e-k: i-II) dei parametri: multimea d e da te d_i $ i s olutia s _i ; combina parametri : soluti i 1e s_i> l ;} }

v oi d mai n ()
( j l d e c l a r a t i i de variabil c lQ csle /Isco c i t c s c dat.c Lc d e i.nt r e re ale pr-ob l eme i. - mul time a d dei p a r ame t r i : multimea de date d $i soluti a s ; lise a f.i$ea::5 s o l ut i.e p rob l eme i - s }

42

Tchnici de programarc

Exemplul 1. Sa 5 8 calculeze suma clementelor pare dintr-un vector v care contine nurnere intregi. Nurnarul de elemente ale vectorului (n) ~i elementele lui se citesc de la tastatura. d=5 s=1 1 2 3 4 5 5 10 1 15 20 25 m- (1+5)/2-3 z=z12345= z123+ z45=10+20=30

./
1 5

<,

2 3 4 5 s=11 10 1 15 d=3 s=41 20 25 Id=5 m-( 1+3)/2-2 m-(4+5)/2- 4 z123 = z 12+ z45= z4+ z5=20+0=20 ..------"" z3=10+0=10, ~ 1 2 3 4 5 s=1 1 5 1 10 I d=2 1 15 1 1 20 25 m=(1+2)/2- 1 s=d=3 s-d=4 s=d-5 z12= z1+ z2=0+1 0=10 z3=0 z4=20 z5=0

1 s=d=1 1 5 z1-0

2 1 10 Is=d=2 z2- 10

Implementarea mel odei divide et impera in acest exemplu se face astfel: -7 Subprogramul divizeaza() - Nurnarul de subprobleme in care se descompune problema este 2 (k=2). Multimea datelor de intrare esle divizata in dou a sub rnultirni disjuncte, prin divizarea multimii indicilor in doua submultirni disjuncte de indici, adica rnultimea indicilor [s,d] (unde 5 este primul indice, jar d ultimul indice) este divizata in coua submu ltirni disj uneIe [s,m] si [m+1,d] , unde m este indicele din mijlocul intervalului: m=( s+d ) / 2. in subproului intervalului - m gram, procesul de divizare consta in determinarea mijloG
~ Subp roqram ul comb ina ( ) -

Combinar ea solutiei insearnn a adun area celar do ua sume obtin ute prin rezolvarea celor o ou a subproblerne. in subpro gram sunt comb inate cele d oua valori obtin ute din prelucrarea celor d oua intervale , ad ic a S8 aduna cele d ou a valo ri x si y , obtinandu-se solu tia z .

-7 Subprogramul dei ( )- 0 subproblerna corespunde cazului de baza atunci cane submultimea contine un singur element (se peate calcula suma, oblinand u-s e solutia sub problemei). Daca s-a terminat procesul recursiv (prin procesul de divizare, cele coua capete ale intervatului au ajuns sa fie identice), atunci se prelucreaza cazul de baza (se calcu leaza sum a in variabila z , co respunzatoare solutiei, astfel: oaca numarul v [s] este par, atu nci suma va fi chiar nu rnarul: altfe l, are valoarea 0); altfe l, se apeleaz a subproramul pentru divizarea intervalului, se ap ele aza subprogramul dei () pentru primul interval, se apel eaza subprogramul de i () pentru al doilea interval ~i se combina cele dou a rezultale. #inclu de < l o s t r e am. h > int v[lOO] ,n ; void divizeaza { i n t s , i nt d , i n t & m) {m= ( s +d l / 2 ;} void combina ( i n t x , i n t Y, i n t &z ) { z ~ x + y ; } v o i d dei ( i n t s , i n t d, i n t &z ) tint m,xl ,x 2; i f I d==s)

I nfo r ma tica
if
(v[s ]% 2 :; =;:O) zev

43
l s l , e lse z .:;;.O ;

else
{d i v i z e a z a ( s, d, m) ; d e i(s, m,xl); ;d e i (m+l ,d, x2); cOmbina (xl , K2, z ) ;} } vo id ma i n() {i n t i,z ; cout c cvne ";cinn; for {i = l ; i < =n; i + + ) ( c ou t. c cv v Lv-c -c i c cv j e v: c Ln c- c- v l Ll c } dei (l , n , z ) ; cout" s u ma = "<:< z; }

s=l l

4 5 1 1 1 m=(1 +5 )/2= 3 z=z12345= z123+ z45=20+50=70

/"
s =11 -----;---'1---=--1 1
m= (1+3 )/2=2

I
~

":
m=( 4+5)/2=4

z123 = z12+ z3=8+12 =20 s=l l-

z45= z4+ z5=2 0+30=50

..------"" :--1 1

"s=d=3 z3=3 x4=12

;t

~ r--'--::-----, 5
s=d=5 z5= 5x6=30

m=(l +2 )/2= 1 z12= zl+ z2=2+6= 8

s=d=4 z4=4 x5=20

;t
s=d=l l 1 1 zl -1 x2-2

1---~ 2---l s=d=2


z2-2 x3- 6

Implementarea metodei divide et impera i n acest exemp!u S8 face astfel: -7 Subprogramul divizeaza() - Nurnarul de subprobleme in care S 8 descompune pro blema este 2 (k=2). Mul\imea date lor de intrare este divizata in doua subrnultirni disjunete , prin divizarea rnultim ii primelor n nume re natu rale in dOU3 subrnultirni disjunc te, adica multirnea [s.d] (unde s este primul numar din multime, iar d ultimul nurnar din rnu ttirne ) este divizata i n doua subrnultirni disjuncte, [s ,m] si [m+1 ,d] , unde rn este numarul din mijlocul intervalul ui: me (s+d ) /2 . in subprogram , procesu l de diviza re consta i n determina rea mijlocu lui intervalului, In. ~ Subprogramul combina ( ) - Combinarea solutiei lnseamna aduna rea celor doua sume obtinute prin rezolvarea celor doua subprobleme . i n SUbprogram sunt comb inate cele doua valori obtinute din cele doua intervale (se aduna cere doua valori , x si v ) obtinandu-se solutla z -7 Subprogramul dei ( ) - 0 subproblems corespunde caz ulul de b aza atune; cane submuttirnea contine un singur element (se poate calcula termenul sumei - produsul celor doua numere consec utive - obtinandu-se solut.a subproblemei). Dac a s-a terminat procesul recursiv (prin procesul de divizare, cele cou a capete ale intervalului au ajuns sa fie identice), atunci se prelucre aza cazul de baza (se calculeaza produsul i n variabila z, corespunzatoa re solutiei): altfel , se ape leaza subprogramul pentru diviza rea intervalului, se apeleaza subprog ramul d ei () pentru primul interval, se apeleaza subp rogramu l de i () pentru al doilea interval si se cornbina cele doua rezultate. #ioclud e <i o s t r e am . h > i nt n ; v o i d divi zeaza {i n t s, i n t d, i n t &m} {m= ( s +d ) / 2 ; } v oid combina (int X, int y , i n t &z) {z e xty r )

44
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);

Tchnici de p rogramarc

el se ( diviz e a z a{s,d,m) ; d ei ( s , m, xl ) ; dei (m+l , d , x2 ) j combina (x l , x2 , z ) ; } } void ma i ne} (iot z ; cou c c c vn e " c c Lno xn : dei (1 , n ,z ) ; c out " s uma e ve c a : }

Exemplul 3: Sa se calculeze termenul n al sl ru lui lui Fibo nac ci. 1 1(3) z=1+1=2 '-",. O ULJ =1 z=2+1=3 '-",. 0 (2) 1 =1 /

z=3+2=5

[l(~}] \

__ /

[Il~LJ

1/

f 2

=1

z= 1+1=2 '-",.

c::::illD

.........

12

=1

1(1 ) 1 =1

0 6 z=5+ 3=8 / ----..... LJillJ


z=2+1=3 '-",.

C 1(3) - -j
z=1+1=2 I 2 =1

1 f [2['] =1 D GLJ= l

Impleme ntarea metodei di vid e at impera i n acest exemplu 58 face astfel: -7 Subprogramul divizeaza () - Nurnarul de subprobleme in care S8 descompune prob lema este 2 (k=2): dete rminarea termenu lui n-l ~ i determinarea termenu lui n- 2. Descom punerea S8 face implicit , prin parametrul cu care S8 apeleaza subprogramul dei ( ) , si subprogra mul de divizare nu mal este necesar . -7 Subprogramul combina () - Combinare a solutiei inseamna adunarea celor doi term eni ai sirutui (x l ~i 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 procesu l de divizare s-a ajuns la termenu l 11 sau (2), atunci se prelucreaza cazul de baza: altfel , se apeleaza subprogramul dei () pentru primul termen al descompunerii, se apeleaza subprogramul de i ( ) pentru al doilea termen at descompunerii ~i se cornbina cele doua rezultate. # i n c l ude<io s t r e um. h > i n t n; voi d comb i na ( i n t x l , i nt x~ , i nt & 7. ) {z =x l +x 2 ; } vo id dei i i n t n, i n t &z ) {int :-:::, x2 ;
i f (,,==1

II

n==2i

z=l;

else {d e i (n - l , x l ) ; dei {n - 2 , x 2 ) ; combina (x l , x 2 , z ) ; } } void main ( ) {int Z ; cou ti c cvn e " ; c Ln c >n : d e i ( n, z ) ; couu c c z r }

~
Atcntie

i n acest exemplu , prob lema a l ost descornpusa in probleme care nu s unt independente unele de alle le ~i, i n apelu rile recursive, aceeasi subproblerna este rezolvata de mai multe ori : 1 (4), 1(3), 1 (2), 1(1). Pentru acest tip de problem a nu se recomandii metoda divide et impera deoare ce nu este eficle nta

Informaticii

45

Exemplul 4: Sa S8 determine simultan va loarea minima 9i valoarea maxima dintr -un vec tor v ca re contine nume re intregi . Nurnarul de elemente ale vectorului (n) ~i elementele lui se citesc de la tastatura. lmplementarea metodei di vi d e et im pe ra i n acest exemplu S8 face astfe l: ~ Subprogramul divizeaza ()- Nurnarul de subprobleme in care S8 descompune problema este 2 (k=2). Div iza rea rnultim ii datelor de intrare se face la fel ca la exemp lul pentru calcularea sum ei elemen telor unui vector ;;i subprogramele sun t identice. -7 Subprogramul combina ( )- Combinarea solutiei l nsearnna determinarea minimului [ z L) ~ i a maximulu i (z z} dintre cele doua valori minime (x l ~ i y l ), respectiv maxime (x2 si y2 ), obtinu te prin rezo lva rea celor doua subprobleme. in subproqram sunt combinate cele doua perech i de valor i obtinute din cele doua intervale . Daca x 1>y1 , atunci minimu l (z r.) este y L, altfel , este x l. Daca x2>y 2, atu nci maximu J (z 2) este x 2; altfel, este y 2. -7 Subprogramul dei ()- 0 subproblems corespunde cazului de baza atunci cand subrnult irnea cont ine un singur element (se pot calcula min imul ~ i maximu l; atat minimul cat ~ i maximul vor ave a valoarea elemen tului) . Daca s-a terminat procesul recursiv (prin procesul de divizare cele doua capete ale intervalulu i au ajuns sa fie ide ntice) , atunci se e z l si z 2 pre lucreaza cazul de baza (se calc uleaza minimul ~i maximul In variabileJ corespunzatoare solut iel): altfel , se ape leaza subproqrarnul pentru diviz are a intervalulu i, se apeleaza subproqrarnul d e i () pentru primul interva l, se ape leaza subprogramuJ dei () pentru al doi lea interval si se cornbina ce le doua rezu ltate. #i n clu d e <i o s t r e am . h > i n t v [lOO ] , no void d i v i c ea a c {i n t s ( i n t d , int &m) { rn> (s Id ) 12 ; } v o id c ombi n a( i n t xl , i rit yl , i n t &z l ,int x2, i n t y2 , i n t &z 2) { i f (x l >y l ) z1 c:;yl ; el s e z l =x l ; if (x2>y2) z2;::x2 ; el s e z2 =y2 ; } voi d dei C i n t s , i n t d , i n t &z 1, int &z 2 ) II z 1 - mi nim, z2 - maxi m {int m,xl ,x2 ,y1 ,y2; i f (d-:: ::.s) z Le.z Z v-v l.sl : e lse {d.i.v La e az e ts , a ,m); d ei ( ~; , m , x l , x 2 ) ; Ilxl - min i m, x2 - max im d ei (m l-l , d , y l , y 2 ) ; Ilyl - mini m, y 2 ~ ma xim c ombina (x l , y l , z l , x 2 , y 2 , z 2 ) ; } } vo id ma i n C) {int i , 7.1 ~, z2 ; c o u t. x -cvne "; c i n n ; f o r ( i ;:: l;i < =n;i + + ) {cout "v [ " i " ] = " ; c i.nc-o-v l i j : } d ei ( 1 , n , z l , z 2 ) ; c ou t ":ni n i mu l = " z l e n d l "maximu l = " z 2 e n d l ; } Exemplul 5: Sa se calculeze sum a a doua polinoame. Gradele celo r doua polinoame , n m , si coeficientii celor do ua polinoame se citesc de la tastatura. Coeficientii ce lor doua polinoame se mernoreaza In vectorii p si q , iar coeficien tii polinomului surna se memoreaza In vectorul r.
~i

lmplementarea metodei divide at im pera In aces t exemplu se face astfel: -7 Subprogramul divizeaza () - Nurna rul de sub problems i n care se cescornpune problema este 2 (k=2). Deo arece exist a doua mul tirni de date de intrare (vectorii P ~i q ca re mernoreaza coeficientii ce lor doua polincarne), se va lua ca reper mul tirnea cu cele mai multe elemente. Multirnea datelor de intrare este divizata In doua sub rnultimi disjuncte ,

46

Tc h nici de progra ma rc

prin divizarea rnultimii indicilor in doua submultimi disjuncte de indici, adica rnultimea indic ilor [s,d) (unde s este primul indice, iar d este ultimul indice - d=maxim( n,m) +1) este divizata in doua subrnultirni disjuncte [s ,m ij l) si [m ijl+1 ,d) , unde mijl este indicele din rnijlocul intervalul ui: mi jl = ( s +d) / 2. Procesu l de divizare este identic cu eel de la exemp lele anterioare. -7 SUbprogramul cornbina ( ) - Deoarece i n cazu t de baza S 8 determina unul dintre coeficie ntii polinom ului surna care S8 scrie direct in vectorul r , acest subpro gram nu mai este necesar. -7 Subprogra mul dei () - 0 subproblem a corespunde cazului de ba za atunci ca nd submul\imea contine un singur element (se poate calcula coeficie ntul polinomulu i surna). Oaca s-a terminat procesul recursiv (prin procesul de divizare , cete doua capete ale intervalului au ajuns sa fie identice), atunci S8 prelucreaza cazul de baza , prin care S8 calculeaza coeficientul polinomulu i surna pentru acel indice (daca termenul care se calcuteaza are indicele rnai mic decat gradul minim al polinoamelor, atunci el este egal cu suma coeficientilor cetor doua palinoame ; altfe l , daca polinamul p are gradul mai mic decat al polinomului q , atunci el este egal cu coeficientul polinomului q ; allfel, el este egal cu coeficientul polinomu lui p ); allfel , se apelea za subprogramul pentru divizarea intervalului, se apeleaza subprogram ul d ei ( ) pentru primul interval ~i apoi pentru al doilea interval. #inclu de <i o s tream. h > int p [l OJ,q [lOJ,r[l OI,n, m; i o t ma~im( i n t x, i n t yl {if ( x >y ) r eturn X; e lse r e t u r n y; } iot ~inim ( i nt x, i o t y ) {if (x >y) r e turo y; el s e r e t u r n x; } vo id diviz e a z a {i n t ~ , i n t d , i n t & mi j l ) {mi j l = ( s +d } / 2 ; } vo i d de i ( i n t s, i n t d) {int mi j l ; i f (d , = s) i f (d< =mi n im(n,m)) r[d]~p[dJ+q [ dJ ; e l s e if (Il<m) r l d l=q ld J ; e lse r l dl e p Ldl : els e {d i v i z e a z a ( s , d , mi j l } ; d e i {s , mi j l l ; dei (mijl+l,d); } } voi d mai n ( ) {iot i ; cou t "n = "; c i n n; cout" m= "; c i n m ; f or ( i =1 ; i <=n + l ; i ++ ) {cou t c c vp t v c c L-L c c "} " . cin p [ i ] ; } fo r l i =l ; i <=m1l; i f +l {cout "q ( " i - l " ) = It ; c i o q [ i J; }
d e i.Ll.v maxi.rn I ni m) I-I } ;
fo r ( i ~ ma x i m ( n , m ) + l ; i > = l ; i - - )

if rr l i {i f if if

l ' =0 1 (r[iJ ! = l) t couu c c r Lil : if (i l=l) cou t.c c vvvr


( i>2 ) c o u t.c cvx r vc c i (i !=l} c out;-cc " t " ;
c

l : e l s e if ( i = = 2) oou c c cvxv,

} }

1. Programul urrnator afiseaza . In ordine inversa. elementel e unui vector. Explicati cum a fost folosita metoda di vide et im pera pentru a rezolva problema . #ioclude <i c s t r e a m. h > int v[-:OO],n ; void d i v i z e aza( i n t 5 . i n t d, i n t &m) ( m= ( s +d ) / 2 ;)

Informatica
v o i d d ei( i n t s , i n t l i n t m; i f ( d==s) cou t.c c v e lse ( d i v i z e a z a vo i d ma i n() lint i ; cout "n = f o r ( i = l ; i <=n ; i ++ ) de i (l , n ) ; ) d)
ls l cc" ";

47

( s , d , m) ; dei(m+l,d); d eils/ill) I } }

";ci nn; ( c ou t "a ( " i " ) =

cin v [ i ] ;}

2. Dete rrninati ce calculeaza programul urrnator. Explicati cum a lost folos ita metoda divide et impera pentru a rezolva prob lema # i n c l u d e< i o s Lr e am. h > Lnt; n : v o 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 ;} vo i d combi n a {i n t x , i n t y, i n t &z ) { z=x +Y;} voi d d ei (int s , i n t d , i n t & 2 ) l i nt m, xl , x2 ; if (d=:;::s) ( i f ( s %2= = O) z =-5* 5; e 1 5e 2= s * 5; } el s e ( d i v i z e a z a (s , d , m) ; d ei {s ,m, xl) ; d ei(m+l,d , x2) ; comb i na( x l , x 2 , z ) ; } }
void main ( ) li nt :0: : ; dei ( l , 2 0 , z ) ; c ou t c c vu uma :;:: " c c a i
}

Scrieti 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+1x2x 3+...+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 polinom 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.intr-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 diago nala 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 initia la. 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 execuue ai celor.trei etape de rezolvare a problemei. Daca:

48

Teh nici de

pro ~ramarc

-7 problema initiata S8 divizea za 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 baz a de baza este 0 (1); T(n) = atunci se obtine functia pentru timpul de exeaxT(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 do ua subproblem e (a=2) l?i dimensiunea dateJ or de intrare pentru 0 subproolema reprezinta jurnatate din dimensiunea datelor initiate (b=2) . Pentru divizarea problernei

in subprobleme, se calculeaza mijlocul intervalului de indici ~i 0 (D(n))=0(1)) . Pentnu combinarea celor doua solu\li ale fiecarei subproblerne, se aduna cele doua valori, ~ i 0(C(n))=0(1) . k Co nside rarn ca n=2 . Rezulta ca: T(n) =T(2k)+2 x0~~ = 2 x(T(2 k-1)+2 x0(1))+2 x0~ r 2x(T(2 k-1)+22x0(1) = 2 2 3 2x(2xTl2 - \+ 2x0(1))+2 x0(1 )=2 xT (2 - )+2 x0 (1) = ... = kO 1<+1 k k+1 k 2 xT(2 )+2 x 0 (1) = 2 x0 (1)+2 x0 (1) = 2 x 3 = nx 3. Ordi nul de complexitate al algoritmu lui este O(n ). Algo ritmul iterativ pent ru rezolv area acestei probleme are ordi nul de complexita te 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

~i

a irnplernentarii ei.

Metod a divide et impera sa recomanda in urmatoarele cazu ri:

-7 algoritmul obtinut este mai efi c ienl dedit algoritmul clasic (iterativ) - de exemp lu, algo7

ritrnul de cautare intr-un vector sortat si algoritmii pentru sortarea unui vector; rez olvar e a prob lemei prin divizarea ei in subprobleme este m ai sirnpta decat rezolvarea cia sica (iterativa) - de exemplu , problema turnurilor din Hanoi ~j genera rea unor

mode le Iractale.

1.4.3. Cautarea binara


Sa se caute , l ntr-un sir de numere intregi ordonate strict crescator (sau var ianta strict descresc ator), pozitia in care se gase~te in sir 0 valoare x citita de la tastatura. Daca valoarea
nu se gase~te in sir , sa S8 afiseze un mesaj de informare. Aigoritmul de cau tare secve ntiala intr-un vector are ordinul de com plexitate O(n) . Pornind

de la faptul ca vectorul este un vector particular (este ordonat strict cresc ator sau strict descrescator ), se poate folosi metoda divid e et im per a . Pentru un vecto r ordona t strict cresc ator. pa sii algor itmulu i sunt: PAS1 . Se divizeaza vectonul v in doi subvectori, prin divizarea rnullimii indicilor [s,d] (unde 5 este indicele primului eleme nt iar d in diceIe ultimului element) in doua subrnultirni disjuncte , [s,m] ~ i [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 problema este rezol vata ;;i pozitia este rn: altfel , daca elementul din mijlocul vectorulu i este ma i mic decat valoarea x , atunci cautarea se face printre elementele cu indicii in mu ttimea [s ,m]; a ltfe l, cautarea se face printre elemen tele cu indicii din

III form a t ira


rnultirnea [m+1 ,d] . Pasul 2 se executa pana cane se can d vectorul nu rnai poate fi i rnpartit i n subvector i.
#include <i o s t z- ezim . h >
int v[lO Ol , 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;} v oid cauta {i n t s , i n t d , i n t &z )
g ase ~ te

49
elem entul sau pana

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.


v oid main { }

z) ; } }

t i nt i,z==O ; CQut " n ::: "; c i n n; cou t "x ::: " ; c i n x ; fo r ( i =l ; i <=n ; i T+ ) {c out "v [ " i " ] = " ; cin v [ i ] ;}
cauta ( l , n , z ) ; i f {z:::::::O} cout " n u cxi a t.a c Lemcn t.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 subprobleme, se calculeaza mijlocul intervalului de indici si 0(D(n))=0(1) . Deoa rece cauta rea se
face numai i ntr-unul din tre eei do i subveetor i (prob lem a ini1ial a se rezol va prin rezolvarea uneia dinlre cele doua subprobleme ) ~i a=1 , formul a recuren ta a l imp ului de executie este T(n )= T(n /Z)+0 (1). Considerarn ca n=Zk (k=l og2n). Rezu lta 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)= 1 092n x 0 (1). Ordinul de cornplexitate al algontmului este 0(log2n) .

Aplicarea algoritmuiui de cautare binara


Exe m plu Sa se de termine, cu a precizie de 4 zecimale, radacina reala , din interva lul [O .1 ~ J 3 ecuatiei x +x _ 1=O.

S-a identficat pentru aceasta ecuatie 0 radacina in mtervatul [0,1] ~ i ne propunem sa localizarn aceasta radacina, in limitele unei preciz ii de 4 zecima le, printr-o valoare x . Pentru cauta rea va lorii x se va folosi metoda bisectiei - care con sta in reduce rea interva lului de cau tare prin inju mata1irea repeta ta ~ i selec tarea subinterv alului in care se gase~ te radacina, lntervalul [s,d] este lm partit in doua subinl ervale, [s,m] ~i [m ,d], unde m= ( s +d) / 2. Cautarea radacinii se va face In subintervaluJ In care functia f( x ) ~ x 3 +x-1 isi schirnba semn ul, astf el: da ca f(s)'l(m)<O, atu nci cautarea continua i n intervalul [s.m ] . altlel, cautarea continua i n subintervalul [m,d ). Procesul recursiv este intrerupt cand se ajunge la intervalul [s,d] pentru care d-s <r , unde r este eroa rea acceptata pentru a precizie de 4 zecirnale ~ i 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> ca n s t fl oat ~=O.OO Ol; fl o a t f( f l o a t x l {return x rxrx.x -l; } vo i 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 ;} v o i d radacina( f l o a t s, f l o a 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 ls e

50

Tehnici de programarc

{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 ra d acina {m, d, z ) ; } } vo i d main ( ) {float z=O ; radaci na(O ,l , z ) ; c out " r a d a c i n a = " z e n d l ;

c out " f (x ) = " se t i o s f lag s( io s : : f i x e d)f (z); }


S8 caute , intr-un ~ir de numere intregi, in care mai lnta i S8 gasesc numere le pare !iii apoi numerele impare, pozitia in care S8 ga se~te , in 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 zec imale , 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 2 x -a=O , S8 va identifica int~ rva l u l in care S8 g as8:}te solutia ~i 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 radica lul de ordinul 3 din nurnarul a, cu 0 aproxirna tie de 4 zecimale.

1. Sa

\..tA. Sortarca rupida (QuickSort)


Prin aceasta metoda de sortare se executa urmatoarele operatli prin care sunt rearanjate elementele din cadrul vectorului :

X,
Pivotul

x,

x,

X;.,

X;

I X;. , I

I X, ., I

X,

Vectorul lnitial

-7 Primul element din vector, numit pivot. este mutat in cadrul vectorului pe pozitia pe
care trebuie sa se gaseasc a in vectorul sortat. -? Toate elementele mai rnici decat el vor fi mutate in vector in tata sa. -7 Toate elemen tele mai mari decat el vor fi mutate in vector dupa el.

I<:: X, I X,., I X, ., I
""V"

Su bvc ct o ru l d in stan qa pi votulu i (clemente mai mici dccat pivotul)

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 divide et impcra problema ini\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 subvectori, la randul lor, vor fi ~i ei rearaniati ~i imparli\; de pivot in doi subvectori etc.

I n fo rm at icii
PAS3.

51

Procesul de descompunere in subprobleme va continua pima cand , prin descompunerea vectorului in subvectori, S8 vor obtine vectori care con tin un singu r element.

Subprogramele specifice algo ril mului divide et impera vor avea urmatoarea sernniflcatie: -7 in s ubp rog ram uld i v i z e a z a ( ) S8 va rearanja vectorul ~i S8 va determina poziua pivotului xm . care va fi folosita pentru divizarea vectorului in doi subvectori: [xs Xm.1] ~i [Xm+1, xdl 7 Subprogramul combina ( ) nu mal este necesar, deoarece comb ina rea solutiilor S8 face prin rearanjarea elementelor in vector. in subprogramul di vi 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 pivotului (i se va incrementa) si j - pentru parcu rgerea vectorulu i de la sfarsitul lui catre pozitia pivotului (j se va decrem enta). Cei dol indici vor fi initializati cu capetele vectorului (d e 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 corespun zatoare lui i n vectorut sortat. Aceasta pozitie este i (sau j } ;;i va fi pozitia m de divizare a vectorului. in exemplele urmatoare sunt prezentate coua versiuni pentru subprogramul d i vi z eaza ( ) : Vers iunea 1 . Se folosesc variabilele logice: pi , pentru parcurgere a cu indicele i , ~i pj , pentru parcurgerea eu indicele j . Ele au valoarea: 1 - se pareurge vectorul cu acel indice, ~i a- nu se parcurge vect orul cu acel indice: cere doua valori sunt compleme ntare.
#inc l ude <i o s t r e am. h >

i nt x[lOOJ,n;
v o i d schimb( i n t &a , int &b ){int aux~a; v o i d divizeaza( i n t s, i n t d, i n t &m )
( i nt
i~s,j ~d,pi=O ,pj=l ;

a~b;

b~aux; }

1/ pivotu l fiind pe p o z i t ia whi l e ( i <j)


{if

5 ,

parcurgerea i n e e p e eu indice le j
scb i mb tp i
i

(x [ i ] > x [jj I

{ s c h i rnb (x [ i ] ,x[j]l;

pj j rj

.i e i ep i : j=j-pj ; } m=i; } vo id QuickSort ( i n t s, i n t d) {int m; i f (s<d) {d i v i z e a z a ( s , d , m} ; Quic 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 ++ ) {o ou t 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 n d l ; f o r ( i =l ; i <=n ; i ++ l cout' x [ i ] " "; }
Cei doi indict i ~i j sunt initializati cu extrerrutatne vectorului (i=1; j=5) ~i parcurgerea incepe cu indicele j (pi=O: pj=1) Se compe re pivotul (3) cu ultimul element (2). Deoarece pivotul este rna! mic , cele doua valori se interschimba. ~ i se scturnba ~i modul de parcurgere (pi=1; pj=O avanseaza indicele i ).

52
Se compara elementul din poz itia i (4) cu elementu l din pozi tia j (3). Deoarece 4 este rnai ma re deca f 3, cele doua va lori se interschimba . ~ i se schirnba ~ i modu l de parcu rgere (pi-D: pj=1 - avanseaza ind.cele j ). Se compara elemen tul din pozina i (3) eu elementul din pozitia j (5) . Deoa rece 3 este mai mic ceca t 5, cele doua valori nu se intersc bim ba. ~i se pastreaza modul de parcurgere (pl-O: pj=1 - avanseaza indicele j ).

Tc h u ici d e programarc
i
1

Cn=3 ~ 1T
i
1

J 4

s=J 4
4

j
3

I 2 I 3 I 1 I 5 I 4 I
ij
1

Se cornpara e!ement ul din pozitia i (3) eu elementul din pozitia j (1). 3 fiind mai mare decat 1, cele doua valori se interscrurnoa ~i se schimoa ~i modul de parcurqere (avanseaza indicele i ). Cei doi ind ia fiind egali , algo ritmul se termina .

I 2 I f I 3 I 5 I 4 I

Ve rsi unea 2 void divize aza( i n t s, i n t d , i n t &m) {in t pivot =x [s],i =s,j =d ;
wh i l e (i <j) {whil e ( x { i j <p i v o t )
i+ + ;

wh i le lx [ j j >p i vo t ) j - - ; i f t i c j } schimb (x [i ],x[j ] ); )


m~ i ; )

lnitial, cet doi indiei i ~i j sunt inii ializa1i eu extremitatile vec torul u i (i= 1, j=5) s! pivotul are valoa rea 3 Elementu Jd in poz itia i (3) nu este ma i mic decat pivotul: indicele i nu avanseaza (i= 1). Eleme ntul din pozitia j (2) nu est e mai mare decat pivotul. indice le j nu avansea za U=5). Valo rile di n pozitiile i ~i j se interschim ba. Eleme ntul d in poz itia i (2) es te ma i mic dec at pivotu l; indicele i avan seaza pan a la primu l element mai mare decat pivotu l (i=2). Elementul d in pcz ftia j (3) nu este ma i mare decat pivotuf. ind icel e j U=5) nu avansea za. Valorile d in pozttiile i si i se interschimba Elernentu l d in pozitia i (3) nu este ma l mic decal pivotul. indicele i nu avanse aza (i=2) . Elementul din poziua j (4) este mai mare c ecat pivotu! ind.cele j avanse aza pima ta pr imul element mai m ic decat pivotul 0=3). Valonle d in pozitiile i $~ j se interschirnba Elementu l din pozuia i (1 ) est e m al m ic oecat pivotul. indicele i avanseaza la primul elem ent 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.

I : q --1

34 5 ]=-3-c~!q

4- 1

Obs erv atie . i n ambe le cazur i algoritmu l continua cu divizare a vectoru lui i n subvecto rii eu mdicii [1,2] ~i [4,5] ~ i rearanjarea elementelor i n eei doi subveetori . Complexitatea algoritmului de sorta re rapida Pentru divizarea problemei in subprobleme se calcuteaza mijloeul intervalului de indiei ~ i 0 (D( n))~0(1 ) . Pentru comb inarea solutiilor se pareurg e vec torul cu ajut orul celor doi indici, de la primul elem ent pana la ultimul element, ~ i 0 (D(n))=0(n x0(1 ))=O(n) Timpul de executi e este T( n)~ 2xT( n/2)+n . k Considerand ca n=2 , rezulta :

Informatica T(n)=T( 2 '\+2 = 2x(T (2 )+ 2 ) +2 = 2xT(2 ) +2 +2 = .., = x-z k i, k k 2 k2 k2 k k k k 2 x2 x(T(2 )+ 2 ) +2 +2 = 2 x(T(2 )+ 2 ) +2 +2 +2 = kx2 = log2n xn . Ordinul de comp lexitate al algoritmulu i este 0(n xlog2n) .
k k k-1 k 1 k k-1 k k

53

1.4.5. Sortarea prin interclasare (McrgcSort)


Algoritmul de interclasare se executa pe doi vectori, ordonati du pa acelasi criteriu, pentru a obtine un al treile a vector, ca re sa contina elementele primilor doi vectori, ordonate dup a acelasi criteriu. Algoritmul de sortare prin interclasare S8 bazeaz a pe observatia ca orice vector care contine un singu r eleme nt este un vector sortat. Algoritmul de interctasare S8 poate foiosi pent ru sorta rea unui vector cu ajutoru l metod ei di vide et im pcra, asUel: PAS 1. Se des com pune problem a in subprob leme I __ I I i r-; sirnilare, prin lrnpartirea vectorului in doi subvec tori , avan d rnultime a indicilor [s ,m] ~i [m+1 ,d] , unde m este indice le din mijlocul intervalului: rn= (s +d) /2 . PAS2. Daca subv ectorul contine un singur element, atunei S8 consic era sortat (cores punde cazu lui de baz a) : altfe l, se continua des compunerea lui in subvectorii care au mult irnea indicilor [s ,m] si rnultirnea indicilor [m+1 ,d] . PAS3 . Se cornbin a solutiile celor doua subprobleme . prin intcrcla sarea celor doi vectori sorta ti, obtinandu -se un vec tor sort at. Vectorul care S8 sorteaza este K . Prin subprogramul interclaseaza () S8 realizeaza combinarea solutiilor prin interclasarea subvectorului x , care are multimea indicilo r [s,m] . cu subvectorul x , cafe are mult imea indicilor [m +1,d), in vecto rul auxiliar v . Vectorul v S8 copiaza in vectorul x , cafe are multirnea indicilor [s,d).
# inc lude < i o s t r e am . h > i nt x l l OO] ,n ; vo id d.l v Lz e az a t Ln t; s , i n t d , i n t &m) {m= ( s +d ) / 7. ;} vo i d inte rc laseaza f i n t s, i n t d , i n t m) lint i =s , j=m+l, k =l ,v [ lOO] ;

while

(i< ~ m

&& j <=d )

l i f 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] whd L e (i<=m) { v [ k ] = x { i ] ; iH ; k ++ ; }


e ls e whi le (j< ;:;d) s, i n t {v {k ] = x [ j l; d)
j++ ;

k ++ ; }

for (k= l , i=s ; i <= d ; k ++ , i ++ )


void MergeSort ( i n t {int m ;

x [ i l ~ v l k j; }

if ( s <d ) {d i v i z e a z a {s , d , m) ;
HergeSor t (5, m) ; HergeSo rt (m+l, d );

irltcrc]ascaz a{ s ,d ,m); } }

54

Tc hnici de programarc

v o i d main ( ) tint 'i : c o u e c cv n e " ; c i n n ; fo r (i =l ; i <=n ; i + + J { CQu t "x [ " i " J= ";c i n xl iJ ; }
MergeSort ( 1 , n ) ;

cou t "v e c t o ru l s ortat " e n d l ; f o r ( 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 comb inarea soluti ilo r se executa interclasarea a doi vec tori ~i O(O(n))=O(n) . Timpul de exe cutie k este T(n)= 2xT( n/2)+n . Ccnsiderand ca n= 2 , rezulta : T(n )=T( 2 1+2 = 2x(T(2 )+ 2 ) +2 = 2xT(2 ) +2 +2 = ... = 1<'-2 k. t. k k 2 k2 k-2 k k k k 2x2 x (T(2 )+ 2 ) +2 +2 = 2 x(T(2 )+ 2 ) +2 +2 +2 = k x2 = 1 09 2n xn. Ordinul de comp lexitate al algoritmului este 0(n xI092n). Observatie. in cornparatie cu algoritmii de sortare prin metoda selectiei directe si prin metoda bulelor, care au ordinul de complexi tate O(n \ algoritmii de sortare care folosesc strategia divide et impera sunt mai eficienti .
1. Sa S8 rearan jeze elementele unui vector astfel incat in vector sa S8 gaseasca mai Intai numere le impare ~i apoi numerele pare. Se vor realiza doua versiuni ale programului, cate una pentru fiecare metoda de sortare care toloseste strategi a divid e et imp era . 2. intr-un fisier text sunt scrise urrnatoar ele informatii: pe primul rand nurnaru l de elevi din class - n , iar pe urrnatoarele n randuri urm atoarele tnformatii despre un elev: nurnele, prenume le .!iii mediile semestriale la disciplina informatica. in cadrul unui rand da teIe sunt separate prin spatiu . Sa se scrie un program care sa realizeze urrn atoarele cerinte, Fiecare ce rinta va fi rezolvata printr-un subproqrarn. Ordonarea elementelo r vectorului ~ i cautarea unu i elev in vector se vor face falosind algaritmii cei mai eficienti.
k k k 1 k1 k k-1 k k

a. Se citesc date le din fisie rul text ~ i se calculeaz a media anuala a fiecarui elev. b. Se rearanjeaza datele i n ordinea alfabetica a numel ui ~i prenu melui 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 pre lucrarilor intr-un alt fisier text.

1.4.6. Problema turnurilor din Hanoi


Pe trei tije notate cu A , B ~ i C se pot mo nta discuri perf orate de dile rite dirnensiuni, lnitial pe tija A (tija surs a) sunt asezate unele peste altele n diseuri in ordinea descrescatoare a diametrelor, iar cel elalte tije sunt goaIe. Sa se afisez e toate rnutarile care trebuie lac ute ca discurile de pe tija A sa fie aranjate pe tija B (tija de stinatie) in aceeasi ord ine in care erau pe tija A , l olosind tija C ca tija de manevra. 0 mutare nu se poate lace decat cu un disc si el nu poat e II asezat pe 0 tija decat peste un disc cu diametrul mai mar e. Sa analizam ~ Se ~ Se ~ Se ~ Se ~ Se ~ Se ~ Se mutarile care trebuie lacute pentru n= 3: rnuta discu l de pe tija A pe tija B (1). rnuta discul de pe tija A pe tija C (2). rnuta discul de pe tija B pe tija C (3). rnuta discul de pe tija A pe tija B (4). muta discul de pe tija C pe tija A (5). rnuta discul de pe tija C pe tija B (6) . rnuta discul de pe tija A pe tija B (7).

III fnrrn n licu


B

55

c>
3
2
...... :

~ c:L~_-J 6
A

. _ ._ _Mi'

,~ ~ ~ I
c

cI

r-L

3=J

II

ir ~ q~ ~
6
C 6

\- 1 -

,~

la ell edo . diseurij>(lij5' . .....di>!!!lnalie


~~

...

I -L

Folosind metoda divide el impe ra problema initiala va fi descornpusa in subprobleme astfel: PAS1. Se mul a primele n -1 diseuri de pe tiia sursa pe l iia de rnanevra. PAS2. Se mula diseul eu diametrul eel rnai mare de pe tija sursa pe liia destinatie. PAS3. Se mula eele n-1 discu ri de pe tiia de rnanevra pe Iiia destinatie.
# inclu de < i o s t r e arn . h > vo i d hanoi ( i n t n , c h a r a , c h a r b , c har c ) {if (ne e L) cout " t1u t a r e a : " <c a -c cv -o- vc cb-cc e nd.L : el se {han oi (n - l , a , c , b ) ; cou t ;c "tdu t a r ee : " a " - >" b< <e n d ! ; hano i (n - l , c , b , a ) ;)} v oid ma i n() {int n ; char a='A' ,b='B' .c = ' C'; c out " n = " ; cin n ; hano i< n , a , b , c ) ; }

56

Tc hnici de program arc

1. Sa se determine nurnarul de partit ii distincte ale 4 unui nurnar natural n . tn dicati e. Se descompune ~'4 3+1 2+2 numarul n in dOU3 numere 01 si " 2, dupa care ~ fiecare nurnar nou obtinut S 8 descom pune in alte 1 doua num ere. Proce sul de descompunere continu a pima cand "1 <n 2. 1 1 Nurnarul de partitii este ega1cu nurn arul de des compu neri obtinu te. 2. intr-un parc cu 0 suprafata dreptu nghiulara care are coordo natele coltului din stanqa sus (X, .Y ,) ~i ale coltului din dreap ta jos (X2,Y2) se gasesc n copaci. Poz itia 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 . lnd ica tie . Considerand ca un capac i imparte dreptunghiul initial in patru drept unghiu ri cu laturile paralele cu dreptunghiul initial, problema se descompune i n patru subpro bleme , 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 ajunqe atunci cane dreptung hiul nu contme nici un capac. Pentru fiecare dreptunghi care nu confine nici un cap ac se calculeaza aria ~i se mernoreaza caordo natele 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 repeta t vecto rul, pana cand ramane un singur element , ~i sa se afiseze valoarea acestui element. Pli erea unui v ecto r Insearnna suprapunere a 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 vectoru l {1 ,2,3.4.5.6.7}. considerand prima jurnatate ca fiind cea receptoare, vectorul obtin ut dupa prima pliere este {5.6.7}

1.4.7. Gencrarea modclclor fractale


Modelele fractale sunt mode le mat emati ce care descriu fc no me ne sau obie cte care au 0 structura perio dica . 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 ord inul c urboi . Un exemplu ciasic este forma geometrica cunoscuta sub numele de curba lui Kocl] care se qenereaza astlel: PAS1 . Se porneste de la nu cl eul care este un triunghi ec hilate ral , cu latura avand lungimea finita L. PAS2. Fiecare latu ra 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 fiec are iteratie se repeta Pasul 2. pentru fiecare segment al figurii obtin ute.

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 poligonului va fi p x(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: X2=X1 + Lxcos(a) Y2=Y 1+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) .

,1

L ,X 2 , Y 2

Desenarea poligonului lnsearnna desenarea fiecarei laturi , care este determinata de coordonatele X1 ;;i Y1, lungimea segmen tului L ;;i unghiul a. Problema se reduce la generarea datelor care caracterizeaza fiecare latura ;;i la desenarea unei linii folosind aeeste date. Generarea laturilor poligonului este un proces recursiv i n care initiatorul care are lungimea L este inlocuit cu generatoru!. Generatoru l este format din patru segmente, fiecare segment avand lungimea L/3. Acest proces poate fi descompus in patru procese . Folosind metoda di vid e et impera pentru a genera curba lui Koch de ordinul n , problema ini\iala va fi descompusa T n 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 stanga (subprogramul stanga ( ). Ei devine initiatorul curbei lui Koch de ordinul n-1 . 0 PAS3. Se qenereaza al treilea segment, prin rotirea segmentului obtinut cu 120 spre dreapta (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 se va desena (subprogramu l deseneaza ( i) .
S8

obtine initiatorul, care

Pentru desenarea pol igonului, se construieste nucleu l (se genereaza cele trei laturi ale triunghiului echitateral de lung ime L) si pentru fiecare latura se construieste curba lui Koch de ordinul n (subprogramul n u cle u _ Ko c h () . # inc l ude <.i o s Lr e a m. h > # inc lude <mut h.h> # include< gruphi c s. h> int x, y; fl o a t a lf a ; v o id s r.e n o e ( f l o a t u nq h i ) {a l [<:1-1 <uraqh i. -J.: t,CP I I 18 0 . ; }

58
voi d dre~p ta( f l o a t unghi) ( a l f a - =u ng h i'M_ PI / 18 0 . ; ) v oid de seneaza( f l o a t L )

Tehnici de programare

{x l =x; y l =y; x +=( i n t) (L * c o s(alfal; y+=( i n t) (L* s i n( a lfal ; line i x , y , x l , y l ) ; }

v o i d Koch (i n t D , float L) {if (n==O) dc sonoaa a t t. j else ( Koch (n - l , L / 3 ) ; stang a(60) ; Ko ch (n - l , L / 3 ) ; d reapta(120) ; Koc h ( n - l , L / 3 ) ; stanga(60); Koc h (n - l , : ,I3 ) ; }} vo i d nu c l eu_Ko ch ( i n t (1 , float L) (Ko c h (n , L ) ; d r eapLa(120) ; Koch (n , L I; dr eap ta (1 20) ; Koch (n , L I ; dreapta(120 ) ; } v o i d main ( )
{int n.L;

CQu t "n = " ; cin n ; cout "L= " ; cin L ; nucleu_ Ko ch (n . L l ; }


1. Desenati praful lui Cantor, care este generat astfel : un segment de lungime a L, care este paralel cu axa Ox , este Irnpartit in cinci segmente egale, din care se elimina segmentul din mijoc - ~ i se repeta aces t proces de n ori pentru fiecare segment rarnas. 2. Desenati curba lu i Koch , definita prin urrnatoarele trei elemente , i n care fiecare segm ent al generatorului are lungimea L/4 , unde L este lungimea segme ntului initiator.

nucleu generator (n =1) 3. Desenat i c urba dragonului , definite prin urmatoarele trei eJemente, in care fiecare segment al generatorului are lungimea Usqrt(2), unde L este lungimea segmentului initiator.

initiator (n=O)

initiator (n=O)

<:
generator (n =1)

curba de ordinul n= 2

u- D
nucleu

4.

se deseneze figura geometrica obtinuta astfel : se deseneaza un patrat cu latura L, se deseneaza un patrat care uneste mijloacele laturilor patratulu i initial ~ i se repeta acest proces de n ori pentru fiecare patrat obtinut. 5. Sa se deseneze covoru l lui Si erpin s ki , astfel : se deseneaza un patrat cu latura L, S8 i mparte acest patrat i n 9 patr ate egale , se hasureaza patra tul din mijloc si se repeta acest proces de n ori pentru fiec are patrat neh asurat.

Sa

In fo rm a l ieu

59

I. 5. Metoda greedy
1.5.1. Dcscricrea mctodei greedy
Metoda greedy se poate folosi pentru problemele in care, dandu-se a multi me finita A trebuie deterrninata a multime ScA care sa in deplineasca anumite conditi;'Metoda furnizeaza a sinqura solutio reprezentata prin elemen tele rnultirnii S. Ca ~i in cazul metodei backtracking, solutia problemei este data de un vecl or S = {X" X2, .. ., xn} ale caru i element e apartin Insa unei singure multim i A . Spre deoseb ire de metoda backtracking , metoda Greedy nu gaS8!?te decal 0 sinqura solutie si, i n general, aceasta solutie este solutia optima.

I StumllJl. de C!llZ I
Scop ident ificarea problemelo r in care solutia optima este a s ubm ultirne inclusa i nt r-o multim e data, care trebuie sa i ndeplineasca anum ite conditii,

Enuntul problemei 1: Sa se repartizeze optim 0 res ursa (de exemp/u, a sa/a de spe ctacole, a set de contetinte, a sa/a de sport) mai multor activita!i (spectacole, ptezentiui de produse, respectiv me ciuri) care Gancuraaza pe ntru a ouine resursa respective.
Mul\imea A este forrn ata din cele n activitati. Fiecare activitate i (1'; i,; n) are un limp de incepere t i ~i un t imp de terminare ti l unde t i < f j ~ i ocupa resursa in interval ul de limp [1;,1;]. Dou a activit ati i si j sunt camp atibile da ca interv alele lor de acupare [1;,1;] si [lj.fj] sunt disjuncte, adica daca I; ,; ~ sau daca Ij '; I;. Cerinta problemei este de a selecta a multime rnaxirnala de activitati campatibile. in acest caz, rnultirnea S este fermata din activitatile care vor folos i resursa, iar conditia pe care trebuie sa 0 Indeplineasca elementele rnultirnii S este ca ele sa fie act ivitati comp atibile. in plus , pentru ca repart izarea resursei sa fie optima, tre buie ca mu ltimea S sa cant ina maximul de elemente car e i nde plinesc aceasta conditie . Enuntu l prob lemei 2: Sa se ocupe optim un mijloc de transport (de exemp lu, UIJ rucsac, lin auto cam ion) care are a capacitate maxima de ocupare (ca re poale Iran sporta a grell/ate maxima G) Cll n obiec te, fieeare obiec t avand qreutete e 9 j i lin profit obtinut in urma transport ului ct. ier din fiecare objec t plltand sa se ia a ttectiune XjE[G, IJ . Mul\imea A este fermata din cele n obiecte . Fiecare obiect i (t s isn) are a efic ienta a tr an sportu lu i e; care reprezinta profitul pentru a unitatea de greutate. Ce rinta prob lemei este de a selecta a rnultirne de obiecte astlel inca t eficienta transportului sa fie maxi ma Mul\imea S este ferm ata din obiectele care vor ocupa mijlocul de transport, iar conditia pe care trebuie sa o Indeplineasca elementele multirnii S este ca, prin contributia adusa de fiecare obiect la eficienta transportului , sa se obtina 0 eficienta maxima, iar greutatea obiectelor selectate sa fie eqa la cu greutat ea maxima a transportulu i.

Enuntul prob lem ei 3: Pentru aou tnuttkn! de numere intregi nonute : C cu n e/emente, C = lci.c: .. ., cn} i A cu m eiem ente , A = {a l,a 2, ... , arnJ, i nsm, sa se sele eteze a submuttime de n num ere din tnununee A. astfel inca t expresie : E = C1 x x 1 + C2 x X2 + ... + Cn x Xn in care xj EA , sa aiba valoarea maxima .
. . . , x- }, i n car e x.eA. trebuie sa i ndeplin easca conditia: E = C1 x x 1 + C2 x X2 + ... + c n x xn = E max Criteriul de alegere a elementel or Xi este urrnatorul: daca in rnultimea A ma i exista eleme nte care au acelasi sem n cu coeficientul c i, se va alege elementu l aj pentru care termenul Cj x Xj

in acest caz , multirnea S = {X 1 ,X2,

60

Teh nici d e programarc

mu ltim ea A nu mai exista elemente care au acelasi semn cu coeficientul

are valoarea maxima (deoarece acest termen S8 aduna fa valoarea expresiei), iar daca in Ci, S8 va alege elementul aj pentru care termenu! C j x Xj are valoarea mini ma (deoarece acest termen S8 scade din valoarea exp res iei) ,

Enu ntul problem ci 4: Sa S8 plateasc a 0 suma 5 cu un numar minim de bancnote cu valori date . Se consk i ers cil din fiecare tip de bencnote 58 paate totosi un numar nelimitat de boncnote , iar pentru ca problema sa aiNi solutie, varn considera ca exist i bancnote ell veioeree 1.

Multirnea A este fermata din cete n valori distincte ale bancnotelo r. Cerinta prob lemei este de a selecta 0 multirne minima de bancnote pentru plata sumei s. in acest caz , rnultirnea S este torrnata din valorile cu care se va face plata, iar con ditia pe care trebu ie sa 0 indephneasca elementele rnu ltirnii S este ca, prin adunarea sumelor partiale platite cu bancnotele cu valorile alese , sa se obt ina suma de plata s. Pentru ca nurnarul de _ bancnote sa fie cat rnai mic, trebuie sa se caute ca plata sa se faca in bancnote CU <l t> valori cat rna i mario Meto da greedy co ns t ruiosto solutia prin se lectarea, di nt r-a m ul time de elem ente, a elementelor care indepli nesc 0 an urnita conditio. Pentru ca clementele care s e se lecteaza sa apart ina solutiei optime , la pasul k s e alege candidatul optim pentru elementul Xk al s o luti ei. Spre deaseblre de metoda backt racking , la met oda greedy, alegerea elementului solutiei este l revoca bi la (nu se mai paate reveni asupra alegerii Iacute).
Xk

al

Metoda greedy paate duce la obtinerea solutiei optirne i n cazul problemelar care au proprictatca de optim local , adica solutia optima a problemei cu dimensiunea n a date lor de intrare co nti no solut ii!e optime ale sub problemelo r similare cu problema initiala, dar de dim ensiune mai mica. Metoda greedy se mai nurn este ~i metoda optimului local . Pas!l algo ritm ului gre ed y s unt: PA51 . Se init ianzeaza rnult imea S cu multtrnea vida: 5 +-0 . PAS2, Cat t imp S nu este solutie a prob lemel 'Ii A ,.0 , exe c uta : : PAS3 . Se alege din rnultimea A elementul a care este candi datul optim al solutiei. : PAS4, Se elirnina elementul a din multirnea A. : PAS5. Dac a el poate fi eleme nt al solutiei , atun ci elementul a se adauqa la : multimea S. Se revine la Pasul 2. PAS6 , Dace multimea S este solu tla problemei , at unc i se afiseaza solutia: altfe l, se afis eaza mesajul "Nu s-a gasit sotutie" Algaritmul greedy este un algoritm iterativ , care determina solutla optima a problemei in urma unor succesiuni de alegeri care reduc dimensiunea problemei respective: se alege elemen tul x, al solutiei, apo i element ul x, al solutiei , s.a.m.d. Altfel spus , elementul X k al so lutie i este determinat prin alegerea, din elementele rarnase in rnu ttirne a A, a candidatului opt irn pentru elementul x , al solutiei, iar determinarea urmatoarel e n -k elemente ale solu tiei (rezalvarea subprobleme i) se face numai dupa ce a fast determinat elem entul Xk al sotutiei. Alegerea tacuta pentru elementul x, al solutiei paate depinde de alegerile facute pentru determinarea pr irnelor k-1 elemente ale sol utiei , dar nu depinde de alegerile ulterioare. Pentru ca alga ritmul greedy sa conduce la obtinerea solutiei aptime, trebu ie sa fie i ndeplinite doua cond itii:

I n for mat icii

61

1. Alegerea op tirnulu i local pentru fiecare element al solutie i duce la alegerea solutiei optime globa le. 2. Solutia optima a prob leme i contin e solutiile optirne ale subproblemelor. Aceas ta lnseamna ca , pen tru a fi siquri ca algoritmul greedy con struieste solutia opt ima a problemei , trebuie sa S8 demonstreze ca sunt i ndeplinite cele doua conditii .

i n rezolvarea multor probleme folosind strategia greedy , pentru a alege optimul local care sa duca la alegerea solutiei opt ime globa le, rnu ltim ea A es te o rd onata d u pa c rite riu l ca nd idat ului opt im. Ordonarea multimii dupa criteriul candi datului optim inseamna rearanjarea elementelor rnultim ii A astfe l lncat, dupa extragerea un ui element, urrnatorul element din multimea A sa reprezinte elementul care este eel mai indreptatit sa fie ales ca elemen t al multimi i S. De exemplu: ~ In cazu l re part lzarii o ptime a unei res urse , 0 act ivitate nu poate Incepe cecat daca se term ina cea anterioara. A repartiza optirn resursa i nsearnna a or ganiza cat mai mu lte act.vitati. Din multirnea activitatilor se alege Tntotdeauna activitatea care are tirnpu l de terminare ca t mai mic . in acest caz , candidatu l optim este activ itatea care are timpu l de termi nare cel mai mic , iar ordonarea activitatito r dupa criteriul eand idatulu i optim inseamn a ordonarea crescatcare dupa timpul de termin are. -7 in cazul o cuparil o ptima a mi jl oeulu i de tr a ns p o rt , trebuie ea eficienta transportului sa fie max ima. Din mu ltimea obiectelor, se aleg obieetele care au eficienta de tra nsport cat mai mare . i n acest caz . cand idatul optim este obiectul care are eflcien ta transportului cea mai mare , iar ordonarea obiectelor cup a crite riul can didatului opt im lnsearnna ordonarea descrescatoare dupa eficienta transportu lui. -7 in cazul pla l ii un e i s ume eu un nu mar min im de banenotc ell va loarc da ta, ca sa se Ioloseasca cat ma i putine bancnote, trebuie ea plata sa se faca i n cat ma i multe bancnote eu valcare foarte mare. in aces t caz . candidatul optim este bancnota cu va loarea cea mai mare , iar ordonarea dupa criteriul candid atului optim Inseamna ordonarea descrescatoare dupa valoa rea bancnotelor .

1.5.2. Implementarea metodei greedy


Pentru impleme ntarea metodei greedy se vor folo si doua subprogram e: -) sub programu l sort () - care ordoneaza rnultimea A dupa crite riul can d idatului op tim: -7 subprogramu l greedy ( ) - care imp lem enteaz a metoda propriu-zisa . i n exemple le urrnatoa re , date Ie de intrare vor fi citite dintr -u n fisier text.

Exemplul 1. Prob lema planificarii oplime a activitatilor. Se folosesc urrnatoare'e date si structuri de date: -7 Pen tru nurn arul de elemente ale celo r doua rnultirni se folos esc var ia bilele n - numarul de activitati (nu rnarul de elemente ale multimii A) ~i m - nurnarul de activitati selectate pent ru a form a solutia prob lemei (nurnarul de elemente ale multirnii S). -7 Pentru mult irnea activitatilor (rnultlrnea A) se foloseste vec torul a , ale carui elemente sunt de tip i nregistrare activitate - ca re contine trei campu ri. x ~ i y pentru era la car e i nce pe 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 Solutia (multirnea S) va fi rnernorata In vectoru l s . i n fiec are element al vecto rului s se me moreaza ind icele elementului selecta t din vectorul a . oupa ce a fost sortat dup a criteriul candidatului optim.
Se folosesc urrnatoarete subprograme :

62

Tc hn ici d e p rogram arc


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 citirea din fisier. in urma executiei acestui subprog ram , S8 creeaza vec torul activitatilor - a . SUbprogramul sort ( ) - sorteaza vectorul a crescator oup a timpul de terminare a activitatilor (carnput y ). Subproqrarnul g r e e d y ( ) - implementeaza strategia gree dy pentru aceasta problema. Subprog ramu l a fis ea za ( ) - afiseaza solutia problemei lolosind inform atiile din vectorul s - indicele fiecarei activitati selectate.

~ Subprogramul citest e () - pentru citirea date lor din fisierul text. in fisierul text, pe

~ ~
~

Strategia g reedy este irnplernentata astfel: PAS1 . Se irutializeaz a vectorul s cu indicele primului eleme nt din vectorul a (se selecteaza , ca prima activitate , activitatea care are ora de terminar e cea ma i mica). PAS2 , Pen tru urmatoarele n-1 elemente ale vectorului a, executa PAS3 . Daca ora la care i ncepe activitatea din elementul curent al vectorului a este mai mare sau eqala cu ora la care se terrnina ultima activitate adaugal a la solutie (i n vectorul s), atunci activitatea este adauqata la solutie.
Mullimea activltatllor Acti vitat ea Or a de incepere Ora de te rminare

1
9 11

2
12 13

3
8 10

4
10 12

5
16 18

6
14 16

7
20 22

8
19 21
~-

Mu1limea activitatilor ~ a ce a fast sortata Acti vi t atea Ora de incepe re


Ora de termi nare

3 8 10

1 9 11

4 10 12

2 12 13

6 14 16

5
16 18

19 ~ 22 21

So lu tia problemei Ac tivitatea Ora de in cepere


Ora de terminare

3 8 10

4 10 12

2 12 13

6 14 16

5
16 18

8
19 21

Pr ogramul este: #i nclude < [ s t r e a m . h > st ruc t a c ti v i t a t e {int x, y , ki }i activitat e a[ 20j ; int n ,m , s[201 ; fstream f ( g r e e dyl. t x t" , ios: : in ) ; vo id cites te() {int i ; f n; fo r l i :::; l ; i < =n ; i + I' ) { f a [ i J . x a [ i j .y ; a l i ] . k :::; i ;} void so rt ( ) {i nt i ,j ; act i vitdte au x ; for (j:::;l ;i<n ;i++) f or ( j:::;ill; j < ::n; j I I)
II

f. c l o s e () ; }

i f (a [i ] . y > a [ i ] . y ) { a u x =a [ i ] ; a[ i] = a[ i] ; a l j l e aux j j j

Informatica
void greedy ( ) l i n t i, j ; 3 [ 1] = 1 ; if m=j ; )

63
j
e

L: ( j ++;

for {i =2 ; i< =n ; i+ +}
la [ i].x> =a [s [ j] ] .y)

s lj le t

i j

vo id c f i s eaz c ( ) {cou t.c c " Plan i fic a r ea acti vi t a r i j.or- : " e n d l ; for (i n t i =l;i< =m;i ++ ) cout" Ac t i vi t a t e a ''c a [s[ i]] . k" 'i n c ep e la ora " ; couti c c a I s L'i l j x <c" s i se termina l a o r a " a [ s [ i ] ] . yendl ;}
c

void main( )

{ci t e s t e ( ) ; sart() ; greedy( ) ; af i sea z a () ; }

------.--..

i ntr-o sala de spectacole trebuie planificate n spectacole care au lee In aceeasi zi, fiecare spectacol avand 0 ora la care trebuie sa tnceapa ~i 0 durata de desfasurare. Scrieti un program care sa planifice optim OCUw parea salii de spectacol e.

Exemptul 2. Problema ocuparil optime a mijlocu lui de transport (problema rucsacului ). Se folosesc urrnatoarele date si structuri de date: -7 Pentru nurnarul de elemente ale celor Mul!imea obiectelor - G=20 doua rnultirni se folosesc variabilele nOb iectul 1 2 3 4 5 nurnarul de obiecte (nurnarul de element e 5 4 4 8 10 ale multirnii A) ~i m - numarul de obiecte Greutatea selectate pentru a forma sotutia problemei Profitul 10 20 10 10 22 (nurnarul de elemente ale multimii S). Eficl t ~ P . _ ' IClen a 2 5 2,5 1,25 2,2 ~ entru greutatea maxima care S8 poate ' transporta, S8 Ioloseste variabila G, iar Mul~imea obiectelor dupa ce a fast sortata pentru greutatea obiectelor care se mai pot Obiectul 2 3 5 1 4 selecta, se foloseste varlabila Gr (greutaGreutatea 4 10 5 8 4 tea rarnasa). Variabila Gr este initiatizata 20 10 22 10 10 cu valoarea G (initial, greutatea obiectelor Profitul care se pot selecta este greutatea maxima Eficie nt a 5 2,5 2,2 2 1,25 de transport), iar dupa ce s-a construit ' Solutia problemei solutia, variabila Gr are valoarea 0 (nu se mai pot selecta obiecte, deoarece a fost ObJectu l - - 1 ocupata toata capacitatea de transport). Gr eutatea 4 4 10 5 8 -7 Pentru multirnea obiectelor rA) se folo. 1 1 1 0,2 0 seste vectorul a t ale carui elemente sunt Fractiunea 2 0 de tip inreqistrare obi e ct , care contine Greutatea 4 4 10 patru carnpun: g - greutatea obiectului, c - profitul obtinut In urma transportului. e - eficienta transpartului ~i k - nurnarul obiectu lui (este folosit ca un identificator al obiectul ui) -7 Solutia (rnultirnea S) va fi rnemorata 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 In 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

Tch n ici de programa r c

Se folosesc urmatoa rele subprograme : ~ Subprogramul citeste ( ) - pentru citirea datelo r din fisierul text in fisierul text. pe primul rand este scris nurnarul de obiecte n ~ i greutatea maxima a transportul ui G, iar pe urrnatoarele n randuri - pere chi de numere rea le, sepa rate prin spatiu, care reprez inta greutatea si profitul tran sportu lui un ui obiect. Fiecarui obiect i S 8 atribuie, ca identificator , nurnarul de ordine de la citirea din fisier. Pentru fiecare object S 8 catculeaza eficien ta tran sportului. In urma exec utiei acestui subprogram S 8 creeaza vectorul obiectelor , a. -7 Subprogramu l sort () - sorteaza vectorul a , crescato r dupa eficienta transportului obiectelor (carnpul e ). ~ Subprogramul greedy ( ) - impleme ntea za strategia greedy pentru ace asta problema . -7 Subprogramul afiseaza () - afiseaza solutia problemei folosind info rrnatiile din vectorii s si x - indicele fiec arui obiect setecta t ~i fractiunea din greutate ca re se va transporta. Strategia g reedy este irnple rnen tata astfel: PAS1. Se initializeaza greutatea Gr cu valo area G !?i selectare a ob iec telo r in cepe cu obiect ul cu ce a ma i ma re eficie nta a transpo rtului (pri mul obiec t din vectorul a). PAS2. Ca t timp rnai exista obiecte care nu au fost selectate ~ i greutatea obiecte lor selec tate nu este greutatea maxim a, executa PAS3 . Dac a greuta tea obiectului din elementu l curent al vec tor ului a este mai mica sau eq ala cu greutatea ramasa, Gr , atunc i obiect ul este adauqat la solutie, lua ndu-se intreaga cant itate dispo nibila din obiect : altfel , S8 ia din obiect fractiunea eqa la cu greut atea rarnasa Gr . Se actualizeaza greutatea Gr dirninuand-o cu greutatea obiectului care a fast adauqat in rucsac. Programul este: #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 o a t G.G r. xI20) ; fstream f ("grccdy2 . LXL", i os: :in ) ; void citeste ( l {int. i; f n G; fo r ( i l;i<=n ; i ++ l {f o l i ] .g a l i J . c : a l i ] . k - i ; a[i ] . c e a l i l .c /a [i J . g; } f . c l o s e (); } v o id o o r t. ( ) {in t i ,j ; o b i e c L a ux; for (i =l ;i<n ;i , +) for ( j ~i + l; j < ~rl; j + +) i f (ali] . c c a l i l . e l t au x va l i j : a l i.L va l jj : a l j l e a u x r L) v o i d gree dy ( ) {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 : G r~;:: a[i] .g ; } else { j ~ + ; S[~l~~; x [ j ] =Gr ali] .g ; Gr=O ; }
m =J; }

void a Li s ea z a () {for ( i n t i=l;i< =m;i ++)

Iufurrnat icu
{c out "Ob i e c t u l ''c a l s l i l I . k c c" i n c a n t i t .at ea coutx [ i J * a [ s [1 J J . g< <endl; } } v o i d main ( ) {c i t e s t e ( ) ; so rt () ; gre e dy( }; afi seaza{ ); }
Observa tie. In problema rucsacului exista doua situatii: 1. Obiectele pot fi fractionate - problema continu a a rucsacu lui; 2. Obiectele nu pot fi fractionate - pr obl em a discreta a rucsa cului.

65

Algoritmul greedy furn izeaza s olutia op tima numai in caz ul probl emei continue a ru csac ul ui . De exemplu , pentru patru obiecte: a (20 kg , 110 lei), b (9 kg , 4 5 lei), c (9 kg, 45 lei) 'ii d (6 kg , 30 lei) 'i i greutatea maxima de transport 25 kg ' -7 Solutia greedy: obiectu l a - profitul transpo rtului = 110; -7 Solutia optima: obiectele b , c 'ii d - profitul transportulu i = 120.
------.,.--..... intr-un rucsac S8 pot transporta maximum G kg. Exista n obiecte , fiecare obie ct avand greutatea g; 'ii valoarea Vi. Obiectele pot fi fractionate . Scrieti un program care sa gaseasca obiec tele care trebuie trans portate in rucsac , astfel inc S8 obtina cea mai valoroasa incarcatura .

atsa

Excmplul 3. Problema expresiei de va loarc 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 calc ula rea valori i expresiei se foloseste variabila exp , car e este init ializata cu va/oare a 0 (este va riabila qlobala) , iar pentru a nurnara elementele selec tate din mult imea A se foloseste variab ila k . care este initializata cu valoa rea O. Se folosesc urmatcarele subprograme : -1- Subprogramul c i te ste ( ) - pentru citirea date lor din fisierul text. i n fisierul text, pe primul rand sunt scrise doua numere intregi , n si In, ca re rep rezinta nurnarul de elemente ale celor doua rnultimi , pe rand ul al doilea ce i n coeflcienti, iar pe randul al treilea cele m numere intregi din rnultirnea A . Valorile numerice de pe un ran d sunt separate prin spatiu . in urma executiei acestui subprogram se creea za vec torii C si a . -1- Subprogramul so rt ( ) - se foloseste pentru a sorta crescato r cei doi vectori c ~ i a. -7 Subprog ramu l gre edy ( ) - implernenteaza strategia greed y pentru aceasta prob lema si afiseaza solutia in timp ce 0 cons truieste . Strategia g reedy este irnplernentata astfel : PAS1 . Se calculeaza termeni i pentru care valorile coeficientului c s si ale nurnarului aj sunt pozitive. Pentru ca expresia sa fie maxima , parcurgerea celor doi vectori se face de la ultimul elemen t catre primul element (de la cele mai mari nume re pozitive, catre cele mai mici numere pozitive). Se rncmorea za, in variabila p , indicele elementu !ui din vectorul C care urma sa fie selectat la terminarea parcurgerii, lar i n variabila r - indicele elementului din vectorul a care urma sa fie selectat fa terminare a parcurgerii. PAS2. Se ca lculeaza termen ii pentru care valorile coeficientutu i c i si ale nurnarului a j sunt negative. Pentru ca expresia sa fie maxi ma, parcurgerea celo r doi vectori se face de la primu l eleme nt catre ultirnul element (de la cele mai rnari numere negative, catre ce le mai rnici numere nega tive).

66

Tchnici de programarc

PAS3 . Coeficient ii ramas i pot fi numai pozitivi n=5 ~i m=7 -> Emax = 97 sau numai negat ivi. in cazul in care sunt lndlc i 1 2 3 4 5 6 numa i negativi, in rnultirnea A au rarnas -2 4 5 Cj -1 3 numai nume re pozitive. Termenii care S8 catcuteaza fiind negativi, pentru ca 5 -5 -4 -1 2 7 expresia sa fie maxima vor trebui sa aiba -5 -4 5 7 Sj valoarea cat m ai mica ~i vector ii S8 vor n=6 ~i m= 7 -> Em x = 77 parcurge in continuare , catre ultimul 2 3 4 5 6 element (coeficlentii sunt numere negati- Ind ici 1 ve din ce i n ce mai mici, iar numerele din C, -5 -4 -3 -1 4 5 vectorul a sunt numere pozitive din ce in a, 4 2 3 -5 -4 1 ce mai mari). in cazul i n care coeficientii -5 -4 4 6 1 2 Sj rarnasi sun t numai pozi tivi, in multirn ea A au rarnas numai numere negative. n=6 si m=7 -> Emax = 21 Termen ii care S 8 calculeaza fiind nega- lndi cl 1 2 3 4 5 6 tivi, pentru ca expresia sa fie maxima vor -2 -1 3 4 5 5 Cj trebui sa aiba valoarea cat mai mica !iii -1 1 -6 -5 -4 -3 vectorii se vor parcurge astfel: vectorul c Incepand de la elementul p catre prirnul 2 -6 -5 -3 -1 1 Sj element, iar vectorul a incepand de la elementul r catre primul elemen t (coeficientii sunt numere pozitive din ce i n ce rnici, iar numerele din vectorul a sunt numere negative din ce i n ce mai mari).

a,

181
7

1 51
7

a,

mai

Programul este: #i nc l 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 [ ( "g rc~ cd y 3 . t x t: " , Lo s e : in ) ; vo i 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 o r ( i = l ; i < =m; i ++ ) Ec- c -al i.L: f .c l ose ( ) ; ) vo i d s o r t ( i n t v[], int n) {i n t i , j , a ux ; f or (i=l;i<n ;i++) f or (j~i+l;j<=n;j+ +) i f Iv[i]>v[j)) {a u xe v l i.L: v l i Lev l j l : v l j l e au x i L} vo i d greedy ( ) // indici : i-vector c, j-vector a, k-vector b {int i =n , j =m, k =O;
cou t " E= ";

wh i le (cli]>O && a[j] >O && k<nl { k ++ ; cou t " { " c[ i] "l * (" a[jl ") + " ; expsec l i l e a l jl : i - - ; j - - ; ) p =j ; i =l ; j = 1; wh i le (c [ i] <O && a[ j ] <O && k <n ) { k ++ ; c o u t " ( " c l i ] " ) * ( " a [ j } " ) + " ;
e x p ee c

l i.L

'a

lj l : i

++ ;

j ++ ; }

if

Ic[i)<OJ wh i l e (k<n)

III furmatica
{ k+ + ;

67
c out " ( " c [ i ] " ) " ( " a [ j ] i++ ; j + + ; } " )+";

e xp e e c l i ] *a [ j J;

else {i =P i j = r ; while (k<n)


{k + + ;

cout " ( " c f i ] " ) * ( " a [ j ] " ) + " ;


j - -; } }

exp+=c[iJ "a l j l : i--;


cout ' \ b ' " = " exp; } v oid main { )

{c i t e s t e ( ) ; sort(c,n); s ort (a,rn ); g ree d y ( } ; } Justificarca criteriului candidatului optim Consi derarn cazu l in care cc eficientii sunt numere intregi pozitive care au fast ordonat e crescato r si exista eel puti n n numere pozitive in 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={a 1,a2, .. ., am} cu 'i;;aj , pent ru i<j , atunc i S={X1,X2 . xn} cu Xj$X j , pentru i<j :;;i x n=a m, Xn.1= a m. 1, . . . , x1 = a m n +1. Este evident ca pentru a obtine valoarea maxima a expresiei trebuie sa S8 aleaqa cele rnai mari n numere din mult imea A. Trebuie sa demonst rarn daca este corect mod ul i n care s-a con struit multirne a S cu aceste numere. Pentru 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 exis ta a expresie Ez a carei valoare este mai mare deca t a expresiei E1 (E2 >E1). in cel mai bun caz , in expresie ordinea 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 + ...+ Cn x Xn Confo rm presupunerii tacute, 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 jus tifica si alegerea eleme ntelor rnultim ii S atunci cand cei n coeficienti sunt negativi ;;i in rnultim ea A exists cel putin n numere neg ative.
-----...,-..... 1. Justific ati criteriul prioritatii de alegere pentru cazul in care coe flcientii sunt poz itivi ~ i i n mu ltirnea A nu exista decat numere nega tive. 2. Justificati eriteriul prioritatii de alegere pentru cazul in care coe ficien tii sunt neg ativi ~ i in mu ltimea A nu exista dedit numere poz itive. Refaceti programul astfe l l ncat sa se determ ine val oarea minim a a exp resie i. 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 ma i mare nurnar din rnultirne. Fiind date multirnea de nume re reale A = {a"a2, ... , am} ~i n , grad ul 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. La un cabinet medical, in sala de asteptare, se gases c n pacienti, Timpu l neces ar pentru consultarea unui pacient i este ti. Cunosc and nurnarul de pacienti n si timpul neces ar pentru fiecare consul tatie ti. scriet i un progra m care sa afiseze ord inea de tratare a pacientilor, astlel inca! timpul total de asteptare al paci entil or sa fie minim. lndicatie. Deoa rece timp ul de asteptare al unui pacient este egal cu suma timp ilor de consutt atie ai pacientilor tratati i nainte a sa, ordonarea pacientilor dupa criteriul

3. 4.

5.

6.

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 c i sume cu un nu m ar minim de bane note cu valor! date.

Se folosesc urrnatoarele date si structuri de date: -7 Pentru valo rile banc notelor se foloseste vectorul a cu n elemen te (n reprez inta nurnarul de tipuri de bancnote). -7 Pentnu sum a care trebuie platita se foloses te variabila s. Se Iolcsesc urmatoarete subprog rame: n=4 ~i S=147 --> Nurn ar total ba nc note= 9

-7 Subprogramul

cite ste () _ pentru Valoare bancn ota 10 1 1 citirea datelor din fisierul text. In fisierul _ text , pe prirnul rand sunt scrise doua nuNumar de bancnote 2 4 1 2 mere i ntregi, n ~j 5 , iar pe randul urrnato r cele n valo ri ale bancnotelor. Valorile nume rice 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 ~ i afiseaza solut ia in lim p ce 0 construieste.

Is o[ I s

Strategi a greed y este irnplernentata astfel: PAS1 . Selec tarea ban cnotelor in ce pe cu ba ncno ta cu valoa rea cea mai ma re (prim a valoare din vect oru l a). PAS2 . Cat t im p nu a fost platita toata suma , exe c uta PAS3 . Dac a 0 parte din suma rarnasa poate fi platita in bancnote care au valoarea elementului curent din vectorul a. atunci S8 determina nurnarul maxi m de bancnote cu care se face plata (catul dintre suma rarnasa ~ i valoare a bancnotei) si S8 calculeaz a restul din surna care rnai rarnane de platit. PAS4. Se trece la urrnatoarea valoare a bancnotei si S8 revine la Pasul 2.
# inc lude < f s t r e a ~ . h>

i n t n,m,S, a{ 2 0 ]; f stream f ("g rcedytl . t x t" . i os: : in ) ; v o id c i t.e s t e () {i n t i ; [ n5 ; f o r ( i = l ; i < = n ; i - ~ ~ ) f a [i); f . c l o s e ( ); } v oid s o r t. t ) { i nt i,j,aux; f or ( i=l ;i <n :i~+) f or ( j=i -Il; j<=n; j+') if {a l Ll c a l j l ] t aux e a l i l : a Li l e e l j l : a[ jJ =aux; } } v oid greedy ( ) {int i =1; whi le (S ! =O) ( if (S/ ali) ' =0 ) {c out S / a [ i ] " bilnenote eu va loarea " a fi] e n d l ; S=S% a[ i l; } i ++ ; } }
voi d ma in ( } l t tj :
( c t . e s e a o r

t I nl

: gre e d y ( ); }

Informatica

69

Obsorv atie . i n plata sumei S cu bancnote de valori date pot sa apar a doua cazuri (presupunand ca in moneda respectiva exista 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 solu tie. deoa rece va alege 3 bancn ote cu valoarea 15 , rarnan and un rest de su rna cu va loarea de 3 , pentru care nu rnai exists ba ncnote ca sa S8 pla teasca. in realitate ,

problema are a solutie: 2 bancnote cu valoarea 15, 2 bancnote cu valoarea 5, , i 2 banenote cu va loare a 8 .

2. Suma este 22 , i bancnotele au valorile 9, 7, 5 , i 1 (n=4). Algoritmul greedy nu va gasi sol utia optima, deo arece va alege 2 bancnote cu valoarea 9 , ~i 4 banc note cu va loarea 1, in total 6 bancnote . Solutia optima este de a plati cu 4 bancn ote: 3 bancnote cu valoarea 7 ~i 0 ban cn ota cu valoarea 1.
Me toda greedy care nu furnizeaza solutia optima a problem ci S8 numeste me toda euris tic a greedy .

Ce relatie trebu ie sa existe intre valorile bancnotelor pentru ca solutia greedy sa furnizez e solutia optima? Co m plexitatea algoritmului greedy Algoritmul greedy propriu-zis are complexitatea O(n ), deoarece se parcurg cele n elemente ale rnultirnii A pentru a alege fiecare dintr e cele m elemente ale solutiei. Aigoritmul de sortare folosit pentru aranjare a elementelor mult u nii A dupa criteriul candidatului optim are complexitatea 0(nxlog2 n) daca se alege un algontm de sortare eficient, cum este de exemplu algoritmul QuickSort. Complexitatea metodei greedy este O(n) + 0(n xlog2 n)= 0(nxtog2n).
Metoda greedy se rocomanda in urmatoarele cazuri: -7 S8 doreste numai obtinerea solutiei optime si suntem siguri ca aplicand strateg ia gree dy S8 obtme solu tia optima;

-7 se doreste obtinerea unc i SOIU!ii accept abile. nu neaparat optirne, , i aigontmul greedy
este mult mai eficient decal al\i algoritmi - care pot duce la obun erea mai mu tter solutii sau

a solu tiei optirne.

1. Un automobilist porneste dintr-un ora, A trebuie sa ajunqa i n ora sul B. Re zervor ul autoturismului, daca est e plin, Ii perm ite sa
pa rcu rqa n kilometri. Pe harta sunt trecute m stat ii de alimentare ~ i

,i

distantele dintre ele . Automobilistul doreste sa opreasca la cat mai putine statii pentru
alimenta rea autoturismului. Scrieti un program care

sa

dete rmine statiile de ben zin a la

care trebuie sa S8 opreasca pentru alimentare. 2. l ntr-un camping exista k casute care pot fi inchiriate 365 de zile din an. O rice turist poate
inchiria 0

casuta pen tru exact

m z ile consecutive din an . Campingul a ad unat solicit arile

a n turisti pe un an intreg , cu un a n i na inte. Fieca re turist precizeaza prima zi cu care dorest e sa i nchi rieze a cas uta (1, 2, ...). Sa se determine nurnarul maxim de turisti care vor putea fi primiti in camping ( k ~ 1 0 0 , m$20, n ~ 1 0 0 0 ) . (Concursul Nemes Tiharne r, 1998)
3. Un turist tre buie sa strabata un traseu de munte. Pe harta, zona prin care trebuie sa treaca a re 0 forma dreptunqhiula ra . care este trnparuta , prin caro iaje , in subzone, ca re au fiecare 0 anurnita ina 1time. Zona prin care trece turistul poate fi reprezentata printr-o matrice ale carei ele mente rnernoreaza inaltimea fiecarei subzone . Turistul porneste din sud, din orice subzona de pe harta, ~i trebuie sa Nord

2
2

,jl. .
3

1 1 0 1

1 2 4

.r,
2 3

Suo

70

Tch nici de program arc


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 Inaltirnilor - si se vor citi din fisier.

4.

Intr-o fabrica s-a automatizat procesul de productie 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 locurile in care exista rnasini). Robotii se deplaseaza in spatiut de deasupra rnasinllor , corespunzator aceluiasi caroiaj. Robolii pornesc din coltul din stanqa sus (1,1) >;i trebuie sa duca piesele i n coltul din dreapta jos (n.rn). Robotii sunt proqramati astfel i ncat sa se deplaseze dea r la dreapta sau in jos. Sa S8 scrie un program care sa determine nu rnarul 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 depo zitului cunoaste nurnarul de monede din fiecare sac ~i vrea sa modifice continutut sacilo r, prin mutarea de monede dintr-un sac in altul, astfe l lncat, la starslt, sa fie in fieca re sac acel asi nu rnar de monede. Sa S8 scrie un program care sa determine, daca este posibil, nurnarul minim de rnutar i prin care fiecare sac sa cantina acelasi nurnar de monede, altfel sa S8 afis eze 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
Me toda pr oqrarnarii din am ice S 8 poate folosi pentru problemele in care trebuie sa fie gasita solutia optima si care au urrnatoa rele caracteristici : 1. Sotutia optima se alege dintr-o rnultirne de solutii. fiecarei solutii puta nd sa i se asocieze o valoare . Alegerea solutie i optime Insearnna alegerea solutiei care are valoarea optima (minima sau maxima ). 2. Problema poate fi descornpusa in subp rob leme simila re cu problema i ni tiala ce respects princ ipiul optirnalitatii : solutia problemei este optima daca ea coniine solutiile optime ale subproblemelor.

3. Subproblemel e i n care se descompun e problema nu s u nt indep end ente 4. 50Iu!i. problemei este data de un vec to r 5 = (x " X2, ... , xml si: -7 exista 0 multirne finita A 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 nurnaru l 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 c la s l c a de rezolvare a acestor probleme este de a cauta toate so lutiile problemei si de a alege . dintre solutille qasite , solutia optima. Algo ritmul de gene rare a tuturor solutiilor tnsea rnna generarea tuturor subrnuttimi lor de indici ai multirnil A cu n elemente >;i are ordi nul d e c omp!exitate 0(2") . Acest ordin de com plexitate este inacceptabil pentru 0 dimensiune mare a datelor de intrare n.

III fn f

ill a I icii

71

(Swoon de CalZ I
Scop : identificarea probl emelor care po l fi descompuse ill subprobl erno similare care nu s unl i ndepen dente ~i ca re resp ecta pr incipiul optirnalitati l, solu tiilo r putand sa Ii se asocieze 0 va loare, iar solutia optima deterrnin andu -se prin calcul area valorii optime . Enuntul problem ei 1: Se conskiere un triunghi de numere naturale ' a11 ell n tinii. Pomind de to numerut din linia 1, mergfmd in j os pana fa a21 finia n. sa se determine a setectie de etemonte astrel incat suma e/ementelor sa fie maxima . Trecerea to Iinia urmatoare se poate face nume! mergfmd in jos, direct sau pe diagonala, la dreapta . a n1
8 ij

a 22
a n2

..
ann

Metoda clas ica de rezolvare a acestei probleme este de a calcula toate sume le care se pot forma respectand restrictia de deplasare in triunghi si de a alege, dintre sumele gasite , suma care are valoarea eea rnai mare . Mul\imea datelor de intrare 0 reprezinta rnultirnea A fermata din elemente le aij ale triungh iului. Valoa rea asociata unei solutii este su ma elemc ntelor. Valoarea solutiei optime este valoarea maxima (s uma elementelo r tr ebui e sa fi e m axim a). Sol ut ia problemei este data de un vector S :::: {X1 , X2, ' .' , xn}, unde xjEA. Pentru canstruirea solutiei S8 porneste de la elementul a1 1 ~ i se merge in jos , pana la linia n. Trecerea la linia urrnatoare nu se poate face decat direct, in jos sau pe diaqonala, la dreapta, astfel lncat succes orul elementului aij nu poate fi decat elementul ai+1 ,j sau eleme ntul ai+1,j+1. Problema poate fi descompusa in subprobleme: subproblem a i este alegerea elementului Xi al solutiei de pe linia i a triunghiu lui. Res trictia impusa pentru sol utie este ca elementu l Xi al solutie i sa se obtina , prin deplasarea in triunghi, numai pe doua direcni, de la elementu l anterior, limita nd rnultirnea elementelor din care se alege elementul Xi al solutiei numai la elementele din triunghi care se gasesc lntr-o anurnita pozitie fata de elementul anterior al solutiei. Pentru a respecta princi piul op nrna titat ii. suma elementelor alese anterior trebuie sa fie maxima. Subproblemele nu s unt independ ente deoa rece i n subprob lema i alegerea elementului Xi al solutiei se bazeaz a pe alegerile Iacute in subprobleme le anterioare . Enuntul p ro ble me i 2: Df111du-se un ir de num ere sa se determine subsirul crescator de lungime maxima . Fiind dat un sir de numere a- , a2, .. _ , an, se defineste ca subsir crescator , sirul aj1, ai2, ..., aik, cu ai1 ~ aj2 :S:; .. . :s:; aik ;;i 1 s i1 < iz < ... :s:;i k. De exernplu . i n sirul de nume re 1, -2, 3, 2, 4 , 4 , un subsir crescator este 1,3 , 4, 4 . Motoda clas ic a de rezolvare a acestei probleme este de a genera fiecare subsir al multimii A ~ i de a verifica daca este subsir crescator. Dintre subsirunle crescatcare gasite se alege apoi subsirul care are lungimea cea mai mare. datelor de intrare a reprezinta rnultirnea fermata din elementele sirului: A={a1, a2, .. ., an} . Val oarea asocia ta unei solutii este lungimea subslrulul cres cat or. Valoarea solutiei optime este valoarea maxima (Iun gim ca su bsiru tui tre buie sa fie ma xim a). Solut ia prob lemei este data de un v ector S = {X1 , X2, .. ., xm}, unde XiEA . Prob lema poate fi descornpu sa in subprobleme: subprob lema i este de a gasi subsirul crescator de lungime maxima care i ncepe cu elementul ar. Restrictia impusa pentru solutie este ca elementul aj cu care incepe subslrul sa alba valoarea rnai mica sau eel mult eqala cu cea a succesorului sau in subsir (aj), iar in rnultimea A nurnarul lui ordine (i) trebu ie Sa fie mai mic c ecat numarul de ord ine al succesorului (j) , tirnitand rnultirnea elementelor din care se alege succesorul aj . Metoda cea mai sirnpla de a gasi subsirul de lungime max ima care i ncepe cu
M u l~ i me a

72

Tc h nici d e p r ogramarc

elementul aj este de a cauta printre subsirurile de lungime maxima descoperite in subproblemele rezolvate anterior, eel mai lung subsir care ince pe cu un element a] ce poate fi succesor in subsir al elementului a r, obtinandu-se un nou subsir, de lungime mai mare, care i ncepe cu elementul a.. Pentru a respecta principiul optimatitatii, lungimea subsirurilor descoperite anterior trebu ie sa fie max ima. Subproblemele nu su nt in dependcnte deoarece i n subproblerna i alegerea subsirului care i ncepe cu elementul ai al solutiei se bazeaza pe alegerile tacute in subproblemele anterioare.
Enu nt u l pro bl emei 3: 0 (eava Cll Iungimea L trebuie sa se contectione ze din n bucet! do (eava. tiecere ouest avand lungim ea ai. 0 bucot de (eava nu poate Ii tiiiata. Sa sa gase asca. aoc exisla , soil/ ria de a obtine teev de lungime L prin sudarea unor bucet) de

!eava cu tunqimee e,
Metod a clasica de rezolvare a acestei probleme este de a genera toate tevile care se pot forma cu cele n bucati de teava cu lungimile date si de a verifica daca lungimea tevii obtinute este eqala cu L. Mullimea dale lor de intrare 0 reprezinta rnultirnea A fermata din lungimile bucatilor de teava a.. Valoarea asociata unei solutii este lung imea tevii . Valoare a solutiei optime este L (Iungimea !evii co nstruite trebuie sa fie L). Solu t ia problemei este data de un vec to r S = {x, . X 2 xm}, unde x;EA . Problema poate fi descornpusa in subprobleme: subproblema i este de a gasi toate tevile care se pot confections adauqand bucata de teava cu lungimea a: la tevile care au fost construite in subproblema anterioara. Restrictia impusa pentru tevile care 58 constr uiesc este ca ere sa nu depasea sca lungimea L. Aceasta restrictie lirniteaza rnultirnea tevllor construite anterior. Pentru a respecta pri nc ipi ul optimalitatil, constructia tevilor eu ajutorul bucatii de teava eu lungimea ai se bazeaza numai pe tevile construite in subproblema anterioara, iar subproblemele nu sun t independente.
En untu l pro btemai 4: lntr-un rucsac S 8 poate transporta a greutate maxima G $i exista n obiectc, fieeare obiect avand qreuuitee g; i un profit obtinut in urma trenspottutu! c; iar obioctete nu pot fi fractionate. Sa se setecteze obiectote care vot fi trenspotteto in mesne, astfel incat sa se obtine profitul maxim (problema discrotii a rucsecutui y.

Metoda clas ica de rezolvare a acestei probleme este de a genera toate posibilitatile de a incarca rucsacul aieqa nd obiecte din cele n obiecte ~i de a verifica daca greutatea obiectelor nu depaseste greutatea de incarcare a rucsacului G. Dintre variantele de incarcare a rucsacului se alege cea care are profitul eel mai mare. Multirnea datelor de intrare a reprezinta rnultirnea A fermata din cele n obiecte ai care pot fi transportate in rucsac. Valoarea asociata unei solutii este pr ofit ul t ran sportului. Valoarea solutiei optirne este valoarea maxima (prof itul t rebui e sa fie maxim ). Solut ia problemei reprezinta lncarcatura optima a rucsacului si este data de un vec tor S = {X1. X2.. . x m}, unde xkEA ~ i 1skSm. Problema poate fi descornpusa in subprobleme: subproblema i este de a verifica daca obiectul a: poate fi element al solutiei, Restriqia irnpusa pentru solutia care se construieste este ca obiectul a: sa nu aiba a greutate mai mare decat greutatea disponibila a rucsacului ~i profitul lui sa fie mai mare sau egal cu profitul utimului obiect adauq at in rucsac 3i.1. Aceasta restrictie lirrnteaza multimea elementelor din care se alege elementul Xk al solutiei. Pentru a respecta princ ipi ul opt irnalitati i. elementu l Xk al solutiei S8 determine prin alegerea dintre doua obiecte a celui care are profitul mai mare. Subproblemele nu sunt inde pend ente dc oarece rezolvarea subproblem ei i se ~ bazeaza pe rezolvarea subproblemei i-1 (elementul Xi al solutiei este determinat in ~ functie de elementul X i-1 al solutiei).

lnfu r mu t icii
Metod a proqramar it dinami ce so bazoaza pc descompunerea unci pro bleme in sub pro ble me s imilar e problcmci initiale, care nu sunt in de pc n dc n tc , ~i c on st ru iosto so lutia rozolvand fie care subprobtorna, prin selecta rea, dint r-o
m ultirne d e c lemente, a el em entel o r ca re indep linesc
0

73

anurnita co nd it ie. .Pen tru

ca elementele care se selec teaza sa apartina sotutiet optima, la pasul k alegerea se face in f un cti e de valoarea op tima a unci functii asociate solutlei ~ i se baze aza pe ale ge rile care s -au facut pana atu nc i (pe elementele solutl ei care au fost desc operite anterio r).
Etapcle de rezol var e a un ci p ro b lem a p ri n metoda p roq ra rna r!i d ina m ice s u nt: PAS1. Se dernonstreaza ca problema are 0 substructure optima (prin reducere la absurd). PAS 2. Se caracterizeaza structura unci solutii optime (descompune rea problemei in subprobleme). PAS3. Se defineste re cursiv va loarea so lut iol opt ime. PAS4. Se calculeaza valoarea solutiei optirne intr-o rnaniera "de jos i n sus" ("bottom-up') . PASS. Se con struieste solutia optima din inforrnatiile obtin ute prin calcu larea valorii solutie i optime.

Obso rv atio. Valoarea solutiei optime este definite recursiv in functie de valorile optime ale subproblemelor. Daca pentru calcularea functiei recursive s-ar folosi un algoritm recursiv, ordinul de complexitate ar fi 0 (2"), la fel ca si in cazul metodei clasice de rezolvare. Din aceasta cauzn, ca!cularea functiei recursive S8 face "de j os in sus " obtina ndu-se un algo ritm itorativ : PAS 1. Se rezolva subproblema obtinuta din descompunerea problemei initia te care are cea mai mica dimensiune ~i S8 mernoreaza soluti a ei. PAS 2. Cat t imp nu sa ajuns la rezolvarea proble mei cu dimensiunea n , exec uta : S8 rezolva 0 subproblems de dimensiunea i folo sind solutiile obtinute in subproble mete cu dimensiune mai mica decat i.

1.6.2. lmplcmentarca mctodci prugrarnarii dinamice


Pentru impleme ntarea metodei proqrarnari i dinamice S8 vor foios i subprogramele: -7 subprogramul ini t () - care initializeaza variabilele de rnernorie ~i structurile de date folosite pentru constru irea solutiei; -7 subprogramul p_ dinamica () - care calculeaza valoarea solutiei optune; -7 subprogramul afiseaza ( ) - care afiseaza solutia problemei foJosind intormatiile obtinute prin calcularea valorii solutie i optime . in exempJele urrnatoare datele de intrare vor fi citite dintr-un fisier text.

Excrn plul 1 . Proble ma surnei maximo in tr iunghi. Cerinta problemei este ca pentru calcu lul sumei sa se porneasca de la elementul a11 si sa se rnearqa in jo s, pana la linia n. Trecerea la linia urrnatoare nu se poate face decat direct, in 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 . Pro blema are sub struc ture optima . Fie un sir de n numere din triunghi, care respecta conditiile de deplasare in triunghi ale problemei, si care tormeaza suma maxima. in 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

T ch nici de programarc

PAS2 . Desc om puncrea probJem ei in subproblem e. Se deterrnina pe rand sumele maxime ale numerelor care apar pe trasee le care pornesc de pe ultima linie n catre varf si ajung pe linia i (t s is n-t). Pe linia i , suma maxima pentru fiecare element S8 va calcula pe baza sumelor max ime care s-au calculat i n subpr oblemele ante rioar e (sum ele de la linia n pfma la linia i+ 1). Aceste sume sunt sume le max ime pentru fiecare linie ~i principiul optirnalitatii este respectat.
PAS3 . Valoarea solutie i fiind suma etementelor selectate , functia recursive care defineste s uma m axima pornind de la elementul au al triunghi ului este prezentata alaturat,

aij oaca len , h "js i


S(i,j) =

{ a;j + max(S(i+1,j), Sli+1,j+1)) daca t stsn-t

PASS . Pentru a calcula valoarea solutiei optirne intr-o maniera de "de jos in su s ", S8 va forma un tri u nghi al s ume lor ma xim e, pornind de la baza (Iinia n ) catre varf (Iinia 1). Sumele maxime de pe linia n sunt ega te fiecar e cu elementul corespunzator de pe linia n a triun ghiului. Valoa rea maxima a sumei elementelor este 51 1.
PASS . Pentru reconstituirea elemen telor solutiei, se foloseste 0 ma trice p , i n care se mem oreaza directia de deplasa re (valoarea 1 pentru deplasarea in jo s si valo area 2 pentru depiasarea pe diaqona la). Matricea peste defin ita alaturat . p(i,j)
={

1 daca 5(1+1 ,j) > S(i+1,j+1) 2 caca 51i+1,j ) ~ 5(1+1,j+1)

Se tolosesc urrnatoarele date ~ i structuri de date : -7 Pentru nurnaru l de Iinii ale triungh iului se foloseste variabila n. -7 Pentru me morarea 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 - a 21 ce sunt patrate , cu dimensiunea n .

:l n l Hil l Se folosesc urrnatoarele subp roqrame : -7 Subprograrnul c i tes te () - pentru citirea datelor din fisierul text. in fisierul text , pe primu l rand este scris numarul de linii, n , iar pe urmatcaree n rand uri numerele de pe fiecare Iinie a triungh iului. Numerele sunt separate prin spatiu . in urma executie i ace stui subprogram se creeaza matr icea triunghiului a. -7 Sub programul ini t () - irutializeaza linia n a matricei s cu elementele de pe linia n a triungh iului. -7 Subprogramul p_ dinamica - calculeaza valoarea solutiei optime (elementul 5 11 at matricei sumelor). -7 Subprogramu l a f isea z a () - afiseaza suma maxima ~ i solutia prob lemei folosind info rrnatiile din rnatricea p .

Strategia proqrarn ar li di namice este implementata astfe l: PAS1 . Se initializeaza linia n a matri cei sume lor max ime S cu ele mentele de pe linia n a matr icei triunghiului a . PAS2. Pentru urrnatoare ie linii ale matricei sume lor maxime incepand cu linia n-1 pana la linia 1, ex ec uta: PAS3 . Se calculea za 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 curen t, atunci la elementul

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

Matricea d irectiei de doplasaro - p

4
0 0
1

1
1 1

2
0 1 1
0

3
0 0

4
0 0 0 0

0
2

0 0

0 0 0 5

1
2
3

20
15 11

0 1 10

0 0

2 3 4

4
5

2
3

4 6

3
2

.s,
5

.z,
0

2
0

Prog ramul 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 .tx t " , 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 ( j~ l;j < ~i; F+ ) f a [i ) [j ) ; f. cl ose () ; ) void .i n.i t ( ) (for (i n t i= l ;i<=n ii++) S ln Jli l""'a[n l [i ] ; } void p,..cd i n a mi c a U {int L j ;

for (i=n-l ;i> = l ;i -- ) for ( j ~ l ; j<= i ; j+ +)


if ($[i +I ] [j j>Sfi+l j [j+l)1 [ S [ .l J [ j ]~a[ i J [j ]+S [l+l ) [j ] ; p[ i) [j J ~ l ; ) else ( S r i ] [ j ] ~ a[ i ) [ j ) + s[i+ l] [j+1J ; p il l [j]~2 ; )

void a f Ls ee za () {int i ,j , q = l, r = l; cou t-c-c't Su ma ma xima= " S [ l J ll J" = " a [ l ] [ 1 ] "+ " ; for {i=l ,j= l ;i <n ; i ++ }
(p [i ] [ j ) ~ ~ 21 ( r ~ r + l; j ++ ; ) cout a[ q ] [ rJ " + " ; } cou t;c-c ' \b ' " " < c e n d 'l r j void main () {if
q~q+ l ;

{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 . Pentru a determina sirul de lungimea maxima, trebuie calculat a, pentru fiecare element a j 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 s ubs tructu ra optima . 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 cresc atoare care i ncep cu numarul a., In subproblema 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
rioare care in cep cu numarut aj, cu ar ::; aj lungimea max ima.
~i

Tch nici lie progra lllarc


kj , altfel
S8

contrazice ipoteza ca subsirul are

PAS2 . Des co mpu nerc a p roblemei i n subpro bleme . Se determine pe ran d lungimea ma xima a unu i sub sir crescator care in cepe cu elem entul a, din sir, porn ind de la subsirurile crescatoare de lungime maxima care inc ep cu elementul an, p~m a la subsirurile care i ncep cu elem entul ai+1. Pentru eJ ementul aj din sir, lung imea maxima a subsirurilor crescatoare care S8 pot form a, Incepand cu el. S 8 va calcula pe baza lung imilor max ime care s-au calculat in subproblemele anter ioare . Aceste lungim i sunt lungimile maxime pent ru fiecare subsir care se poate forma i ncepand cu acel eleme nt si principiul optimalita\ii este respectat. PAS3 . Valoa rea solutie i fiind lungi mea subsirului crescator , functia recur sive L(i ) ; care define ste lun g im ea m ax im a a subsirului car e se poate forma pornind de la elementul aj al slrului este prezentat a ataturat.
1 daca i- n { 1 + m ax(L(j)) daca ar s; aj . L n :?i i< j:$"11

PAS4 . Pentru a calcula valoarea solutiei optime i ntr-o man iera "d e j os i n s us ", se va forma un vector al lungi mi lor ma xime. pornind de la ultirnul element din sir (elementul n) catre prim ul element din ~ir. in acest vector se va memora i n pozitia i lungimea max ima a unui subsir crescator care se poate forma inc epand cu elementul aj al sirului. Cum lungimea maxima a unui subsir cresca tor care se poate forma cu un singur eleme nt este 1, lungimea max ima corespunzatoare elementul ui an se initializeaza cu valoarea 1. PASS. Pentru reconstituirea elementelor solutiei, se foloseste vectorul p in care, in pozitia i, se mernoreaza indicele elementului urmator din subsirul de lungime maxima care incepe cu aj. Se folosesc urrnatoarele date ~i structuri de date : -7 Pentru numarul de elemente ale sirului se foloseste vari abila n . ~ Pentru me morarea sirului de num ere se foloseste ve ctorul a , pent ru me mora rea lungi miter maxi me - vectorul L , iar pentru me mo rarea indicelu i ele rnentului urmato r din subsir - vectoru! p . Tal i acesti vectori au dimens iune a n. Se folosesc urmatoarel e subp rog rame: -7 Subprogram ul ci t.e s t.e () - pentru citirea datelor din fisierul text. in fisierul text. pe primu1rand este sensa lung ime a sirului - n , iar pe urrnato rul ran d cere n numere din sir. in urma executiei acestui subprogram se creeaza vectorul pen tru sirul de num ere - a. ~ Subpro gramul i n i t () - initializeaza eleme ntul n al vectorilor L ;;i p . ~ Subpro gramul p_ di namica - calculea za valoarea solutiei optime (Iungi mea maxima a subsirurilor care incep cu fiecare elemen t aj din sir). ~ Su bprogramul cau ta_ solu t .i a ( ) - caut a cea rnai mare lungime maxima a unui subsir pentru a gasi ele me ntut cu car e i ncep e subsirul. ~ Subpro gramul af i s e a za ( ) - afiseaza tungim ea sirului gasit si so lutia problernei folosind informat iile din vector ul p . Strategia p roq rama rl i d inam ice este irnplement ata astfel: PAS1 . Se initiahzeaza elementul n al vectorului lunIndici 1 2 3 ~ gimitor maxime cu 1 ;;i al vectorutui p cu n . -2 3 PAS2. Pentru urmiit oarele ele mente i ale vect oa 41 ~ rulu i, J ungimi tor max ime Ince pand cu eleL 4 3 mentu l n-1 pana la elem entul 1, ex ec uta: 3 5 PAS3. Sc irutializeaza lung imea maxima p 3 a sub sirului car e in cepe cu acest Subsirul

4 2 3

-_. 6 ~- -".4 4 2

....16
4

6
4

I nfo rmaticii

77

element cu valoarea 1 :;;i pozit ia cu care i ncepe subsiru l cu pozitia elementului in sir. PAS4. Se calculeaza lungimea max ima a subsirului care i ncepe cu elementul curent din sir, astfel : pentru toate elemen tele j din sir care urmeaza dupa elementul i, exe cuta PASS. Daca 3j este mal mic decat 3j 9i lungimea subsirului care ince pe cu 3j este mai mare decat lungimea subsir ului ca re incepe cu ar, atunc i L(i) este egal cu 1+LU) ~ i indicele elementului care ormeaza i n subsir dupa elementul a: este j . PAS6. Se deterrn ina cea mai mare lungime maxima L(k). Subsi rul de lungime maxima va fncepe cu elementul a k.
Progra mul este : # in c l u d e < f s t r e a m. h > in t 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 ++)
v o i d ini t()
{ L [ n l ~l; p[ nl ~ n ; )

f a [ i ]; f . c l a s e () ; }

void p _ d i n a mi c a () tint L j ;

f or

(i = n - l ; i >= l ; i - - )
p [i J~l ; for ( j ~ i t l; j < = n; j + + )

{ c [ i ] ~ 1;

if

(a [ i J<~a[ i J
{ L [ i]~ L [ j ] + l;

&&

L[i] < ~ L[ j J)

p [iJ ~ i ; } ) }

void cau ::a~~solut i a () {in t i, rl\iJ.x "= - l ;

for
if

( i ~ l ; i< = n ;i+ - t)

(ma z <L [ i j ) {lll a :x=IJl _ LJ; k=i; } ] void afiseaza() {int i ,j ; cou t" Lu nq ime subsir= " L [ k ] endl; fo r ( i~~ l, j = k ; i<=L [ k l ;iH ,jo;; p f j l ) coc t cc e l jl cc" ",oJ void mai n () { c i t e s t e ( );p_dinamica() ,o c au t a s olu ti. e jI : .a f i s e a z a f j :

Exemplul 3. Problema tc vii. Oaca se poate constru i 0 teava de lungim ea 0 folosind bucati de teava cu lungimea 8 1, a2, .. , a., atunci se poate construi ~j a teava cu lungimea D+a i+1 folosind bucat i de teava cu lungimea ar , az. ... , a t, ai +1. PAS 1. Problema are substructura op t ima . Fie a teava care s-a obtinut prin sud area bucatii de teava cu lungimea a., la a teava care a fast obtinuta anterior din bucati de teava cu lungimea a], ~i care are lungimea mai mica decat L. In subprobtema i se aleg dintre tevile obtinute anterio r numa i acelea care au lungimea mal mica cecat L-a j, altfel 5e contrazice ipoteza CEt se paat e construi noua teava .

78

T chnici de program arc

PAS2. Descompunere a probl em ei in s u bproblem e. Se determi ne pe rand lungimile tevilor care 58 pot forma cu bucata de tea va cu lungimea ar, pornind de la teava torrnata numai cu buca ta de teava cu lungimea a1, pana la tevile formate cu primele i ~1 bucati de teava . '[evile forma te nu depasesc lungimea L ~i principiu l optimalitatii este respectat. PAS3. Valoarea solutie i fiind lungimea unei tevi, functia recur siva care defineste lungimea tev ilor care se pot forma cu bucata de teava cu lungimea a: este prezentata alatura t,
-1

caca 1=0

T(i,j )=

{ .. ar oaca T{i ,j - ai} :;C,O pentr u 'tsrsn ~i 1 :S:j~L

PAS4. Pentru a calc ula valoarea solutiel optime intr-o rnani era "d e jos in sus", S8 vor forma toate t8vile cu lungimea ma i mica sau eqala cu L , porni nd de la teava care S8 poate construi cu bucata de teava cu lungimea a 1, ~i adau qand la tevile obtinute, pe rand , urrnatoarele 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 lu ngim ilor tev il or care se constru iesc - T, care are lungimea loq ica L. i n acest vector se va memora in pozit ia j lungimea ultimei bucati de teava care se ada uqa la una dintre tevile constru ite anterior pentru a obtine 0 teava cu lungimea j . Princ ipiul optirnalitatii este resp ectat prin mo dul In care se constru ieste 0 teava cu lungimea j: prin adau qarea unei bucati de teava la una dintre tevile confection ate in subproblema anterioara .

PASS. Pentru reconstituirea elemente lor solutiei. se foloseste vectorul T. Pomind de la eleme ntul 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 nurnaru l de bucati de teava se foloseste variab ila n , pentru lungimea tevii care trebuie confec tionata. variabila L , iar pentru lungimea maxima a une i tevi care se poate forma adauqa nd 0 noua bucata de teava la tevile construite anterio r - variabi la max. Variabila ma x are initial valoarea 0 (nu s-a constru it nici 0 teava), iar la sfarsit, daca problema are solutie , are valoarea L (Iungimea tevii care trebuie confectionata) . -7 Pentru memora rea lungimi i fiecare i bucati de teav a se fo loseste vectorul a , de lungime n, iar pentru me morarea tevilor 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 primu l rand sunt scrise numa rul de bucati de teava - n ~i lungimea tevii - L , iar pe urrnatorul rand, lungimile celor n bucati de teava . in urma executiei acestui subprogra m se creeaza vector ul cu lungimile bucatilor de teava - a , -7 Subprogramul ini t () - initializeaza elementul 0 al vectoru!ui T si variab ila ma x . -7 Subprogramul p_ d ina mi c a - calculeaza valoarea solutiei optime (lunqimile tevilor ce se pot obtine adauqand fiecare bucata de teava ail . -7 Subprogramul s oLu t.ae () - verifies daca s-a gas!t solut ia probleme i. -7 Subprogramul afiseaza () - daca este posibil sa se confectioneze teava . afiseaza lungimile bucatilor de teava din care se confectioneaza. Strategia p ro qrarna rll d ina m ice este irnplementata astfel : PAS1. Se initializeaza elementu l 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 m atica

79

PAS3 . Pentru tevile cu lungimea j lncepand cu teava cu lungimea ma x pana la teava cu rungimea 1, exe cuta: PAS4. Dac a adauqand la teava cu lungimea j bucata de teava cu lungimea a: S8 obtine 0 teava care va putea fi folosita la confection area tevi i cu lungimea L, atu ne i constru irea tevii cu lungimea j+ aj in cepe cu buc ata de teava cu lungimea aj. Se rev ine la Pasu l 3. PASS. Se deterrnina lungimea maxima a unei tevi care S8 poa te construi din tevi le construite anterior, astfel: daca adauqand la tea va 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 lung imea bucatii de teava ar; altfel , ea va fi L. Se revine la Pasul 2. PAS6 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 mesa j de infor mare; altfe l, se trece la Pasu l 7 pentru a afisa solutia. PAS7 . Pentru fiecare 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 lung ime a bucafii de teava din lungimea i L=10 indici 1 234 5
n=5

UIiliIiliJ
3 0 0 0 3 3 3 4 0 0 2 2 2 2 5 0 0 0 3 5 5 6 0 0 0 0 0 6 7 0 0 0 3 5 5 a 0 0 0 0 5 6

indici vecto rul T = l un gi me tea v a ma x 0 2 4 7 10 al i) a{1) a(2) a(3) a(4) a(5) 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 2 0 2 2 2 2 2

9
0 0 0 0 5 6

10 0 0 0 0 5 6

in itial

De exemplu, dupa ce s-a luat in considerat ie ;;i bucata de teava de lung ime a(2) se pot construi levi cu lungimea 2 (din bucata de teava a(1)=2) ;;i cu lung imea 4 (din bucatile de teava a(1)=2 si a(2)=2), lungimea maxima a un ei l evi fiind 4. l.ua nd u-se i n cons ideratie si bucata de teava de lungime a(3 )=3 se pot construi le vi cu lungimea 2 (din bucata de teava a(1) =2). cu lungimea 3 (din bucata de teav a a(3)=3), cu lung imea 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 ).

Pro gram ul este : #include < f s t r e a rn. h > int L,n , maz ,T[2 0 ] , a [2 0 ] ; fst ream f( l' p d 3 . t x t ", i o s : :in ) i void c .i t es t e \) {int .i : Ln ; for ( i =l;i <= n; i ++ ) a [i ] ; f . c l os e ( ) i ) void i ni

to

( T [ O ] ~-l;

ma x e Oj }

80
vo i d
p ~dinamica()

Tch nici d e prog ramarc

tint i ,j , r:; f or ( i = l ;i <=!l ;i~ +) { fo r (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 ; } } in t s o Lu t Le t ) ( re tu r n T [L ) ! ~ O ; ]

v oid a fise a za {} {i f (! solutie()) c out" Te a v rl nu se p o ate c onf e cti or..a " ; el se f or ( i n t i=L ;i != O; ) {cou t .c-C'Bu c e 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 ( ) ;
i~it(j ;

p_di namica ( ); a fi s e a za() ; )

Excmplul 4. Problema discreta a rucsaculu i.

PAS1 . Fie un sir de m obiecte a carer greutate nu depa seste greutatea de tncarcare a rucsacului G si care asiqura profitul maxim al transportului. in subprob lema i a fast ales obiectul i numai daca greutatea sa nu cepaseste greutatea de lncarcare dlspon ibila ~i profitul adus de el este rnai mare decat al obiectului adauqat anterior i n rucsac . altfel se contrazice ipoteza ca incarcarea rucsaculu i asiqura profitul maxim. PAS2 . Des c om puncr ea problemei in subp ro blc me . Se determ ine pe rand profitul maxim adus de fiecare obiec t aj pentru fiecare greutate de i ncarcare disponibi la (de la 1 la G) pernind 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 ma xim C(i,j) obtinu t prin lncarcarea optima a rucsaeului eu primele i obiecte, avand disponibila greutatea de inca rcare a rucsacului j , este prezentat a alaturat. C(i,O ) reprezinta profitul maxim al unui rucsac cu greutatea disponibila 0 (care { Oceca ;-0 ~i 1::;;isn nu permi te adauqarea niciunui obiect i). C(O,j) reprez inta profitul maxim al unui 0 dace i=O ~i 1$j$G rucsac gol cu greutatea dispon ibila 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 calcu la valo area solutiel optime in tr-o man iera "de j os in su s ", se va forma a m atrice a profi tu rilor maxima C, pornind de la primul obiect (Iinia 1), pana la ultimul obiect (Iinia n). Matricea C are dimensiunea n xG . Elementu l C(i ,j) rnernoreaza profitul maxim obtinut in subprob lema i pentru 0 greutate disponibila j . Pe linia i, profitul maxim pentru fiecare greutate de tncarcare j se deterrnin a pe baza profitu rilor maxime ce s-au calculat in subprob lemele anterioare (profiturile maxime de la linia 1 pana la linia 1 -1). Aceste profituri sunt maxime pentru fiecare linie ~i principiul optirnalitatii 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 n xG. Elementu l p( i,j) rnernoreaza obiectul ales in subproblema i pentru 0 greutate disponibila l

Infurmuticii

81

Se folo sesc urrnatcare le date ~i structuri de date globale: -7 Pentru nurnarul de obiecte S8 toloseste variabila n. iar pentru greutatea rucsacului, variabila G. "" Pen tru rnultimea obiectelor (A) se foioseste vectorul a ale carui ele mente sun t de tip Inregistrare obiec t care coniine doua carnpuri: g - greutatea obiectului si c - profitul obtin ut in urma transportului. -7 Pentru memora rea 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 tex t 1 n fisie rul 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, separa te prin spat iu, care reprez inta 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 inforrnatiile din rnatricea p .
Matricea C Greutatca di sponibil a Profitul 20 40 Obi ect 1 0 0 0 0 2 20 20 20 20 3 20 40 40 40 4 20 40 60 45 5 20 60 60 60 6 20 60 60 65 7 20 60 60 85 8 20 60 70 9 20 60 90 10 20 60 90

n =4 G=10 Ob ioc tu l Greutatea 1 2 2 3

2
3
4

3 4

6
- --~ - -

50

- 45

85 105 105

Mat ricea p G re uta tea di s p o nlblla Obiec t

Solutia
Obi ect ul 4 2 1 T otal Gr eutate a 4 3 2 9 Profitut 45 40 20 115 1 2 3 4

r-r-r-r-r
0 0 0 1 1 1 2

1 2

3 1 2 2 4

4
I

5 6 1 2 2 1 2 2 4

7 1 2 2 4

8 1 2 3 4

9 10 1 2 3 4

1 2 2

2
3
4

2 4

Strategia pr o qrarn 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 , exe cuta: 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: dac a greutatea obiectului i este mai mica sau eqala cu greutatea disponibila si profitul adus ta greutatea j este mal mare cecat profitul ad us de obiectul i- 1, atun ci profitul pentru obiectul i ~i greutatea j este ega I cu profitul obiectului i adunat la profitul calculat pentru obiectul i~1 ~i greutatea j dirninuata cu greutatea obiectului i ~i in

82

T eh nici de rrou ramare


matricea P se rnernoreaza obiectul I; alt fel, profitul pentru obiectul I si greut atea j este egal cu profitul obiectului ;-1 ~I greutatea j ~I in matricea p se rnernoreaza obiectul i-1 ales pentru greutatea j .

Programul este: #in cl ude < f s t r e wn. h > s tru c t ob iec t lint g , c ; };
obiect a[20] ; int n ,G ,p[20] [201 , C [ 2 0 ] [201 ; fs tre am f ( " pd4 . t xt " , i os : : in ) ; vo i d citeste() l int i ; f nG ; fo r ( i = l; i <=f!.; i .;- + ) f a[1] . g 3 i i J . c ; f c Lo s e Lj r } v oid P dinamica() {for ( i n t i =1 ;i<=n ;i4t) f o r ( i n t j=l ;j<=G ; j ++) i f ((a [ .i ] . g <= j ) && (o i l] .c +C[ i- l] [j -a [i ] .g] >C[ i {C [ i ] U ]=a[i] .c+C[i -l] [j -a[i] . g ]; p [i else { C [ i ] [jl =C[i-ll Ij] ; p l Ll [j]=p[i -l] [j] v o id a f i s ec z a () lint i=n ,j=G ,~ ; coucc-cv p ro Ej t tctal= " :::[r: ] fG] e n d l wh i l e ip[i][j)'=OI { k=p [ .l ] [jJ ; cout " Ob i e c t u l " k" eli g.:-eutatea " a [ k j . g; cou t " 5i pro fi :.ul " a [ k ] . cendl ; j - v a [p [ i ] [j 1] . g ; while ( p l i ] [j] = =k) i --; I I v o i d mai n ( ) {ci t e s t e ( ); p_dinamica() ; afisea za() ; )
c

- l ] Ij ] ) I ] [ j]= i.; I ; I)

Complexitatea algoritmului proqrama rii dina mice

Algoritmul proqrarnarii dinamice are complexitatea O{n xm) deoarece se rezolva cele n subprobleme, iar pentru fiecare subproblerna se calculeaza cele m elemente ale valorii asociate solutiei. 1. Se dau n numere naturale ~i un numar natural 5 . Sa se gaseasca , daca exista, solutia de a obtine numarul 5 ca surna de numere naturale dintre cele n numere date . 2. Sa se afiseze eel rnai mic numar cu exact n divizori. 3. Se citesc de la tastatura doua siruri de caractere S1 ~ i S2. Sa se insere ze spatii in sirul 51 astfel tncat -daca se suprapun cele doua siruri, numarul de caractere care coincid sa fie maxim . 4. Se dau doua siruri de caractere A si B de lungime n, respectiv m . i ntr-un sir de caractere se pot executa nurnai urrnatoarele trei operatii prin care se poate transforma un !iiir: S(I) - sterqe caracterul din pozitia i, 1 (I,e) - insereaza caracterul c in pozitia I ~I M(i,c) Inlocuieste caracterul din pozitia i cu caracterul c . Sa se transforme sirul A in sirul B folosind un nurnar minim de operatii. Problema se va rezolva in doua variante: a) transformante se vor aplica de la stanp a la dreapta; b) transformarile se vor aplica de la dreapta la stanq a.

I n 1"0 r ill a tica

83

5. Se dau doua siruri de num ere X=(x , . xz. .. xm} ~i y =(y , . y z. .. yrn} . Sa se determine eel mai lung subsir comun al celor doua siruri . $irul Z=(z, . zz. .... Zk} este s u bsir co m un al sirur ior X ~i Y dac a el este sub sir al sirulu i X si subsir al sirului Y. De exemptu , daca X=( 1,2,3,2,2, 1,4} ~i Y=( 2,1.3,1.2,4}, sirul Z=(2 .3.1,4} este un subsir comun al celor doua siruri , lnd icati e Valoarea asociata solutiei este lungimea unui subsir comun , iar functia recur siva defineste valoa rea lungimii maxime a unu i sub;;ir comun L (i.j) unde i .este indicele elerne ntului cu .care mcepe s Ub~ l ~ ru l X. tar J est e indicele ele mentului cu care in cepe subsi rul Y. 6. Se da un
~i r

{O d aca

L(i,j) =

i=O sau j=O 1+L(i. 1,j-1) daca i, O , jeO 'ii XI = Y i max(L(i,j1), L(i-1,j) ) daca i. O, j,O 'ii x'*Yt

de n matrice A, . A z. .. .. A n 'ii trebuie sa se calculeze produsul lor : A, xA zx

... xA n. Fiecare ma trice A i. cu 2:5ISn, are Pj1 linii ~ i Pi coloane (doua mat rice A ~ i B S8 pot lnmulti numai daca numarul de coloane din matricea A este egal cu numarul de linii din rnatncea B ). Sa se puna i n acest produs paranteze le potrivite astfel Incat nurnarul de Inmultiri sa fie minim (deoarece Inrnultirea matricelor este asoc iativa, inserarea parantezelor nu rnod ifica rezultatu l). lndic atie . Fiind date doua matrice A p,q ~i Sq,r, matrice a prod us Cp,r con fine elementele:
c ij =

La;" x h"j
k=d

'I

Timpul necesar pentru calculul mat ricei produs este determ inat de nurnarul de Inrnultiri scalare : 3ikXbkj . De exemplu , pentru produsul A1 XA 2 XA 3, in care rnatricele au dimensiunile 10x20 , 20 x5 si, respectiv, 5x40 , nurnaru l de Inmultiri scalars pentru paranterizarea ((A, xAz lx A31 este 10 x20 x5 +10 x5 x40=12 00. iar pent ru paranterizarea (A ,x(A zxA 3ll este 10x20 x4 0+20x5 x40=12000 (de 10 on mai mare decat in exemplul anterior). V aloarea aso ciata solutiei este nurnarul de Inrnultiri scata re, iar tunctia recu rsive m (i,j ) defineste nurnaru l minim de i nm ultiri scalare pentru calculul mat ricei produs A iX. . .x A o daca i= j m(l,j) = { min{ m(i,k) + m(k+1,j) + pil xp kxPi I iSk<j } daca i<j Nurnarul minim de inmultir i scalare pent ru calculul produsului A1 X . . x A n es te m (1,n). Pentru a me mora pozit iile para nteze lor optirne se va folosi matr icea 5 , i n care ele mentul Sij are valoarea k ce reprezinta pozitia parantezei optime i n produsul A iX . . . x Aj . Altfe l spus , Sij este egal cu k pentru care m(i.j) = mli ,k) + m(k+1,j) + p i1xp kXPi

1.7. Compararea metodclor de construire a algoritmilor


Meto d ele backtracking , greedy ~i programarea dinamic a se recornand a i n cazul problemelor care au urrnatoarele caracteristici: -7 solutia poate fi data de un vecto r sau a matrice cu elemente de tip int reg; -7 elem entele solutiei apartin unui subdomen iu hmitat. Algoritmu l backtracking are cea mai mare complexitate (complexitatea exponentials ), iar algor itmul greedy, cea mai mic a. Alegerea uneia dintre aceste metode se face i n functie de cerinlele problemei : -7 Oaca se cere determinarea tutur or sol ut iilor , se va alege metoda backtra cking .

84
-7 Daca se cere determ inarea so l ut lei o pt ime ,

Teh n ici de programarc


S8 va alege metoda gree dy . daca S8 poate demonstra ca ea furn izeaza un rezuJtat corect: altfel , S8 va alege metoda pr o qram arii di namice .

Metodcle grccdy slproqrarnaroa dinamica S 8 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 proprieta tea de optim loc al, adica solu tia optima a problemei cu dimensiunea n a datelor de intrare co ntino solutiil e opt ime ale s ubprobleme lo r similare cu problema initiala, dar de dimen siune mai mica. Deosebirea dintre cele doua metode consta in modul in care este constru ita solutia : 1.

in cazul metodei p rcqrarnarii

dinamice , S8 po rneste de la structura probleme i initiate care corespunde solutiei optime globale si se descompune ace asta problema in subprobleme in care se deterrnina sotutiile optime ale subproblernelor (optimul local). Ea se poate aplica in problemele in care opt imu l global irnptica opti rnul local. Din aceasta cauza, etapa cea mai dificila la aceasta metoda este cea de determinare a structurii solutie i optirne . Oaca se cunoaste structura solut iei optime, metoda q ar antcaza o bti ne rea s o l ut io ! optime a problemei prin determinarea optimului local.

2. i n cazu l metodei g ree dy , se porneste de la solutiile optime locale si pe baza lor se construie ste solutia optima globala. Prob lema este desc ornpu sa in subpr oblerne ~ i solutia este construita trepta t: se porneste de la rnultimea vida ~i se alege pe rand pentru fiecare eleme nt al solutiei candidatul optim pentr u acea subproblerna. Alegerea solutiilor optime locale nu qaranteaza l nsa ca solutia globala obti nuta este si solutia optima, deoreee opt imul loca l nu implica intotd eauna opti mul global. Din ace asta cauza, pentru a fi siguri CB. solutia aleasa este solutia optima , pentru fiecare problema trebuie sa se demonstreze ca modul de alegere a cand idatul ui optim (oplimul local) implica optimul global. Metoda gre edy este mai sirnpta decal metoda proqrarnarii dinamice deoarec e la fiecare pas se trateaza numai subproblema curenta , jar ordinul de complexitate este mai mic decat in cazul proqra rnar ii dinarn ice. Metod ele greedy ~ i backtracking construiesc treptat solutia problernei, Deos ebirea dintre cele doua metode consta in modul in care se construieste solutia . in cazul metodei greedy, cand S8 alege elementul Xk al solutiei, daca elementul a, care este candidatul optirn al solutiei nu este element al solutrei, el este indepartat din rnultirnea elemen telor candidate la solutie (A). in acest mod el nu va mal fi verificat alunci 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 co mbina metodele lnva tate. Excm plu . Problema pla' ii unci sumc eu un numa r minim de bancnotc eu valori date . Proble ma a fost rezotvata cu ajut orul metodei greedy . Folosi nd aceasta metoda este posibil sa nu obtineu nicio soluue. sau solutia obti nuta sa nu fie solutia optima . Problema poate fi rezo lvata co rnbinand metoda greedy (prin ordonarea vectorului eu valo rile banenotelor dupa criteriul candidatului optim ) cu metoda backtracking. Solutia optima va fi printre primele solutii generate. Apelul subpro gramului btU se va opn imedial ce se depaseste nurn arul minim de bancnote Prin combinarea celor do ua metode se obtm e un algoritm mai efic ient decat algoritmul backtracking, care va permite gasirea sol utiei optime.

In formaticii

85

Metode le divide at irnpera si programarca dinarnica S8 bazeaza pe descomp unerea probleme i i n su bprobtcm e s imilarc c u pro bl em a initi al a. Oeose biril e dintre ce re doua metode sunt: Divide et irnpera Programarea dinamica

1. Subproblemele
Subprcble mele sunt ind ependen te si IlU se cunase de la lnceput s ub prob lerne le care apar in urma descompunerii. De multe ori descompunerea in subprob leme depinde de distributia datelar de intra re si es te posibil ca in aceeas i problema, pentru date de int ra re diferite, sa S8 cbtina descompuneri diferite (de exemplu , algoritmul cautaru binare sau algori tmul sortarn rap ide) .
Subprob leme le nu sunt ln depen den te 9i i n descompunerea initiala exista subprobleme comune unor subprob leme de dime nsiuni mai mari, Pentru a se putea rezolva prob lema trebuie s a se c unoa s c a, de la inceput, s ubpro b teme le in care se descompune problema iniiiala. Aceasta pres upune cuno asterea structurii probleme i initiate 9i a relatiei de recurenta care dete rmina sorutla .

2. Asigu rarea oflc ientei rnetodel


Este eficienta numai oaca este respec tata regula de descompunere a problemei in subprobleme independente. Daca nu este asiqurata independen ta problemelor, metoda devine ineficienta oec arece, in apelurile recursive, aceeast subproolema este rezolv ata de mai rnulte ori
Este eficienta num ai caca a subproblerna es te rezotv at a 0 ain qura data, s olutla sa es te mernorata 9i Io tos fta po ntru a ob tlne s olutille

celor lalte s ubproblc me

3. Modul de de scompu nerea ill subprobleme


Descompunerea se face tntr-o marne-a "de sus in jo s" (jop-down"): prob lema ini~ia la este descomcosa i n subprob leme din ce in ce mai mici pana se : btin subprobleme ell rezolvare imediata. se rozorva aceste subprobleme , dupa care se combina solutiile subproblernelo r de dimensiuni din ce in ce mai mari. Descompunerea S8 face int r-o rnaniera "de jos in sus " ("bottom-up"): se rezolva problemele de dirnensiunile cele mai mici care apar i n problema initiala, se mernoreaza solutiile J ar si se rezolva subprobemele de dimensiuni din ce in ee mai mari prin eombinarea sotutiilor probleme lor rna ! mici si memora rea nail or solutf Algoritmu l este iterativ.

4. Algoritm u l
Algoritmul este rccursiv.

Din cauza acestor deose biri aceste metode se folosesc pentru clase diferite de probJeme . De exemplu, pro blema determi nar!i termenului n al sirului lui Fibon acci . Rezolvarea acestei probleme prin metoda divide et impera este ineficienta deoarece pentru a calcula termen ul f n rrebuie sa S8 ca!culeze termenii f n-1 ~i fn-z. Dar, In calculul termenului f n-1, reapa re calculul termenului fn -z, iar in calculu l ambilor termeni apare calculul termenului fn -3 s.a.rn.d. in acest caz, 5e recornanda metod a proqrarnarii dinamice , calculand pe rand termenii ta. f4, ... . fn, pornind de la termenii f1=fz = 1. Formula de recurenta este: fi = fi-1+fi-2, pentru 3:::;;i -;::;n. Deoarece termenul f i nu depinde decat de doi termeni fi-1 :;;i fi-Z, nu este neces ar sa se memoreze intregul sir de termeni, ci pentru fiecare subproblerna i, numai terme nii obtinuti In subproblernele i-1 'ii i-2.

I JE:~nmTI.1ULSlJre I
Adev arat sau Fals :
1. in algor itmu l meto dei backtrackin g initializ area elernen tului k al solutiei 58 face cand se revine de pe nive lul k+1 la nivel ul k .

86
2. 3. 4.
5.

T chnici de program ar c
Algaritmul metodei backtracking se incheie daca s-au testat toate valari le posibile pentru primul element at solutiei . in algoritmul backtracking. dupa gasirea unei solutii, S8 revine la nivelul anterior at solunei, i n algoritmul backtracking . trecerea de la nrve lul k la nivelul k -1 al solutiei se face cupa ce s-a u gasi t toate valorile pos ibile pentru nive lul k . in algoritmul backtracking initial izarea nivelului k al solutiei S8 face eu valoarea de pe nivelul anterior al solutiei, i n algo ritmu l bac ktracking . daca s-a trecut la nivelul k al solutiei. i nse am na ca s-au gasit primele k -1 elemente ale solu tiei. in algoritmul backtracking, trecerea la nive lul k+ 1 al sol utiei se face dupa ce au fost testate toate valo rile posibile pe ntru nivelul k al solutiei, in impleme ntarea recur sive a metode i backtracking reve nirea din autoap el este echivalenta eu reve nirea la nivelul anterior al solut iei din varia nta ite rativa. in implemen tarea recursiva a metodei backtracking autoapelul este echivalent eu trecerea la nivelul urrnator al solutiei din varianta iterativa. Divide et impera este metoda prin care problema ini\ial a se descompune in subprobleme care nu sunt independente. Prin metoda divide et impera se gase ~te solutia optima a problemei. Metoda proqrarn arii dinamice porne ste de la solutiile optime locale si, pe baza lor. construie ste solutia optima globala. in metoda proqrarn arii dinamice descompunerea in subprobleme S8 face .ce susin jos", Metoda greedy se bazeaza pe teorema ca optrmul local implica i ntotdeauna optimul global.

6.
7.
8. 9.

10. 11. 12.


13. 14.

Aleqeti:
1. Algoritmu l care implementeaza metoda backt rack ing este :
a. polinomia l
2. 3. 4.

b. logaritrnic

c. expon ential

d. linia r logaritmic
d. liniar logaritmic

Algoritmul care impleme nteaza metoda sortarii rapide este : b. logaritmic c. patratic a. liniar

5.

6.

7.

Algoritmul care implementeaza metoda cauta rii binare este : b. logaritmic c. patratic d. liniar lagaritmic a. liniar Se utilizeaza metoda backtracking pentru genera rea anagramelor cuv ant ulu i rnasca . Sa se precizeze cuvantul precedent si cuvantul urrnator sec vente i camas , camsa , caams: a. csaam l?i casma b. csama ~i casma c. csaam si casma d . csaam ~ i caasm Se utilizeaza met oda backtracking pentru generarea tuturor num erelor cu 4 cifre distincte care se pot forma cu cifrele O. 2. 4 si 8. Sa se precizeze nurn arul prece dent ~i nurnarul urrn ato r secven tei 2840 4028 4082 : a. 248 0 ~i 428 0 b. 2804 si 4280 c. 2804 si 4208 d . 2480 ~i 4280 Se utilizeaza metoda backtracking pentru generarea siru lui de opt paranteze rotunde astfel i ncat e le sa formeze 0 succesiune corecta. Sa se precizeze sirul de paran teze preceden t ~i sirul de para nteze urrnator secv entei (0(0)) (000) (O())O: a. ((0 0 )) si O((())) b . ((0 0 ~i O((())) c . ((0))0 si (())(O ) d . ((O()) ) ~ i (O)(()) Se utilize aza metoda bac ktracking pentru gene rarea sub rnuttirnilor mult irnii (1,2 ,3). Sa S 8 precizez e submultimea precedenta !?i submultirnea urmatoare secventei de subm ultirni ( 1) ( 1,3) (1.2) : a. 0 si (2,3) b. 0 si (2) c. (2,3) ~ i (1 ,2.3) d . 0 ~i (3)

In fo r m a t ira

87

Daca se utilizeaza met oda backtracking pentru a genera toate permutarile de 5 ob iecte ~ i primele 4 per rnutari generate sunt: 54 3 2 1. 5 4 3 1 2. 5 4 2 3 1, 5 4 2 1 3, atunci a cincea permu tare este: a, 5 4 3 2 1 b. 5 3 4 2 1 C. 5 4 1 2 3 d . 5 4 1 32 (Bacalaureat - Sesiunea speciala 2003 ) 9. Se cere dete rm ina rea tut uror rnodalitatilor de planific are in zile diferite a 4 probe (rezistenta. aruncarea sulitei, sarituri , tir) in oricare dintre cete 7 zile din sa ptarnana . Prob lema este echivalent a cu: a. generarea cornbin arilor de 4 obiecte luate cats 7 b. generarea aranjam entelo r de 4 obiecte luate cate 7 c. generarea cornbinarilor de 7 obiecte luate cate 4 d. genera rea aranjame ntelor de 7 obie cte luate cate 4 (Bacalaureat - Ses iunea spec iala 2003) 10, Generarea tuturor siru rilor de 3 elemen te, fiecare eleme nt putand fi on care num ar din multirnea {1 ,2 ,3,4,5,6), se realize aza cu ajutor ul unui algoritm echivalent cu algoritmul de generare a: a. aranjamentelor c. cornbinarilor d. produ sului cartezian b . perrnut arilor (Bacalaureat - Sesiunea specials 200 3) 11. Se cere determinarea tut uror rnoda litatilor distincte de asezare In linie a tuturor cetor n sportivi aflat i la 0 festivitate de premiere , Problema este echivalenta cu genera rea : a. partitillo r unei mult imi de n obiecte b. aranjamentelor de n obiecte luate cate 1 c. perrnuta rilor de n obiecte d. submultirnilo r unei mult.rni cu n obiecte (Bacalaureat - Sesiunea iunie-iulie 2003) 12. Conditia ca doua dame Q ~i D (de tip structural sa se afle pe ace easi diaq ona la a table i de sah este : a . (Q. l inie ==D. l i n i e ) II (Q. c o l oa na ==D. c o l o a na ) b. ab s (Q.linie- D. l i n i e l ==ab s (Q. c o l oana- D.coloana ) c . Q. l i n i e -O .linie == Q. c o l o a na - O. c oloana d. a b s (Q . lin i e - D . c o l o a n a ) = =ab s { D . l in i a - D .~ o ~ oa~a ) (Bacalaureat - Sesiunea iunie-iulie 2003) 13. Se cere determi narea tutu ror numerelor formate cu cifre aflate in ordi ne strict crescato are, cifre alese din tr-o rnultime cu k cifre distincte date. De exemplu, pentru cifrele alese din rnultirnea {1,5 ,2) se obtin nume rele 1, 2,1 2,5 , 15, 25,1 25 (nu neaparat i n aceasta ordine ). Prob lema este echivalenta cu gen erarea: a. partitiilor unei rnultirni b. aranjame ntelor de 10 obiecte luate cate k c. permuta rilor de k ob iecte d. subrnultirnilor nev ide ale unei multirni (Bacalaureat - Sesiunea august 2003) 14. Cineva do reste sa obtina ~i sa prelucreze toate nume rele forma te din trei cifre din sirul 2, 9, 4 ~i Ie genereaza exa ct i n ordinea 222, 229 , 224, 292, 299, 294 , 242, 249, 244, 922, 929, 924 , 992, 999, 994, 942, 949, 944, 422, 429, 424, 492, 499 , 49 4, 442 , 449 ,444 . Daca doreste sa obtina prin acelasi procedeu numerele formate din 4 cilre , atunci dupa nurnaru l 4944 va urma : a . 4949 b . 9222 c . 4422 d . 4924 (Bacalaureat - Simulare 2004) 15, Un etev foloseste me toda back track ing pentru a genera subrnul tirnile multimii {1,2,5,6,9}. Cate solutii (submultimi) care obligatori u contin elementul 2 ~ i nu contin eleme ntul 6 a gen erat? a, 7 b. 16 c. 6 d. 8 (Bacalaureat - Sesiunea spe ciala 2004)

a.

88

Teh nici de programurc

16. Pentru a determ ina toa te rnoda litatile de a serie pe 9 ca surna de numere natur ale nenule distincte (abstractie facand de ordinea termenilor). un elev folo seste metoda back tracki ng qen er and, in ac easta ordine , toate solutiile: 1+2+6. 1+3+5 . 1+8. 2+3+4 , 2+7, 3+6 si 4+5 . Aptic and exact acee asi meto da , el de te rrnma solutiile pentru scrierea lui 12. Cate solutii de form a 3+ ... exista?

a. 7

b. 1

c. 2

d. 4

(Baca laureat - Sesiun ea iunie-iulie 2004) 17 . Pe ntru proble ma ant erioara , care este a opta sol utie deterrninat a? a. 2+3+7 b. 3+4+5 c . 1+5+6 d. 1+ 11 (Bacalaureat - Sesiune a iunie-iulie 2004) 18 . Pentru problem a ante rioara stabi liti care este solutia cu pro prieta tea ca imediat dupa ea este qenerata solutia 3+4+5? c. 2+ 10 d. 4+8 a. 3+4 +6 b. 2+3+7 (Bacalaureat - Sesiu nea iunie-iulie 2004) 19. Se gener eaza toate pe rrnutarile distincte de 4 obiecte nu me rot ate d e la 1 la 4 , avand prop rietatea ca 1 nu este vec in cu 3 (1 nu se afla imed iat dup a 3, ~ i nici 3 imediat dupa 1) ~i 2 nu este vecin cu 4. Cate astle l de permut ari se qenereaza? a. 12 b. 24 c. 6 d. 8 (Bac ala ureat - Sesi unea augusl 2004) 20. Se cere sa se determine to ate mcdalitatile distincte de a programa n sp ectacole i n z zile (de exemplu , doua spectacole .Micul Print " ~ i . Pacata" se pot programa in trei zile, mart i, miercuri si jo i, astfel: "Micul Print " - rnarti si .Pacala" - miercuri sau : .Micul Print" - miercuri ;;i .P'a cala" - rnarti : "Micu! Print" - miercuri ~i ..Pac ala" - joi: "Micul Prin]" - rnarti ~ i "Pacala" - joi : .Micul Print" - joi si .P'a cala" - miercuri etc .). Rezolvare a se bazeaza pe algoritmul de generare a: a. combinarilor de n obiecte luate cate z b. aranjam entelor de n obiecte luate cate z d. aranjamentelor de Z obiecte luate cate n c. cornbina rilor de Z obiecte !uate cate n (Bac alaureat - Simulare 2005) 21. Se considera algont mul care dete rmina toate pe rrnuta rile distinct e de n obiec te (numerotate de la 1 la n) i n care nu exista poz itii fixe . 0 permu tare (p " p z, .... Pn) are puncte fix e daca exista cel put in 0 cornponenta Pi=i . De exemplu , pentru n=5 , permutarea (2.3,5,4 ,1) are puncte fixe deoarece P4=4. Pentru n=4 , stabilliti cate permu tari tara puncte fixe exista. c. 10 d . 12 a. 8 b. 9 (Bacalaureat - Sesi unea speciala 2005 ) 22. Se consid era algoritmul care determina toate perrnutarile distincte de n obiec te (nume rotate de la 1 la n) in care pe once pozitie de rang par se ana 0 valoare para. De exernplu, pentru n=5, primele trei perrnutari generate in ordine \exicografica sunt (1,2,3,4,5), (1,2,5 ,4,3), (1,4,3,2,5). Pentru n=4, nurnarul total de astfel de perm utari este: a. 2 b. 4 c. 8 d . 12 (Bacalaureat - Ses iunea iun ie-iulie 2005 ) 23. Se conside ra algoritmul care genereaza . in ordine strict crescatoare, toate numerel e formate din n cifre distincte (cifrele de la 1 la n), numere in care pe fiecare pozitie para 58 afa 0 cifra irnpara . Pozitia se nurnara de la stanqa catre dreapta , pornind de la pozitia 1. De exernp lu. pentru n=4, prime le trei numere generate sunt: 2143 , 2341 . 4 123. Pentru n=5 , primul numar generat este : c . 12345 d . 13254 a. 21345 b. 2 1435 (Baca laureat - Scsiunea august 2005)

l nfu r mat icii

89

24. Se genereaza toate subrnultirn ile formate din doua elemente ale rnultimii (5 ,6,7,8) i n ordinea: 56, 57 , 58 ,67, 6 8, si 7 8. Daca se utilizeaza exact aceea"i metoda pent ru a genera submult imile de trei elemente ale multirnli (2,3,4,5,6), atunci penu ltlma multime generata es te: c. 456 d. 2 5 6 a. 3 45 b . 356 (Bacal aureat - Simulare 2006)

Miniproiecte :
Pentru realizarea m iniproiectelo r S8 va lucra in oc h ip a. Fiecare miniproiect va con tine: 3. doua metode pc ntru con struirea algoritmului (care sunt precizate in cazul pnmelor 8 miniproiecte); b. justificarea Io losirii metodelor care au fast alese pentru rezolvarea problemei; c. explicarea metode lor folosite pentru construi rea agoritmului; d. compararea celor doua metode din punct de vedere al corectitu dinii solutiei: e. compa rarea celor doi algoritm i din punct de vedere al cornplexitatii. 1. Rezolva!i problema acoperirii tab lei de sah de dimensiunea n xn cu un cal care porneste din patratul de coordonate (x ,y) folosind meto da backtracking si metoda greed y. 2. Rezolvati problema cost ruirii tevii de lungime L din bucati de teava de lungimi a: folosind me toda back tracking si metoda proqrama rii dinarnice. 3. Rezolva ti prob lema gas irii unui traseu pentru a ie;;i din labirintul de dimensiunea nx rn, stiind ca se porneste din patratul de coord onate (x,y), folosind metoda greedy si metoda backtrac king. 4. Rezolvati problema platii unei sume cu bancnote cu valori date , pentru fieca re valoare de bancnota avand la dispozitie un anumi t nurnar de bancnote, fo losind metod a proqrarnarii dina mice si metod a backtracking. 5. Rezolvati problema turistului care trebu ie sa gaseasca un traseu de munte in care sa urce cat mai putin , folos ind metoda proqrarnari i dina mice ;;i metod a greedy. 6. Rezolvati problema deterrninarii sumei maxime l ntr-un triunghi folosind metoda greedy ;;i metoda proqrarnarii dinarnice . 7. Rezo lvati prob lema dete rrninarii unui subsir crescator de lungime maxima folosind metoda greedy si metoda proqramari i dinamice. 8. Se dau n paralelipipece avand fiecare dimensiunile a r, b i ;;j c., Sa se cons truiasca un turn de lna ltime maxima prin suprapunerea acestor paralelipipede. Un paralelipiped poate fi asezat pe orice fa\a Un paralelipi ped poate fi aranja t peste un alt paralelipiped numa i daca fata lui nu depaseste fata paralelipipedului pe care este pus. Rezolva ti prob lema folosind metoda bac ktracking ;;i meto da proqrarnarii dina mice . 9. Pe 0 tabla de sah de dimensiunea n xn un cal porncste din patratu l de coor dona!e (X1,Y1) si trebu ie sa ajunqa in pat ratul de coordonate (X2,Y2) Sa se gaseasca traseul de lungime minima . 10. 5 e dau n piese de domino, fiecare piesa i fiind descrisa prin perechi de doua numere (Xi,Yi). Sa se gaseasca 0 secventa de lungime maxima de piese i n care oricare doua piese alat urate au inscrise la capetele cu care S8 lnvecineaza acelasi nurna r.

2. Implementarea structurilor de date


2.1. Tipuri de date specifice pcntru adresarea memoriei
Memoria intern a a calculatorulu i este orqanizat a sub forma unor locati i de dimensiunea unui octet, numerotate consecutiv, pornind de la O. Aceste nurnere, ex prim ate in hexazecimal, S8 numesc adrcse de rnernorie- Locatiile de me morie pot fi mani pulate individual sau in grupuri contigue. Spatiul de memorie este gestionat de sistemul de operate. Fiecaru i program aflat in exec utie, sistemul de ope rare Ii rezerva (aloca) propriul spatiu de memorie. Daca programul apeleaza subprograme, acestea pot fi privite ca blocun care contin instructiuni ,i date (variabile de memorie ,i structuri de date), carora sistemul de operare trebuie sa Ie aloce
spatiu de memorare in interiorul zanei de memorie rez ervata programului principa l (ca re

corespunde fisierului sursa). Spatiul de memorare este Irnpartit in patru segmente, iar proceso rul are aece s la toate ce le patru segmente , ale carer adrese Ie qestioneaza prin inte rmediul unor req istri: -7 segment u l d e cod - in ca re S8 in ca rca ins tructiu nile programului care se executa ;

adresa de inceput se pastreaza in registrul CS; -7 seg m e nt u l de dat e - in care se inca rca anum ite date ale progra mului care se executa (de exemplu , variabilele globale) ; adresa de inceput se pastreaza in registrul OS ; -7 se g mc nt u l d e s t iva a sistemului - in care se inca rca adresel e de reveni re din subprograme , i variab ilele locale cu care lucreaza subprograme le; pentru gestion area sa se folosesc doi reqistri: SS (in care se pastreaza adresa de la baza stivei) SP (in care se pastreaza adresa de la varful stivei); ~ ex traseg ment ul de date - in care se incarca alte date ale programului; adresa de inceput se pastreaza in registrul ES.

,i

Siste mul de ope ra re aloca spatiu datel or in mai mu lte zone de mernorie- in functie de modul in car e a u fost de clarat e in program

zona de a dre~~ ibe~~~~ stiv a siste mu lui (s tack ) 7 I(varia bile gIObal:t(alocarea implic ita)

va ria bile locale (alocarea implicita)

-.

segmen tu l d e da te
r e g i ~ trii

I variab ile

loc al e static e (aloc are cu stati c)

pr o ce s or ului

variab ile lo c al e (alocare cu reg is ter )

o dat a rnanipula ta de prog ram prin inte rmediul unei varia bile de memorie e ste carac teri za ta
de mai multe at rib ute - pe ca re Ie prirneste in momentul in care este declarata in program : -7 Nurnele- Este identificatorul folosit pen tru referirea da tei in cadrul prog ramului (in

exemplu - a). -7 Adres a- E ste ad resa de memorie interna la care se aloca spatiu da tei res pe ctive , pe ntru
a stoca va loarea datei (in exemplu , da tei i se aloca ad resa adr in stiva siste mu lui).

Informatica

91

..
void sb ( )

2 octeti
~

valoarea date;

a = nume dat40000000011 0010 t- - - - - - - '


lint
a ~ 100 ;

.. .}

ad r = adresa zonei de memorie

ad r+2

Memoria intema

-7 Valoarea Este continutul, la un momen t dat, al zonei de memorie rezervate datei (In
exemplu - 100 (10) = 1100100(2)) .

-7 TipuL Determina: domeniul de defi nit ie inte rn al datei (rnultirnea In care poate lua
valori data). o pe rato rii care pot fi aplicaf pe acea data si mo dul i n care data este reprezentata i n mem oria lntorn a - metoda de codificare in binar a valorii datei (in exemplu, tipul este unsigned int domeniul de definitie intern al datei este intervaluJ [0, 65535]) , operatorii care pot fi aplicat i pe aceasta data sunt operatorii perrnisi de tipul nume ric - aritmetici, relationali, logici, logici pe biti etc. - ~i reprezentarea datei in memoria intern a S8 face prin conversia nurnarului din zecimal in binar). -7 Lungimea. Este dirnensiunea zonei de memorie alocate datei ~ i se mascara in octeti. Ea depinde de modu l de reprezentare inter ns a tipului de data (in exemplu, datei i se aloca un grup contiguu de 2 octeti ). Pentru a afla dimensiunea zanei de memorie alocate 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 memorare (In exemplu, data a este a variabila eu durat a loc al a careia i se aloca spatiu de memorare numai pe dura ta de executie a blacului i n care a fost decla rata, adica pe durata de executie a subprogramu lui sb ).

Pentru a putea manipula 0 data , prog ramul trebuie sa identifice zona de memorie in care este stocata. Identificarea acestei zone se poate face atat prin numele datei (a), cat si prin adresa la care este mernorata (adr). Pentru a putea manipula datele cu ajutorul adreselor de memorie , In limbajul C++ sunt imple mentate urrnatoarele tipuri de date: -7 tipul pointer sau adrosa -7 tipul roferinta Se poate folosi un nou criteri u pent ru elasifiearea datel or:

criterilJlsernrifjq~liei

contlnutului

\,
Adresele sau da te le c are pe rmit ad resarea ope ranz ilor. Sunt date ale carer valori sunl folosite pentru localizarea pe suportul de memorarea datelor care sunt preJucrate(operanzii).

Operanzii sau da te Ie care fac ob iectuJ ope rat iilo r de prelucrare. Sun! date ale carer valori sunt tolosite ca operanzi in cecru! expresiilor.utilizete pentru calcu larea rezultatelorcerutede problema.

2.2. Tipul de data pointer


Pointerul este
0

va riabila de mem oria in care se m emoreaza

ad resa de memorie.

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 ind ica a zona de memorie care

92

Impl cm en turcu st r ne tu r ilo r d e d ate

contine 0 data care are tipul de baza . Este necesar sa S8 asocieze pointeru lui un tip de data deoarece el mernoreaz a numai 0 adres a si, pentru a manipula cont inutul unei zone de memorie, compilatorul treb uie sa cuncasca dimensiunea zanei de memorie care incepe de la acea adresa ~ i sernnificatia continutului, adica ce algoritm de decodificare trebuie sa folosea sca pent ru a trans forma secventa de biti (din acea zona de memorie) intr-a data.

2.2.1. Decl ararea variubi lelor de tip pointer


Decl arare a une i varia bile de tip pointer S8 poate face prin instructiunea decl ar ativa :

t i p_ d a t a

II

lipul datei stocate la adresa merr-orata in pointer (Hpu l de baza )

numele var iabiJei de tip pointer in care se mernoreaza adresa unei variab ile de memoria care are tipul de bez a operatorul de referl nt a

*n u rne va r iabila ;

.,.

Exernp lu :
cha r

*p ; in t *q ; f l oa t *r ;

S-au deflnit trer variabile de lip adresa (pointeri): p catre tipul cha r, q catre tipul inl si r catre tipul fl oat. Nume le acestor 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. A sadar, p esl e 0 variab ila de tip adresa a unei loca tii ce confine un caracter care ocupa 1 octet , q este 0 variabila de tip adres a a une i 1 0ca\H ce contine 0 data numerics i ntreaqa care ocupa 2 octeti, iar r este 0 variabila de tip adr esa a unei lcca tii ce contine 0 data nurnerica reata care ocupa 4 octeti . Se poate declara un po inter catre ti pul de data i nreg ist rare (adres a un ci Inreqist rari). Exe m plu :

struct punet {in t x ,y ; }; pun c t; *p; S-a definit variab ila p de tip adresa catre tipul inregistrare pun ct , ad ica 0 adresa a unei locatii care contine doua date numerice intregi de tip int ce ocupa 4 octeti.
Pointerul zero are v alo area 0 si i ndic a zo n a de mem ori a d e la adresa O. Pentru Iimbajul C++ adresa 0 i nseamna 0 adresa care nu este valid a pent ru date , adica 0 ad rcsa in exi st en ta.. Altfel spus , pointerul zero nu indi ca nimi c, Ac est tip de pointer este folosit ca t erm in ator in structurile de date care sunt prelucrate cu ajut orul pointe rilor.

2.2.2. Constante de tip adresii


a
cons tanta de t ip ad resa este un pointer al ca rui co ntinu t nu p oat e fi m odificat.

Exc m pl u. Con stanta 0 - car e sernn.fica .adresa nula" (adresa inex istenta sau adres a nealoca ta) - este utila, in unele cazuri, pentru initializarea valcrii unui pointer. in locul cons tantei numerice literale 0, se poate folosi co ns ta nta s imboli ca predefi nita NULL.
Observa tie La declararea unui tabl ou de mem ori a, acestuia i se aloca 0 zona de memori e de dimensiune fixa, lnc epand de la 0 anumita adresa de memorie . Ad resa de la care se aloca zona de m em or ie este 0 const ants (nu poate fi rnodificata) !?i ea este asociata eu

Informaticii

93

numele tabloului de memorie. Nu mele tabloului de memoria este tolos it de compi latorul C++ ca a constants s irn boli 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 fieca re element ocupa acelas i nurnar de octeti . Acest mod de memorare perm ite determina rea adresei fiecaru i element pornind de la adresa sirnbolica a tabloului , care va reprezenta ~i adres a primul ui element. Identificarea unui element de tablou de memorie 58 face folos ind pentru fiecare element un grup de indici (nurnaru l de indici fiind ega 1 cu dimensiunea tabloulu i), adresa elementului calcu'andu-se fa\8 de un element de referinta care este adresa tabloului. Deoarece adresa tablou lui este si adresa primului element, In limbajul C++ numer ot ar ea indicilor s e face p ornind de la 0, indicele reprezentand deplasarea elernentului fala de adresa tabloulu i.

Exemplul 1:

int v [5] ;

Zona de memorie alocata unui vecto r are dimensiunea n x slzeofttipbaza). De exemp lu, vectorului v i se va aloca 0 zona de memor ie de 5xsizeof(int)=5x2=10 octeti. ldentificarea unui eleme nt de tablou de memorie se face folosind un singur indice (i). Oaca adresa tabloulu i v este adr, ea este si adresa elementu lui vIOl, iar adresa elementului v[i] este: adr + ix s izeo ftt ipj baz a}.

+V[O]~
adr adr+2 adr+4 adr+6 adr+8 adr este a adresa de me morie care are valoarea c on stantei sim bo li cev Pentru exemp lul de rnai sus, adresa elementului v[2] este : adr + 2xsizeof(int) = adr + 2x2 = adr + 4.

.--.
2 octet i

Exem plul 2:

04
1

4 0cteti linia 2

linia 0

.>: a[O][ OI

a[0][ 1] 1

linia 1

linia 3

adr

adr+2

a[ 1][0]
adr+4

I a[1][1]
adr+6

. ',.

z octeu a1 2][0]

coloana 0 coloana 1

....

I a[2][1] I

04~

t~

..

a[3][0]

a[ 3][11

~I

d +12 a r

adr+14

adreste

adresa de memorie care are valoarea consta ntei simbolice

Alocarea memoriei unei ma trice se face In mod contiguu , memor area elemente lor facan du-se linie cu linie, astfel Incat matr icea apare ca un vector de linii. Daca matr icea are m linii si n coloane , ea va avea mxn eleme nte. De exemp lu, matricea a are 4 x2=8 elem ente ;;i este rnernorata ca un vector eu m elemente de tip vector cu n elemente , care au tipul de baza al matricei (in exemplu, un vecto r cu 4 elemente de tip vector cu 2 de elemente de tip int). Zona

94

Implem entarea st ru ct ur ilor de dale

de memorie alocata unei matrice are dimensiunea m x n x stzeofttipbaza). in exemplu, rnatricei a j se aloca 0 zona de memorie de 4x 2x sizeof(int) =4 x2 ><2=1 6 octeti. Identificarea unui element al rnatricei se face folosind doi indici (i ~i j ). Adresa tabloului este ~i adresa prirnului element, a[O ][O ] . Daca adresa tabloului este adr, adresa elementului a~]m este: adr + ixn xsi zeof(ti p_baza) + j xsi zeof(lip _b aza)= adr + (i xn+j) xsizeof(ti p_ baza) , Pentru exemplul de mai sus, adresa elemen tului a[3] [1] este: adr + 3x2xsizeof(int) + 1xsizeo f(int) = adr + 3 x2 x2 + 1x2 = adr + 14.

2.2.3. Opera tori pcntru variabile de tip pointer


Pe variabilele de tip pointer se pot aplica urmii toarele tipuri de operatori: ~ oper at ori speci fic i, ~ o peratorul de at rib uire , -7 o pera tori ar itme tici , -7 o pe rato ri re latio na l l.

2.2.3.1. Operatori i specifici


Operatorii specifici variabilelor de trp pointer sunt:

-7 Operato rul & - operatorul de ad resare . Se aplica pe 0 vanabila de memorie sau un element de tablo u de memorie l?i furnizea za ad resa variabilei de memorie, respectiv a
elementului de tab lou . Rezultatul obtinut prin ap licarea acestui operator este de tip pointer. Operatia se nurneste referentier ea un c i va ria bile de me morie.
~ Op erat orul * - op eratorul de redi rect ar e . Se ap nea pe 0 variabila de tip pointer ~i furnizeaza va loarea var iabil ei de memorie care se g ase ~te la adr esa rnemorata i n pointer. Rezultatu l obtinut prin aplicarea acestui opera tor este de tipul date i asocia te pointerului. Operatia se nurneste do re torentie rea unui pointer.

I
nume variabila de memorie (continut)

& - operatorul de adre sare rcf c re nt ierea variabi lei de memorie

...
adresa variabila de memorie (pointer)

'* - operatorul de redi rectare +------7~~-""-'-'==------' dereterennerea pointerului


Observa tii : 1. Pointerii reprezinta adrese ale une i zone de me morie (co ntinutul unei variabile de memorie p de tip pointer este 0 adresa de me mori e). 2. Acce sul la 0 zona de memorie se poate face fie folosind identificatorul asociat zonei de memorie (nu me le var iabilei de mem orie), fie aplic and operatorul de redirecta re pe adre sa zonei de memorie (co ntinutul adresei de memorie indicate de un pointer p se refera cu lo p ). 3. Dimens iun ea si sernnific atia continutului unei zon e de mem orie indicate de un pointer dep ind de tipul poin terului.

Exemplul1

int a =1 0, *p =& a; cou t p e nd l a e n d l ; cout pendl \ u e n dl;

In forma tica

95

S-a definit 0 variabila de memorie de tip int (a) ~i 0 variabila de tip pointer catre tipul int (*p) careia i s-a atribuit ca valoare adresa variabilei a. in memoria interna se vor aloca doua zone de memorie: una de 2 octeti, pentru variabila de memorie identificata prin numele a, in care S8 pastreaza a valoare numerica lntreaqa, ~ i una de 2 octeti pentru variabila pointer identificata prin nume le p, in care S8 pastreaza 0 adresa de memorie (i n exemp lu, adresa variabilei de memoria a). Continutul Beeslor zone de memoria asta prezentat in figura .
I

2 octe\i

~ --adC=
Memoria interna

:1

2 Geteti

10

~0

Ptin instructiun ea 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 redirectare '/< aplicat pe variabila pointer p in care este rnernorata adresa variabilei a. Aceasta instructiune are acelasi efect ca ~i instructiunea cou t -oc a , . Prin instructiunea ccu t-ocp, se afiseaZ3 0 constants hexazecirnala care reprezinta 0 adresa de memorie (adresa ad r la care este memorata variabila a). Aceasta instructiune are acelasi efect ca si instructiunea cout & ai.

Exemplul 2 in t a = 10 , b~20 , * p = & a ; b= *P i I +va riabilei b i 58 atri buie v aloarea d e la adresa memorat a in variabila p , ud i ca ve Lce re e v a r i.abi.Le i. a -Joe ! cou txc a-cc ' u b i Ilafi$ea z a 10 10 *p =l OOi I Joevariabilei a c a r ei a dresa este memorata in point. e rul p (adica , variabilei a ) i S ~ at~i bui e va10area 1 0 0 * / cout a " u b i //afi~ea ~ 5. :00 10
Observa tie Daca tipul de data indicat de pointer este tipul i nregistrare , data conune mai multe carnpuri . Operat orul de red ircctare prin ca re se furnizeaza co ntin utul unui camp este operatorul -> si se numeste operatorul de selectie indiracta mcmbrului unci structun

<n u me _ v a r i a b i l a _ p o i n t e r> - > <n u me _ c a mp > EI coniine doua refer inte: una la con tinutul adrese i indicate de pointer si alta catre un membru al l nreqistrarii (carnput). Rezu ltatul furn izat de expresie este valoarea rnembru lui selec tat (a carnpu lui). Este un op erato r bi na r care are prioritate maxima ~i asociativitatea de la stanqa la dreap ta .

Exemplu str u ct pu~ct t i n t X ,Y i } i punc t a = { 3 ,~ } , *p= &a ; cou t a . x" " a . y endl ; cou t -oc p - c-x-c-c" " P - >f ;
Observatii 1.

/ / a fi$e aza 3

/I a ::i.'?eaza 3

4 4

Operatorul * se poate folosi in ambii membri ai unei operatii de atribuire:


* p~ & a , * q= & b ;

,nt a ~10 ,b ~ 2 0 , *q= *p;

II II

( 1) (2)

96
/~ v~riaDilei

hup lcmcntarcu strncturilor de date

d e 12 ad re s a me~o rata in va ri a bil a q , ~ d ica v a r i a b ilei b , i se atribuie v a Loa r ee de La acir e s a memo r a t a 1.:1 vari abila p , adlca valoarca va~iabilei a c c ucc c acc'' " 0 ; //a :i:;;eaz a 10 1 0

~a~ 10 I
"p
adr_3

~~ 1O
*p

~~ 20 q b adr b
q Memoria intern a (1) 2.

I
>

,.~ tb
v

ad r_3 : *q=*p

Memo ria i ntorna (2)

Constructia rp (p fiind un pointer catre un tip de data) poate aparea i n orice expres ie in locul unei variabile de memorie care are acelasi tip ca si eel asoc iat pointerului :

int a ""lO, *p=&a; *r-'= *p +S; /+ Lnc remence a z a cu 5 ve Loe r ee va r i ab i.Le i. de 1a aci r e aa memorat~ i ~ ~a riati~3 P , ad ic ~ valoarea va r i 0b ilei a */ c our.c-c a-c-c'' "<x e p , Ilafi~eaza 15 15
3. Ope ratorii si & sunt operatori unar i si au prioritate mai mare deca t operatorii aritmetici, relationa li, logici ;;i de atribuire.
I\:

in t a=iO , *p"""' &a ; *p += l ; j k i l l c r e m e nt e a z~ co. 1 valoarea va ri a b ~ lai de ],a adresa memora t a in p , a dic5 vaJ. oa r e a va riabil e i a " j
cou t c'<e , j/af':;;caz,'j 1 1

4.

Asociativ ita tca operatorilor unari este de la drcapta la s tanqa . Din aceasta cauza. trebuie folositi cu grija operatorii unari ;. liii ++ (respectiv - -). Astfel, * p++ incrementeaza cu 1 adresa rnernorata i n variabila p, si nu valoarea de la adresa rnernorata i n p :

++* p ;

in t .1--=10 , * .r:= &a ; / - .i nc r eme nt.ea z a ell 1 v a.i oa re.s va r La bi. Le .i. de La ad r e s a memo r a t.a in p , ad.ice ve Loa r e a var i.eb i Le i a ',1 courc c a , / 100 f =-$eaza 11 {*1:. ) ++ ; I ' .i ncr cmcnt.eez a cu 1 va Loa r ea va r i.abi.Le.i de La ec re ee
r.emo r e t a in p, cout a ;

eo f cs

i nc reraen tea za co. .1 va roe ree ve r i.ab i Le i

a *1

5.

Datorita tehnicii de suprainc arcare a operatorilo r permisa de limbajul C ++ , caracterul (asterisc) este folosit ~ i ca operator de redirectare (operator unar) si ca operator de multiplicare (operator aritmetic). Pentru a Inrnulti valorile memorate la dcua adrese de memorie indicate de doi pointe ri P si q este obligatori u sa se foloseasca parantezele:

i n t a ,b= 10 ,c=20 , *p= &b, *q= &c ; eJ..=;( *pl *( *q) ; /"vi;lrLJ.bi1 0 i a i

sc a t ri.bu i.e pr c.dus u l d.lr.t ro va.Loa r ca de

13. udreec mcmor at a in .0 , ~d':"ca vatoa ree va'r i.ab i.Le i. b, s i. vo tce ree de la adresD memO~ az a i n g, ndica valoa~e~ variabilei c f i cout a ; Ila:i~eaza 200

Iulurm at icii
Con siderand declaratia: int <1 ,0 , * p ;.;;;& a; instructiu'b=a+ 1O; nile de atribuire din tabelul aiaturat sunt echiva lente: a b; Asadar, local izar ea une i date memo rate intr-o varia- a++; a-a+5 ; bita de memo rie se poate face prin: b-a*a; -7 adresare directa - folosind numele variabilei de a *-5 ; memorie (in exemplu a);

97
<-> <-> * p~ b ; ,-> ( *p )++ ; <-> *:e-*~ <-> b ~ ( *I' ) * (~LL <-> *p L 5 ;

._ - _ ._ - - - b-* +10;

-7 ad resare lndlrocta - folosind 0 variabi la de tip pointer In care este mernorata adresa zone i de memorie In care este stocata data (In exempJu, p).
1. Scrieti un progra m In care declarati 0 variabila de memorie de tip f loat ~i un pointer catre tipul float , cititi de la tastatura valoarea variabilei ~i l i afisati valoarea folosind cele doua metode de adresare : adresarea directs ~i adres area indirecta. 2. Scrieti un program in care declarati - 0 variabila de memorie de tip inregistrare care va contine doua carnpur i, coresp unzatoara numitoruJui ~ i nurnaratorutui unei fractii, ~i 0 variabila de tip pointer catre tipul imegistrare -' , citit i de la tastatur a valorile carnpur ilor din i nregistrare ~ i afisaf valorile acestor carnpuri folosind cele doua metode de adresare: adresarea directa ~i adresarea indirecta. ----.... ......-.....

2.2.3 .2. Operatorul de atribuire


Unei variabile de tip pointer i se poate atribui numai 0 valoare care reprezinta 0 adresa de mem orie. Ea poate fi exprirnata prin: -7 0 adresa de mamorie obtinuta prin apl ic area operatorului de ad resare pe 0 variab ita 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 variabila 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. - Num ele unui tablo u de m em ori e este a constan ts de tip adresa. Dupa opera tia de atribuire, variab iJa de tip pointer va adresa zona de memorie in care este stocat primul element al tab loului - in cazul vecto rulul. elementul cu indice!e O. ~ Constanta 0 sau const anta sirnbolica predefinita NULL - care corespunde pointerului ze ro - poate fi atribuita oricaru i tip de pointer. -7 Rezulta tu l un ei expres ii c onstr uite cu operanzi de tip adrosa a unor date definite anterior ~i care apartin tipului de baza al pointerului . Observatie . Un ui pointer i s o po ate atribui un pointer de all t ip dedit l ipu l de baza numai daca se aplica operatorul de conversie expliclta de tip . Acest operator trebuie aplicat ln sa cu foarte mare precautie , deoarece de multe ori rezultatul obtinut nu este cel
dorit. int ~=1 0 , *p = &a ; float *q; q= ( f l o a t * ) p ; //Nerr,ori a Lnt e rnz (1) / ~ t i p u l exp re s j c i (ELoa t.v j p e s t c f1oat * , ad i.cei p ointer cat re tLpu I float, :;.;i in eccs t mod po i .nt e r-u-L u i. q i s -a putut c t ri. bu.i. a dr c c a memor a t.S in p o .i.nLe ruI p "/ c o o t-cc vqc-cendj 1/ Af i s ea za 1 .401 29 l:J e -iJ tl , un n uma r rea l .

98

Implcmc utarea struct urilor de date

I ~ Pointerul q i ndi ca 0 zona de me~ rie de tip fl oat de 4 octeti , din car e p rimi i 2 oc t.c t i con r in repr e zentarea in comple men t fa t a de 2 a nu mar'u Lui. i n t r e g 1 0 , La r urma t .or.i.L 2 oc t.e t ; 0 valoa r e r ezLdua La . ru st. r u e t i unea de af i$are face conver s i a valorii memora te , d i n r epreze ntarea i n f o rmat i n t e r n in r e pr ezentar e a in forma~ extern , interpre t and- o ca pe un numar r e a 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-lemo r 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 nte rul q cou t* p; II Afi$ea za Of u n n u ma r i n t reg . /~Poi n t e r u l p indica 0 zona de memorie de tip in t de 2 octe t i , ca re re prezinta pr.imi i 2 octet;. i di n grupu l de 4 oc t et;.i in care a fo s t r e pre zental in v.i rqu La mob i.La s Lmp.La precizie nurre ru l real 1 0 . j nst ruc t.Lunea de
afi~are in~ern

face conversia valorii memorate din r ep r e ze n t a r ea in f o rma t rep~ezentarea in fo~,at e xtern , in~erpret and -o ca pe un nu~ar intreg r e p r e ze n t a t i~ complement fat a de 2 ~ I
in
20cteti

)
p

adr
20cteti
adr

(
Memoria interna (1)

)
q

...I i

.>
)' q Exernpl ul 1: c ha r c = 'A ' , *p;

:: e \y
:::et~L
P
~e

1 a_/ _'_ad_r_ 4~
.1 4

..

2 octet i

m~~i1a sjmpla precizie

reprezentat in vi rqula

Memoria iriterna (2)

p=&c;

:*\ar~abilei

tip pointer ca:re caracter i se at ibuie

adres a v ari a bilei de memorie c ~ I cou t-c-cc-oc" "<x e p : I /af:'~eaza A A Exernplul 2: in t 0=10 , *p =& a , *q ; q=p; l ir poi nt e rului q i se a tribuie v a l oa r e a p oi n t e r u lui P, adi c a a dre s a va r i ab i l e i a ~ / cout *p " " *q ; //af i ~eaz~ 10 10 Exemplul 3: Numele unui vec tor e ste numele unei var iabile de rnemorie, dar ;;i 0 constanta de tip ad resa CII tipul de baza al eleme ntelor vecto rului , care indica primu l element al vecto rului. Pointerului p i se poate atribu i adresa vect orului a exprirnata prin :

In 1"" f ill a t ira

99

-7 cons tanta sirnbo lica a; -7 operato rul de adre sare & aplica t pe nume le va riabilei a ; -7 operatorul de ad resare & aplicat pe identlficatorul primului elemen t al vectorului a[O],
iar urrnatoarele operatii de atribuire sunt ech ivalente: p=a <-> p=&a <-> p = &a [OJ ~ i *p <-> a[O] int a[lOI , i ,k-l , *p ; f or (i:0 ; i <10 ;1++) a[ i] =k++ ; p =a ; j Jvar i a b i l ei p i s e a tr ibu ie nurne l e vecto r u lu i d , ca re e s t e 0 c o n s t a n t a simbol ica de t i p adre sa * / cout.cc ep-;c" "<c a l Oj c c e nd L, //afi $e az a 1 1. - va Ioa rea e l ementul u i a l O] Excmplul 4: Numele unei matrice este numele unei variabil e de me mo rie, dar ~i 0 constanta de tip adresa cu tipul de baz a al elemente lor ma tricei, care indica pr imu l elem ent al rnatricei. Pentru un pointer p cu tipul de baza al elementelor matricei a, care trebuie sa ndice pr imul element al matricei, urma toarele operatii de atribuire sunt echi va lente : p=a <-> p=&a <-> p=a[ O] <-> p=&a[O] [0] ~i *p <-> a[O ] [0 ]
i n t a[lOJ [lOJ ,i ,j ,k~l, *p ; f or (i=O ;i <lO ;i+~) fo r (j-O ; j<lO ;jH) a l i ] fjJ~kH ; p =a ; I * v a r iabile i p i SP e t ri bu.i e n u mel e ma t rice i d , c a re este 0 cons t a n ta simbo li ca de ti p adresa k / ccutxcepc-;'' " a [OJ [0] <cendk , / hlfi~ea za 1 1 - veuoc r ea e.lenentulua a (OJ [0]

Exemplu l 5:
i nt a[4][Sl,i ,j ,I:-1, *p ; =or {i=O ;.i<4 ;i++) for (j-O ;j<S ;jH) a[iJ [jJ-k++ ; p =a [0 ]; ;*'variabi l ei p i se e t r i.bu Le adre s a vecto rul ui f orma t di n p rima l i n i e a mat r ice i a , c a re este 0 c o n s t a n t a * /

cou t *p " " a rO] {O] e nd l ;


/afl~eaz a

1 -

v a Lo e rce e Lemen t u Lu.i a[O l [ OJ

Exe m pl ul 6:
.i n t; * q ;

q=O;

II pointerului q i
/~nu
v

5e atr ibuie consta nta


ni~ic ,

=out*q endl ;
q= NULL;

afi~eaza

deoarece pointerul q are

a Lo a r-e a 0 s i e I fit; i n d i c a n i.c i 0 a d r- e s S d e rnemo r Le ... / II pointer~lui q i 5e atribuie constanta simbolica NULL c out* q; !knu afi~eaza nimic deoarec e pointerul q are va Loa r e a NULL s L el nu indica n i ci G adresa. de memo r i e ... /
Unui pointer nu i se poate atribui valoarea unei constante intregi , Atcntie chiar daca este a con stanta hexazc cim ala, deoarece programato rul . . nu are acces direct la adresele de me morie pentru a Ie gestio na. .Jnei date nu poate sa ii atribuie 0 adresa de memorie decat sistern ul de ope rare .
0 constanta simbolica de tip adresa , une i variabile de tip tablou nu i se poate atribui a alta variabila de tip tablou sau un : ointer ca in exe mp lul urrnator :
I

~ Deoarece nu m ele tabl oului d e memorie este folos it de cornpila-

~ toru l C++ ca

100
a=b; a=p ;

IIlIJllcIllcnta rca s t r nct u r ilor dc datc


se poa t.e mod.i f i.ca va Lo ar ea

i n t a [ 1 0], b [ 1 0 ], *!p & b; II Er o are ! Une i cons t arrt e nu i

;;i care sa

Scrieti un program in care declarati 0 va riabi la de memorie de tip i nreqistrare. care ccntine coua campuri cores punzatca re numitorulu i ~i nurnaratoru lui unei frac fii si 0 variabila de tip poin ter catre tipu l inregistrare realiz eze urrnatoare !e:

a. atri buie pointerului adresa variabilei inregistrare; b. citeste de la tastatura valorile pentru numerator ~i numitor;
c . afise aza fractia simp lificat a - rez ultatele S8 obtin in do ua va rian te , folosind cate una dintre cele doua metod e de ad resare (adresare a directs ;;1 apoi adresarea indi recta) ;;1 S8 co rnpara rezultatele obtinute .

2.2.3.3. Operatorii aritmetic i


Operatiile aritmetice permise asupra pointerilor sunt: -7 Aduna rea ~ i sc ade rea un ei co nstante - operatorii + si -. -7 Increm entarea ~i dec rementa rea unui po inter - operato rii ++ ~i --.

-7 Sciiderea a d oi po interi de ace tasi lip - operatorul -.

Atcntie ~ ta co n s i d e ra~ d unilalea egal ii cu sizeof(lip_b azii) , adica eqala cu ~ nu rnarul de octeti necesari pentru a memora a data care are tipul
~i

T oate operatiile aritmetice cu pointeri catre un tip de baza se execu-

tip_ baz a . De exernp lu , incrementarea unui pointer catre tipul int va considera unitatea

eqala cu 2 (numarul de octeti necesari pentru reprezentarea tipului int)


O peratorul pentru ad una rea sau scadorea un ci cooatallte est e:

noua adresa se

va obtine prin adunarea constantei 2 la adresa initia la mernorata de pointer.

p + k sau p - k
unde p este un pointer catre tipul tip_ baza care rnernoreaza a ad res a ad r, iar k 0 co nsta n-

ta Rezultatul este a adresa care se calcuteaza aslfel : ad r+k xsi zeof(tip_baza ), respectiv ad r- kxsi zeof(lip_ba za). Obssrvatie : Operatia de adunare este cornutativa: p+k = k+p .
O peratorul pe ntru incrementarea si decremcntarea unui pointe r este:

p++ sau p- unde p este un pointer catre tipul tip _b aza care memoreaza a adresa adr. Rezu ltatul este

a adresa care se calculeaza aslfe l: ad r+sizeof(lip_baza ), respectiv ad r -s izeof(lip_baza).


Op eratorul pentru sc ade ro a a do i po inte ri 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). Re zultatul este un nurnar intreg care reprezinta nurn arul de cleme nte aflate intre p ;;i q .
O pe ratiile aritmetice cu pointeri au sens numai dac a adresele in di ca te de pointerii op cr an zi si de pointerul rezultatului expresiei sc p astrcaza i n s pa tiu l de ad rcsc ale unu i ta bl ou de m em ori e . Sin-

ln furmatic ii

10 1

gura exc eptie acceptata este cea a pointe rului ca re indica adresa unui element situat imediat dup a ultimu l element al tabloului. Exemplul 1 - in cazu l in care operatorii aritmet ici se aplica pe pointeri care nu-s: pas treaza valorile in spatiul unui tablo u de memorie, rezultatele obtinute nu a u nic i un fel de releva nta. i n t d =10 , *p = &c, * g =p; cou t.c-cp'<-;" "<c s p c c e n d j , " p ++ ; cou t .c-cp-c-c" " <x e p c -ce rid L : p -I-! ; cou t.c-cp c c" "<c vp -c -cen dj, , / ~ Z o n a d e memo rLe .i nd.i. c a t.a d e p o f nt e z- d u p e f L e ca r e ope r a t L e d e i nc r e me n t a r e con t;. i ne 0 va10are r ezidual a care n u a re ni c i un f e l de ~e l e v a n t 5 i n cad r u l p rogramului*f c o u t p- q ; II 0f i~ca za 2 Exemplul 2 - Se inve rsea za un vect or in el l nsusi. Se folosesc doi pointe ri p si q cat re elementele vectorulu i ca re se intersch imba .

i n t a[2 0 ] J n . ~ p , * q , a u x ; cou t " n = " ; c i n n ; for (p=a ; p <Zl +n ; p ++) {co u t.c-c ve Lemcrrt u L " p - a +l " = "; cin *p;}
for (p =a ,qo:;;a -t n-1;p< q ;p /-j , q - - ) La u x v vp , f o r( p = a ;p< a+:n ; p + + ) c o u t * p " " ; *p o;; * q ; vq-ca u x r }

Obso rv ati e. Prin definitie , operatorul in dice al tabl oul ui ([ ] ): 7 se aplica pe doi ope ranzi x :,i y (x[y] sau y[x]), x fiind un pointer si y un intreg ; -7 realizeaza adun area dintre pointerul x ;;i constanta y , obt inand adre sa elementului y al ve ctorului de la adre sa x ; -7 rezu ltatul furni zat este va loarea ind icata de pointerul obtinut , adica valoare a elementului y al vectorulu i de la adresa x : x[y]=y [x] ='( x+y). Este un op era tor binar ~i are priorita te maxim a si asocia tiv itatea de la sta nqa la dreapta . Eleme ntul i al vecto ru lui a poate fi identificat pri n a[i], de oarece ope ratorul indi ce al tablo u lu l ([]) ex ecut a suma dintre pointerul a (0 adresa) si constanta nurnerica i. Prin apli carea acestu i operator se obtine va loarea de la adres a elementului i. Deoarece operatia de adunare dint re un po inter si 0 constanta este comutativa , urrnatoarel e expresii sun t echivalente si se pot fo losi pentru iden tificarea elernentului i al vectoru lui : a [i] <-'> * ( a+ i ) <-'> * ( i + a ) H i [a ] Un element al matricei a poa te II identilicat, folosind cei doi ind ici i :,i j , prin a[i][j] . .Iu i ind ice al tab lo ul ui fiind de la stanqa la dreapta ~ i prior itatea Asociativitatea operaton. sa fiind cea ma i mare , ca lcularea adresei elementu lui se va face asttel : ma i Inta i se executa su ma dint re pointerul a si constanta i si apoi suma dintre rezultatul obt inut anterior si constanta j . Prin a plicarea opera toril or indi ce al tab lo u l u i se obtine adresa elementului din linia i ~ i coloana j , urrnatoarele expresi i fiind echiva lente : 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 aplica f asup ra pointerilor sunt: -7 Operatorii de in eg ali t ate : <, > , <= ~i >= 7 Operatorii d e eg alita te == :,i !=. Evaluarea unui ope rator relational aplicat pe doi pointeri p ;;i q se face prin anal iza diferentei p-q .

102

lmplem cntareu st r uct u ri lor d e date

Exemplu - Se afiseaza ordinea in care apar doua valori x ~i y lntr-un vector cu numere intregi. Se folosesc doi pointeri p si q catre elementele vectorului. Se parcurge vectorul folosind poin teru l p pen tru loc alizarea valorii x si poin terul q pentru loc alizarea valo rii y. Stabilirea ordinii de aparitie in vector S 8 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 o u t-ccv e Lernen t u I "<cp - ia-r l cc "> " ; cin *p ; }

cout" p r i ma va l oar e = "; c i n x ;


ccc ccc? a doua va .J.oa r e= " ; c i n y; p =a ; while (*p! =x ) pit ; while ( *q !=y) q++ ; if (p>q) c ou t-ccv va l ca r e e "<c y-oc '' apa re ina i nt e a valor i i

" X i

e lse cou t " va l oa r e a " x " apare i nain tea 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 nume re intregi . Valoarea nurnarului k se citeste de la tastatura . Se inserea za elementul cu valoarea x inaintea elementului cu valoarea y . Valorile numerice x ~i y se citesc de la tastatura . Se insere aza elementul cu valoarea x dupa elernentul cu valoarea y. Valorile numerice x si y se citesc de la tastatura. Se ordoneaza crescator elementele vectorului. Se afiseaza elementele comune din doi vectori a ~i b - a sinqura data.

2. 3. 4. 5.

2.3. Tipul de data referintii


Acest tip de data permite folosirea mai multor identificatori pentru aceeasi variabila de memone. Declararea unei variabile de tip referinta 58 poate face prin instructiunea declarativa:
t ip da ta

tipul

retera vanabila de memorie defi nita

datel ~lcare se

j -\

&n u me v a r iab il a

n u me v a r i a bi l a re fer ita i

numele vana:ei de

vanabila de memorie de flmta

m:mon~la care se refer.

opera torul de referentiere

numele variabile i de memorie care se defi neste prin referinta la 0 alta vanabila de mem orie

Exemplu:

in t a=10 ; in t & b =ai sau int a=10 , &b=a i

Variabila de memorie b este 0 referinta catre variabila de memorie a. Aceasta lns eamna ca, prin referinta, variabilei de memorie (a) i s-a mai dat un nume (b). Cele cou a variabile de memorie (a ~i 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 ~i 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:

In fo rmati ca

103
" Zl " a d r e s ,J. l u i a = u &a endl; " b" ad r e s a lui b = "&0 ;

cou t " a c out" b

= =

Orice operatie de modificare a valorii variabilei referite prin numele b, va mod ifica valoarea variabile i ide ntificate prin numele a, deoar ece ambele num e de variabile S8 refera la continutul acele iasi zone de memorie. Urmatoar ele doua instructiuni vor afisa aceleasi valori:
b~15 ;

c o u t .c-C' a

cou t " b
Observatil : 1.

" a "a d r e s a l'..ii a= "&aendl; " b "a d r e s a lui b= "&b ;

Tipul de data referinta, la le i ca si tipul de data pointer, co nti ne 0 ad rc s a. Pentru a avea acces prin refe rinta la 0 var iabila de memorie nu este insa nevoie sa S8 totoseas ca adr esa de memorie, ci num ele variabilei referinta.

Exem pl u:
i n t a = 1 0 ,b=2 0 0 ; I/ s - a u dec la rat d aua variabile in tregi int &x =a ; I/s -a declarat 0 referinta 1a var iabila a Ils -a decla rat un pointer ca re indica v a r i a bi la a i nt ~ p = & a ; i nt <q =&x ; Ils -a d e c l a rat u n po i n ter ca re i n d i c a va ri ab il a x cou t.c -ca -c" H X" "<x vp'< " " <c vq c c" " < c e n d j , ! / af i g e a z a 10 10 10 10 ~p= 2 0 ; oou c-oc a -c -c " "<x x -c c" "<x e p-c-c" "<c - q c -:" "<c encn ,
J/ a f i~E a z a

20

20

20

20

:-:=30 ; cou t-c-ca c c" "<e x -e -c " "< . . p-e-e " " < x e qc c" " <c e n d j.: // a f igeaz a 30 3 0 30 3 0 p= &b ; /Ip .i.nd Lc a variab.i La b cou t c c b -c -;" "<x e p-c-ce rid L: Ila fi:$eaza 2 0 0 200 p= &x ; li p indica variab ila x c a re se r e fera l a v a r i a bi la a c o u t b " " r p endl; Ila f i~eaza 200 30

2.

Operatorii aritmetici apli cati pe variabile reterinta nu rnodifica va loarea adresei referite, ci valoare a rnerno rata la adresa variabilei referite. Operatori i relationali aplicati pe variab ile ret ennta nu comp are valo rile adre selor referite , ci valorile memorate la adrese le variabil elor referite.

Exe rnplu :
i n t a = lO , b =20 ,& x=a ,&y=b ; " x e nd l ; " xendl ; x=- -x ; x-r-=x-2 ; cout a" " xendl; i f ( x ! = y") c ou e -ccv ede v e r at " endl ; :-:=+ +y ; ccue c -ce -c-c'' " <x x -oc end L : cou c-oc c-cc" "<x y-c-ce ri d L : i f (x ==y) cout" a d e v a r a t" endl;

x=30 ; c o ut a " x++ ; c ou t a "

Ilafi~ea z5

30

!/af igeaza 31 Il a :i g e a z a 90

30 31
9C

I/ a f i$e a z a adevara t !/a fi ge a z a 21 21 Ilaf i ~ e a z 5 21 21 Ila f i~eaza adevar at

~ ExemPlu:
i nt
a , &~ ;

1.

Refe rin ta tr ebuie lnit iallza ta c hiar i n m om entu l dec la rari i ei.

II Eroare : va r i a b il a

re erin~a

nu a f cst

ini~ i a:izata

104
2.

Impl cmcnta r ca st r nct nrilor tic da te

Dupa ce a fost lnitializata, referinta nu mai poate fi rnodificata (nu S8 mai poate schimba adresa de mem orie la care S8 refera).

Exem plu :
int a=lO ,b= 100 ,&x =a ; c ou ti-oc a-oc " " Y . e nd l;
x = &b ;

! faf i$eaza 10

10

x nu i se poat e a t rLbu i. ad r e s a va r i a b ilei de memorie b , d eoa r ece var i a b i la X , pr i n ae f i n i~i e , S0 r e fe r S La va ri a o i La de me mor i e a s i. memo r e aa a c d r o s e e i. -k I
/ k Eroare : va .r i ab i.L e L .re f'e r i nt.a

x=b ;

/ '" Care ct : va r Lab i Le i r c Ie r i n t'a x: i s c p o a t e a t r-Lbu i valoarea va riabilei dc memoric b , aceasta 'i.nse:nndnd ca vari2:.bilei referite de x (variabila a ) i s e a::.ribuie valoarea variabile_ b -.. /

c ou ti-c-ca-c-c"

" <c x-c-cend l ,


0

/ /afi$e a za 100

100

3.

Nu

S8

poa te crea un pointer la

referint a.

Exe mp lu :
i nt a =]O ,&:-:: =a ; i n t "P=/. ; / . Ero are: po.i r.r.e r u Lu i p nu i se poa te a t r Lou i edreee memor~ta ~n variacila x , deoarece nIT~el e variabile~ x nu identific ~ 0 adre s5 , ci 0 valoa re i~tre ag5 mB~orat5 l a adre sa var i abilei a ' j int * p ~.: &x ; /* Corect : po.i n t er-u Lui. p i se poa t .e a t r i.bu L ad rc s a va r La b i Le i. r ere rf nt a x , ace a s ta fi Ln c d e rap t: ad r e s a va ri. abi Le i a * / 4. Nu es te perrn isa dec lararea un ei referinte la 0 ad resa exprirnata printr-o rc fe rin\a sau pri nt r- un po i nte r. a=10 ,b= :00 , "' :;-.)"-' & a , -q-o. b . & :-:= a ; &y = F .x; / ": Er-oar-e : S- <J. dec Lar a t va.ri.a b.i.L a Y cn r o t rcbuic s b sa r c-' La 0 ve r i a b i la de li p int , ca 0 ref erint;.~ 1a adre a a va rL a b i. Le i x .~ / ; y =x ; / > Co r e ct: s -a dec1arat var iabi1a y ca 0 re fe r i.md 1a

Exemplu :
int in t fcre in t

variabila x, CZlre este 0 r e f e r i ::'1;:a :a va~ iabi1a a; var i a b i l a .y se re fera In vu riabila a ~ / i n t &z=q ; I '" Eroa:ce : s -a dec La r a t; va ri abila 7. , ca re tr e b u i e sa
s e r-e f e r e In. I) va r i ab i.l. e de tip i n t, ca 0 re fo rL n ta 1 5 ve r.i a b i l a po i n t e r q ca r e ml2mor eaza 0 a d r e s a ~/ in t & z = ~ q ; / ~ Co r e ct : s -a decla ra t vu r i a b ila z , care t r e b u i e sa se re fere la 0 va r iabil a de rip in t , ca 0 re f e r inta la 0 va riabila a cn re I acrc sc e s t.e .i nd i.c a t S de po i n t e r-u L q (e d i.cf variabila 0; ~ / c o u t-ocac-c" " " p " " x" " < x y-c-ce rid L : l/afJ.fjea7d 10 10 10 10 ccc e-cct.c-c '' "" q " "<c accencn / J afi$eaza 100 ::" 0 0 100 "p=-20 ; cou t -c-ca -c-c" "<e -pe-e" "< e x-e-c " " yen d l ;

x-30 ;
p~r.z ;

20 20 oou t.c-c a c -c" I/afi~eaza 30 30


b~2QO ;

Ilaf i~eaz a

20 2 0 " <c vp c -c'' 30 30

"<x x-cc"

"<x yc -ce rid L :

co u t c-ca -c-c"
/ln fi ~eaz 5

" <e -p-ee ' " <ex-e-c ' " '1" 30 200 30 30 200 200

"<c vqc-c"

"<c z-c-ce n c .l ,

5.

Tip ul referintei si tipul va riab ilei la care sc re fora tr cbuie sa fi e aco las i 9i refe rinta ~ j ob iec tu l la ca re face referirea trcbu ie sa fie de ace las i tip. Astfel , daca referinta

Inform aticii

105

este 0 variabila de memorie, referirea trebuie S8 taca tot la 0 variabila de memorie , n si nu, de exemplu , ta 0 cons tanta, chiar daca aceasta este de acelasi tip cu reter inta. T cazu l in care nu S8 respecta aeeste reguli, comp ilato rul va va atenticna. Aceasta lnseamna CEt pro gramul va putea fi executat, dar rezu ltatul obti nut nu va fi eel asteptat, deoarece S8 creeaza 0 variabila de memorie tern pora ra , cu tipul referintei, careia i S8 atrib uie valoarea variabi lei referite, respectiv a cons tantei , jar variabila referinta va adresa aceasta variabila tamporara, si nu variabila referita , respectiv cons ta nta:

sa

Exemp lu:
char c :. ' A ' ; float & w ~ C i ! / e c h i_v a l e n t e u : char c"" ' J\ ' ; float t.emp wc , float s a e t / / t f:> mp f i ind v a rLab L'l.a de memc r i e t.e rnpor-a r a cout.c-cac-c '' "<cccceocn . II<1 f.i $Gaza a o;;o a / 5 ; cou t a " " cendl; I / a f i.,? e az a e l+ ; cout a " " cendl; / /afi,'2 e aza int &a=1 0 ; /I 0.ch i, \'a lenL ell ; int t e mp= l O; int I I t.emp f i i n d variab i l a de memo.rie cout a endl; / / at i~eaza. 10 0. ""' 2 0 ; c o u t .c-ca : //afi$8aZ a 2 0
emp ,

A B &3""' temp ; t e mp o r-a ra

65 13 13

Scrieti un program in care declarati a var iabila de memorie de tip f loat ~ i a referinta catre aceasta variabila de memorie , cititi de la tastatura si afisati va loarea variabilei de tip float - folosind cele doua nume ale vari abi lei de memorie.

Ulililalea tipului de data rotcrinta


Tipul de data referinta este utiI in transm iterea datelor intre modulul apelant ~i subprogam prin intermediul parametrilor de cornunicatie. in tirnpul executiei subprogramulu i, date1e cu care el lucreaza (variab ilele locale si parametrii cu care a fast ape !at) sunt pastrate In stiva . lnstructiunile subprogramului pot mcdifica aceste date . Madificarile se executa asupra valorilor mem orate In stiva. Cand se terrnina executia subproqrarnului. spatiul ocupa t in stiv a de pararnetri ~i de variabilele locale est e elib erat ~i - i n cazul parametrilor de iesire sau de int rare-iesire - S8 pierd valorile calcu late i n subprogram .

v oid sb ( i n t a} { a ''''c.. + 2 ; cou t -oc e-o c e n d Lr : ) vo i d main( ) {int a =2 ; sb(a l ; cout a ; }

l / a fi$'2' a;:a 'l // afi~ea z~ 2

Folosind transfcrul parametrului pr in referinta, in mome ntu! apelarii subprogramului, in suva este incarcata adresa de merno rie la care se g ase~te valoarea parar.iet rului. Subprogramu! va lucra direct in zona de memorie in care se qaseste data. Asada r, atat modulul ape!ant cat ~ i subprogramul lucreaza asupra aceleiasi date , ~i 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 v o i d mai n e)
&il )
{ Q= 0 + 2;
a~ 2 ;

{int

coc t.ccc-ccendr r i j s b( a ) ; cout a; }

// afi ~ ea=5
/ ! il fi ~e a z ~

Intre moduluJ apelant ~i subprogram se pot transmite ~i parametri de tip aorosa Daca adresa este transrnisa prin valoare si ea este modificata in subprogram , noua valoare se pierde la ter minarea executiei subprogramului .

v o i d sb (i n t
void ma Ln I}

*r )

{i nt x""' Lj; p""' &x cout * pendl;} {int a=2 , *p= &-' i ; sb (p) ; cou t cc vp r }

/ / a f .i$ e a za 4 //af.i:;; eaza 2

106

lmplcmcnturcu structurilor de <late

Folosind transferul parametrului prin retormta pentru pointer, i n momentu l apelarii subprogramului , i n suva este incarcata adresa de memorie a pointeru lui ~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 subprog ramulu i, este eliberata din stiva zona i n care este mernorata adresa pointerului.

void sb( i n t *&p ) tint x = 4 ; P= &X i cou t *pendl;} void ma in() ti nt a=2 , *p = &3. i sb(p} ; cou t -oc - p r }

//a fi$eaza 4 / /afi -? e a za I;

2.4. Alocarca dinamica a mcmoriei


Decla rarile de date i n cad rul programului folosesc alocarea statica a memorieL Aloca rea sta tlca a rnc moriei se face in timpul cornpilarii , in functie de modul in care a fo st declarata variabila de memorie sau s tr uct ura de date, iar in tirnpul e xecuti ei programului nu mai poate fi modiflcata. Variabilele care folosesc alocarea statica a memoriei se numesc varia bile statice . Sistemul de operare Ie aloca spat iu i n segm entul de date sau i n stiva sistemului, i n functie de mad ul i n care au lost dec larate i n progra m (globale sau loc ale) . Structu rile de date stat ice au un mare dez avantaj, deoarece i n timpul executiei proqramului pot sa apar a urmatoare te cazuri: -7 spatiul alocat structurii este insuficient si este posibil ca sa se depaseasca ace st spatiu ~ i sa se intre in spat iul de memorie alocat altar date ; -7 spatiul alocat stru cturii este mult m ai mare docat este necosar ~ i memoria inte rna nu este utilizata eficient. Aces t dezavantaj poate fi climinat prin folosirea alocarii dinamice a memorie i. Alocaroa dinamlca este metoda prin care unci varia bile de memorie sau unci structuri de date i se atribuie sp atiu de memorie - sau S 8 elibereaza spatiul de memorie ocupat d e ea in timpul exncutioi programului, in fun ct ie de nec esttati , Variabilele care folosesc alocarea dina mica a memoriei se numesc varia bile dinarnice . Spatiul de me morie alacat va fi in zona de adrese libere (Heap) . Sistemul de aperare atoca unei date zon a de memorie i n Heap sau elibereaza spatiu l de me morie aloca t datei, in urma unor c ereri de alocare de memorie ~I de eliberare de memorie din program . Mecanismul prin care programatorul folo seste alocar ea dina rnica a memoriei este urrnatoru l: 1. Se de c lar a a vari abll a de m em ori e de tip pointer catre li pul de data al variabilei dinam ice .
< t i p _ d e _ b a z a> * "': n u me _ p o i n t e r > ; La comp ilarea programului , va riabilei pointer i se va areca spatiu in seg mentul de date sau i n sliva sisternului, i n funct ie de madu l 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 alac 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 variabilei dina mice, ~ i atribu ie pointeru lui adresa acestei zon e.

Informaticii
3.

107

in

momentul In care In program nu mai este folosita var iabila di namica se ce re sistcmu lui de operare sa elibercze spat iul de memorie pe ca re i I-a alocat in Heap. Pentru cererea de elibe rare a mernoriei S 8 toloseste operatoru l delete :

delete <n ume -po i n t e r> ; Siste muJ de operare declara ribera zona de memo rie care a fost alocata variabilei dinamice , si con side ra ca var iabila pointer nu mai este initia lizata cu 0 adresa de memorie, iar valoa rea ca re a fost mernorata in variabila dina mica S 8 pierde .
Observatie Operatorii new si delete sunt operatori u nari si au prioritatea si asociativitatea acestui tip de operatori.

[ Swd!:Ji.lI.lJ. de

OSlZ

Seop : exem plifica rea modului in care puteti folosi aloca rea dina rnica a memoriei Enunt ul problemei 1: Se citesc de la tesieture trei numere intregi - a, b i c - care reprezinte marimile lalurilor unu i triunghi. Sa se eiiseze aria triungh iului. Se foloseste alocarea dinamica a variabileJor clementare . Pentru referire a marimi lor latur ilor se fol osesc pointer ii a , b si c catre tipul int , iar pent ru referire a ariel si a semiperimet rului se folosesc point erf aria ~i sp catre tipul float.
ftinclude < i o s t r c a m. h > #i nc lud e <ma t h. h > void mai n ( ) ti n t *a, *b,* c; f loat ~ a r i a , ~sp ; lise declara poi n te ri i (1) a '"'" new in t; b = new int; c = new int ; l ise a l oca memo rie pen tru ar i a = new f l o a t ; sp = new float; l /variab i lcle dinamice (2) I /se cite sc de 161 t .as te cur-s va Lo r.i Le v a r i.ab i Le l o r o l nam i.ce I l folo s i t e pell t ru lat u ril e t r iunghiu lui ccu t o cv a -. " ; cin *a; cout " b = " ; ci n *b ; c o u t c-c vc -. "; c in* c ; l i s e calcu lea za va10 rile variab ilelor din ami ce fo103ite pentr u / /~; emip eri m etru s L a rie *s p = (* a +* b + *c ) 12 . ; *a r i a =sqrt {* s p * ( *s p - *a )* ( *s p - *b l k ( *Sp_ *c) ) ; / I s e a f i s ea z e vel oa r e a va rLab i.Le i di namic e folo s i t e pe n tru arie c out " a r i a = "<c e a r i a , 1158 e Li be r-cn z S z ona de mcmo r i.e a Lcca t a v a r .i ab i Le Lo r d in umi ce (3 ) de l e te a ; d elete b ; delete C i dele t e aria ; de lete sp ; }
:ji

Enunt ul problemei 2: Se citesc de la tastatura coordonatclo a (Joua puncte din plan - a b. Sa se etiseze distnnte dintre cele cou puncte .

Se toloseste alocarea dinarnica a structurii de date de tip i nregist rare . Pentru referirea coordonatelor celor doua puncte se folose sc pointer ii a ~i b catre tipul i nregistrare punc t., iar pentru refer irea distantei se foloseste pointe rul d catre tipul float.
#includ e <.i.o s t r e a m. h > #i nc lude <ma t h. h > st ruc t punct {i n t X, Y i } ; punc t e e , *b ; f loat *d; /Ise cecl e r a p o .in t e r i i. ( 1) v o i d mai n () { I Isealoca memo r ie pentru variabi lele d i narn i c e ( 2 ) a = new pun ct: ; b = new punct ; d = new fl oa t ;

108

lmplcmcntarca st r nc t n r ilor de dat e

tasta t u ~ a va lo r i le v a ~ i ab il el c r dip.amic~ / /folo s i te pen t ru coo r done t.e Le punc t e Lo .r a s i, b CQut " c oc r d o flil Le l e puncct:! ui a - x : " ; cin -3 - >y.i cout" - y: cin a ->y ; cou t " c oc !"d o na t e l e pUrlc -c.:llui b - Yo : " - cin b - >x i co o cc-c" - 'J : ". c.i.noc-b - c-y : / /:::::::: ca Lcu LcazS va Loz u-e a va r i.ab.i.Lc.; di nam i c e fo Los.i t;e pont ru d.i st.e.nt.a *.j =- sqrt (pow {a- > x - b - > x , 2 ) +pow (a- > y - b - > y, 2 ) ); ! / 51? a ~i$ e a z a. va Loa rea va r Lab iL e L di. nami.c e 010 3 i t.e pent r u d t s uant a c out" d i s t a n t a d i n t re punc te le a 3i beste " *d ; I I s e c Li b e r ec zu z cria d e memor Le n Ioc a t a v e r i ab iLeLc r d i.n um.L c c (3) d el ete i:J ; del ete b ; delete d ; }

lI se c i t e s c de 1a

Enuntul p roblem ei 3: So citesc de la Insta/ura n numero intrcgi cam sa mem oreaza intr-uo vee/or. Sa se iovorsozo voctor u t in el insus! i sa so etiseze vectotul dupa inversare.

Se totoseste alocarea dinarnic a a s tructurii de date de tip vec to r. Pentru refer irea nurnarului de elemente ale vectorului se toloseste pointerul n catre tipul int, iar pentru referirea variabilei prin intermediul careia S8 mterschirnba d0\13 elemen te ale vectorului se foloseste pointeru l aux catre tipul int. Pentru referirea vectorulu i S8 foloseste pointerul p catre tipul int r n]. Acest pointer indica 0 zona continua de nxsi zeof(int) octeti, n reprezentand valoarea citita de la tastatura pentru numarul de elemen te ale vectorului ~i care este referita de pointerul n . Pointe rii q !?i r catre tipul int se folosesc pentru a parc urge zona de memorie atocata vec torului in vedere a prelucrarii elernentelor lui.
#i n c l u de < i 0 s t r e a m. ~ >

#i r.c l ud e< ma t h . h > v oid ma i n ( ) //. 'H] d oc La r S po i.n t.c r.i i (1) l in t *p,* q, * (, * n,* a u x; //!; e; a Loc a memo ri.e pe nt. ru vo r iab i.I o I e dLn emi .ce (2)
ne .ne w int; au x -n e v i n t ; c c u t c -cvr. > " ; c in * n; p = n ew int[* n] ;

l i se
fo r

c ite~c

de la tus: a tu r5 vulorile pent r u

e lemen~ele

ve ctorulu~

(q ""-" p ; q <p+ * rl; q t t)

{cou t " e J e me n t u l =- " q- p + l " = " ; cin -- q ; } I / se .int.e r s ch i.mba e l eme n t.e Le vec t.o r u Lu i. fo= (q"" p , .:=p +*;;- l ; ::.<.: ; q .,.. +, r - -) { *a u :-:"-*q; * q ""*r; * ro--*a u x ;} ,/SE' e c ' t s e e z a e l crnc n t e Le .... e c t or u Iu ;
for {q = n ; q <!,l! *n ; q"1 cou t-c-c v q-c-c " " ; A I/se e l i.bcr oe ze zan:'! oc memor i e al cca t .a va.r.i ab i Le .lo.r d.inamLce (3) <J~~ delete [I f' ; delete n : de lete aux r }

fr-.?!\

Scrie ti urrnatoa rele programe in care Iolc siti aiocare dinamica a rnernoriei: Cit iii de la tastatura temperatura, presiunea ~ i nurnaru l de mali ai unui gaz l?i calculati volumul lui. b. Citl\i de la tastatura nurnaratorul ~ i numitorul a oc ua fractii, calcul ati sum a si produ sul celor dou a fractii, simplific ati rezu ltatele obtin ute si apoi afisat i suma si produs ul. c. C,ti\i de la ta statur a coordo natele a doua cclturi ale unui dreptung hi (coltu l din stanpa sus si coltu l din dreapta jos ) 'ii afisati dimensiunea diaqonalei drept unghi ului.
3.

I II for m a ti cii

109

d. Cititi de la tastatura temperaturile medii zilnice din luna precedenta 'ii afi'ia\i temperatura medie a lunii , si zilele In care temperaturile au fast ma i ma ri decat media.

2.5. Clasificarea structurilor de date


Organizarea in structuri de date a dale lor prelucrate de algoritmi sirnplifica mutte dintre operatiile de prelucrare . Atunci cand orqanizati datele l ntr-o structura de date , trebuie sa identificati modu l in care puteti ave a acces la ele ~i operatiile pe care Ie puteti executa cu datele din colectie. Procesul de organiza re a datelor in colectii este un proces care S8 desfasoara pe trei niveluri care inte ractioneaza i ntre ele, pomind de la nivelul concep tual:

nivel conceptual
(ni v elull a care se dezvolta imaginea rnentala a structurii de date: modul in care trebuie organizate datele !1i relatn!e care exlsta intre ele)

-U-nivellogic
(ni velull a care se alege un model de implementare a structurii conceptuale)

.Dnivel fizi c
(nivelulla care sunt stocate datele in memoria calculatorului i care Impllca anum ite caracteristici ale operatillor de accesare i de prelucrare a datelor din cotect!e . in functle de modul in care sunt memorate datele ~i de algoritmii implementati in limbaj pentru acces ar ea, citirea i scrierea datelor in memorie)

Ati studiat structurile de date irnplementate la ni ve l fizic In limbajul C++ : -7 ta bloul de memori e - structura de date omoqena , liniara, intern a si ternporara: -7 flst erut -. structura de date ornoqena, liniara . externa si permanenta: -7 sirul d e c arac te re - structure de date omoqena, liniara, inte rna ~i ternporara: -7 inrcgistrarea - structura de date neomoqena, interna si ternpora ra
A~i ~i

rnai studia t si 0 structure de date log-ica-Iista - structure de date omoqena , liniara, interna ternporara ~i 0 metoda de implementare ta nivel logic a listei folosind vectoruL

( Studiu de ca.z I
Sco p : exemplificarea modului I n care identificati structura de date pe care pen tru a rezo lva problema .
0

tolosit i

Enuntul probl emci 1. 0 firma ao transport arc lin perc cia 10 I17CJini CII cepeciteti de transport ciitetite. Trobuio sa so doformine cete dintro ecesto mail1i au Goa rna; mare capacitate de transport. Pentru rezolvarea problemei trebuie stabilita st ructura de date care se va folosi : -7 La nivel c o ncept ua l - capacitatile de transport ale masinilor reprezinta un sir de numere Intregi, aranjate lntr-o ordine aleatorie, in care trebu ie cautat numarul ce l mai mare ~i de cate ori apa re In sl r.

1~20--1

40

50

on

20

40

50

40

30

I~

-7 La nivel lo gi c - implementarea perrnisa de Iimbaju l C++ a unei colectii de date omogene


este vectorul , fiecare numar Intreg fiind un element al structurii. Pentru rezolvarea proble -

110
mei S8 vor folosi urmatoni algoritmi: algoritmul pentru parcurgerea vectorului la memorarea numerelor, algoritmul pentru determinarea valorii maxime dintr-un ~i r de numere si algoritmul de cau tare in vector a elementelor cu 0 valoare prec izata (valoarea maxima).

int a [10 ];
7 La nivel fizic - numerele vor fi memorate intr-o zona continua de memorie interna , fiecaru i nurnar alocandu-i-se acelasi spatiu pentru memorare. Identificarea unui element al structurii se face prin numar ul sau de ordine (indicete).

20

40

50

30

1 20

40

1 ---:: 5-: 0-

40

30

40

o[O J

a[l ]

0[21

0[3]

0[4 ]

a[5]

a[6J

of7 ]

0[8 J

a[9J

Daca se doreste pastrarea datelor memo rate (capac itatile de transport ale rnasinilor din
parcul auto ) pentru prelucrarea Jor ulterior, S8 vor salva intr-un fisier text, de unde vor fi restaurate in memoria interna intr-un vector, la fiecare prelucrare (executie a programului).

relat ie de ordine in care fiecare element are un succesor

Observatie i n structur a de date folosita (vectorul), i ntre elem entele structurii exista 0 ~i un predecesor. Acest tip de structure este 0 structura liniara

--. ~
3, = primul ele me nt (nu are predecesor)

a,
an = ult imul elem ent (nu are succesor)

a , = eleme nt succesorul sau este 3;+1 predecesorul sau este ai_1

Enuntul pro blemei 2. Un profesortrebuie Sa celcuteze media semes/ ria/a a Iiec etu! elev din clasa i sa obtin a {isla eu nume/e, prenumele i mediile etevilot. in ordinea oescrescetoere a modiifor. Pentru rezolvarea problemei, trebuie stabilita structura de date care S8 va tolosi: ~ La nivel con ceptu al - elevii din cia sa reprezinta un si r de enti tati care sunt caracterizate de 0 li sta d e propri et ati (atri bute): nume ,?i prenume (care identifica unic elevul), cinci note ~i media sern estriala.

Num e Ang hel

Pre nume Maria

Not a 1

Nota 2

Nota 3

Nota 4

Nota 5

Med ia

...
30

...
Vlad

...

10
7

...

...
6

10

...
8

...

...

9,5

...
7

Miha i

-7 La nivel logic - implementarea permisa de limbajul C++ a unei colectii de date omagene
este vectarul , fieca re lista de atribute ale unui elev fiind un element a l structurii. Pentru implement area listei de atribute (care este fermata din date nea magene : nume le ~ i prenumele sunt siruri de caractere , notele sunt numere intregi, iar media este un nurnar real) se va folosi structura de date de tip inregistrare , fieca re atribut fiind me morat intr-un

camp. Pentru rezolvarea problernei se vor folosi urmatorii algoritmi: aigoritmul pentru parcurgerea vec torului la memor area listei de atribute a fiecarui elev si la aflsarea med iilor, algontmul pentru calcularea rnediei antmetice ,?i algoritmul de sortare a elementelor vectorului in functie de valoarea unui atribut din Iista de atribute.
struct e 2-ev

{char n ume[20J , pren[20j ;


unsigned nota[5] ; fl oat meo t a , } ;

e Lev clas2. [30 ];

Inform atica
7

111

La nivel fizi c - listele de atribute ale fiecarui elev vor fi memorate int r-o zona continua de memorie inte rna, fiecarei liste de atribute alocandu-i-se acelas i spatiu pentru memorare. Identificarea unei liste de atribute I n cadrul structurii se face prin nurnarul sau de ordine

(indicele), iar identificarea unui atribut din lista se lace prin numele carnpului.

:?i i n cazul acestui exemp lu, daca se doreste pastrarea datelo r memorate (Iista de atribute a fiecarui elev din ciasa), pentru prelucrarea lor ulterior, se vor salva intr-u n fisie r text, de unde vor fi restaurate In mem oria interna lntr-un vector de i nreqistrari, la fiecare prelucrare (executie a prog ramului).

clasa[i } .n u me

~::;@9

nota[O]

I mL l

c l a s a [ i ] . no ta[2]

Observatie i n structura de date folosita pentru lista de atribute , int re eleme ntele structurii exista 0 rela tie de ordine In care fiecare element are un singur predecesor !iii nici unul, unul sau mai multi succesori. Entitatea e/ev (corespunde unui eleme nt din vec torul c1asa) are ca predecesor entitatea clasa ~ i ca succesori entitatile : nume, pren, nota ~ i media. Entitatea nume are un singur predecesor (entitatea elev) ~i nici un succesor . Entitatea nota are un singur predecesor (entitatea e/ev) si cinci succesori (nota{O], nota{I], nota{2], nota{3] si nora{4]) . Structu rile de date de tip in registrare pot Ii ierarhizate pe unul sau mai multe niveluri. Ace st mode l de re prezen tare a datelor se numeste arbore cu radacina , iar acest tip de structura de date este o structura ierarhizata .

Nive lul 1
...

L...::F--J

Nive lul 2 Nivelul3 Nivelu l4

G:;J

intr-o structure de date ierarh izata. datele pot fi grupate pe mai multe nive luri. Eleme ntul a1 se gase ~te pe nivelul 1. El nu are predecesor, dar are trei succesori: 311, a12!iii an care se qasesc pe nivelul 2. Elementul a12 are un singur predecesor (a- ) si trei succeso ri: am . a122,i a123 Elementele a111 . a112, a121, a123,i a131 de pe nivelul 3,i elementele a1221 si a1222 de pe nivelul 4 nu au succesori.
matrice cu n linii ~ j m coloane este si ea 0 struct ura de date ierarh izata pe trei niveluri: pe primul nivel e ste ma tricea ca re are n succesori: liniiie, care sunt pe nivelul 1. Fiecare

112

I mp l emen t area st ruct u r i lo r d c date


0

linie are ca predecesor matricea si ca succesori cele m elemen te de pe gasese pe nivelul 3.

linie, care S8 Nivelul 1

Matricca

L
lin ia 2

I a[O][O] I a[0][1J 1

---

l ini a 0

'l

Iinia 1 ..

linia 3

Nivelul 2

~ ~I \. I a[3][OJ 1a[3][1]
;---'a[=2]:7[0::::]'Ia"'[ 2"']["' 1]:0\1 N ive IuI 3

I a[1][0] I a[1][1]

. En untul prob lem ei 3. 0 oersoens oorosto sa vizileze aple obiective luristice caro se gasesc in sopte locolitari, po care Ie notisn: cu A, B. C, E, F, G i I. in tre cele <yJle obiective turistice existe mai multe cil ; de acces. Trebuie sa se gase asca un traseu, astral tncet turistul sa pIece din tocoutetee A i sa revine in locaHlalea A, viziumo lo a Ie cote apte obiective sa l m aca de doua or; ptin eceeesi IDea/ita/e. Daca exis/a me i multe trssee. sa so ceute tresoui ell drumul eel tne! scurf . Penl ru rezolvarea prob lemei, lrebu - ..-----------..,----..-- - - ----;:

tara

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 reprezent a la nivel conce ptua l aceast a structure de date vern reprezenta in plan harta zcnei turist ice prin intermediuI unor eremente geome- '--">~-,-,~,,.,.."--'----' ==__,....__,....----_c--,.....:>-_,::-__,....-' trice, astfel: localitatile se reprezinta prin cercuri i n interiorul carora vom scrie identificatorul locatitatii, iar caile de acces prin linii drepte care unesc anurnite puncte. Acest model de reprezentare a datelor se numeste grit!. Obs erv atie . i n structura de date toloslta pentru a reprezenta la nivel conceptual entitatile (Iocalitatile), int re elementele structurii exista 0 relatie de ordine in care fiecare ~ elemen t are mai multi predece sori ~i mai multi succeso ri. Acest tip de structura de p. ~ date este 0 retea , Din studiul de caz anterior putem folosi un nou criteriu pentru clas ifica rea structurilor de date :

criteriul relatiei de ordine lerarhizate (arborescente)

r----;c~--,---------"i
Liniare
Fiecare element are un succesor ~i un predec esor, exce ptand primul elemen t, care nu are decat succesor, ~i ultimul element. care nu are oecat predecesor .

""

Intre elemente exista 0 relatie de subordonare , i n care fiecare element are un predecesor unic $i poate avea unul sau mai multi succe sori. cu exceptia primului elemen t (numit radik iml ), care nu are prede cesor, sl a ultimelor eleme nte (numite term inale), care nu au succ esor .

Intra el em~ nte exts.a 0


relatie de subordonare, i n care fiecar e elemen t poate avea mai multi predeces ori ~ i mai multi succesori.

Retea

I II formuticii

113

2.6. Lista liniarii


Pe Itmga criteriile studia te pentru clasificarea structurilor de date , mai exista ~i urrnatoarele criteri i :

r Implementarea in limbajul de programare I

...

...

Structuri implicite
Slructura creata la nivel conceptual este lrnptementata la nivelul Jimbajului de prog ram are. Repr ezentarea sa este irnplicita $i nu ma i nec esit a inforrn atii su plimentar e pentru localizarea
compone ntelor .

Structuri explicite Structura creata la ni vel conceptual nu este lrnplernentata la ni velullimbajului de


program are. Repre z entarea sa S8 fa ce folosind st ruc turile impl icite implementate in Iim baj , fiind neces are info rrnatii suplimentare pentru loc alizarea co m po nentelo r.

..-

Dispunerea elementelor in memorie

...

Elernentele sunt di sp use in zone contigue de rnernorie, care permit localizarea uneia dintre ere foJ osind 0 adresa de ref erinta ,i deplasarea fa ~a de adresa de rete rinta .

Structuri contigue

Structuri dispersate
Elementele sunt dispuse i n zone dispersate de rnemo rie; pentru a putea localiza elementele in structure. trebuie sa se memoreze pentru fiecare element ,i adresa la care se 9aS8$te.

Aloearea memoriei interne

.-

Structuri statice _Dimensiunea zonei alocate este fixa. Alocarea ei se face in ttrnpul ccmpl lar ll . in functie de modul in care a fast dectarata structura. iar i n timpul execune! programului nu rna! poate fi rnodifi ca ta ,

Strueturi dinamice Dimensiunea zonei alocate nu est e f ixa. AJocarea sau eliberarea zonelor de memorie folosite de structure se face i n timpul executlei programului, in functie de numarul de componente ale structurii.

Usta liniara este 0 struc tu re d e d ate logic a, e u da te omogcne , in care fie c are ele me n t are un s ucces o r ~ i un pred ec esor, exc eptand primul el ement, care nu are dedit s u cce sor, ~ i ultimul ele me nt, c are nu are decat pred cc esor.

l.ista llnia ra, la fel ca ~i ve ctorul, din punct de vedere conc eptual este 0 structure de
date ornoqona tiniara . intre c ele dou a

structuri ex ista

urrnatoarele deoscbi ri :

Cri teriu l Implementarea


III lim baj

Vecto r i Sunt structururnpuctte Fiind 0 struc ture Ilzlca . este Irnplementata in limbajul de programare. Nu necesita informatii suplimentare pentru 1 0calizarea elementelor structurii in memoria interna. deoarece mecanisrnul prin care este impleme ntata fizic asigura identificarea elementelor.

Lis te
Sunt structuric xplici te . Fiind ostructura loq lca , trebuie ateasa 0 metoda de implementare folosind structurile fizice existente. Necesita informatii suplimentare pentru localizarea elementelor structurii in memoria intema. deoarece mecan ismul prin care este implementata fizic nu asigura identifica rea eiernentetor.

114
Criteri ul Dispunerea elementelo r Vecto r;

Implcm enta r c: st r u ct u r i lor de date Liste

..

in me mo rie

Sunt structu ri co nt ig ue . Pot fi structuri d ispersa te . Predece sorul, Predecesor ul, eleme ntul ~i eleme ntul !iii succesorul nu sunt in locatii de succesorul se gasesc in locatii memorie contigue . Proqramatorul trebuie sa cont igue prin mecan ismu l de defineasca rnecanis mul prin care elernentele implementare a stru cturii de date la structurii vor fi legate unele de allele pentru nive l fizic. a putea fi recasite i n rnemorie. Sunt structu ri stance. Sunt str ucturi stat ic e sau d inamice, in funct ie de implementarea alea sa.

Al ocarea rnemoriei

Se defineste lungimea Iistei (n) ca fiind numarul de elemente ale listei. Lista vida este lista 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 date Iis ta tiniara.
0

aplicatie in care folositi ca structure de

Enunt uri le problem elo r pentru care trebuie aleasa structura de date si eoneeput elgoritmul pentru prelu crarea lor: 1. lnt r-o bibliateea exist a colectie de eaf1i arganizale in ardinea alfabe tiea a autari/or. Un canor paate imp rumuta 0 carte (se extrage 0 carte din co/eerie) sau poate inepoie 0 carte (se inseteeze 0 carte in co/eerie). Toate aeeste operaNitrebuie exeeulate astfel ineat sa se pestreze organizarea in ordine alfabetiea a au/orilor. 2. La 0 benzinerie s-a forma / 0 coeoe de esteptere. Ma inile sunl servil e in ordinea venirii: prima main8 sos ite esle setvits, ier ultima maina venue se 88la fa sfaritul cozii. Toate aeeste operetii trebuie executate astfel inca! sa se pestreze ordinea in care au sosit m osinite i S-8U esez! la coeds. 3. lntr-o stive de cen: volume/e sun t asezare in ordine a alfabetiea a tiuutito r. Trebuie extrese 0 carte din stiv tara a deranj a modul in ca re sunt ordonate carti1e in stive .
Toate aeeste proble me au in eomu n urrnatoarele caracte ristici: -7 Elementele colectiei sunt omoqene jtnreqlstrarl eu aceeasi structura l . -7 Conceptual sunt structu ri liniare i n care fiecare element are un succ esor ~i un predecesor , cu exceptia primului ~i a ultirnului element , care au numai succesor, respectiv numai predecesor. -7 Structurile de date se rnodifica folosind aceiasi algoritmi de prelucrare se insereaza ~ j se extrag elemente, pastrancu-se a anumita ordine de aranjare a elemente lor.

Daca s-ar alege sotutia de a grupa aceste elemente intr-o stnrctura de date de tip vector , alqontmii de prelucrare (de actualizare a vectorilor) vor necesita multe deplasari de elemente care consurna tirnp de prelucrare. Caracteristicile operatiilor de prelucrare a vectorilor sunt: 7 Vectorul este 0 structura de date care are lungimea fizica fixa, iar implementarea lui la nivel fizic este un proces prin care se face conversia locatiel concep tuale a unui element , in locatia reala, din mem oria intem a. -7 Orice operatie de adauqare sau extragere a unui elemen t din colectie mod.fica lungimea logics a vecto rului. -7 Pentru a insera un element in colectie . trebu ie deplasate toate elementele spre dreapta , ln cepand cu pozitia inserarii, -7 Pentru a extrage un elemen t din colectie , trebuie deplasate toate elementele spre stanqa, de la sfarsit , pana in pozitia din care se extrage.

I n formaticii

115

n cazul structurilor liniare care trebuie s a-~i pastrezo i n timpu l exploatarll ordon area du pa un anumit criteriu, mecanismul vectorilo r este gre oi. in aeeste cazuri, S8 poate alege ca solutie de implementa re a structurii de date lisla tiniara ce deg reveaza progr amatorul de ordonarea dupa indice a structurii, irnpusa de vectori . mplementarea structurilor de date cu ajutor ul liste lor are urrnatoarele avantaje: ~ alocarea dina mica a memoriei - care gestionea za memoria rnult mai eficien t: -') algoritmii de.prelucrare - care sunl mull mal eficienti (se executa mul l mai punne opera!" pentru mserarea ~I sterqerea urun element).
On fun ctie de modul i n care

.... W?,.e-

S8

aloca memoria interna,

S8

pot folosi metodele:

Metode de implementare a listelor

in functie de modul in care sun! aranjate eleme ntele i n lisla, S8 pot folosi metodele:

Me tode de implementare a listelor

.t.
nu m ai statica
i

y.
statica Ava ntajul alocarf di nam ice a rnem ori ei

y.
dinamica
Ava ntaj ul alg o ritrni lor

Meto da de impl ementar e

de prelucrare

stati ca secventialii - at ati ca inlantulta

nu nu
da

nu
da da

otnamtca inlantuita

Implementarea statica secventia la nu aduce niciunu l dintre avantajele listelor, fiind 0 implementare In care lista este prelucrata la fel ca un vector. i n implementarea l nl ant ui ta nodurile listei nu m ai sunt s tocate succesiv i n mem orie. Acea sta implementare se poate face atat static, cat si dinam ic, int re cele doua irnplernentari existand urrnatoa rele diferente: ~ In implem ent area statlc a, noduriIe Iistei ocupa un bloc contiguu de locatii de m emarie (zona de memorie aloca ta vectorului); ~ In imple mentarea dina mica, nodur ile liste i ocupa loc atii di sp ers at e din memorie (a carer adresa poate fi pastrata cu ajutorul pointeri lo r). i n c1 asa a X-a ali tnvatat modul i n care puteti implementa stat ic listele liniare. Algoritmii pe ntru prelucrarea unei Iiste inlantuite sunt aceiasi . atat in cazul im plementarii stance , cat ~i i n cazul irnplernentarii dinamice.

2.6.1. lmplcmentarca dinarnicii a listclor in limbaj ul C++


Exemplu - a lista este ferma ta din 5 cuvinte (noduri), fiecare cuvant avand maxim 4 caractere. Nodurile listei se exploateaza i n ordine altabe tica : Usta = ("alfa", "beta", "gama", "teta", "zeta"]

116
Memoria

Implcmcntarca st r u ct u r i lo r de date

mterna

5 locat ii de mcmorie dispersato identificate prin adrese le adr1, adr2, adr3 , adr4, adrS --::"""'be-.'a'c-',.::.;, "9 a:" a"

[jjfL1
nodul 1 ( prim la adresa adr1

nodul 2 la adresa adr2

l--.----"zeta"
nodul5 (ult im )

nodul 3 la adresa adr3

" tet a"

nodu l4 la adresa adr4

'

Deoarece nodurile listei nu sunt aranjate succe siv, ci aleatoriu, In memorie , trebuie irnplemental un mecanism prin care sa S8 precizeze ordinea reala a acestor nod uri (ordinea in care S8 lnlantuie in llsta} . Aceasta tnsea mna ca: 7 treb uie cunoscut locul din care in cepe lista (lan tul de nod uri), adica pozitia primului nod din lista (nodul p rim ) - i n exemplu, nodul "alfa"; 7' trebuie cunoscu t locul i n care S8 terrnina lista , adica poz itia ultimu lui nod din lista (nodul ultim ) - in exemplu , nodul "zeta "; 7 pentru fieeare nod din lista, cu except ia ultim ului nod, trebui e cun oscut nodul care este succesorul lui - de exemplu, pentru nodu ! "gama" trebuie cunoscut ca succe sorul sau e ste nodu l "teta" . Metoda totosi ta pe ntru implementare este ca un nod al listei sa cantina do ua tipuri de inferrnatii: info rrna tia propriu -zi s a si i nforrnatia

propnu~zlsa

Infor~atia

. Il nfOrm a! la p:ntru legatura

de legatura - ad resa prin car e S 8 ide ntifica nodu l care urrneaza i n stru cture . lnfo rrnatia de legatura mern orat a i n ultirn ul nod (in carnpul de adresa) este const anta NULL (care semnifica tapt ul ca ultimul nod nu se leaga de nimic) . Memoria interna adre sele nodurilor adr1, adr2 , adr3, adr4 , adrS r:! - '"" 'be-t a''-- 1'a"", -- dr-' 31 i " ama" l~dr4 1-'--,''-'a-:-,t:a",,''---' 'a,d-:r-::" 21

.......................:::::::::::::::::::::::

adr2

dr3

i..

adr1

1
+.

"zeta" !NULL

1
L
~

"teta"

adrS

adr4

[nlantuirea nodurilor Iistei in implementarea dinarnica Lista l iniara intantuita este 0 s tructure loqica de date , parcursa Iin ia r , care are doua extrernitati (i n ceput si sfarsit), in care Iiecaru i element i se asociaza 0 in format ie s up l imenta ra referitoare la locul eleme ntului urmator , din punct de vede re logic. Un nod al lister va fi de tipul inregi strare ce contine un camp cu inforrnatia pentru leqatura care este ad resa succeso rului exprimata print r-un pointer.
struc t nod

{< t i p 1> < t i p _ 2>

< i ~ fo <i ~ fo

11 > , <i n f o 12 > , 21 > , < i n f o 22 > ,

, <i n f o In > ; , < i n f o 2n > ;

Info rm ati cii


< t.i p~m>

117
< i n f o _ ml>, < i n f o_ m2>,
< i n f o_ mn>;

nod " u rm r L :

nod *prim , *u l t i m , *p ; Carnpurile < i n f o _ i j> sunt carnpurile cu inforrnat ii, iar carnpul urm este un cam p de tip pointer catre tipul de baza nod ~i cont ine intorrnatia de leqatu ra (adresa urrnatorutui nod din lista). Aeest tip de i nre gistrar e se nurneste inregistra rea au to re ferita. S-au declarat variabilele de tip ad resa a unei i nreqistrari de tip nod: -7 *prim ~i *ul t i m pent ru a memora adresa primulu i nod , respectiv a ultirnu lui no d ; ele va ajuta sa ldentificati extrernitatile listei; -7 * p pen tru a memo ra adresa unui nod curent din lista (este folosit pentru parcurgerea listei).
in lisle, algoritm ii de inserare si eliminare a unor nod uri din structura S8 sirnplifica foarte mult 7 Inserarea unui nod consta in alocarea zonei de mem orie in care S8 scrie nodul si legarea lui la structure (stabilirea legaturii eu predeeesorul si eu sueeesorui lui). ?' Eli min area unui n od consta in ruperea nodului din structur e, prin legarea predeceso rului sau cu suc cesorul lui, ;;i eliberarea zone! de memorie pe care a ocupat-o.

2.6.2. Clasifica rca listclor


."

' --: L -;is -: te - :7 1 in -: i are ."

- I
!

."

Liste generale Nu exlsta restnctii pentru operatiile de mserare $i sterqere a elementelor din lista (se pot face in ortce pczitie a listei),

Uste restrictive Exista restrictii pentru operatiile de inserare $i sterqere a elementelar din lista (se pot face numal la extrernitati).

Stiva Operatiile de introducere si extragere a elementelor se pot face numai printr-una dintre extrernltati.

Coada Operatia de introducere a elementelor se face pe la 0 extremitate, tar extragerea elementelor - prin cealalta extremitate.

..

Usta simplu Inlantuita Fiecare element pastreaza legatura cu un singur vecin (de obicei. succesorul).

Lista dublu inlantulta Fiecare element pastreaaa legatura cu ambii vecini (succesorul $i predecesorul).

Usta circulara Este 0 flsta in lantuita in care elementul ult im se leaga de elementul prim .

A lgoritmii ce se p ot fo l os i po nt ru p re lu crarea Ii stelor: -7 initiali za rea Ii stci - se creeaza lista vida ; 7 c rca rea list ei - se adauqa repetat elemente la lista, porn ind de la lista vida; -7 insera rea unui c le me nt i n li sta - la i nceput, la sfa rsit , in inte rior; -7 ste rqe rea u n u i c le m ent d in l ista - la inceput, la starsit, in interior; -7 pa rc u rge rea liste i - se v iziteaza elementele tistei pentru a obtine inforrnatii: -7 c auta rc a in lista a unui cl eme nt care lndepline ste anumite co nditii: -7 sorta re a un ei liste ; -7 c o ncate n arc a a doua liste; -7 d ivi zar ca in dou a liste .

118

Im plcm cn tarca st r uct u ri l o r d e date

2.6.3. Agoritmi pcntnt prcillcrarca listclor simplll inlantllitc


Lista simplu inlanluita

prim
info

ultim

I urm

~I

II.
I

In 0

. f

I lI rm- 1

r.:::

info urm "--_---''-----J

info

INULL~

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 truc t n od {int in fo ; /linf o r ma 1;. ia p r c p r Lu-e z l s a nod *u r m;} ; l/in f orma1;;ia pent r u Leqe t u r a n od *pr i rn, *u l t i m, ~p ; j/pointe ri pe n tru e x p lo a t a r e a l i s tei in t x; . / /pen t ru valoare a ce s e atriliuie c empuIu i, eli I n fo rmat.L'i

in lista v id a atat nodul prim cat ~i nodul ult im nu exista, ~i adresa lor are valoarea NULL: prim = ult im ",. NULL; Starea de ll sta vida 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 testea za prin conditia : p r im = = NULL. Pentru testarea unei liste daca este vida se poate implementa functi a operand este_ v i d a ( ) care va furniza valoarea 1 ("adevarat"), daca lista este vida , ~i valoarea 0 (.tals") daca Iista nu este vida. i nt e s cejvLd e ( no d " p r i m) {return p rim ==NULL i l

2,6.3 .1. lnitializarea listei


Prin acest algo ritm se c reeaza lista v ida . in acest caz, atat nodul pr im cat ~ i nodul ultim nu exista, ~ i Ii se atribuie adresa NULL. Imp lementarea algo rit 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 oi d i n i t (nod * &p r i m, n od *&u l t i m) {p r i m = ul t im=NULL i l

2,6.3.2 . Crearea listei


Deoarece in alqoritrnii de prelucrare trebuie sa se cunoasca adresa prirnului nod, este importanta adauqarea prim ului nod la lista vida. Pasii alg oritmului 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


in Iista cu un singu r nod , adres a de legatu ra a nodului pri m are valoarea NUL L - ~ i atat nodul pr im cat si nodul ultim au aceeasi adresa. Pasii executati i n aces t algoritm sunt: PAS1 . Se cere alocarea de memorie pentru nodul p r im. PAS2 . Se scrie inforrnatia in nodu l pr i m. PAS3 . Adresei de leqatura a nodului pr im i se atribuie valoarea NUL L. PAS4 . Nodului ul tim i se atribuie adresa nodului p r im. Implementarea algoritmulu i. Se foloseste Iunctia procedurala adauga_nod O ai carei parametri prim ~i ul t i m de tip nod se transmit prin referinta, deoarece sunt parametri de iesire. vo id ad a u g _n o d ( nod * & p r i m, no d *&u l t i m) {p r i m = new nod i p r i m- >info= x i pr im- >urm= NULL i ulti m=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 dintre algoritm ii urrnatori : 1. ad auqaraa in fata pr imul ui nod ; 2. adauqarea dupa ultim ul nod ; 3. ad auqaroa l nt r-o po ziti e in in ter ioru 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

ultlrn

inf o p

~
ij
info

G;3--+ info
p devine nodul prim

] NULL ~

@rnJ

Implementarea algor itm ului . Se foloseste functia procedurala adaugayrimO al carei parametru prim de tip nod S8 transmite prin reterinta, deoarece este parametru de intrare-iesre.
void ada u ga...J'Jritn(n o d *&p r i m)

{no d

* p ~ new

no d ; p -> i nf o=x ; p -> urm=p r im ;

pr i m~p;}

Adauqare dupa ultimul nod Pasii executati in acest algoritrn sunt: PAS1. Se cere aloearea de memorie pentru nodul p. PAS2 < Se serie intorrnatia in nodul p. PAS3 . Nodul peste nod terminal (nu se leaga de nimie - adresa de legatura este NULL) . PAS4 . Nodul ul tim se leaqa de nodul p adaupat. PASS. Nodul p adaugat devine nodul ul tim.
I

Adauqarea dupa ultimul nod

p rim
info

ultim

urm ~
.......................................... ,
p ..

p devine nodul ultim

inf o

Im plemen ta rea algoritm ulu i. Se foloseste functia procedurala adauga_ultim() al carei parametru ul tim de tip nod se transmite prin referinta, deoarece este parametru de intrare- iesre. void a d a u ga...;..ult im( nod *&u l t i rn } {nod *p= ne w nod i p->info=x ; p~ >urm=NULL ;u lt im-> urm=p ; u l tim=p ; }

120

Im plemcnta rea struct u r ilur d e dat e

Adauga re a i n interiorul li st ci S8 poate face in doua modur i: a. dup a nodul cu adresa q ; b. in ainte de nodu l cu adresa q.
Ad au g area i n i nterio ru l listei du pa nodul c u adrcsa q

Pasii aiqoritrnu lul sunt: PAS1. Se cere alocarea de me morie pentru nodul p . PAS2 . Se sene inforrnat ia in nodu l p . PAS3 . Nodul p se leaqa de succesorul nodului q . PAS 4. Nodu l q se leaqa de nodu l p adauqat. PASS. Daca nod ul q a fast ultimul nod , nodul p ad a uqat devine nodul ul tim.
Adauqare dupii nodul q
prim

I! I,

, nl o

I urm ,~ fI ' ~~ n~'~_l~~j Jl . I 0 I u rm J L ur . ~~ .. In


"':".f~ '
j,

q->urm

ultim

I"" '- ' nI o-,..-----, I

I NULL, I

q p

L~j. m iinfo lm"trj:".J

Implemcntarca algoritmului. Se foloseste functia procedurala ada uga_ dupa () ai carei parametri sunt de tip nod : q (adresa nodului dupa care se face adauqarea), care se transmite prin valoare , deoarece este parametru de intrare, !iii ul tim (adresa ultirnului nod), care S8 transmits prin referinta, deoare ce este parametru de intrare-iesire.

void adauga. du pa( n od *q , { n o d " p v new nod ;


p-csi.n f o e x :

r:.od

*& ul t i m)
i f
(q== ul tim ) u l.f Ltr r-p r )

p -c-u rme q -c-u r m:

q-c- u rur-p ,

Adaugarca in inte riorul Iistei inainte de nodul de adresa q


Pentru a adauqa nodu l p l nainte a nodului q , trebuie sa leqarn predecesorul nodului q de nodu! p . Dar, predecesorul unui nod nu este cunoscut. Adauqarea unui nod in lista inseamna, 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 (1) prim Adaugare inaintca nodului q
q q- xurm

ultim

I' __ v1 _--'-_ u_ rm _ ++ _
p
(2)

II

. .

. v ,, 2 ... . . ..,--,-_u_rm_ff_v _ 3_ ..l I_u _r_mf f = = V=4== = = = = =

I NULLI I

v2

I urm

f
I NULUI

p rim

In furmatica

121

nodul q trebu ie sa a urmeze. Ast fel, in lista nu se va adau qa nodul p i nainte de nodul q, ci dupa el, interschirnban d apoi informatiile lnt re cele doua nod uri. Pasii algoritmului sunt: PAS1 . Se cer e alocarea de memorie pent ru nodul p . PAS2 . Se cop iaza info rm alia din nodul q in nodul p . PAS3. Se sene In nod ul q inforrnatia care trebuie adauqata la 115t3. PAS4. Nodul p se leaqa de succesor ul nodu lui q . PASS . Nod ul q se leaqa de nod ul p adauqat. PAS6 . Daca nodul q a fast ultimul nod , nodu l p adauq at devine nodul u l t i m. Implementarca algoritmului. Se foloseste functia procedurala a d a u g a _ in_ f a t a () ai carei parametri sunt de tip nod: q (adresa nodului inaintea caruia S8 face adauqarea), care S8 transmite prin valoare, deoarece este parame tru de intrare, :;;i u l ti m (adresa ultimului nod) , care S8 transrnite prin referinta, deoarece este parametru de intrare-iesire. vo id oda u ga i n fa t a( n od *q, n od *& u l t i m) {nod * p~ new n o d; p ->infc~q -~info ; q- >inf o =x ; p - > urm~q -> u rm ; q- >u rm=p ; if ( q o:~"'u l t i m ) uLt.Lmvp r }

2.6.3 .5. Parcurgerea listei


Prin acest algoritm se viziteaza fiecare nod al listei , pornind de la primu l nod , pana la ultirnu l nod , in ordinea de lnlantuire a nodurilor - furn izata de adresa urm din nodu l vizitat. l.is ta se parcurge pentru a prelucra informatia stoca ta In noduri . Implementarea alg or itm ului. Se foloseste functia procedurala parcurge () al carei parametru
prim de tip nod se transmite prin va!oare, deoarece este parametru de intrare. v oid p e rc u qe (noel " p rim ) {for (nod e p vp r i.m : p ! ""-NU L L ; ;'Y"' f) '- > lJ t:""m )
I/~e

p r e l u c r c ca za p->info;}

Atat vectorul , cat si lista sunt structuri liniare , iar algoritmii de parcurgere sunt asernanatori:
Vc cto ru l Lis t a i de tip int pentru indlcele elementului P de tip pointer catre tipu l nod a! listei pent ru adr esa eleme ntul ui cu rent din usta curent din vector I uent ru oarcurocre p-prim - adresa primului nod din lista i=O- indicele prirnului element din lnitializarea vector ~c~!ia bi l~ p-p->u rm - pointeru lui i se atr ibuie i-i+1 _ se incrementeaza indcele Trecerea la eleadresa nodului urrnator m entu l urrnato r i- n - indicele i are prima valoare mar p NULL - adresa rnemorata in pointeru l Conditia de mare decat cea a ultirnului element p este cons tanta NULL tenninare Varia bila tolosfta

2.6.3.6. Cautarea unui nod in lista


intr-o lista se poate cauta: 1. Nodu l care indeplineste 0 anurnita conditie , pe care 0 notarn cu co n ditie si care este exprimata pri ntr-o expresie lc qica ce contine eel putin un camp cu informatie din nod ; valoarea cond itiei este dependenta de intorrnatia stocata In ned . Alg oritmul 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. No du l care se gase~te intr-o anum ita 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 Implementarea algoritrnu lui . Se foloseste a tunctie operand cu tipul pointer catre tipul nod. In ambele variante:

122
-7 parametrul functiei este prim de tip nod

Im pleme n ta r ea str uc t urilor de date

~ i 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 rnernore aza In po inte rul p care va fi ret urnata de functie .

Varianta 1
nod *c a u t (n o d *p r i m) {for (nod * p~p r i m; p !=NULL && !c ond i t i e; p=p ->urm) ; return P i }
Varianta 2 - Va riabi la lccala nr de tip int se foloseste pentru a nurnara pozit iile parcu rse - este inltializata cu valoarea 1. no d " c e u t t n od *p r i m, int p a z)

{n o d *p =p r i m; i n t n r= l; for ( ; p ! =NULL && n r <poz ;

p=p ~ > u rm ,nr + +) ;

r etu rn p i }

2.6.3.7. Eliminarea unui nod din lista


Dupa eliminarea nodu lui din pozit ia p din lista S8 va elibera zona de memorie ocupa ta de nod. Elim inarea unui nod S8 face numai daca lista nu este vida . Pentru eliminarea unu i nod din lista , In functie de situatie, se poate folosi unul dintre algori tmii urm ato ri: 1. e li m ina re a p rim u lui nod ; 2 . e li m ina rea ultimu lui no d ; 3. e lim ina re a unui no d d i n interi orulli stei.
Eliminarea primului nod

Pas ii executati In acest algoritm sunt: PAS1 . Se salveaza adresa nodului prim In pointerul q. PAS2 . Succesorul nodulu i prim devi ne nodul prim. PAS3. Se cere eliberarea lonei de memorie de la adresa memorata In po interul q .
Eliminarea primului nod p rim ... u ltim

~ i:~?~ >f..~.~. ~ ~ info ~-i-nfo ..,~


.' ". succesorul nodului prim devine nod ul pri m Implementa rea algoritm ului . Se foloseste functia proced urala e liminayrim O al carei para metru p rim de tip nod se transmi te prin referinta. deoarece este parametru de intrare-iesire. v oid e l imina_prim(nod * & p ri m) {no d q =pr im ; p rim"'p r i m->urm ; delete q ; } Eliminarea ultimului nod

Pasii executati In aces t algo ritm sunt: PAS1 . Se salv eaza ad resa nodului ulti m in pointerul q. PAS2. Se cau ta predeceso rul ultimu lui nod , prin parcurgerea liste i in ce pand de la primul nod , pim a la pred ec esarul nod ului te rm inal (nodul care nu se leaqa de nimic adres a de leqatura are valoarea NULL) PAS3. Predeces orul nodulu i ult im devine nod termin al (adresa de legatura este NULL). PAS4 . Predecesorul nodul ui ultim devine nodul ultim . PASS . Se cere el ibe rarea zo nei de memorie de la ad resa rnernorata I n po interul q .

Informatica
Elim in area u lt im u lui nod p rim

123

--

.....

Im plemenlarea algoritmului . Se foloseste functia procedurala elimina_ultimO al carei parametru ul tim de tip nod S8 transmite prin referinta, deoarece este parametr u de intrare-iesire , v o id elim ina_ultim(nod p r i m, n o d * & u l t i m) {nod *p ,* q =u l t i m; fo r (p=p r i m; p ->urm- >u r m l =NULL ; p=p ->u rm) ; p- >u r m=NULL ; ultim =p ; de le t e q i }
Eliminarea unui nod d in inte rio r u l l istei

Pentru a elimina nodu l p aflat in interiorul listei, trebu ie sa leqa rn predecesorul nodului p de succesorul lui. Dar, predecesorul unui nod nu este cunoscu t. Elimin area unui nod din lista l nseam na de rapt elim inarea din lista a inforrnatiei pe care 0 con tine. Astfel, din lista nu S8 va elim ina nodul p , ci succesorul Sc3 U (care este cunoscut), dup a ce lnforrnatia din el a fast copiata in nodul p, Pasii executati in aces t algoritm sunt PAS1 . Se salveaza adre sa succesorul ui nodu lui p in pointe rul q . PAS2. Se cop iaza i n nodu l p toata informatia din succesorul lui (lnforrnatia propriu -zisa ~i inforrnatia de legatura). PAS3 . Se cere eliberarea zone i de memorie de la adresa memorata in poinl erul q. PAS4. Daca suc ceso ru! nodului p era nodul ultim , atunc i nodu l p devine nodu l ultim . Im plementarea algoritmului. Se foloseste functia procedura la el imina () ai carei parametri sunt de tip no d : p (adresa nodului care se elirnlna), care se transmite prin valoare, deoarece este param etru de intrare, ~ i ul ti m, care se transmite prin referinta , deoare ce este parametru de intrare-iesire. v o i d elimina(nod *p, n o d * &u l t i m) lnod *q =p - >u r m; p - > i ~ f o= p -> u r m - > i n fo ; p ->urm =p-> u r m ->u~m ; dele te q i i f ( p - > u r m= ~ NULL ) 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 prim ul nod, pima la ultimul nod, i n ordinea de lnl antui re a nodurilor _ furnizata de ad resa urm din nod ul vizitat, si se elibereaza zona de memorie ocupata de fiecare nod. Pas li executati i n acest algoritm sun t: PAS1 , Se initializeaza pointeru! p cu adresa primului nod din hsta - prim (p <-prim). PAS2. Cat l imp nu s-a parcurs toata lista (p ONULL) executa : i PAS3. Se salveaza adresa nodu lui p i n pointe rul q . PAS4. Se trece la succesoru! nodu lui p (p <- p ->urm). j PASS . Se cere eliberarea zonei de memorie de la adresa rnernorata i n pointerul q. Se revine la Pasul 2. PAS6 . Primu l nod nu ma i are adresa alocata (p r i m <- NULL ).

124

Implementa r ea strnclu ri lo r de date

Imp lcrnenla rea algoritm ul ui. Se foloseste functia procedurala eliberareO al carei parametru este prim de tip nod. Fiind parametru de intrare-iesi re 58 transmite prin referinta void el ibe ra r e( r.od * & p r i m) {n o d *p =p r i m, *q ;
while (p ! =NULL) pr im=NUL L ; } {q -:-o p; p =p ->unn ; delete q ; }

2.6.3.9. Lisle ordonale


in functie de cerintele aplicajiei listele gene rale pot fi c1asificate astfel:

Liste gen erale

Ordonate

J.
Ncordonate
Nu exista a ordine a nodurilor in Hsta. Operatiile de adauqare de noi noduri $i de rnodificare a valorii campurilor cu infermati! S8 fae fara restrictii, Adauqa rea S8 face de obicei pe la 0 extremi tate a listei ,

Nodu rile listei sunt ordonate pe baza valor ii unui camp cu informatie numit camp c heie. Operatiile de adaupare de noi noduri si de mod ificare a valorii campului c hele trebuie sa S8 taca astfel tncat sa S8 pastreze ordonarea.

i n cazul listelor ordonate , daca mtorrnatia din nodul listei este 0 data elementara , chela de ordonare va f data elementara. Oaca intormatia din nodul listei este 0 inregistrare, chela de ordonare va fi unul dintre carnpu rile inreqistrar!i. Pentru prelucrarea listelor ordonate putet i folosi : -7 algoritmul de sortare prin insortie: -7 algoritmul de interclasare a doua Iiste ordonate . 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 an t a 1 - Se porneste de la lista care coniine primul nod cu inforrnatie . Paii executati in acest algoritm sunt: PAS1 . Se adauqa primu l nod cu informatie la lista . PAS2 . Cat t im p rnai exista inforrnatie de adauqat exec uta PA S3. Se cauta nodul in aintea 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 lista: altfe l, se adauqa noul nod i n tata nodului qasit . Se revine la Pasu! 2. Im plernentarca algoritm ului .
#include < i o s t r e a~ . h >

struct n o d {int i nfo ;


nod * u r m;}; int n ; void a da u qa __no d (nod *&p r i-m) { p r Lm-c n e w noti , p r i.rrr-c- i n f'o '<n : p r Lm-c-u rm--Nttf. L r )

In fo r illa t icii
voi d

125

a d a \] 9 a _j. n ~f a t a ( n o d *q ) {n od ep vn ew n od ; p-c- u rmv q - c- u rmr P..... >i nfo =q - >i n [ c i q- >i nfo=n ; q -c-u rm ep r I void a d eru q ai u Lt Ern Lr iod *q } {n o d *p= n e w no d ; p,.->in f Q=n; q- > urrn=p; p -> u r m=NULL ; } nod * c au t.a (n od * p c.b n l {n o d * q =p r i m ; while (q - > i n f o <n && q -> urm! ""NULL) q - q - c- u r m. retu r n q ; }

void

Df i s ar~(nb d

*p r i m)
p ! =NUL L ; p wp - c-ur ru) cout.ccp - oL n to c c '' " ;}

{for ( nod * p =p r i m; void main ()

{n o d *p r i m,* q;

cou t .c-c vn uma r "; cinn; aci d uga_ncd (prim ) ; / /S e a dau g a primu l nod
c o u

vn u m a

";

i. ncc-n

while (n ! =0 )

/ /C ~lt

t i mp ma i. e x t s t

.i.nEo rm e t. Le d e a cle u qe t;

( q =c a u t a (p r i m);
no d u l q in a i nt e a c~ rui a trebu j.e adb ug at n odu l p /I Dac5 s - . a j un s I a a f a rs i.t.u .I Ld s t. o i. 2 d a uga:.;..ult irn( q) ; I lnodul p s e a de.uqf ce ul tirn n od else adau ga in ra ta (q) ; I in odul p se aciau q a i n f a t.a rrcciu.Lu L q
if
(q-c i n I'o -cn)
I/S~ caut ~

cou t.c -cv n uma r- "; c i n n ; } a f is a r e f p r im Lr } li Se afi o;> cClzJ.in f o n na ;': i i l e din l i E;ta

Varianta 2 - Se porneste de la lista care contine un nod santine la (un nod care ma rcheaza sfarsitul liste i). Acest nod con tine ln ca rnpul cheie 0 inforrnatie care are 0 valoare care face ca el sa fie intotdeauna ultimul nod din lista (de exemplu , In cazu l unei liste ordonate crescator, I n care ca rnpul folosit pen tru ordonare este de tip i nt, se ada uqa un nod care are In acest camp cea mai mare valoare pen tru tipul int - MAXI NT). Cand se va afisa lnfo rrnat.a d in lista. ultimul nod din lista nu S 8 mai af iseaza. Pasii executati in acest algoritm sunt: PAS1 . Se adauqa nodul santinela la lista. PAS2 . Ca l limp exista info rrnatie de adauqat ex ecut a PAS3 . Dac a infcrmatia care se ada uqa tre buie sa fie la i nceputul listei, atu nc i se adauqa noul nod ca prirnu l nod din list a si S8 rev ine la Pasul 2; a ltfe l, 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 gas it S8 revine la Pasul 2. tmp lemcnta rca al go ritm ului. #include < i o :: ; t r czun . li> #include < v 2 l u e s. h > struc t nod {int info ; n od * u n n; }; int n ; v o i d a d auqa s a n t. Lne La (no a v Sp r Lm) {p r i m=new nod ; pri m-> inro"'-MAX.I NT ; pl~ i m- > u r m =-'- NUL L ; } vo id e da uqe p t i m .t n'od * &p r i m) {n o d * p =new nod ; p -c- Ln I'o cn , p -c-u r m- p r im . p ri.rn e-p i } void adauga~in_ fata (nbd *q ) {n o d * p ~new nod ; p-> lJrm =q-> lJrm ; p->i llo= q ->lnfo ; q - > i n o = !l; q ->urm =p ; }

126

I m plem cn ta r cu srructu ril or dc datc

nod *c a u t a (flo d * p r j m) { n od *p =p r i m; fo r ( ;p - > info < n i p ~p-> u r m) ; retur n pi } v oid a f is a re (n o d *p r i m) / I Nu se a fi g ea za Intcrma t.La d i n u ltimul nod {f o r (n o d *p = p r i m; p -> u rm ! =NULL ; p=p ->urm) c o u t p-> :i. n f o " " ; }
v oi d ma in ()

{ nod *p r i m, *q ; ad a uga _s antinela( pr im ) ; / IS e adauga nodul santi nela cou t .c-c vn uma r " ; cinn ; wh i le (n != O) II Cat timp mai e x ista i n f o r ma tri e d e a d a u ga t {i f (n-cp .r i ru-o Ln f o ) j *Dac a .i nf o rrnat.La tr ebuie sa

fie

10.

incepu tu l li s tei */ a d a u g a_p rim( pr in) ; /I n o du l p seada uga co. p r i m n o d e l s e { q = c a ~ t a ( p r i m J; I/Se c aur a no d u I q Ln a.Ln t e a ca r u i a t r eb u t etac au c c t rro d u.l,
a d a ug a ~ i n ~fata

(q) ; } / I nodu l p s e ad auga in f a t a n odu lu i q

cout "numar "; c inn;}


a f i s a.re (p r i m) ; }

Algoritmul de interciasare a doua liste ordonate


Acest algoritm fo lo sest e ace lasi princip iu ca ,i aigoritmul de inte rclasare a doi vectori ordonati . Cele do ua liste sunt ordonate dupa ac elasi ca mp cheie ~j crite riu de ordonare ~i S8 obtine 0 a treia lista care contine infcrmatia din primele doua liste ordo nata dupa acelasi criteriu, folosind ace las i camp cheie. Pasii ex ecutati i n acest algo ritm sunt: PAS1 . Se creea za Lista 1 ,i Lista 2 ordonate dupa acelasi criteriu si dupa acelasi camp cheie. PAS2. Se adauqa primul nod la Lista 3 astfe l: daca in co nfo rmitate cu criteriul de ordonare folosit treb uie ad auqata intorrnati a din pri mul nod al Listei 1, at u nci se adauqa inforrnatia din nodul p rim al l.iste i 1 ;;1 In Lista 1 S8 trece la succesorul nodul ui prim , iar in Lista 2 la nodu l p rim ; altfe l , S8 adauqa inforrnatia din nodul pr im al Liste i 2,i i n Lista 2 se trece la succesorul nodulu i p rim , iar i n Lista 1 la nodul pr im . PAS3. Cat timp nu s-a ajuns la starsitul List ei 1 sau al Liste i 2, exec uta : PAS4. Se adauqa la Lista 3 un nod dupa ultimu l nod astfel : d ac a i n conformitate cu criteriul de ordonare folosit trebuie adauqata informatia din nodul curent al Listei 1, atunci S8 ada uqa inforrnatia din acest nod ;;i in Lista 1 S8 trece la succeso rul nodului curent, altfel , se adauqa informatia din nodul curent al Liste i 2 ,i i n Lista 2 se trece la succesa rul nadulu i curent. Se revine la Pasul 3. PASS . Da ca s-a ajuns la sfarsi tul l.istei 1. at unc i la Lista 3 se ad auqa dupa ultimul no d nodurile rarna se in Lista 2; altfe l, la List a 3 se ad aug a dupa ultimul nod nodurile rarnase in List a 1. Imp leme ntarea algoritm ului. i n implementa rea algoritmulu i 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 ~i respectiv r , iar pentru lista care se creeaza prin interclasare - pointerul p .

Informa tica
#include <i o s t r e a m. h > s t r u c t nod t int in fo ; nod *u r m,'};
i nt n ; vo id a d auga,..:..Dod (nod * &p r i m) { p r i.rne n e w nod ; p r i.m-c-i.n f o e n : p r i.m-c-u r me Ntrl.L r }

127

v o i d adaug3_in:....-f at a (no d *q )
{nod * p = new hod ; p -> u rm=q ->urm; p ->info=q->info ; q - >info=n ; q - c-urm e-p r }
v o i d adauga ultirn (nod * q )

{n od *p =new nod ; p->info~n ; q-> u rm ~p; p ->urm=NULL; } nod *c a u t a {n o d *p r i m) {n od *p =p r 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 creeaz a 0 l ista ordonata {nod *q ; oou t .c-cvn u ma .r " ; cin n ; e da uq a j nod (prim) ; cout" n u rua r " ; c i n n ; whi le (n ! =O} {q =c a u t a (prim ) ; i f (q ->irlfo<n) ad aug a u l li m (q ) ; else adauga in fa talql ; ccu t.c-cv n uma r " ; c i n n ; } ) v o i d afisare(nod *p r i m) {n o d - p -cp r i.n.: wh i l e (p ! =NULL ) { cou t .c-cp - o i n I cc c " " ; p =p->urm ; } }
v o i d ma i n {) {n o d vp r i. rnL , *pr im 2, *p r i m3, *q , "r , *p ;

crea re(priml ) ; c reare(prim2) ; i f (prim)- >info>9r~m l->in fo) {n = p r i ml - > i n f o ; qe p .r im L - o u r m, r~ pri m2 ; } e lse { n = p r i rn2 - > i n f o ; r =pr im2 ->urm ; q =pr iml; ) adaug a nod (pr i m3 ) ; p=prim3 ; wh i 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 rrij } else {n= r- >i n f o ; ra r -c- u rm r j :ldau!;Ja~ulti m{p ) ; p vp - c-urm r I
if
(ql ~O)

t r ! = 0 ) {ne r -c-Ln fo , a dauga _ult i.:Tl (p ) ; p-p-c-unn. rvr-c-urm . I aisareip rim3J ; ) / /Se afi$eaza info rma\=. i ile din lista interc lasata

wh i l e e lse wh i l e

(q !=OJ

{n =q - > i n f o; adau qa u Lt irn tp I p vp -c-u rrn . ,q =q - >u rm ; )

2.6.3.10. Prelucrarea listelor simplu inlantuite


Rezolvarea problemelor i n car e orqanizati datele sub forma de liste presupune folosirea algo ritmilor prezentati, astfel: 1. Se creeaza lista prin folosirea urrnatorilor algoritmi : -7 Se adauqa primu l nod la lista vida (algoritm ul pentru ad auqa re a la llsta a primului nod ). 7 Se adauqa cate un nod la lista. Pozitia in care se ada uqa nodul depinde de cerintele problemei. Daca lista nu este ordonata, adauqarea se poa te face la starsitul

128

lmplcmcn tarca structurllor de date


sau la inceputul lisle i (algori tm ul pe nt ru ada uqa ro la i nc ep ut ul sau la s ta rs it u' list ei ). Daca lista este ordonata , S8 parcu rge mal in tai lista pentru a gas i pozi tia de ins erare (a ig o ritm u l pentru c auta roa unui nod i n tista) dupa ca re S 8 inse reaza noul nod In po zit ia gas ita (a lgo ritm u l pentru ada uqaro i n i nte r io ru l li stei ).

2.

Sa intretino l ista prin folosirea urrnatorilor algoritmi : -,) Se adauqa noi nod uri la lista . Ca ~i la crearea liste i, i n functie de cerintele probleme i S8 va folosi unul dintre algoritm ii de ada u qare. -,) Se elirnina noduri din lista . Mai inlai se parcurge lista pentru a gas i nodul care se elimina (al goritm ul pentru ca ut arc a un ui nod i n lista ) dup a care S8 elirnina nodul din pozitia gasita folosind unul dintre alg ori tm ii pent ru climi nare - in fu nctie de po zitia in ca re a fast gasit nodul. 7 Se mod ifies inforrnatia dintr-un nod al listei. Mai i ntai S8 parcurg e lista pentru a gasi nodul in care se va mod ifica informatia (aigoritm ul pe ntru cau ta rca unui n od in lista). 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 carnpulu i respe cl iv. Daca lista este ordonata si, prin modificarea valori i carnpului, se poate distruge aceasta ordonare, se modifica valoarea carnpului, se salveaza inforrnatia din nodul listei l ntr-o variabila intermediara , 58 elirnina din vechea pozitie (algoritm ul pe ntru c li m inarca un ui nod di n Hat e). se parcurge lista pentru a gasi noua pozitie (algo ritm ul pen tr u cautarea unui nod in lista) ~i 58 insereaza nodul in pozitia gasi!a (algoritm ul pentru ada uq arc a un ui nod la lis ta). Se obtin inforrnatii din Iista Se par curge lista (algo rit m ul de parc urge re a li sl ei) si se vizitea za fieca re nod allistei pentru a extrage din el inforrnatiile necesare.

3.

[Swmu de cmz I
Seop: exempl ificarea modului i n care , pentru rezolvarea prob leme i, folositi algo ritmii de prelu cra re a listelor simplu l nlantuite ~ i implementarea lor cu ajutorul subprogramelor. Enunt ul pro bl em c i 1. So citosto dintr-un fiier taxt lin sir do numere separate prin spatia cu care se creeazD 0 listfi simplu inlan tllita in ordinea in care sunt citite numoroto din tisior. Sa so vcrifico (facti tiste coutine numoi numere distincte i opo! sa se tuiouqe dupa fiecam Ill/m ar impar "din lista vetonroe 100 i sa S8 etiseze numctete din tiste. Penuu testarea prog ramu!ui se vor folosi aou setuti do numere: (2, 5, 10, 3. 8) i (2. 5. 10. 5, 8, 7) . Nodur ile listei nu sunt ordonate conform unui criteriu . Nume rele se vor cit: din fisier ~ i 58 vor scrie in lista prin adauqare dupa ultimul nod . Proble ma se desco mpune i n urrnatcare le subproblerne. iar algoritmul de rezolvare a unei subprobl ems este implemental cu ajuto rul unui SUbprogram:

iE1l Se crteste

primul num ar din fisier si se adauqa primul nod la lista (nodul prim ) subprogramul adauga no d () . ~ Cat tim p mai exis ta num ere in fisier exec uta : se cite ste un nurnar din fisier si 5e adauq a un nod cu num arul respe ctiv dupa ultimul nod din lista - subpr ogramul adauga ul t im () . ~ Se ver ifica daca num erele din lista sunt distincte, astfel: se parcu rge lista de la primul nod pana la penultimul nod si se venfica daca nurnarul din nod ul curent mai exista i n . nodu rile care urmcaza dup a el pana la sfarsitul listei - subproqrarnul distin cte () . ~ Se parcurge lista de la primul nod pana la starsitul ei si daca numar ul din nod este impar se adauqa dupa el un nod care contine valoarea 100 - subproqrarnul p rel ucrare ( ) .

Info rmatic a
fieca re no d - sub prog ram ul afi s are ( ) .
#inc lude < f s t r e am . h > struct n o d t int i nfo ;
n o d * u r m;) ;

129

~ Se parcurge lista de la primul nod pana la sfarsitul ei si se afis eaz a inforrnatia din

fs tream f( " Li s r.e l . t xt" , i 0 5 : : in ) ; in t n i void a d a u g a ,.;n o d (nod *&p r i m, nod *&u l t i m)

{p r i m=new nod ; prim ->info=n ; p rim ->urm=NULL ; ul t im=p r i m; }


void adauga_ultim(nod *&u l t i m)

{nod

* F ~new

nod ; p->in fb=ri ; p-> u r .m=NULL; u lt i rn->urm= p ; ultim=P i }

v o id ud auga~dupa(nod * &q, nod *&u l t i m) {n o d *p zonew nod ; p ->info =100 ; p ->urm=q ->urm ; q ->urm=p ; if (q==ultim) illtim=p ;}
in t d l s t l ~ c t e ( n o d *p r i m) {f or (n o d *p """p r i m; p->urm!:=.NULL ; p=p ->u rm)

fo r

(nod * q =p - > u r m; q !=NULL ; q =q->urm) if (p ->info==q->info ) retu r n 0 ;

re turn I ; } v o i d prelucrare(nod *p r i m, nod * & u l t i m) {fo r (no d *p =p rim ; p ! o;,o NULL; pe p -c-u r m)
if (p ~ >infD %2 = = 1 ) adauga_dupa(p ,ultim) ; } v o i d a f is a.r e (nod " p r.Lm ) { for (nod * p=p r i m; p! =::oNULL ; p ep-c -urm) c cutx-cp - o i n foc c '' ". void ma in () {n od e p r Im , * u l t i m; f > > n adauga nod(prim ,ultim} ; wh i le (f n ) adaugaultim(ultim) ; f of o s e t j , if i st t t p Lm ccc l sun t ti
i
{ d L n c e r l ) c .c -c v z I c m e n t e e d i . s n c

cout-ocendf , }

t e v

c n

else cou t-cc ve Iement.e Le n u s un t dt s t i n c t e.vccen d f


prel uc~a re (prirr ,u ltim ) ;

afisare(pr im ) ; }

Enuntul problemei 2. Se citeste dintr-un tisier tex t un numet cu maxim 20 de cifre. Sa se verifice daca nurnarul esle palindrom. Pentru testarea programului se var folosi oou

numere: 1234321

12345.

Se vor crea doua liste: una cu cifrele nurnarului citite din fisier. prin adauqa re dup a uJ timul nod, iar a doua, cu cifrele memora te 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 (prim 1 si respec tiv prim2) ~ i prin adresa ultimului nod (ultim1 ~ i respectiv ultim2). Problema se descompune in urrnatoare!e subprobleme , iar algor itmu l de rezolvare a unei subprobleme este implementat cu ajutorul unui subprc qrarn citeste primul nurna r din fisier ~i se adauqa primu l nod la Lista 1 (nodul prim1 ) subprogramul adauga n od ( ) . [E] cat timp mai exista caract ere in fisler, executa: se cites te un caracter din fisier, se converteste In cifra si se adauqa un nod cu citra respectiva dupa ultimul nod din Lista 1 - subp rogramul a d au g a u l t i m () . ~ Se ada uqa primul nod la Usta 2 (nodul pr im2 ) care va contine infor matia din primul nod al Liste i 1 (prim 1) - subpro gram ul adau ga nod()

IE] Se

130

Im(ll em entarea st ru ct u r ilor de date

~ Se parcurge Lista 1 de la succesorul primului nod pana la sfarsitul ei ~i se adauqa un nod


cu citra respectiva inaintea primului nod din Lista 2 - subprogramu l adauga prim () .

~ Se parcurg simultan ambe le liste de la primul nod pana la sfar~ it ~i se v erifica daca
sunt eg ale cifrele memorate i n nod ul curent din cele doua lisle - subprogramul
p alindrom ( ) .

#includ e < f s t r e a m. h > s t r uct n od ti n t in f o ; nod - u r mr l f s t r e a m f( "1 is ta 2 .t xt " , i o s : :i n ) i int n ; v o id adauga no d {nod * & p r i m, nod * & u l t i m) {p r i ;no:= new nod ; p rim->infoo=C1 ; prim->urm=NULL ; ul tim=prirn. ; } vo i d adaugu_u ltim (nod * & u l ~ i m ) {n o d *p =new nod : p ->info=n ; p ->urm=NULL : ultim ~ > urm=p ; ul t im=p ; } vo i d acta ug a_ prim (nod *&p r i m) { n o d - p v n ew nod ; p- >i n f o=n ; p -c- u rm ep r Lm, p r Lm-p r j i n t pa l i nd r om(nod *p r i ml, nod *p r i m2 ) { nod " p , *q ; f o r (p=priml , q =p rim2 ; p ->urm! =NULL ; p=p-> u rrn, q =q - >u r m) if (p ->in fo !=q->info) r eturn 0 ; r eturn I ; }
v o i d ma i n ()

{cha r c ; nod * p r i m l , * u l t i ~ l , * p r i rn 2 ,* u l t i m 2 ,* p ; r >c n=c - 'O ' ; adauga nod Lpr Lm l s u Lt i mLj r whil e (fcl ( n =c - ' O' ; a d a u g a _ u l t i m(u l t i ml ) ; } f . c l o s e ( ) ; n=priml ->info ; adauga _ nod(~rim2 ,ul~im2l ; f o r (p=priml - >u rrn ; p != NULL ; p=p->u r ml {n=p - > i n f o; ada u ga _p rim (pr i m2 ) ; } if (pa l ,indrom (p rim l ,pr im2) ) cOllt" Es Le pa lindro m" ; el s e co ut " Nu estc p a lind rorn " ; }
Enuntul problemei 3. Se citeste dintr-un fiier text un :;ir do numere separate prin spa(iu cu care so creeaz8 0 lista simplu inl8n(uita in ordinea in care suni cilite numerele din Iisler. Se moi cnest de /0 tastatura un numar x. Sa se caute $i sa se $tearga din list nodu/ care contine acest nutner. Pentru testarea program II/IIi se va tolosi situt de nllmere: (2, 5. 10, 3, 8). iet pentru x patru vetori: 2. 5, 8 $i 7. Nodurile listei nu sunt ordo nate conform unui criteriu . Numerele se vor citi din fisier ~i se vor scrie i n lista prin adauq are dupa ultimul nod. Proble ma se descompune i n urrnatoarele subprobleme, iar algoritmii pentru rezolvarea subproblemelor sunt irnplementati cu ajutorul subproqrarnelor:

[i>] Se citeste

valoar ea pentru x de la tastatura. ~ Se citeste prirn ul nurnar din fisier si se adauqa primu l nod la lista (nodul prim ) subprogramul ada u g a nod ( } . ~_ C a t timp rnai exi sta numere i n fisier ex ec uta: se citeste un nurnar din fisier ~i se adauqa un nod cu nurnarul respectiv oupa ultimul nod din lista - subprogramul
a d a u g a u l tim () .

~ Dac a prim ul nod din lista contine numarul x , atunci se elirnina primul nod (subprogramul e limi n a _ p r i m ( )) ; altfel , se cauta predeceso rul nodulu i ca re contine nurna rul x (subprogramul cau ta () ) si da ca se g ase~te aces t nod, atunc i se sterqe nodul care urmea za d u p a el (subprog ramul el imin a _ u rm () ).

Informa tic a
fiecare nod - subprog ramu l a f Ls er-e () .
#i n cl u d e <f s t r e a m. h > struct nod tint info ;
n o d - u rm r j

131

~ Se parcurge lista de la primul nod pana la sfarsitul ei si se afiseaza inforrnatia din

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;


n od

ult~r.l ->urm=p ;

ult.i.m=p ; }

* cauta {nod

~p )

&& p ->urm->info!=x) p=p->urm; return p ; } v o i d elirnina prim (n od *&p r i rr.} {nod *q =p r i m; prim=prim ->urm ; del ete q ; } void elimina_urm(nod *p ) {nod *q =p - > u r m; p ->urm=p->urm->urm ; delete q ; } vo i d afisare(nod p r i m) {f o r {nod *p =p r i m; p ! =NULL ; p =p - > u r ml cout p - > i n f o" ": coutendl;} void mai n ( ) {n o d e p r i m, "u l c i m, "'p ; cou t.c-c" x e " ; cin x; f o ; adauga~nod (prim , u ltim) ; while (fn) Ddauga_ul~im(ultirn) ; f . c l o s e ( ) ; if (prim-> info==x) elimina prim(prim) ; e lse {p =c a u t a (p r i m) ; if (p - >u r m! =NULL ) elimina_urm (p ) ; } afisa=e(prim ); }
{ w h i l e ( p - > u~m ! =NULL

Enuntul problemei 4. Se citeste dintr-un tisier text un ~ir de numere separate prin spatiu cu cam se creeaza 0 Iista simplu inlantuila in ordinea in care sunt cilite numerele din tisier. Sa se eiimine din tist vetotite care se reoete, in afara de prima lor aparitie. Pentru leslarea programului se va tolosi irul de numere: (2, 4, 9, 9. 9, 6, 2, 9, 9) . Nodurile listei nu sunt ordonate conform unui criteriu. Numere le se vor cifi din fisier ~ i se vor scrie in lista prin adauqa re dupa ultirnul nod. Problema se descompun e in urrnatoarele subprobleme, iar algoritmii pentru rezolvarea subproblemelor sunt irnplernentat i cu ajutorul subprogramelor:

:E1I

Se citeste primul nurnar din fisier si se adauqa primul nod la lista (nod ul prim ) subprogramul adauga nod ( ) . ~ Cat timp mai exista nume re in fisier executa : se citeste un nurnar din fisier ~i se adauqa un nod cu nurnarul respectiv dupa ultimul nod din lista - subprog ramul
adauga ul ti m () .

~ 5 e elimina din lista valorile care se repeta, astfel (subprogra mul prel ucrare () ): Pentru un pointer p care indica fiecare nod din lista , in cepand cu primul nod pfma la p.enultimu l nod , exe cuta : -7 Se initializeaza pointerui q cu adresa nodul cure nt (indicat de pointerul p). -7 Cat timp pointerui q nu indica ultimu l nod, executa: daca nodul indicat de pointeru l p contine acelasi nurnar cu succeso rul nodului indicat de pointerul q ,

132
:

lmplcrn enrarea st r uc t ur ilo r d c date

atunci S8 elimina succesorul nodului q (- subpro gramu l e Li.m.i .na u rm n ): allfel, pointerul q indica succesorul nodulu i. ~ Se parcurg e Iista de la primul nod pana la sfarsitul ei ~ i se afiseaza inform alia din fiecare nod (subprogramu l afisare ( ) ). #incl u de <f s t r e a m . h > struct n o d lin t in f o;

nod

* u rm ; } ;

f s t r e am
int n ;

f { " lis~a 4 .t x t " , i o s : : i n ) ;

voi d adau g a n od (nod *& p r irn , nod * & u l t i m)


{p r Lm- n e w nod ; pr Lm-c-Ln fo e x , prirn->unn=NULL i ultim=prim ; } v oid a dauga _ult im{nod * &u l t i m}

{nod *p =n ew nod ; p- >info=x ; p->urm=NULL ; u lt im->urrn=p ; u ltirn=p ; }


v o i d e limina _ urm (n o d *p }
{ n o d * q=p - > u r m; p-> u r :n=p-> urm ->urm ; delete q; }

void p~el u crare (no d *p r i m) {::o d *p ,* q ; fo r ( p =p rim ; p - >u rm!~ NULL ; p=p - > u rm)

{n=p->i n f o; q =P i
whi l e (q! =NULL)

{i f

(q-> urm!=NULL && q ->t: rm-> info="'-'n) elimi na_urm(q) ;

e l s e q =q ->urm; } } } void a fisare{ncd * p r i rn) {f o r (nod <p -.p r Lm, p!=NULL;p=p - >u Ym) cou t ccp - c- Ln f o -cc" "; cou t e ndl;} void ma i n {} { ~ o d *p r i m, * u l t i m; f n; ad aug a_nod( p r i m,ultiml ; while (f :1) a dauqa_u l t i rn (u l t i m); L c l o s e (} ; p re I ucr a re (p r i m) ; afisa r e (p r im) ; }

En untu l prob lemei 5. Adunarea a dOlla potinooma. Se citesc oimr-ut: Iisier text de pe prima linie un numar n1, care teprezinte numiuut oe coeiicienti nenuli oi utiui palinom, apai do pe urmatoarele 111 linii coeticientii nenuli i gradlll, de pe tinie urmatoare un numar n2 care repte ziate numetut do coeticienti nenuli ai cetui de al doi/ea palinom i apai de pe utmetoetele lmii coeticientii nenuli i gradul. Sa se creeze cu acesto intormetit ooue listo simplu inlernuite i sa se adune cele doue palinoame. Coeticiontut i gradul tiecetui termen din polinomul suma se vor salva intr-un tisier. Pentru testarea programului se vot folosi 4 2 3 potinoernete -lOx +5x -3x ~j 3x +7/+x +2. Se vor crea coua liste in care se vor memora cele doua polinoame. lnformatia utila va fi mernorata intr-o inregistrare cu doua carnpuri: un camp pentru coeficient si un camp pentru grad. Ambele liste se creeaza prin citirea datelor din fisier ~i adauqare dupa ultimul nod. in a treia lista se va memora palinomul obtinut prin adunarea celor doua polinoame . Cele trei liste se identifica prin adresa primului nod (prim1, prim2 ~i respectiv pri m3) si prin adresa ultirnului nod (ull im 1, ul li m2 ~i respectiv ull im3). Problema de creare a listei surna a polinoamelor se descompune in urrnatoarele subprobleme, iar algoritm ii pentru rezolvarea subproblemelor sunt impiernent ati cu ajutorul subprogramelor:

IE] Se citesc din fisler


E?]

n 1 si coeficientul ~ i gradul primului term en din primul polinom. Se adauqa primul nod la lista L1 (nodul prim1 ) - subprogram ul a da uga nod () . Pentru urrnatoare le n1-1 perechi de numere din fisier , executa : S8 citesc din fisier coeficientul ~i gradul unui termen al primului polinom si se adauqa un nod cu inforrnatia respect ive dupa ultimul nod din lista L 1 - subprogramul adauga_ ul tim () .

Inform at icii

133

~ Se citesc din fisier n2 ~i coeficientu l si gradul primului termen din al doilea polinom.

Se adauqa primul nod la lista L2 (nodul prim2) - subprogramul adau ga nod ( ) . ~ Pentru urrnatoarele n2-1 perec hi de numere din fisier, exec uta : S8 dtesc din fisier coef icientul ~ i gradul unui termen al celui de al doilea polinam ~ i se adauqa un nod cu informatia respective dupa ultirnul nod din lista L2 - subprogramul adaug a _ u l tim ( ) . ~ Se adauqa primul nod (prim 3) la lista L3 cu urrnatoarea inforrnatie: daca gradul din primul nod din lista L1 este egal cu gradul prirnului nod din lista L2, at unci gradul este egal cu gradul nodulu i din Lista 1, iar coeficientul este egal cu suma coeficientil or din nodurile celor doua liste ~ i in ambele liste se trece la nodul urrnator : allfel , daca gradul din primul nod din lista L1 este mai mare decat gradul primului nod din lista L2, atu nc i gradul este egal cu gradul nodului din Lista 1, iar coeficientul este egal cu coeficientul nodului din Lista 1 ~i in Lista 1 se trece la urrnatorul nod; altfe l, gradul este egal cu gradul nodul ui din Lista 2, iar coeficientul este egal cu coeficientul nodului din Lista 2 ~i in Lista 2 S8 trece la urmatorul nod - subprogramul adauga n od () . ~ Cat tim p nu s-a ajuns la sfarsitul Listei 1 si al Listei 2, exe c ut a: se adauqa un nod la lista L3 dupa ult imul nod, cu urrnatoarea inforrnatie : daca gradul din nodul cure nt din lista L1 este egal cu gradul nodului curent din lista L2, at unci gradul este egal cu gradul nodulu i din U sta 1, iar coeficientul este egal eu suma ccefi cientilor din noduril e celor doua liste ~i in ambele liste se trece la nodul urrnator : allfel, daca gradul din nodul curent din lista L1 este mai mare decat gradul din nodul curen t din lista L2, at unci gradul este egal cu gradul nodului din Lista 1, iar coeficientul este egaI cu coeficientul nodului din Lista 1 >;i in Lista 1 se trece la urrnatorul nod; allfel, gradul este egal cu gradul nodului din Lista 2, iar coeficientul este egal cu coeficientul nodului din Lista 2 ~i in Lista 2 S8 trece la urmatorul nod - subprogramul adaug a _ u l tim () .
#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 : : o u t } ; struct n od lint e ,g ; nod e u r rrr j , int e ,g ,:1 ;
voi d a d a ug a nod { no d *&p r i.."TI, n o d *& u l t i m)
{ p r : ~=new ~od ; ultiffi~pr:n ; prim ->u=m~ NULL ; pr i ~- > c = c ;

prim- >g=g ; }

v oid

adaug2 _ul~im {ncd

*& u l t i ~ )

{ ~ od *p =n e w n od ; p- >u r m=NULL; ultL~ ->urm=p ; u ltin~? ; 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 _ n o d lp r i m,ultim ) ; f or ( i n t i '-".2 ; t c-n , i -'- t ) { l c gi a dzru q a ul t i m {u l t i rn) ; } } void a d u n a r e (noel - p r irn I. nod *p r i m2 , n o d * & pr im3 , I1 C'Jd * &u 1 t irr,3 .1 { no d *p = p r i ml , *q =p r i r:12; if lp - >g ==q - >g) {g =p - >g ; c =p- >c +q - >c ; p =p->u r m; q=q -> u r m; } else i f (p ->g>q- >g) {g =p - >g ; c=p ->c ; p=p - >ur m; } else {g =q- >g; c = q - >c ; q=q ->urm ; } adauga no d( prim3 ,u ltim3 ) ; while (q l =NULL && p != NULL ) { i f ( p - > ~ = = q - > g) { g ~ p - > g ; c=p ->c+q ->c ; p =p ->Jrrn ; q=q ->u r~ ; } else if (p - > g > q - > g) { g =p- > g; cep ->c p =p - >u r rn; } e lse { g ~ q - > g; c=q ->c ; q=q -> urm ; } adau qa u l t i m (u l t i m3 ) ; }

if

{p ! ~ NUL L )

whi le (p ! =NULL ) else

( g =p - >g; c=p->c ; ad aug a ulti m (u l t i m3 ) ; }

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 - >u r rn) c ou t p - >c " " p - >gendl; cou t e n d l; ) voi d salvare(nod *p r i m) {f or (no d *p =p r i f:l ; p ! =NULL; p =p - >u rm ) f2 p->C " " p - >gendl;} v oid main () ( n o c *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 (prim l) ; fl ~2 ; n=n2 ; creare (prim2 ,ultim2) ; af i s ar e {prim2 ) ; a dunare (priml ,prim2 ,prim3 ,ult im3 ) ; afisare lprim3 ) ; salvare {prim3 ) ; ~l . c l o se ( l ; f 2 .c l o s e() ; }

Enuntul problem ei 6. Reuniunea !ji intersectie a doua muttimt. Se citesc dintr-un fi~ier text do pe prima linie un numar n1, care reprezintfJ numeru! de elemente ale ptimei tnuttimi. apoi de pe urmatoa rea tinie elementele muuimit, de pe linia urmetoere un numer n2 numerut de elemente ale celei de a doua muttim), epoi de pe urmatoa rea tinie elemen tele muttnni'. Sa se determine reuniunea i intetsectie celor doua multimi. Pentru testarea programului se vor folosi doua seturi de date de introte: mu/rimile A ={1,2,3,4,5} i B={4,5,6,7} i multitnite A ={1,2,3} i B={4,5}.

Se vor crea doua liste in care se vor memora cele doua rnultirni. Ambele liste se creeaza prin citirea datelor din fisier ~i adauqare dupa ultimul nod. in a treia lista se va memora reuniunea celor doua multirni, iar in a patra lista - intersectia. Cele patru liste se identifica prin adresa primului nod (prim1, prim 2, prim3 "i respectiv prim4 ) "i prin adresa ultimului nod (ultim1, ull im 2, ullim3 " i respectiv ultim4). Pentru determinarea reuniunii se vor executa urmatorii pasi: Pas 1. Se adauqa primul nod la Lista 3 (nodul prim 3) care contine numarul din primu l nod al Listei 1 (p ri m 1). Pas2 . Se parcurge Lista 1 de la succesorul primului nod pana la sfars itul ei " i se adauqa un nod cu num arul respectiv dupa ultimul nod din Lista 3. Pas3 . Pentru liecare nod din Lista 2, exec uta : se parcurg e Lista 1 si daca nurnarul din nodul curent din t.ista 2 nu S8 gas8iite in Usta 1, atunei se adauqa un nod cu nurnarul respectiv dupa ultimul nod din Lista 3. Pentru determinarea int ersecti ei se vor executa urrnatorii pasi: Pas1 . Se initializeaz a Lista 4 ca lista vida (prim 4=NULL si ult im 4=NULL ). Pas2 . Pentru fiecar e nod din t.ista 1, executa : se parcurge Lista 2 si daca nurnarul din nodul curen t din Lista 2 se gase" te in Lisla 1, at unci se adauqa un nod cu numarul respectiv ca prim nod in Lista 4 (nodul prim4 ). Pas3 . Daca s-a adauqat primul nod la Lisla 4, atu nci pentru un nod din Lista 1 de la succesorul nodului curent pana la ultimul nod , executa : se parcu rge t.ista 2 ~i dac a numarul din nodul curent din Lisl a 1 se gase"te i n Lista 2, at unci se adauqa in Lista 4, un nod cu nurnarul respectiv, dupa ultimul nod .
#include < : s t r e a ~ . h >

struct nod t i nt i n :o ;
nod - u rn. r } ,

fstream f( "lista 6 .: ~ : t " , i o s : : i n) i nt x ; voi d adau ga_ nod( nod * & p r i ~ , n o d

; * & ~ l t im )

III fnrill a ticii

135

{p r i rnvn e w n od i pri rn -c- Ln f oe x r pr irn - >u r m=NULL ; u LtImep r i.mr I void a d a u g a_ultim( nod *&u l t i m) {no d - pe new nod ; p- c- Ln f c -cx, p ->unn=NUL L ; u l t i m- >u r m=p ; u l t i m=p ; } voi d c r e a r e {no d * &p r i m, n o d * &u l t i m)

l i n t n ; f nx ; ada uga_flod (p rim, ultim) ; fo r (i n t i =2 ; i <=rl ; i +i ' ) {f x; a dauga_ulti rn( u l t im) ; } }


v oid r eun i u n e (n o d *p r i ml , nod *p r i m2 ,
~o d

*& p r i m3 , no d * &u l t i m3 )

{no d *p ,* q ; int g a 5 it ; xep r i.mL'- o i.n f o r adauga ~.nod (p r im.J , ul tim3) ; f o r (p =prim l ->unn ip !=NULL i p-p->urm) l x=p->info i a dauga u ltim{ul tim3) ; } f o r (p = p r i m2 ; p ~ ~ NULL ;p = p ~ >u r~) (for (q =p r i ml, g a s i t =O; q !=NULL && !gas ~t ; q=q- > u r ~ ) i f ( p - > i n f o = = q - > i ~ f o ) ga3it=l ;
if ( ! g a s i t i { x e p -c-Ln f o , adauga_ult.i:ntultim3) ; } } } voi d .i n t e r s cc t Le Lnod e p r i.rnL, nod * p r i m2 , nod * &p r i m4 , nod * &L:. l t i m4 } ( n o d *p ,* q ; int gasit ; ?r im ~=NULL ; ultim4=NULL ; f o r (g a s i t= O, p ""'p r i m1; p ! =NULL && i qas i t , p =p ->urm) fo r (q=prim2 ; q != NULL && ~ g as i t ; q=-q->u r m) i f (p - >info==-q->info) {g a s i t = l ; x ~p - > info ; } if (g a s i ':) ( a d a u ga n on (p r i m1 , u l : i m4 ) ; f or ( ; p ! ~ O ; p=p - >u ern) {for (ga s i t =O, q =-p r i m2 ; q! =- NULL && !gasit ; q=q- >u r m) if (p ->info=- =q->info) gasit= l; i f (g a s i t } {x =p - >i n f o ; adauga_ultim(ultimt;) ; } } }} void a :i s a re(nod * p r i m) {for {nod * p = p r i m; p!:-:"NULL ; p =p- >u r m} c out p - > i n f o " cou t e n d l ; } v o i d mai n ()
II .

{ ~ od

* p r i m l ,* u l t i m l ,* p r i m 2 ,* u l ~ i m 2 ,* p r i m 3 , * u l t i m 3 ,* p r i m 4 , * ~ I t im 4 ;

c cee ce (p r .iml , ul timl) ; c r ee r e (prim2 , ul tim2} ; f _close ( ) ; r cuni.une (priml , prim2 , pr im.S, u l t i m3 ) ; ccuccc vne cnt u ne e - " ; afisa re (prim3) ; Ln t c r sec t i e (p r im l , p r i.mz , p r i.mq , u Ltim-1) ; c o u t-cc" Intersectia= " ; if {prim4l=NULL) afiSar~(p r ~~j.:) ; ~ else cout" M u l t l :ne 2. vida " ; }
o
0

'*"

Scrieti cate un program care sa rezolve cerintele flecarei probleme. Fiecare problema se va deseompune i n subprobleme ~i algoritmul pentru rezolvarea unei subprobleme se va implementa cu un subprogram. Datele se transmit intre subprograme eu ajutorul parametrilor de comunicatie ~i nu al variabilelor globale. Dupa executarea unei operatii de preluerare a lisle; simplu i nlant uite. 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 c oua numere x ~ i y . Se insereaza i n lista numarul y ina intea nurnarului x. 2. Se creeaz a 0 lista i n care ordinea de aeces este inversa celei i n care sunt citite nurnerele. Se elimina din lista eel mai rnic nurnar si eel mai mare nurnar.

Tenui

---

136

1m ilcm cntarca st r ucturilor de date

3. Se cree aza 0 lista ~i S8 afise aza in ordinea inve rsa citirii din fisier num ai 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 mes aj de informare. 5. Se creeaza 0 lista in care ordinea de acees este cea in care sunt citite numerele din fisier . Se insereaza inaintea fiecarui nurna r facto rii sai primi. 6. Se creeaza 0 lista in care ardinea de acees este cea in care sunt citite numerele din fisier . Se insereaza i ntre fie care pereche de nod uri eel rnai mare divi zor com un al celor doua num ere. 7. Se creeaza doua lisle 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 ordine a 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 in 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 fi~ie 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 inaintea numerelor care au suma ultimelor trei cifre eqala cu 10. 11.8e creeaza 0 lista in 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 . (lndicatie. 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 in al doilea fisier numerele sunt ordonate descresca tor. Se creeaza a treia lista prin interclasarea primelor coua. 14.Se creeaza 0 lista in care ordinea de acces este cea in care sunt citite numerele din fisier. Sa S 8 inverseze ordinea de acces in lista, astfel incat parcurgerea sa se taca de la ultimul nurnar catre primul nurnar. (lndicatie. Se rnuta ultimul nod la inceputul 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 forma tid

137

16. Se creeaza a lista ordonata cu numerele din fisier si se divizeaza apoi lista in doua Iiste: una cu numere pare ~i una eu numere impare . 17.;n fisie r sunt memo rate foarte multe nume re (maxim 10.000). Foarte multe dintre aceste numere S8 repeta (exists max im 100 de numere distincte). Se creeaza 0 lista ordonata crescator numai cu numerele distincte si eu frecventa lor de apa ritie. Se aflsea za 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 ~i se afiseaza numai num erete care sunt mai mari decal media aritrnetica. 18.Pentru doua rnultirni de numere A ~i B sa se determine diferent ele A-B ~i B-A. 19. 5e citeste dintr-un fisier text un nurnar cu ma xim 20 de cifre. Se creeaza a lista cu cifrele nurnarului, S8 elirruna din lista cifre te pare ~i se afiseaza nurnarul astfel obtinut. 20. Se calculeaza produsul a doua polinoame. lnforrn atiile desp re cele doua polinoame S8 citesc dintr-un fisier. (Indicat ie. Pentru fiecare nod din prima lista se parcurge a doua lists iii. daca produsul coefic ientilor nu este nul, se creeaza un nod i n iista a treia care va avea coeficientul egal cu produsu l coeficie ntilor ~i gradu l egal cu sum a gradel or. l.is ta a treia este a lista ordo nata descresca tor dupa grad .) 21. 8 e creeaza dou a liste cu n noduri ~ i respectiv m nodur i care cont in nume re in tregi ge nerate aleatoriu in intervalul [a.b] . Valorile pentru nurnarul de noduri n, si respect iv rn, si pent ru limitele intervalului , a ~i b , se citesc de la tastatu ra. 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 ad au qare a primului n od la tista vida si de ada uqare d u pa ullimul nod sunt la fel ca si cei de la listele simplu l nlantuite:
Lista circulara simplu ln tantuua

prim

u ltim

info -,-

I urm

I,

info

I urm~ r:

info

I urm

I'.

info

I urI"l I

2.6.4. 1. C rcarc a list c i


Deoareee in algoritmii de preluerare trebuie sa se cunoasca adresa prirnului nod, este importanta adauqarea primul ui n od la lista vida. Pasii algo ritnl ului de croaro a unei liste sunt: PAS 1. Se adauq a primul nod la lista (nodul prim ) PAS2 . Cat limp mai exists inforrnatie exec uta : se adauqa un nod la lista dupa ultimul nod. PAS3. Se leag a ultim ul nod de primul nod. Impl cm cntarea algori tmu lu i. Se folose ste functia procedurala c rea re ( ) at carei parametru este prim de tip no d : care se transrnite prin reterin ta deoa rece este parametru de intrare-ieslre. 8e foloseste variabila globala n pentru citirea inforrnatiei din nod. Se considera ca nu mai exista into rmatie atunci cand valoarea citita pentru n are valoarea O. vo i d c rea re (n od *&p : i o ) ( n o d *u l t i m; cin n; adau ga _n o d , p r im , u l ~ iffi ) ; wh i le ( n ! ~ O ) (cin n; a d a ~ g a_ u l t i ~ ( u l tire ) ; }
ul t.i m-c-u r-mop r-a m }

138
2.6.4 .2. Pa rcurgerea listei

Im plcmenta r ca strudurilor de date

Deoa rece lista circu lara nu contine un ultim nod care sa fie conside rat ca terminator al listei, S8 va con sidera ca nod care terrnina lista nodul prim . Pasi i algoritmului de prelucrare a unei liste circu lare sunt: PAS1 . Se prelucreaza primu l nod din lista (nod ul prim ). PAS2. Pentru l iecare nod din lista ln cepan d de la succesoru l nodulu i prim pan a la prim ul nod, executa: S8 prelucreaza nodul curent. Implementarea algoritmului. Se foloseste functia procedurala parc urge (J al carei parametr u p rim de tip nod S8 transmite prin valoa re deoa rece este pa rametru de intra re.

v o id p a r cug e (no d *p r i ffi ) { l i s e prel ucreaza prim->info ; f or (nod * p~prim- >urm ; p r =pri m; p =p- >urm) I /s e prelucreaza p->info; }

2.6.4.3 . Eliminarea unui nod din listii


Daca S8 elirnina din lista nodul care urmsa za dupa nodul curen t p tre buie sa S8 ve rifice daca aces t nod nu este nodul prim , ca sa nu S8 piarda adresa prim ului elemen t din lista. Pasii algoritmului de eliminare a nodului urrnator nodului curent sunt: PAS1. Se salveaza adresa succesorului nodului p i n pointerul q. PAS2. Se leaqa nodul p de succesorul succesorului lui. PAS3 . Daca succesorul nodulu i p era nodul prim , atunci succesorul nodului pr im devin e nodul prim . PAS4 . Se cere eliberarea zonei de memorie de la adresa mernorata in pointerul q . Implementarea algoritmului. Se foloseste functia procedurala elirnina_urm() ai carei parametri de tip nod sunt: p (pentru adresa nodului precedent nodului ce S8 elirnina), care se transmite prin valoare deoarece este parametru de intrare si prim, care se transmite prin referinta. deoarece este parametru de intrare-iesire.

v o i d elimina._urm(nod *p, n od *& p r i m) {n o d *q =p-> u rm; p->urm= p->urm->urm i if (q===prirn) pr im==pr im ~>urIll i delete q ; }

I Swmu de CBlZ I
Sco p: exemplificarea modului in care, pentru rezolvarea problemei , foloslti algoritmii de prelucrare a listelor circulate simplu Inlantuite si implementarea lor cu ajutorul subprogramelor. Enunt ul probl emei. Sa ciuiste dintr-un fiier 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 fiier. Sa se tearga numerele p are din lista i sa S8 etiseze numetoio din iiste. Pentru leslarea proqrtnnutu) se vor tolosi doua seiut! de nutnere: (2. 2, 3, 4, 4) si (2. 2, 2, 4, 4). Problema se descompune in urrnatoarele subprobleme, iar algoritmii pentru rezolvarea subproblemelor sunt implernentati cu ajutorul subprogramelor:

f1l Se creeaza lista circulara simplu Inlantuita -

subprcqramul creare ( ) .

~ Se parcurge lista de la succesorul primului nod pana la primu l nod si daca nurnar ul
din succesorul nodului curent este par, at unei se elimina succesorul nodului curent subprogramu l eLa mi n a u r m ( ) ; altfel se trece la succesorul nodului curent. ~ Daca nurnarul din nodul prim este par. atunei se elirnina nodul prim si lista este vida subprogramu l e Li.mi.n a_ p r i m ( ) .

Infor matica din fiecare nod (subprogramul afisare ()) . #inc lude <f s t r e a m . h > struct nod {int in fo ; n od *u r m ;}; fstream f( "li s t a7 . t x t " , i o s : : i n } ; int x ;

139

~ Dac a lista nu este vida (subprogramul es te vida () }, atunci S8 afiseaza numerele

void a da u ga nod (n od *&p r i m, nod *&u l t i :nl


{p r i :n=new no d ; pr im-> i n fo =x ;
p r i m- > u r m ~ NULL;

u l t i m=p r i m; }

void a cla ug a _u l t i m(nod * &u l t i m ) {n o d " p e new n od ; p- c- Lnf oe x , p ->unn=NUL L ; u l t i m- >urm=p ; u L t..inr- p , } void c reare(nod *&p r i m) {n o d *u 1 tim ; I c->x , a d a u ga.. ..n od rpr im , u lt im ) ; while (f x ) adauga~)1 1 t im(u ltim) ; u l t Lm- c-u rme-p rLm , } ' v o i d e Li.m.ina _ _ urm( n o d *p, n o d *&p r i m) {rio d *q =p - >u r :n; p -c-u rmcp -c-urm- o u rm ,

if (q ==p r i m) p r im=prim- >u rm ;


delete q ; } vo i d e Ld.m.i.na p i .im t n o d * &p r i m) {n o d *q = p r i m; pr irn=NULL ; delete q ; } a.n t; e s t .e vLda ( n o o ep r-Lrn ) {return pr i m= =NULL ; } v oid 2-fisar e( n od *p r i m) Lcou t.c-cp r i.m -o Ln Fo -cc " ", for {nod *p "" p- >u rm; p >=p rim;p =p->u rm ) coutxc c - c- Lnfcoc'' "; coutendl ;} void ma i n () { no d e p r i.m, *p; c r ee.r-e.Ip r i .m j , afi s ar e (p r i m);

for (p =p r i m- >u r m; p ! =p r i lll;) if (p - >u r m->i n f o% 2=-"'O) e l i rn i n u.....urm(p ,prim) ;


else p=p- >u rm ;
i f (p r i m-c I u Co % 2== O)elimina ,:-,"prim (p rim} ; i f (! este_v .i.da (p r im ) ) a f L s a r e (pr i m) ; }
-<I ~~ t>-

-----.--.... Scrieti cate un program care sa rezolve cerintele fiecarei probleme. Fiecare problema se va descompune i n subprobleme ~i algoritmul pentru rezolvarea unei subprobleme se va implementa cu un subprogram. Datele se transmit intre subprograme eu ajutorul parametrilor de cornunicatie ~i nu al variabilelor globale. Se creeaza liste ci rcu lare sim plu ln lan tu tte in noduriIe carora se rnernoreaza numere intregi. Sirul de numere se citeste dintr-un flsier text in care sunt memorate pe acelasi rand, separate prin spatiu. Dupa executarea unei operatii de prelucrare a listei, S8 vor afisa numerele din noduri pentru a verifica daca operatia s-a executat coreet. Se vor alege seturi de date de intrare astfel l ncat sa se verifice algoritmul pe toate traseele lui. Pentru urmatorii 4 itemi J istele se creeaza asttel lncat ordinea de acces sa fie cea in care sunt citite numerele din fisier. 1. Sa se insereze , dupa fiecare nurnar divizibil cu cea mai mare citra a sa, valoarea cifrei, ~ i sa se elim ine numerele care au ultime le doua cifre consecu tive . 2. Sa se verifice daca num erele sunt in progres ie geometr ica si sa se afiseze primul termen al progre siei geometriee. (Observat ie. Daca numerele sunt i n progresie geometrica, nu este ob ligatoriu ca sirul de numere citit din fisier sa lnc eapa cu primul termen al progresiei geom etrice.) 3. Sa S8 insereze in tre doua numere pare din llsta media lor aritrnetica pana can d nu mai exista perechi de numere pare .

140

Implcm cn ta r ca structuril or de d ate

4. Din lists circul ara creata sa se creeze alte dOU8 liste circulate simplu inlant uite - una cu numerele divizibite cu cea mai mare citra, iar alta cu numerele divizibi le cu cea rnai mica cifra - ~i S8 verifice daca cele doua liste cont in numere comune. 5. Se creea za 0 lista ordonata crescat or si S8 creea za apoi din ace asta lista 0 lisla cu numerele care sunt patrate perfecte.

sa

2.6.5. Algoritmi pcntru prclucrarea listclor dublu iulantuitc


in cazu l listelor dubl u Inlantuite intorrnatia de legatura trebuie sa contin a ~ i adresa succes oru lui nodului (pointerul 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;

//irlforma~ia

//inforrna\:ia propriu -zisa pentru leg5 tur~

Alg oritmi i de la listele simp lu ln lantui te S8 rnod ifica prin adauqarea instructiunilor care Int retin ~i adresa de leg atura cu predecesorul nodulu i. Algoritmul de ada uqare a unui no d pin inte rio rul liste i i na in tea un u i no d q se sirnplifica deoar ece se cuno aste adresa atat a succesorului, cat ~ i a predecesorului.
Lista dublu lnlantulte

prim

NULL I

i nfo

an t

2.6.5.1. Adauqarca primului nod la lista


Impl emen tarea alqoritrnului . Se foloseste functia procedurala adauga_nod O ai carei parametri prim ~ i u l tim de tip nod se transm it prin re ferin ta deoarece sunt parametri de lesire. void adaug_nod (nod *&p r i m, nod *&u l t i m) {p r 'im = new nod , pr im-> .i n foe x r pr.l.m->an t =-NULL; p r i rn- >u rm =NULL; ultim=pri:n ; }

2.6.5 .2. Adau qar oa unui no d la lista


Ad5ugare in Ia ta prirnului nod

Implementarea algoritmul ui . Se foloseste functia procedurala adaugayrimO al carei parametru prim de tip nod. se transmite prin referinta deoarece este parametru de intrare-iesre v oid adauga_prim (:1oa *&p =i m) {n od *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

Im plementarea algoritm ului. Se foloseste functia procedurata adauga_ul tim () al carei parametru u l tim de tip nod se transmite prin refennta deoarece este parametru de intrare-iesire. void adauga_ultim(~od * & u l t i m) {n od ~ p =new ~od ; p -> i~ fo = x ; =u l t i rn; =NULL; u.l t i.m-c-u rmvp , ultim=p ; }

lufnrm aticii
Adauqarc a in in tc rio ru l liste i
[ p rim

141

I - . . -f~-{~J-+B ..- 1 I
ultim

a) dupa nodul cu adresa q Nodul p care se adauqa se insereaza lntre nodul q ~i nodul q-surm. Succesorul sau este nodul q-surrn, iar predecesorul sau nodul q . Nodul p va fi succesorul nodului q ~i predecesorul nodului q -surm . Implementarea alg oritmului. Se foloseste functia procedurala adauga_ dup a ( ) ai carei parametri sunt de tip nod: q (adresa nodului dupa care S8 face ada uqare a), care S8 transmite prin valoare deoarece este parametru de intrare ~i u l t i m (adresa ultimului nod), care S8 transmite prin referinta deoarece este para metru de intrare-iesire. v o i d ada ug a~dupa (nod *q , n6d -* &ul tim)

{n o d
i f

*p~ n e w

nod ;

p -> in f o= x ;

PT<9~ m=q ~ > u rm ;

p~>a~t= q ;

(q ==u l ti m) u ltirri.=p; e l s e

q;;j>j.lriTL~>ant= p ;

q->.urxn= p ; }

b) l nai n te de nodu l de adrcsa q


Nodul p care S 8 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 ~i predecesorul nodului q.
Implementarea algoritmului. Se foloseste functia procedurata adauga_in_ fa t a () ai carei parametri sunt de tip nod: q (adresa nodului inaintea caruia se face adauq area), care se transmite prin valoare deoarece este parametru de intrare.

v o i d adau g a~ in _ fa t a(nG d *q ) {ne d kp=n e w nod ; p ~> i nf o= x ;


p -c-u r m- q , p-ec-an

t e q- c

-an

L,

q-c-an c-c-u.rm-e p ,

q;.>ant= p ; }

2.6.5.3 . Parcurgerea listei


Viz itarea fiecaru i no d al listei se poa te face In doua moduri: -7 pom ind de la primul nod, pima la ultimul nod, In ord inea de i nla ntuire a nodurilor furn izata de adres a urm din nodu l vizita t; -7 pornind de la ultimul nod, pima la primul nod, in ord inea de inlantuire a nodu rilor fu rnizata de adresa ant din nodul vizitat
Implementarea algoritmulu i. Se toloseste functa procs durala parcurge-inainte (), respectiv parcurge-inapoi () , al carei parametru prim, respec tiv ul ti m, de tip nod , se transm ite prin valoare deoa rece este parametru de intrare. v oid pa r cuqe .i na i.n t e.Lri od e pr i m) {for (no d * p =pr i m; p !=NULL; p=p- > u r m) lise prelucre Dza p->i nfo}

vo i d p a r cuge _in apoi( n o d *ll l t i m} {for (nod * p =u l 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 algo ritm u lu i. Se Ioloseste functia procedurala eliminayrim() al carei parametru p r i m de tip nod se- transmite prin referinta deoarece este parametru de intrare-iesire void el i mi na__ pr im( n o d *&p r i m) {n o d *q =p r i m; prim->urm- >a n t =NULL ; prirn=p rim->u rm; dele te q ; }

142
El iminarea ultimului nod

I mplem enta rea strn ctnrilor de date

Implementarea algoribnului. Se toloseste functia procedurala e limina_ ultim () al carei parametru ul t i m de tip n od S8 transmi te prin referinta deoarece este param etru de lntrare-iesire . v o id e L i mi n a u L t Lm t rrod. * &u l t i m) {n od * q=u l t i~; ultim~>ant->urm~NULL; u l tim=ultim->ant ; d elete q;}

Eliminarea unu! nod din interiorul listei


Pen tr n a eli mi na nodul p al lat in interiorul listei, treb uie sa legam pr edeee sor ul nodului p (p-s ant) de sueeesorul lui (p -s urm ). Sueeesorul nodului p-e-ant va fi nodul p-x urm , iar predecesorul nodului p- o-urm va fi nodul p -sa nt. Implementa rea algoritm ulu i . Se foloseste functia procedurala ed.imi.na () al care i paramet ru este de tip nod: p (adresa nodului care S8 elimina) , ca re S8 transm ite prin valoare deoarece este parametru de intrare. v oid el i min a (nod * p ) {nod *q=:=p ; p:-c->a nt - >u r m :=p - >u rm ; p -ourm - ca n ue p - c- en t , de lete q ; }

Seop: exe mplificarea modului in care, pentru rezolvar ea pro blemei, folositi algoritmii de prelu crare a listelor dublu Inlantuite ,;;i implementarea lor cu ajuto rul subpro gramelor.

Enunt ul p rob lem ei 1. Sa citeste dintr-un fiiBr text un sir de numere separate prin spetiu cu care se ereeaza 0 !ista dublu inlanfuita in ordinea in care sunt citiie numerele din tisier. Sa se adauge va/oarea 1 dupa fiecare numer par i sa se tearga apoi numerele pare din lista. Sa se etisoze numerele din lista dupa fiecare operatic de prelucrare, in ambele moduri (de fa primulla ullimul, si de la ullimul fa primu/). Penlru les/area programufui se va folosi $irul de numere: (2, 2, 5, 3, 4, 4).
In prelucrarea tistelo r dublu inlantuite trebuie lnt retin ute atat adre sa primulu i nod , cat si adresa ult imu lui nod . Pro blem a se de sco mp une in urrn atoarele subp rob leme, iar algoritm ii pentru rez olvare a subproblernelor sunt implementati eu aju torul subprogra melor:

lP11

Se creeaza lista du blu inlantuita - sub programu l creare () . ~ Se adauqa un no d eu valoarea 1 dupa l iee are nurna r p ar, a stlel (s ubp rogramu l
pr e l u c r a re 1 ( ): 1 -7 Se p areurge lista de la primul nod pana la pe nul timu l nod si, da ca nurn arul din nodul eure nt es te par, se adauqa dupa el un no d eu valoa rea 1 - subp rogramu l ada u g a ~d u p a ( ) . -7 Dac a nurn arul din nodu l ul tim este par , atu nc i se ad auq a dupa el un nod ca re con : tine valoa rea 1 si aeest nod devin e no dul u ltim - sub program ul a d auga ul tim () . ~ Se elirnina nodurile cu numere pare, astfel (su bpro gramu l p r e l u c r a r e _ 2 0): -7 Se pa reurge lista de la sueeesorul pr imului nod pa na la penu ltim ul nod si , da c a nu rna ru l din nodul eurent este par, at u ne i se elim ina di n lista (su bp ro gra mul el imi na ~ urrn () ; altfe l , se trece la sueee sorul n odului eurent. -7 Oac a nurna rul din nodul pri m este par, atunci se elimin a din lista si suecesorul sau devine nodul prim - subprogramul e li mina _ pr i m ( ) . # i n c lude < f s tr e a m . h > st ruc t n od ( i nt i n f o;

nod *a n t , *u r rn ; ) ;
f stream f ( " l i s t a8 . tx t " , i o s : : in ) ;

i n t X;

InliJrm :l!k.a'--voi d adauga nod (no d *&p r i mr n o d * &u l U .m) {p r i m=- n e w n od i p r im ->i nfo = x ; p r i m- >u r m=NULL i pr i m->a n t =NULL ; ul tim=p r i rn; }

143 .:....:...::.

vo id a d a u ga u l t im(nod *&u l t i m)
{n o d *p ; p=n e w n od ; p -> info= x ;

p ->unn=NULL; p-> ant =ult im ; ultim - >urm=p; ultim=p ; }

vo i d ada uga_dupa(n od *p )
*q=n e w n od ; q -> inf o = x ; q - >u rm =p - >u rm ; q - >a n t =p ; p ->urm- >an t=q ; p ->urm=q ; } v o i d elim i n a p r i m {n o d *&p r i m) {n o d *q =p r i m; prim->urm- >a n t =NULL ; p r i m=prim-> urID ; de lete q ; } void elim i n a( nod *& p) {n o d *q =p; p ->ant->ur~=p-> ~ rm ; p ->urrn->ant =p ->ant ; p =p - >u rm ; de lete q ; } void crea rc{nod * & p r i m, l1oc * &u l t i m)
{ ~ od

{f x ; adauga noc(prirn ,ultirnl ;


whi le ( f x)
adauga_ult L ~{ultim) ; }

void pr e lucrar e _ l ( n o d *p r i m, n o d *&u l t i ml

{fo r (nod *p =-p r i mi p - >u rJn! +=NULL ; p =p - >u r ml i f { p - > i n fo% 2=~O} ad a u g a~d u p a ( p) ;
if (ultim- >i nf o %2 =- =- O) a d a u g a u l tim ( u l t i m) i }

v o i d p xe l u c r-are vz (n od *& p r.i m )


{fo r ( n o d *p =p r i m- > u r m; p - > u r m ! =NULL i ) if ( p - > i n f o % 2 ~ = O ) c l i mi n a( p) ; e lse p =-p->urm; i f (p rim- >i n fo%2==O) e l ~mi n a~rim(pr i m) ; } v oid a f i s a r e~urm(nod * p r i ~ }

{for

(nod *p =p r i m; p !:=cNULL; p =p - >u rm)

c o ut

p~ > i n [ o "

" ; c ou t end l ; }

v oid 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 n t l c out-ccp - c- Ln Coc c " "; cou t e ndl; } void maine ) {n o d *p r i m,* u l t i m,* p ; creare (p r i.rn, ultim) ; a f i s a r e j u rm (prim) ; a f i.s a rejen t (ul tim) ; ::=1; p re Lu crar e 1 (prir:-: ,t;lt im) ; a r Lsare urm tp r im) i afisa re a n t (ult i m) i p re Luc r e r e _ 2 (p r im) i a fisa re_'1rJn (pr .irn j r e f i s ar e _ an t. (ul t. Lm) ; }

Enuntul problem ei 2 - Calcularea rezistentai ec hlv alente Sa se cotcuteze rezisiente echiv etente in tre pun cteie A $i B pentru citc uiiut electric din figura.

n,

s,

u,

R il l

:~-ER"
Pentru calcularea rezistentei echivalente se porneste de la ultimele rezistente - Rn ~i Rn-1 care sunt legate in serie. 5 e calculeaza rezistenta lor echivalenta Re1, care va fi legata i n paralel cu rezistenta Rn2. Prin calcularea rezistentei echivalente a celor coua rezistente legate i n paralel, R cl o;i R n-2, se va obtine 0 noua rezistenta echivalenta R c2 care este leqata in serie cu rezistenta Rn-3. Calcularea rezistentei echivalente a circuituiui electric este un proces repetitiv i n care alterneaza calcularea unei rezistente echivalente a doua rezistente legate i n serie eu calcularea unei rezistente eehivalente a doua rezistente legate in paralel. Pentru a ~ti care dintre variantele de calcul se alege, se foloseste variabila 5 care are valoarea 1 daca rezistentele sunt legate in serie, ~ i valoarea 0 daca sunt legate i n paralel.

144

Implem entarea st ructu r ilor de da te

Va lorile pentru rezistente S8 citesc dintr-un fisier text in care sunt memorate pe acela si rand, separate prin spatiu , Se creeaza a lista dublu Inlantuita in care ordinea de aeces este cea in care sunt citite nurnerele din fisier. Lista S8 parcurge de la ultimul nod pana la primul nod . #inc l ud e <f s t r e a m. h > struct nod {f loat in fo ; n o d *a n t , * u rm ; } ; fst ream f I vre z i s t.ent.e t x t vi Los : : i n ) ; f l oat X i
c

void a da uga nod (nod *& prim, nc d *& u l t i m) { p r ~=new nod ; pr i m-> i nf o=x; prirn- >urm=NULL; prim- >an t =NULL; ultimzprim ; }
vo id adauga (no d * & u l t i m) {n o d *p ; p e n e w nod ; p- c- Lnf o e x , p- >u r m=NULL ; p - >ant= ul t i m; u l t i m - > u rm~~; u l tim=p ; } voi d c rea r e (n od *&p r i m nod * & u l t i m} ( f x; a d a u g a nod(p ri m ,~] .ti m ) ; whi le ( f x) adauga(u l t i rn) ; } float R {n o d * u l t i m) {int 5= 1 ; float r=ul t im->info ; nod * p = u l t i m - > a ~ t ;
l

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 () ;. ccc e-ccv nez t s t ent.a e c h iva Leri t .a> " R ( u l t i m);} ~

while (p ! ~NU LL ) if ( 5) {r +=-p- > i n f o;

Rcco mandare. Listele dublu l nlantuite se folosesc i n prob lemele in ca re , pentru prelucrarea lnformatiilor: -7 se executa frecevent operatii de inserare ~i de eliminare de noduri; -7 lista trebuie parcurs a i n am bele sensuri. Exe m plu. i n problemele i n care trebuie prelucrate numere foarte ma ri (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 nu rnarulu i de cifre ale nurn arulu i, listele i n care sunt m em orate numere le vor fi parcurse de la primul pima la ultimu l nod. Scrieti cate un program care sa rezolve cerintele fiec arei probleme. Fiecare prob lema se va descompune in subprobleme si algorilmul pentru rezolvarea unei subprob leme se va implementa cu un subprogram . Datele se transmit intre subprogra me cu ajutorul param etrilor de com unicate si nu al variabilelor globa le. Se creeaza liste d ublu I nlant uite in nod urile carora se rnerno reaza numere i ntregi. Sirul de numere se citeste di ntr-un fisier text in care sunt m emorate pe acelasi rand , separate prin spatiu. Dupa execut area unei operatii de prelucrare a listei, se vor afisa numerele din nodu ri pentru a verifica daca opera tia s-a execut at core ct. Se vor aleg e seturi de date de intrare astfel incat sa se verifice algoritmul pe toate traseel e lui. Listele se creeaz a astfel ln cat ordinea de acc es sa fie cea in care sunt citite numerele din fisier. 1. Sa se elimine numerele prime $i sa se insereze intre fiecare pereche de num ere rarnase cel mai mare divizor eomu n al lor. 2. Sa se calc uleze eifra de cont rol a fiec arui nurna r ~i , da ca numarul este diviz ibil cu cifra de cont rol , citra este ada uqata du pa nurnar; alttel, numarul este elim inat din lista . Citra

Inform aticii

145

de control a unui numar este suma repetata a cifrelor numarulu i pana cane S8 obtine 0 suma mai mica decat 10. 3. Sa S8 mo difice adresele din nodurile Iistei astrel inca t sa S8 obtina doua liste !iniare dub lu inlantuite care sa cantina numerele din pozitiile pare, respectiv din poz itiile impa re. 4. Se citese dintr-un fisier doua numere foarte marioSa S8 scrie urrnatoare le subprog rame pentru prelucrare a nume relor: a. calcu larea sume i, a diferentei i produsu lui nume relor; b. com para rea a doua numere (subprogramul trebuie verifice daca cele doua nume re sunt egale , iar daca nu sunt egale, sa precizeze care nurnar este mai mare) ; c. ver ificar ea nurn arului daca are un nurnar par sau un numar irnpa r de cif re , fara sa se numere cifrele nurnarului: d. determina rea nurna rului de cifre ale unui nurnar: e. verific area nurnarutui daca este palindrorn.

sa

2.6.6. Algoritm i pcntrn prelucrarca stivclor


Cele coua ext rernitat i ale stivei se numesc varf ~ i baz a , Accesul la nodurile stive i (adauqarea. extragerea sau con sultarea unui nod) este permis numai printr-o sinqura extrem itate nurnita varf si ultirnul nod inserat este primu l nod extras (se extrage cea mai noua inforrnatie adauqa ta ). La 0 operatie de adauq are a un ui nod , varful stivei stivei urea, iar la 0 oper atie de extragere a unui nod , varfu l 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 pointe rul va r 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 . Altfe l spus , prelu cr are a unei stive se face de la varf spre baza si se prelucr eaza Intotdeauna nodul din varful stive i . Acces ul la informatia din acest nod se face cUva r f - >i nf o . st.va vida este stiva care nu contine nici un nod ~ i adresa nodu lui vart are valoarea NULL (v a r f ~ NULL; ) . i n sliva 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 testa rea unei stive daca este vida , S8 poate imple menta functia operand es te _v ida ( ) care va furniza valoa rea 1 ("adevarat") , daca stiva este vida , si valoarea 0 ("fals ") daca stiva nu esle vida. int 8s t c_v i da (no cl *v a r f ) {return var f=~ NUL L ; }

Penl ru prelucrari cu autorul sl ivei putet i folosi urrnatorii algoritmi: -7 lniti alizarea s tive i: -7 ada uqa rea u nu i n od la stiva : -) ex trage rea unui n o d d in s tiv a: -) co ns u lta re a n odului din v a rfu l stive i.

2.6.0 .

nitial izarea s ti ve i

Prin acest algoritm so c roo aza st iva vida. varf are valoa rea NULL.

in acest

caz . nodul v arf nu ex ista si poin terul

Im pl em entarea algorit m uJ ui. Se foloseste functia procedura la ini t () al carei parametru varf se transm ite prin referinta, deoarece este para metru de iesire.

146

Implementarea strue t u r ilor de date


vo id i n it{ no d * & 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: PAS 1. Se cere alocarea de memorie pentru nodul p . PAS 2. Se scrie informatia i n nodul p . PAS 3. Nodul p se leaqa de nodul varf. PA S4. Nodul p a da uqat devine nod ul var f . Impleme ntare a algoritm ului . Se foloseste functia procedu rala ada uga () al carei parametru

varf

S8

tra nsmite prin reterinta, deoarece este parametru de intrare-iesire.


var.f~p ; }

voi d adau g a( nod * &va r f ) {no d *p =n e w no d i p ->in f o ~ x ; p - >u r m=va r fi

2.6.6.3. Extrag erea unui nod din stiva


Nodurite se extrag din stiva pentru a putea consulta informalia care e xi sta in nodur ile urmatoare. Un nod S8 poate extrage numa i in cazul in care stiva nu este vida. Se poate extra ge numai nod ul din varful stivei (se elibereaza spatiul care a fost ocu pat de nod ). i n varfu l stivei va aju nge succesorul nodului extra s, Pasi i algoritmu lui sunt: PAS1 . Se salvea za adresa nodului v a r f i n pointerul p . PAS 2. Succesorul nodu lui varf devine nodul varf . PAS 3. Se cer e elibera rea zonei de memorie de la adresa mernorata in po interul p . Im plementa rca alq oritmu lui , Se foloseste functia procedurala extrage ( ) al care: parametru var f se transmite prin referinta, deoarece este parametru de intrare-iesire. vo id e xtr a g e (nod *&v a r f ) {n o d *p =v a r f ; va r f =va rf - >u rm ; d e l ete p ; }

2.6.6.4. Prclucrarea stivei


Prin acest algoritm se consulta informatia din fiecare nod al stive i. Deoarece nu poate fi co nsultata de dit inform alia di n vartut st ivei , pentru a ajunge la un nod trebuie sa se extraga toale nod urile p;ma la et. Imp lementarea alg oritm ului. Se foloseste functia procedurala prelucrare() al carei parametru varf de tip nod se transmite prin referinta, deoarece este parametru de intrare-iesire. v oid prelucrare{nod * &va r f ) {whi l e (va rf! =NULL) { l i s e p r e lu creaz5 v arf->inf o e xtr a ge (va rf ) ; ) }

Seop exempliticarea modului i n care, pentru rezolvarea problemei , folositi algoritmii de prelucrare a stive lor ~i implementare a lor cu ajutorul subprogramelar .

Enunt ul pro bl em ei. Se citesie dintr-un tisier text uri sir de numere separate prin speiiu care se depun intr-o stive in ordinea in care sunt ciiite numerete din tisier. Sa se etimine nunuuut de la baza sitvei i numerele ttimese in stiv sa so scrie intr-un tisier text. Pentru testarea programului se va lolosi irul de numere: {t , 2. 5. 3. 4).
in prelucrarea stivelor, pentru a putea ajunge la inforrnatia care treb uie prelucrat a, trebuie extrase toate nodurile, pan a la nodul care confine acea informatie, deoarece nu poate fi prelucrata decat inforrnatia din varful stivei. Pentru a nu se pierde informatia din nodur ile

Informatica

147

extrase, ele vor fi descarcate intr-o alta stiva (de rezerva ), iar dupa prelucrarea inforrnatiei, nodurile vor fi i ncarcate din nou i n stiva.
Con su lta rea nodului care c ont ine n um aru! 3
'

....

..

4
3
2

oes c arc a

consulta

1
stiva

varl r

- W
stiva

[~_3:Jva rl

Inca rc a

Iv arl

4
- 3
varl r

1
stiva

varl_r= NULL
stiva de rezerva

stiva de rezerva

stiva de rezerva

Problema se de seomp une i n urrnatoarele subprobleme , iar algoritmul de rezol vare a unei subprobleme este imple me ntat cu ajuto rul unui subprogram:

rP1l

Se creeaza stiva cu numere le citite din fisier (nodul ve r -f) - subprogram ul c rea re ( ) ) Se descarca stiv a Intr-o alta stiva (nc dul va rf r ) pan a la penu ltimu l nod (subprogramu l d e s ca rc a ( ). ~ Se extrag e ultimu l nod din stiva - subp roqrarnul ext rage () . ~ Se l ncarca in stiva (nodul v arf) nodurile din stiva de rezerva (nodul varf r ) - subprogramu l i n c arca ( ) . ~ Se seriu numerele din stiva (nodul var f ) i n fisierul text - subprogram ul salv e aza () .

# i n c l ude < f s t r e & ~ . h>

s t r u c t nod {i nt info ;
nod * u rm ;} ;

fst ream f1 ( "stival .t xt " , i o s : : i n ) , 2 ( " stiva2 .txt " , i o s : : o u t ) ; i nt x; vo i d in it (no d * &v a r f l { v a r f = NULL; } voi d a d a ug a (n od *& va r f ) {nod *p= n e w nod ; p-> i n f o =x; p->urm=varf; va rf~ ~; } i n t este vida(nod * va r f ) {retu r n varf==NULL ; } v o i d extrage (nod * &v a r f ) {n o d *p = v a r f ; var f =varf->u rm ; d e lete p i } void crcare{nod * &va r f ) {i n i t (va r f ); wh i le (fl x) adauga(varf) ; } voi d d~sca rca(nod * &v a r f , n o d * & va r f _ r ) { Ln i t I va r f vr ) ; while (va r f -c-u rm! =-NULL) {x=va r - >i n f o ; ext raqe (varf) ; adauga (var f rl ; } } void inca rca (nod *&v a r f , n o d * &v d r f r) {wh 1 l e (le s te_vi6a(varf_T )) ( x =v a r f _ r - > i n f o ; extrage(varf~r ) ; adauga(varf ) ; } } vo i d salveaza(nod *&v a r f ) ( wh i l e ( !este vida {v a r f l ) { f zccv a r f -o i.n fo -cc" "; ex t.r aqe (varf) ; } ) void ma i n () ( ne d " v e r f , " va r f r ; c rea r e (va r f) ; fl . cl o s e () ; _ descarca (v a r f va r f r) ; e xtrage(varf) ; -<:I - t> incarca{varf ,var[_r} ; salveaza(varf); f2 . c l o s e {) ; }
j

Fieeare problema se va deseompune in subproblerne ~i algorilm ul pentru rezolvarea unei subprobleme se va impleme nta cu un subprogram. Datele se transmit i ntre subproqrarne cu ajutorul pararnetrilor de cornunicatie ;;i nu al varlabilelor globale. Se creeaza stiv e in nodurile carora se merno reaza inforrnatia (numere sau caracte re). lnforrnatia se citeste dintr-un fisier text i n care , nume rele sau caracterele, sunt memora te pe acelasi rand, separate prin spatiu. Se vor alege seturi de date de intrare astfel tncat sa se verifiee algoritmul pe toate traseele lui.

148

lmplcm cntarcu s t r uct u r ilo r de date

1. intr-o stiva sunt memorate numere din intervalul [1,10J, ordonal e crescator, iar i ntr-o alta
stiva, numere din intervalul [20,30]. ordonate crescator. Sa S8 concateneze cere dOUE! de numere, pastrand ordonarea crescatca re. (Ind icatio. Se rastoarna a doua stiva intr-o a treia stiva , S8 rasto arna si prima suva in a treia , peste numerele din prima stiva , !?i S8 extrag numerele din a treia stiva.) Se cornp ara doua stive fara a pierde conti nutullor i n urma extragerii de noduri. 5e elirni na din stiva numerele pa re. Se rnernoreaza intr-o suva un ~i r de litere mici. Se citeste de la tastatura 0 litera mica a alfabetului - lit. Sa se creeze doua stive: una va contine literele din stiva initiala care preced in alfabet litera lit ~ i alta va conune literele din stiva ini!iala care succed in alfabet litera lit Sa se afiseze in ordine inversa num ere !e dintr-o lista linlara sim plu l nla ntuita. (Ind icat ie . Se incarca nume rele din lista lntr-o stiva, i n ordinea de parcurgere a listei, !?i apoi S8 extra g ~i se afiseaza numerele din stiva.) Se ordoneaza crescator un ~ir de numere, cu ajutorul a doua stive . Determinati complexitatea algoritmului. (Indicat ie. Se folosesc doua stive. Se serie un nurnar in Stiva 1. Se citeste un numar. Daca nurnarul din varful Stivei 1 este mai mare decal numarul citit, atunci noul nurnar se adauqa la Sliva 1; altfel , se descarca din Stiva 1 in Sliva 2 numere pima cand in varful Stivei 1 ajunge un nurnar rnai mare decal nu rnarul citit, S8 adauqa la Sliva 1 numarul citit , si S8 lncarca in Sliva 1 numerele din Stiva 2.) Sa S8 verifice daca 0 expr esie aritrnetica ce contine paranteze este balansata. adica daca fiecare parante za deschisa este i nchisa coree! De exemplu, exp resia (a+b+(cI[d-e]})+ (dis) este balansata, iar exp resia (a+b+{cI[d -e}])+(d/s) nu este balansata , (lnd icatie. Se codifica paranlezele 1-(; 2- [; 3-{; 4-); 5-J; 6-)). Daca stiva nu esle vida ~; daca difere nta dintre codul dintre paranteza citita ~i codul parantezei din varful stivei este 3, atunci se elimin a nodu! din varful stivei: aittel , S8 adauqa la stiva codul parantez ei citite . Daca stiva este vida la term inarea evaluarii expre siei, inseamna ca expr esia este balansata .)
~i ruri

2. 3. 4.

5.

6.

7.

~() rit 1II DC

irn

Cele doua extr ernitati ale coz ii S8 nu mesc ca p ~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 nu mai prin extremitatea cap (se extrage cea rnai veche intormatie adauqata). Imp lementarea dina mica a cozii se face la tel ca a unei liste liniare , cu deosebirea ca: -) primul nod al cozii va fi indicat de pointerul catre tipul nod . iar ult imul nod at co zii va fi indicat de pointerul ,i. catre tipul nod : -7 pentru adauqarea unui nod . se poate folosi numai algoritm u l de adauqa re dupa ul timu l no d ; -7 pen tru extrager ea unui nod se poate folosi num ai algoritm u l pent ru elimina rea prirnului n od . Altle l spus , prelu cr area unei cozi se face d e la ca p s p re baza ~ i se prelucreaza intotdeaun a nodul d in ca p ul cozii. Accesul la inforrnati a din acest nod se face cu c.ap-c-Lnfo
r"'

iaa es te coada care nu confine nici un no d si ad resa no d ului cap are va loarea NULL (ca p ~ N UL L ; ) . in coada vid a nu se mai pol execut a ope ratii de ex tragere de noduri. Coada poate sa ajunqa sa fie vida in doua cazuri : la in itlaliza re sau dupa ext rage re a ultimul u i n od . Pentru testarea unei cozi daca este vida se po ate implem enta functia operand este_ v i d a () ca re va furniza val oarea 1 ("adevaran. dad! este vida , :;;i valo area ("fa ls") daca nu este vida .

III fo rill 'I tid


int e ste_v ida(nod *c a p ) {return c a p == NULL ; } Pentru preluc rari cu ajuto rul coz ii puteti folosi urrnatorli algorit mi: -7 lnitlallzar ea cazii ; -7 adauqa roa unui nod la coada: -7 ex t rage re a unui nod din coa d a: -7 con su lta rea nodului di n cap ul co zii.

149

2.6.7.1.lnitializarca cozii
Prin acest algoritm se creeaza co ada car e con tlne un nod . in acest caz , nodurile cap ~ i baza vor avea aceeasi ad resa . Implem entarea algori tmului. Se foloseste functia procedura la i ni t {} ai carei parametri cap si ba za S8transmit prin referinta, deoarece sunt parametri de iesire. v o id init{nod *&c a p, nod *&b a za )

{ca p =n ew nod ; cap->info=x ; cap->llrl11=NULL ; baza=-cdp ; }

2.6.7.2. Adiiugarca unui nod la coada


Nodul se ada uqa la coada ca succesor al bazei. Pasii algo ritmului sunt: PAS1. Se cere aloca rea de memorie pent ru nodul p . PAS2. Se scrie intorm atia in nodu l p PAS3. Nodul p se leaga de nodu! baza PAS4. Nodu l p adauqat devine nodul b aza . hnp lcm entarea alg oritmului. Se foloseste functia procedu rala adauga () al carei parametru baza S8 transmite prin referinta deoarece este parametru de intrare -iesire. void ada~ ga(nod * & ba za ) {no d *p =n ew no~ ; p->in:o=x ; p ->urm~ NUL L ; Da=~->urm~p ; ba z3 =9 ; }

2.6.7.3. Extraqcroa unui nod din coada


Nodurile S8 extrag din ccada pe ntru a putea consu lta inforrnatia care exista in nodurile urrnatoare . Un nod S8 poate extrage numa i in cazul in care coada nu este vida . Se poate extraqe num ai nodul din capul cozii (se eliberea za spatiul care a fast ocupal de nod). i n capul coz ii va ajunge succesorul nodulu i extras . Pasii algoritmu lui sunt: PAS1. Se salveaza adresa nodului cap in pointeru l p . PAS2. Succ esor ul nodului cap devine nod ul cap. PAS3. Se cere elibera rea zone ! de memorie de la adresa rnernora ta i n pointerul p .

lmplernentaroa alg oritmului . Se foloseste functia procecurala extrage () a! carei metru cap S8 transmite prin referinta, deoa rece este parametru de intrare-iesire. voi d extraq e (Ilo d * &c a p ) {n o d *p <c ap r c ap ec ap - c-ur m : d e le t e p ; }

para~

2.6.7.4. Prclucrarea cozii


Prin acest algoritm S8 consults informatia din fieca re nod al cozii . Deoarece nu poate fi con s ulta ta decat i nfo rrnatia din ca pul cozii , pentru a ajunge la un nod trebuie se extraqa toale nodurile pan a la el. Implementarea algo ritrnului. Se foloseste functia procedurala prelucrareO al carei parametru cap de tip nod se transmite prin referinta, deoarece este parametru de lntrare-iesire. void preluc~are{nod *&c a p ) {wh i le (cap!=NULL) { l i s e prclucreaza c a p- >i n f o ext rage(cap ) i )}

150

Implem enta rca str uct u r ilor de date

Scop exemplificarea modului in care, pentru rezolvarea probleme i, folositi algoritmii de prelucrare a cozilor ~i implementarea lor eu ajutorul subp roqrarnelor .

Enun t ul proble mei. Se citeste dintr-un fiier text un ir de numere separate prin speiiu care S8 depun tntr-o coeoe in ordinea in care sunt citite din tisier. Sa S8 a/imine numiuut din mijloeul eozii, daea numerul de noduri este impar, i eele oou numere din mijloe, daea numetut de noduri este par, iar num erele (amase in cooos sa se sctie lnlr-un tisier text. Pentru testarea prog ramufui se vor folosi doua seturi de numere: fl , 2, 5, 3, 4) i fl , 2, 5, 4) .
in prelucrarea cozilor, pentru a putea ajunge la intormatia care trebu ie prelucrata, trebuie extrase toate nodurile pima la nodul care contine acea informatie, deoarece nu poate fi prelucrata decat informatia din capu l cozii. Pentru a nu S8 pierde intorma tia din noduri le extrase, ele vor fi descarcate l ntr-o alta coada (de rezerva), iar dupa prelucrarea lntorrnatiei, nodu rile var fi descarc ate in continuare in coada de rezerva. pana cand coad a initiala dev ine vida.
Consulta rea n odul ui ca re confine numaru l 3

coada

coada

coada

C1IU
c aPJ

~
cap

2---l.--,,----,---=---,---,,--,---=nSUl~~
baza

eap =NULL

ocscarca

cap \ aza

desca rc a

coada de rezerva

coada de rezerva

Problema se des com pune i n urmatoarele subprobleme, iar algo ritmul de rezo lvare a unei subprobleme este imp lementat cu ajutorul unui subprogram: [E1J Se creeaza coa da cu numerele citite din fis ier (nodurile cap :;;i baza) - subproq rarnul creare () . ~ Se descarca coada in tr-o alta coad a (nodurile c ap _ r sl ba z a_ r) pana la nodu rile care trebuie elimin ate - subproqra rnul de scarca 1 () . Se ex trage nodul sau se extrag nodu rile din mijlocul eozii - sub prog ramul extrage () . lE1l Se descarca res tul nodurilor din coada (nodul c ap ) in eoa da de rez erva (nodul ba z a r ) - sub proqrarnul de s c arca 2 () . ~ Se seriu numerele din eoada de rezerva (nodul c ap r ) i n fisi erul text - subprogram ul s a l v eaza ( ) .

#1 nclude < f s t r e o rn . h > str uct nod t i nt info ; n od *u r rn; }; fs t r e a m fl( " c oadal .tx t " , 1 o s : : i n ) , f 2 ( " c o a d a 2 . t x t", ios : :ou t );

i n t x s n , i,j ;
v oid in it {no d *& c a p , no d *& ba z a ) {c a p =n e w nod ; cap ->in o ~ x ; ca p ->u ~m= NULL ; baza=cap ; } int este vi d a{nod *c a p ) {r e tu r n cap==NULL; } v o id adauga(nod *&b a z a ) {no d *p =new nod ; p ->in fo =x ; p ->u rm =NULL ; baza ->u rm=p ; baza=p ; } v 01d ext rage(nod -& c a p ) {no d *p =c a p ; cap=cap->u rm ; del ete p ; } v oid crea re{ nod * &c a p , n o d *&b a z a ) {f l x; i nit( cap ,baza) ; n ++ ;

I II forill a tiea
while ( f l x) { a d a u g a (baz a) ; n ++ i } }

151

void desc a rca_l(nod *&c a p , no d *&c a p_ r, nod *&b a Za _ L) {x v c e p - o i n f o , ext ra g e(cap) ; ini t ( ca p _r , ba z a _~r) ; i + +; while (i <j) {x =c a p- > i n f oi extra ge(cap) ; a d au ga{baza r ); i ++;}} voi d desc a rc 3_2(nod *&c a p , noc *&ba za _ r ) {whi le (! e ste vida (cap)) {x=c a p- >i n f oi e xt r age(cap} ; a dauga(baza ~ r) ; } } v o id sa l v e a z a(nod *&c a p ) {whil e { ! este vi da (c a p } ) { f 2 c a p - >i n f o " "; e x t ra g e (cap ) ; } } void main ()

(nod *c a p ,* ba z a ,* c ap r, *ba za r ; crea r e (cap,ba za ); f l . c los e ( ) ;


if
(n%2==O)
descarca_l(cap ,cap_~ ,baza_r) ; if (n %2==0) e x t r a qe (cap) ;

j=n/Z -l ;-e l s e j=~/2 ; e xtrage(cap) ;

~ , " " ~

descarca_2(cap ,baza_T) ; salveaza{cap_r) ; f2 . c l o s e ( } ; J

Fiecare problema se va descompune in subp robleme ~i algoritmul unei subproblems S8 va implementa cu un subpro- , -f gram . Datele se transmit in tre subprograme cu ajutorul parametrilor de cornunic atie si nu al varia bilelor glo bale. Se creea za cozi in nodur ile caro ra se memoreaza numere intregi . Sirul de numere S8 citeste dintr-un fisier text i n care sunt memorate pe acelasi rand, separate prin spatiu. Se vor alege seturi de date de intrare astfe l i ncat sa se veri fice alg oritmul pe toate traseele lui. 1. Se elirnina din coada nume rele pare. 2. Se verifica caca numerele dintr-o coada sunt ordonat e (cresca tor sau descrescator). 3. Se concateneaza doua cozi, adauqano a doua coada la sfariitul primei coz i. 4. Se formeaza din doua cozi 0 a treia coada care contine rnai intai numerele pare din pozitHle impare din prima coada si apo i numerele impare din pozitiile pare din a doua coada. 5. Se inverse aza ordinea numerel or dintr-a coada cu ajutorul unei stive .

Tem

'>::::J pentru rezolva rea

2.6.8. Aplicatii practice


1. Ana liza lexi cal a a unui text. Sa se afiseze. i n ordine alfabetica, cuvintele dintr -un text ~i frecventa lor de aparitie i n text. 2. Exista co ua automate care elibe reaza bonuri de ordin e pen tru 0 coada de aste ptare. Pe fiecare bon de ordine este trecut nurnarul bonului ~ i 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 cere dou a automate. 3. Jocul lui Josephus . i ntr-un grup de n copii, acestia sunt aranja ti in cerc ~i sunt nurnarati ince pand cu primul copi l pana la nurnaru: k . Cop ilul care are numa rul k iese din joe. iar nurnaratoarea ince pe 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) cca da: 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 ma i folosesc : caracterul .A", pentru a anula ultimul nurnar introdus, ~ i caracterul n C~, pentru a anula toate numerele introduse.

152 _ _ _ __ _ _ _ _______ _ _ _ --'Ir :.:.: " I'l cl11 ellta fea Sl f llet IIfilllf de dal e
5. Un automo bil trebu ie parcurqa un traseu care forrneaza un poligon, cu intoarcere la statia de pom ire. Pe trase u exista n statii de alimentare cu carburant care formeaza varfurile poligonului. Fiecare statie de alimentare i este caracterizata de coordonatele (x;,y;). Automobilul consurna 1 litru de carburant la fiecare 20 km ~i nu exista restricne pentru capaeitatea rezervorului. Se citesc dintr-un fisier text urrnatoarele informaui: de pe prirnul rand nurn arul de statii n , de pe urmatorul rand un sir de n numere Cj care reprezinta cantitatea de comb ustibil cu care este alimentat la statia i, iar de pe urrnatorul rand n perechi de num ere X j ~ i Yi care reprezinta eoordonatele statiei i. Din ee punet trebuie sa piece automobilul astfel incat sa parcurga traseul cu intoarcere in punctul de pornire ~i sa nu n3mana tara combu stibil.

sa

Pent ru exercitiile urrnatoa re, daca nu lolosese urrnatoarele dat e:

S8

specifica sernnificatia variabilelor de mem orie, se

struct no d tint inf o ; n od * u r m;} ; r. o d * p r i m ,* u l ~ i m /* p ,* q/* r /* u / int x , k ;

* v :: /* c a p ,* b a z a ;

Raspundoti :
1, Analizati din punet de vedere al cornplexitatii algoritmii pent ru prel uerarea listelor. Se va folosi i n determinarea cornplexitatii timpul maxim de exec utie Pentru compararea algoritmilor com pletat i urrnatorul tabel: Lista sim p!u i n l a n~ Li sla dublu inf an!uita Neordon ata Ord onata Neordonata Ordonata Cau t a (L ,k)
Ad a ~g ~hL ,~)L _____

Elimina L,x
~u cce s o r u l

(h><)

PredecesorullL,Xl MinimJ l 1 Ma xim (L ) 2.

0 lista simp lu in lantuita ccntine , in ard ine, urrnatoarele naduri: 2 - ) 4 - ) 6 - ) 8 - ) 10 - ) 12 - ) 14 - ) 16 - ) 18 _.) 20 . Ce se va afisa in urma executiei urma toarei sec vente de prog ram?
for { p ~ p ~ i re , k = 1 ; k < 5 ; k ~ ~ , p = p- > u r m );

co u t

p - > i~f o ;

3.

0 lista simp lu in lantuita contine, i n ordine . urmatoa rete nodu ri: 1 - ) 2 - ) 3 - ) 4

--t

- 6 -o 7 ~) 8. Ce se va afisa i n urma executie i urrnato arei sec vent e de program? for {k =O,p::.:;prim;p->urm !::.;;NULL ; p~p->u rrn) if (p -> i n f o%2) k += p->i nf o ; cout k;

4.

Ce se va afisa i n urma executiei urrnatoarei secvente de program , daca lista sirnplu inlantulta conf ine. in ardine , urrnatoar ele noduri: 1 - ) 2 - ) 3 - ) 4 - ) 5? Dar dac a naduri le ei sunt, i n ord ine: 1 - ) 0 - ) 3 - ) 0 - 5? f or (p =p r i m; p-> i~f o!= O ;p=p -> u rm : ; c out p - >i n r o;
inlan~uita

5.

Ce se va afisa in urma exec utiei urrnatoarei secv ente de progra m, dac a lista sirnplu contine , in ordine , urrnatoarele nadur i: 1 - ) 2 _. ) 3 - ) 7 - ) 8 - ) 9? Dar daca nodurile ei sunt, in ordine: 1 - ) 2 - ) 4 - ) 5 ~) 7 -~) 8?
f or ( ~ = O , p = p r i m ; p - > i n f o ! = O ; p = p - > u rm )

Informatica
i f f p -c-urm -'> 'i n f o r p -' > .i n.f o e -eL ) cou t cc k , k++;

153

Adevarat sau Fals:


1.
2. 3.

Daca p este prim ul nod al listci, pentru a afisa informatia din al doil ea nod se executa secventa de instructiuni; p e p - c- u r m, cou t -cc p- c- Ln fo Daca peste pr im ul nod al listei, pentru a afisa infcrrnatia din al doilea nod se executa instructiunea: cou t-cc p- c- u rm- >info; Dac a p est e primul nod al Iiste i, pentru a afisa inforrnatia din al treilea nod S8 executa instructiunea: c ou t.c -cp - u r m- c- u rm- >i nfc :

Aleqeti:
Daca p este primul nod al liste i, iar q al doile a nod al listei, prin ce instructiune se leaqa nodul p de nodul q ? a. p'<q : b. q=p ->urm ; C. p=q->urm ; d . p -c-u rm e q : 2. Care din tre urmatoarele variante realizeaza corec t leqaturile in cazu l inserarii unui nod nou in tr-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 ; b . p ->urrn=q -> urm ; q ->urm=p ; C. q -c-u rme p -c- u rm : d . p->urm=q->urm ; p->urm=q ; 3. Daca p este primul nod al listei, ce instructiune trebuie executata pe ntru a afis a intorrnati a mernorata in al treilea nod? a . c ou t p - >u r m- >u rm- >i n f o - >i n f o ; b. c o u t p - > u :::- m - > i n f o ~ > u r m ~ > i n f o ; c. cout p - > u .rrn- > u r :n- >i n f o; d . cout p ->u rm ->u rm->u rm ->info ; 4. Daca p , q si r sunt trei nod uri co nsecutive ale listei , pentru a intersch imba nodul q cu nodul r , care dintre sec ventele de instructiuni este corecta ? a . r ->unn=q ; q ->urrn=r ->urm ; p -c-urrno r : b . p - >u r m= r ; r->unn=q ; q-c-urrrr-r'-c-u rrru
c.
q -c- u .rme r -c-u rm .

1.

r -c- urrn-iq .

p ->unn=r ;

d. .r-c-u r 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 tipu l nod, care dintre secventele de instructiuni urrnatoa re realizeaza corect leqaturile astfel i ncat sa se elimine din lista cele doua nod uri care urrneaza dupa nodu l p? a . p ~>u rm=p->urrn->unr,->urm ->urm ; b. p- c- u rm- p- ou rm- 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 . stab iliti care este adresa corecta de extragere din stiva:
de lete 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 ; Ca re dintre urmatoarele secvente de progr am ca lculeaza , in variabila k , suma elementelor 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. fo r ( k= O, p""p r i m; p->urm ~ =NULL ;p = p -c-u rm I k+=p-> info ; c. k =O ; p=pri:n ; while (p! =NULL) { k + = p->info ; p = p -c-u rrr u } d . p=pr im ; k = p ->in fo ; do { p = p-c-u rm, k+= p ->info ; } while (p ->unn! =NULL ) ;

a.

7.

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. Elem entele listelor sunt de tipul no d. (Baca taureat - 5e siunea iunie-iu lie 2003)

154
8.

Implernentarcu struct urilor de datc

Trebuie mutat primu l element al listei L1 imediat dup a primul elem ent al listei L2, in rest listele ramanand neschi mbate. Car e dintre urrnatoarele atribuiri sunl nec esare ~ 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. 1 3 5 c. 2 6 3 4 d. 2 3 6 4 9. Trebuie mulat primul element al listei L1 imediat dupa primu l elem ent al Iistei L2, i n rest listele rarnanand nesch imba te. Care dintre urrnatoarele atribu iri sunt necesare ~i in ce ord ine se ete ctuea za? 1) r =q- >urm; 2) r =p->urm; 3) q- c-urm-p , 4) p e 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 10. Daca la sfarsitu l exe cutarii secventei alatu rate valoarea r =p- >u nn r"'l'Nh':w ~ i var iab ilei r es te nu la, atu nci lista L 1: whil e J .t:'! = p && r ) a. are eel putin doua elemen te b. este vida r';'i->UDn i 'l! c. este incorect constituit a d . nu este circulara '"' 11. Functia egale(ad1 ,ad2) returneaz a valoarea 1 dac a ~ i numai daca inforrnatiile utile mem orate la adr esele ad1 ~ i ad2 coincid, altfel return eaza valoarea O. Secventa alaturata calculeaza i n variabila l ntreaqa n nurnaru l de elemente din lista L1: a. disli ncte consec utive aflate la i nceputullistei n =O; r=p ; b. egale consecutive aflate la inceputul listei while (e ga l e (r , p) && r } c. care sunt egale cu primul element { r = r - >u Lln: n-l-+ ; } d . car e sunt egale doua cate doua 12. Daca L1 este 0 coada , cu p adresa primului elem ent si u adresa ultimu lui element, iar r este adresa unui eleme nt ce urrneaz a a fi adauqat i n coada , stabiliti care dintre urrnatoarele es te 0 ope rali e co rec ta de adau qare : a. rvu - c- urm. u= r ; b. r- >urm::o: p: pe r : C. u -o u rme r : u e r d. r - c- u rmeu , u e r : 13. Pent ru a uni listele L1 ~i L2 plas and lista L1 in continuarea listei L2 , se etectueaz a ope ratiile : a. r e q : whil e (r -> u rm ) { r e r - c-urm, r -> u rm=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 il e ( r - >urm) r =r ->UnTIi r - >urm::o::q i 14. Pentru a determina nurnarul de elemente ale liste i L1 se utilize aza 0 variabila intreaqa n astfel : a . n =O: .r e p , while ( c- -c-u rm) {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, resp ectiv a ultimului element al lisle i Iiniare simplu ln lantu ite nevide L. Elementele listelor sunt de tipul nod. (Bacalaureat - Sesiune a august 2003) 15. $t iind ca L este fermata din 4 elemente, atunc i adresa penultim ului elem ent este : a . p-c- u rm- c- u.rm- > b . p -c-urrn- o u r m C. p- >u r m d . p - >u rm->urm-> urm
16. Elerne nte le din lista L aflate la adre sele q si r sunt vecine (consecutive) i n lista c aca si num ai daca: a . q - >u rm r-c-u rrn b . r- >u r m == q && q ->u nm = = r C. q->u rm d . q == r r I I r - >unn q

Intorm atica

155

17. Stiind ca este cefl nita 0 functie cnf astfel incat cnt(a1,a2) returnea za nurnaru l de elemente situate i n lista i ntre elementele de la adresa a1 si a2 (fara a nurnara elementele de la adrese le respective), care dintre urmatoarele ex presii arata al cate lea 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 fun ctie min astfe l tncat min(a 1,a2) returneaza valoarea 1 daca 'Ii numai daca eel putin unul dintre elementele memorate la adrese le a1 ~ i a2 S8 afla in lista L ~i returneaza valo area a in caz contrar. Care dintre urrnatoa rele expresii are valoa rea 1 daca ~j numai daca elementul 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 secve ntei alaturate va riabila r are valoarea : a. 1 b. p e. q d. NUL L ! 0 20. Lista L are exac t doua elemente daca: a . p-> unn= =u b. u ->urm==NUL L / ! u->u rm c . P'''' U d. p ->u rm==NUL L / ! p ->urm 21. Daca in variabila p este rnernorata initial adresa primului nod a l unei liste simplu Inlantuite cu eel putin 10 elemente, pentru a obtine in variabila p adresa pen ultimului nod al listei S8 executa secven ta: b. while (! p- >unn) p ->u rrn; a. while ( ! p ) p->urm ; C. wh ile (p- >urm->urm ) p - c-u rm, d . while (p - >u rm) p - >u rm ; (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 do ua elemente distincte din lista, atunci elementul memo rat la adresa p este succesorul elementului memorat !a adresa q in lista daca si numai daca: b . q ->u rm =:::., p a . p-> u nn == q ; C. p ->urm == q -c-urrn , d. q - c -urm-o u rrn == p (Bacalau reat - 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 ad resa 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 ad resa p (elementul de la adresa p nu este nici primul, niei ultirnul) un elev utilizeaza trei instructiuni simple (nestructurate). Care dintre instructiunile urrnatoa re poate fi una dintre cele trei? a . p ->unn-> urm = p ; b . d i s po s e (p ) c. p ->urm = p->urm- >u rm ; d . p- c-urm = p (Bacalaureat - Sesiunea iunie-iulie 2004) 25. Noduri!e unei liste dubl u inlantuite retin in carnpurile info, adp si ad u 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 - >ad u b . p ->adu ==q ->adu C. p -c-e du we q d . p - >a d p ==q ->adp (Bacalaureat - Simulare 2006)

156 _ _ _______ _ _ _ _ _ _ ---' ___ I= 1llplclI1 C II ta rca st.-nctn rHo.- dc da te


26. Daca intr-o lista liniara simplu inlantuita 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 . p cu- o-u rm C. u - c-u r rnvp d . ue p - c- u r m (Bacalaureat - Ses iunea 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 urmato r. Pentru inserarea unui nod aflat la adresa p irnediat dupa un nod al listei aflat la adresa q, 58 utilizeaza unele dintre urmatoarele 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 ~i in ce ordine: d. 23 c . 52 a . 36 b . 24 (Bacalaureat - Simulare 2006) 28. Variabila vf mernoreaza adresa elementului din varful stivei . Fiecare elemen t al stivei rnernoreaza intr-un camp ad r adresa urrnatorului element din stiva. Variabila q poate memora adresa oricarui element al stivei. Sa se realizeze elirninarea elementulu i din varful stivei: b. q =v f-> a dr ;vf =q - >ad r ; d e l e t e q ; a . q - >a d r =v f; v f - >a d r =q;delete q ; d. q= v f ; v f =q- >a dr ; delete q ; c . q =v f; v f =v f - >a d r; d elete 'If ; (Bacalaureat - Simulare 2003) 29. 0 lista tiniara simplu i nlan\uita cu adresa de i nceput merno rata i n variabila p este vida daca: b. p ~~ NULL I lp a. *p ==NULL I ! "" P d . e p ! =NULL / "p c. P ! =NUL L I p (Bacalaureat - Sesiunea spec iala 2003 ) 30. i ntr-o lista dub lu in lantuita cu cel pu tin 4 ele mente, fiecare eleacu-:>adp ; men t rel ine i n carnpu l adp ~ i adu adresa eleme ntul ui precep""'q->odtJ; dent si respectiv urrnat or din lista. Daca p reprezinta adresa p- >ad p=NOLI ,; primu lui element din lista, iar q e ste de acelas i tip cu p , atunci delete q ; secventa alaturata realizeaz a: a. interschim barea pr ime lor doua compo nente b . elim inarea primu lui element d. eliminarea ult irnului elemen t c . elimin area ce!ui de-a! doilea element (Bacalaureat - Sesi unea specia la 2005) 31. i ntr-o lista dublu inlan! uita cu cel putin 4 elemente, fiecare eleme nt reline i n carnpu l ad p ~ i adu adresa eleme ntului precedent ~i resp ect iv urrnator din llsta , Daca p reprez inta adresa pr imulu i elemen t 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 treilea eleme nt d . adresa celui de-al patrulea elemen t (Bacalaureat - Simulare 2005) 32. Intr-o lista circulara simplu i nlantuita fiecare element refine i n carnpul next adresa eleme ntului urmat or. Stiind ca. pentru variabi la p ce rnernoreaza adresa unui element oareca re din lista, este adev arata relatia p ->ne xt=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 ind ica ultimu l nod al stivei , care dintre urrnatoa rele expresi i trebuie sa fie adeva rate , pentru ca stiva sa fie vida? a. v f ==NULL b. v f - >urm ==O

q;. ; p-

c.

v f - c-u r me e Nu L l,

d.

vf ~ ~O

Informati d
34. Daca v f indica ultimul nod al stivei, jar q urrnatoarele secve nte de instructiuni extrage a. q e v f-c-u r rn : v f = q -> u r m; d e l e t e q; c . q =vf ; v f = q -> u r m; d e l e t e q ;

157
un pointer catre tipul nod, care dint re nodul d in varful stivei? b . c.=v :: ; v : =v f ->urm ; d e l e t e q ; d . q =v f ;v f = q - >u r m ; d e l e t e q ;

35. Daca variabila cap rne moreaza adresa primului nod din coa da si va riabil a b aza rnernoreaza adresa ultimului nod din coada, ca re dintre urrnatoa rele exp resii trebuie sa fie adevaratc . pentru a avea 0 coada vida?
a. be z a e v NlfL l . b . cap-> urm= == ba z a c . cap==b az a d . c ap = = NUL L

Miniproiccte:
Observatie: Pentru realizarea urrnatoarelo r miniproiecte S8 va lucra i n echipa. Protesorul va numi ccnducatorii de proiect, le va distribui proiectele si le va aloca un buget pentru realiza rea lor (pentru simpli!icare , buge tul va fi folosil numa i pentru plata membrilor ech ipei care vor realiza proiectul). Conducatorii de proiect vor negocia cu profesorul termenul de predare a aplicatiei, echip a cu care 0 vor realiza, si , daca este cazul, bugetul care Ii s-a alocal initial. Pe timpu l realiza rii aplicatiilor, membrii echipelor pot migra de la a echipa la alta. cu co nditia sa rarnana incadrati Intr-una dintre echipe, iar miqratia sa se faca numai cu accep tul conducatortlor echi pelor int re care migreaza. Fiecare echipa va fj to rrnata din : -7 Condu catoru! pro ie ct ulu i I~i va forma echipa ~i va distribui sarcinile pentru fiecare membru, negociind initial suma repartiza ta din bugetul alocat pentru realizarea sarcini i. Va fixa termene de executie pentru fiecare memb ru al echipei ~i va urma ri rnodulin care sunt respectate aceste tenn ene. In cazul In care unul dintre membrii echipei nu i~i realizeaza core ct :?i la timp sarcinile, va redistr ibui a parte dintre sarcini lntre ceilalti rnernbri ai echipe i, renegociind suma din buget alocata fiecaruia dintre ei La sfarsit , va da calificative fiecarui membru al echipei , In functie de modul in care si-au respecta t termenele, de modul in care au cooperat cu ceiialti membrii ai echipei si de calitatea lucrarilor executate. -7 Ana listu l va analiza cerinte!e info rmatio nale ale aplicatie i. va determina functiile apli catiei ~i va elabora modul de rezolvare (datele ~i structurile de da te folos ite, procesele in care este descornpusa aplicatia - care vor f implementate cu subprograme - si meniul care asiqura intertata cu utilizatorul ). In rea!izarea acestor sarcini va f ajuta t ~i indrurnat de conducatorul proiectului. -7 Grupul de pro g ram atori (numarul lor trebuie sa fie stabilit in funct ie de dimensiunea proiectu!ui) va implernenta in Iimbajul de programare solutia qasita de analistul echipei. Conducatorul proiectului Ie va repartiza subprogramele pe care Ie vor realiza ~ i specificatiile fiecarui subprogram: datele de intrare , datele de iesire si functia subprogramului. -7 Testo ru l va testa aplicatia . EI va trebu i sa aleaqa set uri de date de intrare astfel incat sa gaseascii erorile de loqica ~i de executie ale aplica tiei , -7 Documcnta ristu l va Intocm i docurnentatiile aplicat iei : documentatia pentru beneficiar si docurnentatia pentru pro iectantul aplicatiei La terminarea pro.ectului membri i echipelor vor prim i note pentru evaluarea activ.tatii lor. Sistemul de evaluare trebuie sa tina cant de venitu rile rea lizate pentru munca depusa , de calificativul obtinut de !a conducatorul de proiect si de ca!itatea muncii eva luata de profesor. 1. Pentru biblioteca scolii sunt aduse carti de la mai multe edituri. Cartile trebuie organ izate i n ordinea alfabetica a autor ilor , ~i pe fiecare autor in ordinea alfabetica a titlurilo r. Este posib il ca pen tru acelasi autor ~i acelasi titlu sa se prirneasca ma i mu lte exempla re. Se va folosi cate 0 stiva pentru fiecare autor, In care se va simula teancul de titluri primite , pentru fieca re titlu rnernorandu-se si numarul de exe mp lare . Numele autorilor si adresa

158

Implcm cnta rca st ruct ur ilor de da te

varfului stivei de carti asociate S8 vor memora i ntr-o lista ale carei elemen te contin in info rmati a utila do ua carnpuri : un camp de tip sir de car acte re pentru numele auto rulu i si un camp de tip pointer cate tipul nod al stivei pentru varful stivei. Scrieti a aplicatie care sa asigure urrnato arele ope ratii prin intermediul unui meniu : a. Distribuirea pe autori si titluri a unui teanc de carti sosit de la 0 editura. b . Afisare a titlurilor si a nurnarului de exemplare ale unui autor al ca rui nume se citeste de la tastatura. c. Afisarea in ordine alfabetica a autorilor si a numarului de titlu ri si de exemplare pent ru fiecare auto r. d. Numele autorilor cu cale mai multe, respectiv cu cere rnai putine titluri. e. Numele autorilor cu cele ma l mu lte, respectiv cu cele ma i putine exemplare. 2. La un concurs participa mai multi candidati identificati du pa nume ~i prenume . Fiecare candidat primes te la i nscriere un nurnar de identificare. Concu rsul consta i n trei probe , notele putanc lua valori de la 1 la 10. Rezultatul concursulu i se stabileste pe baza mediei aritrnetice a notelor primite. Trebu ie prevazute doua varian te de admitere a candidatiler: sunt adrnis i toti candid atii care au a medie mai mare decat m ~i sunt admlsi, i n ordinea med iilor, primii k candidat i (valorile pentru m si k se citesc de la tastatu ra). Scrieti 0 aplicatie care sa asigure urrnatoa rele operatii prin intermediul unui rneniu: a. Inscrierea unui no u cand idat la concurs. b. Retragerea unui candidat din concurs. c. Completarea notelor ~ i calcularea mediei pentru fiecare candid at. d . Modifica rea infor rnatiilor despre un candidat. e. Afisarea candi datilor adrnisi i n fiecare dintre cele doua variante in ordinea descres catoa re a medi ilor. f. Afisarea candidatilor adrn isi in fiecare dintre cere dou a va riante i n ordinea alfabetica a numelui si prenumelui . 3. Intr-un depou exista 0 linie pe care se gasesc mai multe locomotive , aranjate in ordine a in care au intrat in depou, ~i a linie pe care se TRIAJ LOCOMOT IVE gasesc mai multe vagoan e, aranjate i n ordinea i n linia de linia de care au intrat in depou. Fiecare locornotiva ~i intrare i e~ i re fiecare vagon are un num ar de identificare. In plus , pentr u fiecare vagon este preciza ta ~ i clasa (clasa 1 si clasa 2) Pentr u linia care contine locomotivele exi sta un tria] cu k linii de rnanevra . Valoa rea k lin ii de rnan evra pentr u k se citeste de la tastatura. in triajul vagoanelor exista 0 linie de intra re ,,1 0 linie de iesire pe care depla- TRIAJ VAGOANE sarea se poate face numa i in sensul saqetilor si 0 linie de linia de linia de ma-nevra pe care dep!asarea se poate face in ambele intrare ies.re sensuri. Scrieti 0 aplicatie care sa asigure urrnatoarele operatii prin inter-mediul unui meniu: a. Intrarea unei locomotive in depou. l ,inia de _ b. Afi~area locomotivelor din depou . Jm anevra 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 n vagoane , dintre care m vagoane sunt de clasa 1 (valorile pent ru p. n si m se citesc de la tastatura).

"i

Inform atica

159

2.7. Graful
2.7.1. Definitia matcmaticii a grufului
Se nurneste graf (G) 0 perec he ordonata de rnultirni (X,U), unde X este 0 rnultirne finita ~i nevld a, iar U 0 multirne de perechi formate cu elem ente distincte din mu ltirnea X (familie de subrnultimi cu doua elemente din rnultimea X). Terminologie:

-7 Elem entele rnultirnii X se nume sc varfuri sau noduri. Mulfirnea X se mai nurneste
multirnea varfurilor sau rnultimea nodurilor grafului G. Ea este de forma :

~i

x = {X1J X2, X3, ... , Xi ... , X

n}

unde Xi reprez inta nodul i al grafulu i G care are n noduri .


-) Ordinul grafului reprezinta numarul de noduri ale grafului, n :

ordinul grafului = eard(X) = n

-7 Elementele rnultimii U sunt perech i de nocuri , adica submultirn i 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;*XJ (elemente distincte din rnultirnea X). Elementul u, leaqa nodurile x, ~ i xJ si se noteaza astfel : [X;, Xi). Multirnea U este de forma:
U={U1. U2, U3 , ....

ue, "

OJ

Um}

Clasificarea grafurilor:
Criteriul de clas ificare folosit este proprietatea de simetrie a rnultirnii U .

Mul\imea U are proprietatea de s imetrie daca i numai daca, pentru orico per ee he d e noduri (x;, Xj), daca [x, Xi}E U, at un ei i (xi ' X;}E U in functie de prop rietatea de simetrie, grafurile se clasifica In : ~ Grafuri neorientate. Un graf G=(X,U) este un graf neorientat daca multirnea U are pro prietatea de simetrie. Mu1limea U este fermata din pereehi neord onate {xi, x;}. ~ Grafuri orientate. Un graf G= (X ,U) este un graf orientat daca rnultimea U nu are proprietatea de simet rie. Mu ltimea U este fermata din pe re c hi ordo na te { Xj, Xi}. Pentru a identi fica tipu l de graf pe care 11 veti folosi pentru a repre zenta datele , daflniti rel atla dintre noduril e grafului si verificati daca relatia are proprietatea de sirnet rie, astfel: ~ Daca nodul X In relatie eu nodul y irnplica ~ i ca nodul y este In relatie cu nodul x, atunci grafu l este neoriental. ~ Daca nodul X In relatie cu nodul y nu irnplica ~i ca nodul y este In relat ie cu nodu! x, atunci grafu l este oriental.

I S1bul.dlJi.u de CSlZ I
Seop: identifiear ea tipul ui de graf pe care 11 folositi pent ru a rezolva problema . Enuntul problemei 1. Pe neno unui jude! exist mai muite locetitet) care sunt legate prin sose te pe care S8 citcule in ambele sensuti. Sa se identltice traseele pe care se poate ajunge de la localitatea A la tocalitatea B.

160

Irnplernentarea strueturilor de da te

Nodunle grafului sunt localitatile. Relatia care se stabileste lntre nodu rile grafului este: nodul x este in relatie cu nodul y, daca exista 0 sosea care lea qa direct local itatea asociata ncdului x cu localitatea asociata nodului y. Relatia are proprietatea de simetrie, deoa rece soseaua care leaqa direct localitatea asociata nodului x cu localitatea asociata nodului y leaqa direct ~i localitatea asociata nodului y cu localitatea asociata nodului x. Pentru reprezen tarea caller de cornunicatie dintre lccalitati S8 va folosi un graf nooriontat .
Enuntul problem ei 2. Pe haria unui cartier existe rna! multe itite rsectii care sun! legate de strezi. Pe unele strezi S8 paale circula in ambefe sensuri. pe alte strez! numei tnu-u anumit sens . Sa S8 identifice traseele prin care se poate ajunge de la iniersectie A la intersectie B.

Nodurile grafului sunt intersectii'e. Relatia care se stabileste lntre nodur ile gralului este: nodul x este In relatie cu nodul y , daca exists trafic care leaga direct intersectia asociata nodului x cu intersectia asociata nodu!ui y (se poate circula de la nodul x la nodul V). Relatia nu are proprietatea de simetrie deoarece, daca exista 0 strada care leaga direct intersect.a asociata nodului x cu intersectia asociata nodului y i pe aceasta strada exista trafic de la nodul x la nodul y , nu este obligatoriu ca pe acea straca sa existe trafic si de la nodul y la nodul x. Pentru reprezentarea traficului auto dintre intersectii S8va folosi un graf ori entat .
En u ntul p rob lemel 3. La nivelul unui grup de persoene se face un studiu social. intre persoane se stabilesc retetii de prietenie, dar i releti: de simpatie . Sa se descrie eu ajutorul grafului rotntiile dintre porsoane.

Nodurile grafului sunt membrii grupului de persoane. intre persoane se pot stabili relatiile: -j- Relatia de prietenie este 0 relatie definita astfel : persoana x este In relatie cu persoana y , daca este prietena cu ea. Relatia este sirnetrica deoarece, daca persoana x este prietena cu persoana y , atunci si persoana y este prietena cu persoana x (relatia de prietenie presupune reciprocitate ). Pentru reprezentarea relatillor de prietenie dintre membrii grupului se va folosi un graf noorientat . -j- Relatia de simpatie este 0 relatie defin ita astfel: persoana x este In relatie cu persoana y , daca 0 simpatizeaza. Relatia nu este sirnetrica deoarece , daca persoana x simpatizeaza persoana y, nu este ob ligatoriu ca persoana y sa simpatizeze persoana x (relatia de simpatie nu presupune reciprocitate ). Pentru reprezentarea relatiilor de simpatie din tre membrii grupului S8 va folosi un graf o rienta t .

~.

1. 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 stabilit relatii de cunostinta? 1'11111
1 -jr

n-rri-nt:

srminoloqre

Elementele multirnii U (perech ile de noduri) S8 numesc mucn u. Multirnea U se mai nurneste si Itimea muchiilor grafului G. 0 muchie, fiind un element din rnultirnea U, este ce terrninata de 0 subrnultirne cu doua eleme nte din multimea X: muchia k a grafului ( ), care uneste nodurile Xi ~i Xj , este determinata de subrnultirnea {Xi, xi} ~i se noteaza cu x"j ' [x., Xj] ~i [ Xj , Xi ] reprezinta aceeasl muchie a grafului. Graful G are m muchii :
nurnar ut de muchi i = ca rd (U) = m

In fo rmatica
-7 Numim noduri adiac ent e orice pereche de nodu ri care forrneaza

161

0 muchie - {Xi,Xj} EU . Fiecare dintre cele doua noduri (x, ~ i X j) este nod inc ident cu muchia Uk = [x;,Xj] . -7 Nodurile vec in e unui nod Xi sunt toate nodurile Xj care sunt adiacente eu el. -7 Se nurneste nod ext rem al unei muchii oricare dintre cele doua nod uri care S8 gasesc la capatul muchiei . Nodurile Xi ~ i Xj sunt extrernitatile much iei [Xi . Xj]. -7 Se numesc rnuchi i i nc iden te do ua muchii U j 9i Uj care au 0 extremitate comuns nadul Xk. Un graf neari entat G este definit de 0 pereche de rnultirnl: rn ult irnea nodurilor sale - X ~i rn u lti rnea muchi ilor sal e - U. EI poa te fi con siderat ca o rnultirne de noduri din care unele pot fi unite doua cate doua printr-o muchie.

Grafu l S8 reprez in ta In pla n prin intermediul unor elemente geometrice: n od uril e se reprezinta prin cercuri, iar muchiil e prin linii drepte care unesc anumite cercuri .

0"

Nodul xi al grafulu i G

Muchia Uk=[Xi,Xj] a g rafului G

' - Nodul Xj al gratului G Elemenlele mult irnii X (nadurile) se identiflca cu ajutarul unar etic hete , care pot fi numere sau litere. Pentr u simp lificare , vom folosi ca etichete un sir de numere consecutive, lncepand cu nurnarul 1. De exemplu, pentru un grat cu n noduri, vom tolosi etiche tele: 1, 2, 3, ..., n-1, n. 0 muchie se va nota cu [i ,j] , unde i ~i j sunt etichetele nodurilor incidente cu muchi a. De exemplu , muchia [2,3] este muchia care uneste noduri le cu etichetele 2 ~i 3 Exem plul 1: in gratu ! G, =(X" U, ) din figura 1: -7 Ordin ul gratu lui este 8. -7 Graful are 8 naduri (n=8) ~i rnultim ea nodurilor este X,={1,2,3A,5,6,7 ,8} -7 Graful are 9 muchii (m=9) ~i mu ltimea muchiilor este Fig . 1 U ,={[1,2]. [1,3] , [1 A], [2,3], [2,5], [3A], [3,5], [6,7]. [6,8]) . -7 Nodu l 1 este n od adia cent cu nodur ile 2, 3 ~i 4, iar nodu l 6 este adiacent cu nodurile 7 ~ i 8. Nodurile 3 ~i 4 sunt adiacente deoarece perechea de noduri [3A] EU , . Nadu rile 5 ~ i 6 nu sunt adiacente deoarece perechea de nodur i [5 ,6] ~U ,. -7 Nodul5 este nod inci dent cu muchiile [2,5] si [3,5], dar nu este incident cu muchia [1,2]. -7 Nodul 3 este nod extrem much iilar [1,3], [2,3], [3AJ ~i [3,5]. -7 Muchii le [1,21 si [2,3] sunt m uc hii inciden te deoarece au un nod comun (nodul 2). Muchiile [1 A] ~i [2 ,3] nu sunt muchii incidente deoarece nu au un nod comun .

~ ~

Teorema 1 Daca graful neorientat G are n noduri (x " X2, ..., xo) , atunci nu m arul total de grafuri neorientate care sepot forma cu aceste nod uri esteg:
b

(J= 2c~

Dem c nstratle. Notam cu X multimea nodurilor grafului, cu U rnultirnea muchiilor, cu A multimea tuturor subrnultirnilor de doua elemente din X ~ i cu B multimea {O,1}. Multimea A are urrnatoarete elemente (subrnu ttimi) :

162
[1,2J, [1,3], [2,3].
[1,4], [2,4]. [1,n]

Implemen tarea st r net u r ilor d e date


0- 1 sub mulpm i

[2,n]
[0-1,0]

0-2 submulturu
1 sub rnuhirne

Nurna rut total oe su bmultirnieste: (n- I) +( n -2) + ... + 1 =

n x( n - I)
2

C'

"
1' da ca [x.y]
E

Notarn cu a - card{A):;;i cu b - card(S). Fieca rui graf ii putem asocia 0 funcue f:A ~B de finita a taturat. lovers, unei functii f:A ~ B ii putem atasa un grat, astfel: f(1x,y})=1 daca si numai da ce [x,y]e: U, Rez ulta 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-) B este ega! cu b
3 ,

f( { x.y l)=

{ O. caca [x ,yJ e. U

unde b=2:;;i a=

C~

4. Go 5.

6.

7.

in gra!ul G , - cu ce noduri este adiacent nodu l1? i n gra!ul G, - cu ce muchii este incident nodu l 1? 3. Dati exemple de doua noduri adiacente ~i de ooua noduri care nu sunt adiacente in gra!ul G,. Dati exe mplu de doua muchii incidente ~i 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 la c legatura int re localitati le Brasov, Bucuresti, Buzau, Ploiesti ~ i Constanta. Oaca exists mai multe trase e rutiere i ntre doua localitati (de exemplu, Bucuresti ~i Brasov), adauqati la gra! noduri pentru localitatile care identifica unic aceste trasee (de exemplu , Valenl i de Munt e, Tarqoviste si Pitesti), Desenati gra!ul judetelor din Roman ia (intre doua jude te exista a muchie daca cele 1.

8.
C;'~J'

~ 2 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 9. Pentru graful G J din figura 2, precizau ordinul, num arul de noduri, nurnarul de muchii ~i multimile X3 ~i U3 . 6 7 10. Structura unei molecule de substanta chimica poate fi reprezentata Fig . 2 printr-un gra! neorientat , i n care nodurile sunt atomii ~ i grupa rile din care este cornpus a molecula, iar muchiile sunt leqaturile dintre ele . in figura 3 este prezentat gra!ul rnoleculei de apa H20 . Reprezentati gra!urile moleculelor de H2S04 , NH3, CH4 ~i C2H4. H H

/\

2.4.2.2. Gradul unui nod al grafului neorientat


Nodul unui gra! este cara cterizat pnn grad.

Fig. 3

Gradul unui nod Xkal gra!ului G esle egal cu nurn arul muchiilor incidente c u nodul ~i se not oaza c u d(xk) '
Tcrminologie :
~ ~

Se nurneste nod terminal un nod care are gradul egal cu 1 - d(xk) = 1 (este incident cu 0 sinqu ra muchie). Se nurneste nod izolat un nod care are gradu l ega l cu 0 - d(xk) = 0 (nu este adiacent cu nici un alt nod al grafului, adica nu S8 g a se ~ te in extremitatea nici unei muchil) .

Info rmat ica


Exemplul1 :

163

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, Fig . 4 [7,9] }, in graful G 4 : -7 G rad u l nodu lui 5 este 5, deoar ece are 5 muchii incide nte: [2,5J, [3,5], [5 ,6J, [5,7] ~i [5,8J -7 Nodu l 9 este nod te rm inal, de oarece are gradul 1 (0 sinqura muchie tncide nta: [7,9]) . -7 Nodu l 10 este no d izolat, de oarece are gradul 0 (nic io mu chie incidental. Exe mplul2 :

G4,

Fie graful G5=(X S.Us), unde X s={1 ,2.3,4,5,6.7,8} si Us={[1 ,2J, [1,5], [2,3], [2,5J, [3,4], [3,5J, [4,5], G, .,,",," [4,6], [4,7J). Din lista much iilor unu i graf neorientat , putef preciza urmatoarele inforrnatii: -7 Determinati gr adul unu i nod - nurnarand de cate on apare eticheta nodului i n lista de muchii. Nodul 5 are gradul 3 (in multirnea muchiilor, eticheta 5 apare de 3 on: [1.5J, [2,5J, [3,5J). -7 Det errninati dace un nod este terminal - verificand da ca eticheta lui apare 0 singura data . Nodul 7 este no d terminal (eticheta lui apare numai intr-o sinqura muchie : [4 ,7]) . -7 Deterrninati da ca un nod este izo lal - verificand daca eticheta lui nu apa re i n lista de muchii. Nod ul 8 este nod izol at (eticheta lui nu apare in lista muchiilo r). -7 Deterrnin ati nu rn aru l de nod uri izolatc (n -) astfel: nurna rati etichetele distincte care apar in lista mu ch iilor (n 2) ~i n1=n-n2 . i n graful G s, i n lista de muchii exista 7 etichete distincte. Nurn arul de noduri izo late este 1 (8-7).

Observatie: intr-un graf cu n noduri, oricare ar fi nodul egal cu 0 ~i m ai mic sa u egal cu n-1 (O';d (xk)'; n -1).

Xk ,

gradul sau este rnai mare sau

-------------- .-----.. 1. in g raful G 4 : precizali gradul nodu lui 3 ~ i identificati nodu l cu gradul cel

mai mare, nodurile izolate si nodurile terminale.


2. in graful G 3 : identiflcati nodu rile care au gradul 2, precizati cate noduri au gradul impar si care este nodul cu gradul eel mai mare. 3. in graful G s: precizat i grad ul nodulu i 3, identificati nodurile izolate si nodurile term inale , precizati cate noduri au grad ul 2 ~i cate noduri au gradu l impar.

Teorerna 2
Daca gra ful G are m rnu chl i (Ul, U2, ... , um) ~i n noduri (x-, X2, .. . , Xo ) , atunci in tre gradul nodu rilc r si numarul de muchii exista urrnatoarea relatie: suma gra dalor tuturor noduriJ or

grafului este cgala cu dublul numarului de muchii:


;,- 1

i: d( 'J ~ 2 m

Dem on stratie. Fiecare muchie Uk = [xj, Xi] coresounde unei unitati din gradul nodului Xi ~i unei unita\i din gradul nodului Xj . Rezulta ca fiecare muchie contribute cu 2 unitati la sum a gradelor.

Exemplu . in gratul G 4 : d(1) + d(2) + d(3) + d(4) + d(5) + d(6) + d(7) + d(8) + d(9) + d(10) + d(l l ) = 2+2+3+2+4+1+2+ 1+1+0+0 = 18 = 2x9 = 2xm

... Propozltla 1. Pentru orice graf G , nurnaru l nodu rilor de grad impar es te par.
Demon st ratie. Suma gradeJor nodurilor fiind un numar par, aceast a surna trebuie sa contina un numar par de termeni care sunt numer e impare.

Exemplu . in graful G 3 exista 4 noduri cu grad impar (3, 6 , 8 ~i 9).

164

Imp lcmcntarca st r ucturilor d c da tc

Propozitia 2. Numarul minim de much ii, rnm tn, pe care trebuie sa Ie aiba un graf neorien tat, cu n noduri, ca sa nu existe noduri izola te, este:
III "''''

=[

II ;

I]

Dernon stratl e. Pentru ca un nod X j nu fie izolat , trebuie ca d(X r); :::.1. Pentru ca toate noduri le nu fie izolate, trebuie ca suma gradelor sa fie mai mare sau egala cu n . Dar, suma gradelor este dub lul nurnarului de muchii - m . Insearnna ca , pentru n par - mmin=n/2 , jar pentru n impar - m min=(n+1 )/2 .

sa

sa

Teorema 3 Daca gralul G are

n nod uri (na), atunci eel putin doua noduri au acetasi grad.

Dernonstratte - prin reducere la absurd. Presupunem cit nu este adevarat. Cum, oricare ar fi nodul xe. O ~d( xk)~ n -1 , ln searnna eel sinqurul sir de n numere, diferite intre ele doua cate c oua. care pot reprezenta gradele unghiurilor este 0, 1, 2, ... , n-l . Deoarece un nod es te lzotat, eel ma i mare grad al unu i nod nu poate fi decat n-2 (nodul nu se poate lega de el Insusi s! de nodul izolat). Rezulta ca sirul de numere definit mai sus (singurul ~ir care se poate defin i) nu poate reprezenta sirul gradelor in graf.

1. in graiul G, ,, verificati ca este Indeplinita relatia dintre gradul nodurilor si nurnarul de muchii ale gralului . ldentiflcati nodurile cu grad impar ~i 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 sir g rafi c un sir s de n numere intregi pazilive (d" d" .." do) care pot reprezenta gradele unui graf neorientat, cu n noduri.
Propozitia 3

Cond itllle necesare ca un ~ir de n numere intregi pozitive (d" d" ..., dol sa fie un sir grafic sunt: (1) d,,; n-r , penlru once i=1,n; (2) suma d, + d, + ... + do trebu ie sa fie un numar par.
Demo nstratle. Neces itatea ccn ditiei (1) rezutta din faptul ca grad ul ma xim al unui nod dintr-un graf cu n noduri poate fi n -t . Necesitatea conditie i (2) rezulta din Teo rema 2 - suma gradelor fiind ega la cu dub lul numa rului de rnuch!i, este un nurnar par .

Ac es te conditil nu sunt intotdeaun a ~i suficientc . Pentru a verifica dac e sirul de numere este sir graf ic, se face ana liza sirului de numere . Exem ple: (a) s=(1,1,2,3,3,4,5,5,7,8) Acest sir nu indeplineste una dintre conditiile necesare - (2) " suma numerelar este 39. (b) s=(1,1,1,2,2.3,5,6,8,9) Acest sir lndeplineste condltiile necesare (suma numerel or este 38 l}i fiecare nurnar este mai mic sau egal cu 9: 9=1 0~1 ) . Aceste cond itii nu sunt tnsa suficiente . 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 fo r illa Iicii

165

pe care i l poate avea oricare dintre celela lte sase noduri este 6 (ele nu se pot lega de ere insele si de nodurile 1, 2 ~i 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 ~i r Ind eplin este conditiile necesare (suma numerelor este 38 ~i fiecare numar este mal mic sau egal cu 9). i n plu s, fala de sirul (b), avand aceleasi gra de pent ru nod urile 1, 2, 3 ~ i 10, i nde plineste ~ i condit ia ca celelalte nod uri sa alba grad ul mai mic sau ega I cu grad ul max im posibil (6). Dar , exis ts doua nod uri cu grad ul 6. Ele trebuie sa se leg e arnandoua de nodul 4, la care este legat si nodul 10. Nodul 4 trebu ie sa aiba eel putin gra dul 3. Dar nodul 4 are gradu l 2, cee a ce este impo sibil. (d) s=(1,1,1,3,3,4,4,5,5,9) Acest ~ i r i ndeplineste conditiile nec esare (suma numerelor este 38 si fiecar e numar este ma i rnic sau ega l cu 9) ~i este un sir grafic caruia i se poa te asocia grat ul G, =(X6 ,U6 ) , cu 18 muchii , definit astfel. X6 ={1,2,3,4,5,6,7,8,9,1O} U6 ={[1 ,10], [2,10], [3.1OJ, [4,8J, [4,9J, [4,10), [5.8], [5,9], [5.1O J. [6,7J , [6,8J, [6 ,9], [6,10). [7,8J, [7,9J, [7,10), [8,10J, [9,10]}.
~

e,

Precizat i daca sirurile s,= ( l ,1,2,2,4) ~i s,=(0,1,1,1,4) pot fi siruri gratice. Pentru sir ul care este sir grafic, gasiti un graf care i S8 poate as ocia .

2.7.3. Graful or icntat


Spre deosebire de gratul neorienta!, In gratul orientat pere c hile de nod uri s unl ordo nale . Gratul orientat se mai nurneste ~i digraf.

2.7.3.1. Terminologie
~

Elementele rnultirnii U (perechile de nodur i) se nume sc arce. Mul\imea U se mai nurneste ~i rnultirnea arcel or gratului G. Un arc, fiind un element din multirn ea U, este determinat de 0 submultirne ordonata, cu doua elemente, din multimea X: arcul k al gratului (Uk), ce uneste nodurile x; ~ i Xi ' este determinat de subrnultimea {x;,x,} ~i se noteaza cu [x ;, xi] ' [ x;, xi] ~i [Xi, Xi] nu roprezinta ace las i arc aJ g rafulu i. Gratul G are m aree: nu m aru l de arce = ca rd( U) = m un arc - (X"X,) EU sau (xj,x,)e U. Fiecare dintre cele doua noduri (x, si xi) este nod
inc ide nt cu arcul U k =
[ Xii Xj]

-7 Se numesc n oduri adia ccntc in graful G oricare din perechile de noduri care tormeaza
sau cu arcul U k

=[ Xj , X i].

-7 Nodurile Xi si
~
~

sunt ex trem itati le arcului [ Xi, Xj]. Nodul X i este extrcrnitatea initial a a arcului, iar nodul Xj este extremitatea finala a arcului . Se numesc arce incidcnte co ua arce u, ~i Uj care au 0 extremitate com uns - nodul Xk. Se num este suc cesor al nodului Xi orice nod la care ajunge un arc care iese din nodul Xi. MUI~ime a succcsorilor nodului Xi este fermata din rnultirne a nodurilor la care ajung arcele care ies din nodul Xi. Se noteaza cu S ( Xj) si se defineste ca multirnea: S(x) = {Xi EX (X;, xj)e U}
Xj

Se nurneste prcdcccsor al nodului Xi orice nod de la care intra un arc in nodul Xi Mul1imea predecesor ilor nodului Xi este fermata din multimea nodurilor de la care ajung arcele care intra in nodul Xi . Se noteaz a CU P(' si S 8 defineste ca m uttimea: P(x) = { Xi e X I (xj, x;)e U)

166
-7 Mul~irnea arce lor care ies din nodul
U+(x,) = {u=(x,.
Xj)

IlIIplclllcntarca st r nct ur ilor dc datc

IUEU} . I

Xi S8

noteaz a
S8

CU

U+(X i) ~j
U -(X i)

S8

de fine ste ca rnultimea


S8

-7 Multimea arcelor care intra in nodul x,


mea U"(x ,) = {u=(x;. x,) UEU}

noteaza cu

!?i

define ste ca rnutti-

-7 Nodul sursa a l grafului este nodul care are rnultimea succesorilo r fermata din toate celelalte noduri, mai putin el, jar mu ltimea predecesorilor sai este mul timea vida.

-7 Nodul destinatie al gralu lui este nodul care are multimea predeceso rilor fermata din toate celelalte noduri, mai putin el, iar rnultimea succesorilor sai este rnultirne a vida.
Observatii 1. card(S(x))=card(U+( x)) ~i card(P (x ))=card(U"(x)) 2. Pentru nodul sursa al qrafului card(S (x))=c ard(X).1 ~i card( P(x ))=O. 3. Pentru nodul destinatie al gralului card( P(x))=ca rd (X)- 1 ~i car d (S( x))=O. 4. Daca un graf are un nod sursa , atunei nu poate ave a un nod destinatie, ~i inve rs.
~j

Un g raf o rientat G es te d efinit de 0 per eche de rnulti m i : rnultim ea nodurilor sal e - X m ultlmea a rcelo r sa le - U . EI p o ate fi co ns ide ra t ca 0 multirn e d e noduri din ca re un el e pot fi unite doua ca te dou a, p ri n unul sa u d ou a arce .

G raful orientat se rep rezinta in plan prin intermed iul unor elemente geometrice: nodurile se reprezinta prin ce rcuri, ia r arcel e prin linii drepte care unesc a numite cercuri si care a u 0 saqsata la ca patul ca re core spunde extrernitatii finale a arcului.

0 "'- Nodul x i al g rafu l u i G

~
' - Nodu l Exemplu :
Xj

Arc ul uk=[xi,X j] al g ra ru l u i G

al grafului G

:;>

t; , in graiul G, =(X" U, ) - din figur a 5:


-7 Ordinul grafului este 5. -7 Gral ul are 5 nod uri (n=5) si rnultim ea nodurilor este X, ={ 1,2,3,4,5} . -7 Gralul are 7 arce (m=7) si multirnea arce lo r este U, ={[1 ,2], [1,4 J, -7

~ 2
5 4

-7 -7 -7

3 Fig 5 {2,3J, [4,1], [4,3], [5,2], [5,31}. . Nod ul 1 este nod ad iacent cu noduri le 2 si 4, iar nodul 3 este adiacent cu nodurile 2, 4 ~i 5. Nodurile 3 si 4 sunt adiacente deoarece perechea de noduri [4 ,3JEU, . Nodurile 5 ~ i 4 nu sun t adiacente, deoa rece nici una dintre perech ile de noduri [4,5J si [5,4] ~ U, . Nodul 4 este nod in cident cu arcele [1,4], [4,1J ~i [4,3]. dar nu este incident cu arcul [1,2]. Nodul 2 este ex t re m itatea initial a a arcului [2,3J ~i ex tr em ita tea fln al a a arculu i [1,2Jsi [5,2J. Arcele [1 ,2J ~ i [5 .2] sunt ar ce in cide nte deoarece au un nod comun (nodul 2). Arce le [1,4J ~i [2,3] nu sunt arce incidente, deoarece nu au un nod comun.
s uccosor al nodului 1, dar si al nodului 5. Nodul 1 este nod succesor al nodu lui 4, dar ~i

-7 Multim ea s uccesori lo r nodu lui 1 este fermata din noduri le 2 si 4. Nodul 2 este no d
nodul4 este nod succesor al nodului 1. Nodu l 3 nu are succesori.

-7 Mul!im ea pred eces oril or nodului 3 este fermata din nodurile 2, 4 si 5. Nodul 2 este
nod pred ecesor al nodului 3. Nodul 1 este nod predecesor al nodului 4 , dar si nodul 4 este nod pred ecesor al nodului 1. Nodul 5 nu are prede cesori .

Inform a ti ca Tcorema 4
Daca graful oriental G are fI noduri (X" X2, "', xo), atunci nu rnarut total de grafllri orientate care se pot fanna ell acoste noduri osto g:

167

g ='"

.~~I':'U
2

Dem onstratie. Se dernon strea za la fel ca Teorcma 1, eu deosebirea ca multimea Beste {D,1,2,3} card( B)=4 , ia r fu nctia f este de finita atatur at

3' daca [x,Y]


2, daca [x,y)

E
E

U ~ i [y,x]
U

f(l x.Y I) =

{ 1, oaca [y,x) E U 0, daca [x,y] e U ~ i [y.xj e U

in graful G, - cu ce noduri este adiaeent nodul 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 grafu l G, . 5. Da!i exe rnplu 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 ~i rnultirnea predecesorilor nodului 4. 8. Desen ati 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? Desenali 10 dintre aceste grafuri. . 10. Pentru graful G, din figura 6, precizati ordinul, numarul de ( \ II G, noduri, nurnarul de aree ~j rnultirn ile Xg ~i Ug.

1. 2.

(JF-

2.7.3.2. Gradele unui nod al grafului orientat


Nodul unui graf orientat este caracterizat prin grad ul intern
~i

Fig. 6 gra du l ex te rn .

Gradul intern al unui nod Xi al grafului G este egal eu nurnarul arcelor care intra in nodul x, (arce de forma [x" x,)) ~i se noteaza cu d(x). Gradul extern al unui nod Xi al grafului G este ega I cu nurna rul arcelor care ies din nod ul

x, (arce de forma
Tcrrninologie :

[ Xi, Xj))

~i se noteaz a Cll d+(x).

-7 Se nurneste nod terminal un nod care are surna gradelo r eqala cu 1 (gradul intern sau
gradul extern ega l cu 1 ~i gradul extern , respectiv gradul intern, ega l eu 0 - d+(x,) = 1 ~i d'( x,) = 0 sau d"(x,) = 1 si d+(x,j = 0). Nodul terminal este incident cu un singu r arc.

-7 Se nurneste nod izolat un nod care are surna gradelor eqala eu 0 (gradul intern si
gradul extern egal e eu 0 - d+(x,) = d'( x,) = 0). Nodul izolat nu este adiacent cu niei un
alt nod al grafului, adica nu se g as e ~t e la extremitatea niciunui arc.

Observ atii: + ' . 1. d (x)=ea rd( S(x)) ~ I d (x) =c ard( P{x)). 2. Daca graful are n noduri , pentru un nod sursa al grafului d+(x)=n-1 ~i d"{x)=O, iar pentru un nod destinatie al grafului d-(x)=n -1 ~i d+(x) =O.

168
Exemplul 1:

l mplemcnta r ca structuri lor de d a te 5

Gra!ul G , 0 =(X lO,U lO ) din figura 7 este definit astfel: X lO={ 1,2,3,4,5,6,7,8,9, 1OJ UlO={[ l,2] , [1,4]. [2,1], [2,3], [2,5]. [2,6], [2,7]. [4,l J, [7,2], [8,9), [9,8] j . in gra!ul G lO : -') Gradu l intern al nodului 2 este 2, deoarece are 2 arce care intra: [1,2J ~ i [7,2]. Grad ul ext ern al nodului 2 este 4, deoarece are 4 arce care ies: [2,1J, (2,3], [2,5] ~ i (2,7]. -') Nodul 5 este nod terminal deoarece are suma gradel or eqala cu 1 (gradul intern este 1 ~i gradul extern este 0) ~ i un singur arc incident: [2,5]). -7 Nodul 10 este nod lzo tat , deoarece are gradul 0 (niciun arc incident). Exemplul2 : (." Fie graful Gl1=(X ll ,U l1), unde X ll={ l ,2,3,4,5,6,7,8) si Ull={[l ,2J, (1,5]. [2,1], [2 ,3], [2,5], [3,4], [3,5], [4,3]. [4,5J , [4,6], [4,7], [5,4]). Din lista arcelo r unui graf orientat, puteti preciza urma toarele inforrnatii: -7 Gradu l ex tern al unui nod - numarand de cate ori apare eticheta nodului in Iista de arce, ca prim elemen t din perec he. Nodul 3 are gradul extern 2 (in rnultirnea arcelor, eliche ta 3 apare de 2 ori ca prim elem ent: (3,4J ~i (3,5]). -') Gradul intern al unui nod - nurnarand de cate ori apare eticheta nodului in lista de arce, ca al doilea element din pereche . Nodul 5 are gradul 4 (i n multirn ea arcelor, eticheta 5 apare de 4 ori ca al doilea element: (l ,5J , [2,5), (3,5J ~ i (4,5]) . -7 Mul~ im ea succesorilor un ui nod este fermata din nodurile a carer etich eta apare ca al doilea element i n perechile i n care primul element este nodul preciza!. Mul\imea succeso rilor nodului este p , 5, 6, 7) .- arcele: [1,3]. [1 ,5], [1,6] si [1,7]. --7 M u l~imea pre dccc so rilor unui nod este fermat a din nodurile a carer eticheta apare ca prim elem ent in pe rechile in care al doilea ele me nt e ste nodu l precizat. M ulttrnea predec esorilor nodu!ui ;). este {2, 4) - arcele: [2,;).] si [4 ,;).J. Exe mplu l3 C " Fie gra!urile G 12 =(X 12 ,U12), unde X 2={1,2.3,4} si U' 2={[l ,2], [1,3], [l,4J (2,3J, [3,4J, (4 ,3]), ~i G13 =(X 13,U"j, unde X13={1,2,3,4) ' ~i U13={[2,1]. [2,3J, (3,1], [3,4J, [4,lJ, [4,3]). Din lista r: IJ muchiilorunui graf, puteti preciza urmatoare le informatii: -') Nodul s urs a al unui gra! apare pe primul lac din pereche de n -t ori - ~i niciodata pe locul al doilea. i n gra!ul G 12 , nodul 1 este nod sursa. Desenati gra!ul G 2 pen tru a ' veri fica ace asta afirrnatie . -') Nodu l destinati e al unui gra! apare pe al doilea lac din pereche de n-l ori - si niciodata pe primul lac. In gra!ul G 13 , nodul 1 este nod destinatie. Oesenati gra!ul G13 pentru a verifica aceasta afirm atie . Observatie l ntr-un gra! cu n noduri, oricare ar fi nodul Xk, oricar e dintre gradele sale este mai rnaresau egal cu 0 ~i mai mic sau egal cu n -1 (O,;d+(xk) s n -t ~i O ,;d -(xk) s n-t ). 1, In graful Gg - preciza ti gradul intern ~i gradu l extern ale nodul ui 5, identificati nodul cu gradul extern eel rnai mare si nodunle cu gradul intern eel rnai rnic. 2. in graful G lO - identificati nodurile care au gradul intern 1, precizati cate noduri au gra dul intern egal cu gradut extern, care sunt nodurile terminale ~i care sunt nodurile izolate.

Info rm atica

169

3, i n gralu l G l l - preciza ti gradu l intern si gradul extern ale nodulu i 4, ldenti flcati nodurile izolate ~ i nodurile terminate, identificati nodurile care au gradul extern maxim ~i nodurile care au grad ul intern ega l cu gradul extern .
Tcororna 5

Daca gralul orienta t G are m ar ce (u, . U2, .... Um) ~ i n no duri (x-, X2..... Xo) . atunci i ntre gradele nodurilor ~ i nurnarul de muchii exista urma toarea relatie: suma gradelor interne ale tuturor noduriJor este egala cu suma gradelor exteme ale tuturor nodurilor ~i cu numarui de arco :
II II

L d +( \j)= L d -( \ i)= m
j,.,1 j"' l

Demons tratl e. Fiecare arc Uk ;; [Xi. Xj] corespu nde unei un ttati din gradul extern al nodului Xi ~ j unei unitali din gradul intern al nodului Xj_ Rezulta ca fiecare arc contribuie eu 0 unitate la suma gradelor interne ~j eu 0 unitale la suma gradelor externe.

Exem p lu. i n gralul G g : d+(1 ) + d+(2) + d+(3) + d+(4) + d+(5) + d+(6) 1+3 +1+2+2+ 1 d' (1) + d' (2) + d' (3) + d' (4) + d'(5) + d' (6) = 1+2+ 2+2+2+1 = 10, m fiind ega l cu 10

=10 si

--------

~ In graful G 11 verificati ca este Indeplinita relatia dintre gradurile nodurilor


si nurna rul de arce ale grafului .

2.7.4. Rcprezcntarca

~i

implemcntarca grafllilli

Exista ma i multe moduri de reprezentare la nivel logic a unui graf, care pot fi implem entate i n memoria unui calculat or, lolosind diverse tipuri de structun de date . Aceste reprezentari pot fi folosite in algoritmii care pre lucreaz a grafuri si, implicit, in programele prin care vor fi impJernentati in calculator acesti algoritmi. Printre rnodurile de reprezentare a unui graf se numara: -7 re preze ntarea prin ma tricea de a d iaconta : -7 reprezenta rea prin ma tricea de incidon ta : -7 reprezentarea prin Iista muehiilor (areelo r) ; -7 reprezentarea prin Iista de adiacenta (Iistele veeinilor); -7 reprezentarea prin matricca costurilor.
Fiecare reprezentare prezinta avantaje in ceea ce prives te utilizarea efi cienta a memoriei interne , in fun ctie de tipul grafului (cu noduri put ine . dar cu muchii mu lte - sa u cu noduri mu lte , dar cu mue hii putine) ~i din punet de vede re al eficientei algoritmilor de prelucrare (i n functie de aplica tie). in urrnatoa rele rep rezent ari se con side ra ca gralu l G= (X.U) are n nod u r i ~i m mu chii.

2,7.4,1, Reprezentarea prin matricea de adiaccnta


Matricea de ediaccnta a unu i gra f es te 0 matrice patrata binara de ordinul n (A,I,Il), a le care i e lemente a iJ sunt definite astfel :

I. dad Ii, il E U a j,J = { o.Jacali."j Jrl U


Implementarea qraf ului prin matricea de adiacent a se face printr-un tablou bidimensional (0 matrice patrata cu dimens iunea n), asttet:
i nt

a r:>]l< :1> ] ;

170
Exempl e:
Graful ncorientat G 1

Implemcutarca structurrln r de datc ;

2
1

0
1 1 1

2 3
4

0
1

0
1

5 6 7
8

.s.
0 0

0 0 0

5 - 60 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 1 0 .z, .,Jl._ 0 0 0 0 -~ 1 0 0 0 1
-,-::,-

--~-

7 0 0 0 0 0

8 0 0 0 0 0

G ra fu l oriental Gg

0 0

-1 ,-.s,
0

1 - '-_ 2 . 3 --'-" 0 1 1 0 0 2 1 1 3 0 0 0 4 0 1 0 5 1 0 0 0 0 0 6

4 0 1 0 0

5 0 0
1 1

0 0

0
1

6 0 0 0 0 1 0

Proprietati le matricei de adiacenta : 1. Ele mentele de pe dia go nala pr incip als au val oa rea 0 - din definitia grafului re zulta ca

oriee muehie (arc) [i. j) trebuie sa respeete conditi a i,.j .


2. i n cazul unui g ra f n eorientat , matricea de adiac erita este 0 m atri c e s irne t ric a fata de , i]. diagonala principa ta. deoarece , dac a exista rnuchia [i , j] , atu nci exis ta ~i muchia U Accas ta r e prez entare es te recorn and ata p en t r u probl em ele in c are se tc stc aza pre zenta u n c i m u c hii sa u a unui ar c in tre d ou a n o duri , se ca lcu loa z a gradul unui n od etc . - deoa rece pe r mi te un ac c es r apid la n odu r i le s i m u chi i le (arc ele) unui graf.

Algoritmi pentru reprczenta rea grafurilor fo losind matricea de adiacenta


Din matr icea de ad ia centa pute ti obt ine urrnato arel e inform at ii: Graf neoricntat Suma elemente lo r matr ice i de aotacenta esle eqala eu 2xm (dubtul numarului de muchii ). Gradul unu! nod i este egal cu suma elementelor de pc lin ia i (sau cu su ma eleme nte lor din colo ana I). Nodurile adiaccntc nodului i sunt nodurile j U=1 .n) pentru care clc me ntc le din linia i sun t eqale c u 1 (altl l lls t l Mal pot f definite ca ncdurile j U=1,n) pc ntru care clemente lc din co loa rta is unt c gale ell 1 (aU][iJ=1) Graf orientat Suma elcmcnte lor m atrj c ot de adiacen ta este ecala cu m (numaru! de arc e). Gradul extern al nodului i este egal eu suma oreme nte tor de pe linia i Gradul intern alnodulul i este egal cu suma eleme nte lor din co loana i. Succcsorii nodului i sunt nodurile j (j=1,n) pentru care elementele din lini a i sunt egale cu 1 (a[ilUl =1) Predeeesorii nodului i sunt nodurile j U=1 ,n) pentru care elementele din eoloa na 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 din col oan a i sunt egale cu 1 (a[i]U]=1 sau a(j][i]=1 ) - reuniunea dintre multimea succesorilo r si multimea predeceso rilor nodutui. Numarul de vecini ai nodu lui i este egal eu eardinalul multimii de noduri adiacente nodului i. Arcul [l,j] al grafului reprezinta un element al matricei de adiacenta care lnd eplineste conditia: afilfil = 1

Numaru! de vcctn! at nodului i este egal eu cradul nodului. Muchia [i,j] a grafului reprezmta un element al matrieei de adtacenta care Indephneste conditia: afiJOl = 1 (sau aUlfil = 1)

Inform aticii
Exemplu Se considera graful din FIgura alaturata . ldentificati matricea de adiace nta a gratului
a)

171

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 1

1 0 0 0

dI

0 1 0 1

1 0 1 0

~
0 1 0 1

1 0 1 0

(Bacalaureat - Sesiunea specia ls 2003) Raspunsul coreet este matricea a). Pentru a identifica mat ricea de adiacenta a grafului din fiqura , S8 vor elimina pe rand variantele incorecte, prin verifica rea urrnatoa relor conditii: 1. Matricea trebuie sa fie binara - toate matriceJe indeplinesc aceas ta con ditie ; 2. Elemen tele de pe diagonala principala trebuie sa aiba v aloarea 0 - matricea b) nu Indeplineste ace asta conditie . 3. Deoarece graful este neorient at, matricea trebuie sa fie s irnetr ic a - matricea c) nu lndeplineste acea sta conditie 4. Din analiza grafu lui S8 observa ca doua noduri au gradul 2 si dou a nodu ri au gradu l 3; in matricea de adiacenta treb uie sa existe dou a linii care sa contina doua elemente cu valoarea 1 $i doua linii care sa cantina trei element e cu valoarea 1 matricea d) nu ind epllnes te aceasta conditie. 1. Scrieti matric ea de adiacen ta a gratului G4 . Folosin d informatiile din matrice a de adiacenta , deterrninati: gradul noduJ ui 5, nodu rile izolate si nodu rile terminale . Scrieti matricea de adiacenta a gratului neorientat G14=(X ,4,U 14 ), unde X 14={1 ,2,3,4} si U 14 ={[1,2]. [2,3], [3,4], [4,1]). Ce prop rietate are acest qraf? Scrieti matricea de adia centa a grafului Ga. Folosind inforrnatiile din matricea de adiacenta, deterrninati: gradul intern al nodului 5, gradul extern al nodului 4, succe sorii si predecesorii nodului 2 ~i predecesorii nodului 3. 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. Scrieti matricea de adiace nta a qrafului orientat G1 5 din figura 8. Scrieti matricea de adiac enta a grafului G 12. Cum iden:05 tificati in matricea de adiacenta nodul sursa al grafului? Fig. 8 Scrie ti matr icea de adiacenta a gratului G 13. Cum identificati i n matricea de adiacenta nodul destinatie al grafu lui?

2. 3.

4.

5. 6. 7.

Implcmentarea algoritmilor pcntru reprczentarea grafurilor cu matricca de adiacenta 1. Crearea matricei de adlaconta prin introducerea dateler d e la tastatura , Det erminarea gradului unui ned. Salv area matricei de adiaconta intr-un fisier te xt.

Se citesc de la tastatura muchiile (arcele) unui graf orientat (neo rientat) , se creeaza matricea de adiacent a a grafului, se aflseaza nodu rile izolate $i terminale $i se salveaza matricea de adiace nta in fisierul text grall.txt, pentr u gratul neorientat, si graI2.txt , pentru gratul orientat. In fisierul text se scriu, pe primu! rand, ordinul grafului, si pe urrnato arele randuri, li / matrtcei de adiacen ta. Functia sc rie () se foloseste pentru a scrie matricea de

172

Implcm eutu re n st ru ct u r ilor d e da te

adiacenta in fisier. Deoarece matricea de adiacenta a lost dectarata ca va riabila ql oba la, elerne nte le ei sunl initlatlzate cu valoarea O. Pentru testarea programelor se lolosesc gralul neorienlat G, ;;i gralu l orientat G, . Gralul neorienlat Functia grad () se 1 01 05e;;te pentru a determina gradul unui nod.
#include <= s L r e a m . ~ >

int a[10J [10J , n, :C.; fstr eam f( "grafl .t xt " , i o s : . ou ti j , v oid .sc r i e t ) t i n t i ,j ; f n e n d l ; f o r {i = l; i < = n; i + T ) (for ( j - l ; j <- n ; j+ + ) f a [ i ] rj J " " . f e nd 1 ; ) f. close () ; } int q r a dt Ln t; i) lint j ,g-O ; f or {j =1;j<=n ;j++) g+ =a[i] [jl ; retu rn g i l v oid main () t i n t i ,j ,k ; cou t .ccv nu.m ar de nodur i " ; cdrco-n , c c u t-oc't numa.r de muchii
f o r \ ~ = l; % < =m ; k T T )

II.

c in r1;

{c ou t -cc vp r LmuI ned e L much i.e I " k";

" ; c i n i ;

cou t .c-c va L do i.Lea nod e L mucn i e i " <ck-cc v: "; c i n j ; al i ] [j ]~ l ; a[JJ [ij-1') o ou ti-oC'N o d u rLl e .i z o La t e sun t: " ; f o r (i=l ; i<=n ; i-t-+) i f [q r ad (i) ==0) c o u t .c-c i .c-c " ".

c ou t e nd l " Nod u r i l e t e r mi n a l e su nt : It ; f or {i = l; i <=n ; i ++ ) if (grad(il==l) cout i "


sc rie{) ; }

II .

Graful orlontat Functia g rad_ i n t () se foloseste pentru a determi na gradul intern al unui nod, iar functia grad_ e xt () S8 foloseste pentru a determina gradul extern al unui nod.
# i nc l ude <f s t r-cer-. . h> i n t a [101 [10 ] , n ,!n ; fs t r e a m f ( " g :,- u f 2 . L: t", i o s : :ou t ) i

v oid sc r ie{) { l i e s : ' Lderrt i c a cu cea de La q r a f u I neor-Len t e t j i n t qrad ext{ i n t i) { J.n t j ,g ~Q ; f or ( j = l ; : <= n i j -t l ) g't=a:i] l j l : r eturn g i } in t g rad_int( i n t i) t i n t j ,-:j=O; f or {j = l ; j < = n i j + +} g + =a[j] [i] ; re turn g i } v oid main () ti n t i , j , :: ; c o u t .c-C'riume r de nodu r.i " ; cin :1; c ou t -ccvn umar de arce "; cin rn; fo r (k=::' ; k<=rn ; kH-} {co u t.c-cv nodu I. initial a L a r cu Lu i, " < x k -oc '" : " ,' c i n i ; cout " n o d u 1 final a1 ar c u l u i " k " : " ; ci n j; al i ] [ j]=l ; } co u t.c -C'No d u rLl e Lzo La t e sun t : " ; for (i= l; i <,....n, i t+ ) i f (g r ad_int ( i. ) +g r a d_e x t (i) =:-::0 ) c out-oc k-cc'' " ;

c outendl " Nod u r i l e t e r mi n a l e ,sunt : " i


f or ( i = l; i < = n i i + -+ ) i f

(g rad int.(i)+g r a d _e xt(i)==l)

ccu t -c-c j.c-c ''

";

serie () ; }

[II fo rm aticii

173

2.

Cr earea matricci de ad iacenta prin citi rea datelor din fisie r. Determina rea n urnarului de vecin i ai un ui nod. Afisarea m uc hii ior (arc elor] graf ului.

Se citesc din fisierele text create anterior rnatncele de adiacenta ale celor doua qrafuri graft .txt, respectiv graf2.txt. Se afiseaza nodurile care au cei rnai multi vecini (cele mai multe noduri adiacent e). Se determine numarul de muchii (arce) ale gralului ~ i se afiseaza much iile (arcele). Functia ci tes te () se foloseste pentru a citi matricea de adiacenta din fisier, Grafu! neorientat Functia n r _ m() S8 foloseste pentru a determ ina nurnarul de muchii ale grafului. La afisarea muchi ilor, pentru a nu S8 aflsa de ooua ori aceeas i muchie , S8 parcurge matricea de adiacanta numai cteasupra diagonalei principale. #include <r s t r e a m. h >
int a[lC) [lO],:> ; fstr e a m f( ' g~a~l v oid c i t.e s t e t ) lint i ,j ; f :i. ;
.txL ' , i o s : ; i n! ;

for ( i = l; i < ~ n; i + + )

fo r (j=l ;j<=n ;j++) int nr_m() t int 1 ,j ,m=O ;


for { i = ~ ; i < = n ; i + + )

: a [=- ; l i l .

f . c l o s e () ; }

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 exemp l ul an t er t or j void main () lint i ,j ,ma:-: ; c t t.e s t e t j , max-qr a d t l j for ( i ~ 2 ; i < = n ; i + + ) if (g r a d( ima x) ~ a x = g r a d (i ) ; cec e ccv n c d u r aLe eu c eI rna I mul t i vec rni sun t : " ; for {:i = l; i <"'" rl; H + ) if (g r a d{ i)=o=max) c o u t cc Lc -c'' It; coute ndl" Gr n f u l a r e " n r m( ) " muc h i i " e ndl; cou t.c-C'H u c h i i Le gr a f u lui s un t : "; 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 numa rul de arce ale grafulu i. Functia vecini ( ) se Ioloseste pentru a determina nurnarul de vecini ai unui nod. La afisarea arcelor , se parcurge toata matr icea de adiace nta.
#include < f s t r e a m. h > in t ,,[10J [IO],n ; f s tream f( "g:-ilf2 .t xt " , i o s : : i n ) ; v o i d c it.e s t.e t ) { I l e s t e Lden t i.c a eu cea de in t nr_a() lint i ,~ ,m=O ;
f or ( i = ! ; i < = n ; i ~ )

2.,]

q re fu l n ecr Len t a t. }

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 ,J~jJ[i:'-"o:::l) v ++ ; vo i d ma i n () li n t i ,: ,maz ; c Lt.e s t.e t y , mexe-ve c i n i (::./ ; f or ( i - 2; i <= n; i ,..'t- ) i f {ve::::in~{ii>:na::) me x-vs c In LtLi , c c u t-c c vt.o d u r i 113 cu eel ma i. mu.l t i vec i n i sunt : "; for ( i = 2. ; i <= n ; ':'+ + } if {v12cini(i )==:naxj c ou t i" It ; c o u t endl" Gr a f u l ar e " rr!:"_ a. ( " aree " e nd l ;

return v ; }

174
oou t.c-C'Ar c e Le g rafulu l s un t : " ;
for ( i = l; i < ~ n; i++ ) for { j ~ l; j < = n; j + + )

Implementarea strneturilor d e datc

if (a [i ) U J=o:: l) cout i "-" j" ";}

3.

Crearea ma tr ice i de adiacenta prin ci t irea m uchiilor (arcelo r) di n fi si er. Determ inarea veci nilor unui nod.

Datele se citesc din fisierul text graf3.!x!, pentru graful neorientat, ~i graf4.txt, pentru grafu l orientat. In fisier sunt scrise , pe primul rand , despartite prin spatii, numarul de nod uri ;;i numaru l de muchi i (arce) ale grafu lui, ~i 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 () pentru a determina vecini i unui nod. Fisierele text S8 creeaza cu ajutorul unui editor de texte. Pentru testa rea programelor se folosesc graful neorientat G , ~i graful orientat Gg .
Gr aful neorientat.

#include <f s t r e a ltl. 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 nm ; for ( k ~ 1 ; k < ~m; k + + ) ( f i j; ali] [j] ~l ; a[l] [i]=1 ; ) f . cl o s e () ; ) void ve c i n i{ i n t i } (fo r (int j ~l ;j< ~ n ; j++ ) if ( a [ l ) [j] ~ ~1) cou t-oc j c-c'' " ; ) void main ( ) {int i ; c i t e s t e l ) i cout" Ve ci n i i f i .cca r -u I nod sunt : "<c e n d .l , for (i =l ;i<=n i i +T) (cout-ocv uo o u ; "<xi -c-;" : ". v e c Ln .i t i l : coutendl;})

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 vo id 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) ccu c-oc j c-c'' ";} void main () {int i ; citeste() ; oou t-oc vve c i.n i i. fi e ce r-u i nod s unt : " <c e n d .l : for (i = l ;i<=n ii++) t cout.cc vtcoc u l " i": or; vecin i (i) ; coutendl;}}

4.

Gen er area matricei de ad iacenta .

Pentru a testa programele care preluc reaza grafuri implementate cu mat ricea de adiacenta , puteti sa generati aleatoriu matricea de adiacenta Functia gene rare () qenereaza matricea de adiacenta a unui graf neorientat , cu n noduri ~i m muchi 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 qene r-are () tint k =O , i , j ; randomize(); while ( k <m) { .i =ra nd ( ) %n+l ; .j v x a n d ( i %n+1 ; if ( i! ~ j && a li] [ j ] == O) (a[iJ[j]=l; a [ j J[ i ] = l ; k++ ; ) ) )

In limn a tica
vo id 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;} qenc r a r e () ; .. . }

175

1. intr-un fisier este sensa 0 matrice patrata, astrel: pe primul rand , un nurnar care reprezinta dimensiune a 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 adiace nta a unui graf . in caz afirmativ, sa S8 prec izeze daca graful este orien tat sau neorientat gen ereze aleat oriu ma tricea de ad iacen ta a unui gr af orie ntat. 2. Scrieti un program care

sa

3. Scrieti un progr am care cite ste dintr-un fisier matricea de adiacenta a unui graf neorientat ~i care deterrnina nurnaru l mini m de muchii care trebuie adauqate pentru ca graful sa nu conti na noduri izol ate. 4. Scrieti un progra m care citeste, din doua fisiere lext , gl .lxI ~i g2.lxI , matricele de adia centa a doua grafuri , G.=(X.U.) si Gb=(X.Ub), ~i care determina matricea de adiacenta a g raf ul u; reuni une Gr=(X,Url , unde U,= U. V Ub, care se salveaza in fisierul g3.lxI ~i matricea de adiacenta a graful ui in ter sectle G,=(X,Ui), unde U,= U. n Ub, care se salveaza in fisierul qa.txt. 5. Scrieti un program care cites te din fisierul lext graf2.lxI informatii desp re un graf oriental (de pe prima linie - nurna rul de noduri, apoi malricea de ad iacent a) ~i de la tastatura 0 rnult im e A de num ere care reprezinta etichetele unor nod uri din graf - ~ i care afiseaza mu ltirnea arcelor ce au 0 extrernitate ln tr-un nod din rnuttimea A si 0 exl remitate in rnutirne a X-A (X fiind rnultim ea nodurilor grafulu i). Pent ru leslarea programului , se vor folo si graful Gg ~i rnultimea A={1 ,3,4,6).

2.7.4.2. Reprezentarea prin matricea de incidenta


Matricea de lncidonta a unu i graf ncorientat es te a ma tri c e binara cu n Iinii ), ale ca re i elemen te a ij s unt d efin ite as tfel : c a lo an e ( A II,m
~i

.I ' , J -

_ { L JaCfI 1i. .i JE lJ O . Jac" li. .i I ~ U

Implemenl area grafului neorienla l prin malr icea de incid enta se face printr-un tablau bidimensional (0 mal rice cu dimensi unea n xrn ), astfel: int a l cn> ] [ <m> ] ;

,;fD
~
Grafu l G, Fig .9

Graful ncoricntat G 1

1
1

2
1 0 1 0 0 0 0 0

34
1 0 0 1 0 0

5
0 1 0 0 1 0 0 0

6
0 0 1 1 0 0 0 0

7
0 0 1 0 1 0 0 0

8
0 0 0 0 0 1 1 0

9
0 0 0 0 0 1

2 3
4

1 1 0 0 0

6 Proprletatile matricci de lncidonta a 7 grafului neorientat:

~
0 0

.s,
0

1 1. Pe fiecare coloana exista doua ele- 8 mente cu valoarea 1 (pe liniile i ~i j care corespund nodurilor incidente cu much ia), iar restul elementelor au valoarea O.

0 1 1 0 0 0 0 0

.s,

176

lmplcm entarca st r uct u r ilor de d a te

2. Matrieea de incidenta are 2xm etement e egale eu 1, deoareee fieeare muehie este incidenta cu doua nodur i.

Matricca de incidenta a unui graf orientat este 0 matrice cu n linii oi m caloane (A n,m), ale carei c leme nte au s unt definite as tfe l: 1' dac a nodul i este extremitat ea final a a arcului j
a
i, J

-1 , dac a nodul j este extremitat ea in il ni~i a arcului j { 0, dac a nodul i nu este extremitat e a arc ulu i j
S8

lmplementarea grafului neorientat prin matricea de incidenta bidimensional (0 matr ice cu dim ens iunea n xrn ), astfel :
int
a [ < ~ >]

face printr-un tablou

[ <m> ] ; Gralnl orientat G,

1
2 3 4 5 6

1 r-'1 -1 0 0

Gralnl G,

Fig.10

ri10

2 --1 1 0 0 0 0

3 0 -1 1 0

ri10

4 0 -1 0 1 0 0

5 0 1 0 -1 0 0

6 0 0 1 0 -1 0

7 0 0 -1 0

r-10

8 0 0 0 -1 1 0

9 0 0 0 0 1 -1

10 0 0 0 0 -1 1

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 eleme ntelor au valoarea O. 2. Matricea de incident a are m elemente egale cu 1 ~ i m elemente egale cu -1 , deoarece fiecare arc are 0 extrem itate finala ~ i 0 extremitate in i~ial 21. Suma elementelor matricei este O.
A ceast a reprezentare este roc orn and at a pe nt ru g ra f urile care a u u n nurnar ma re d e noduri ~i u n nurnar m ic de m u c h ii.

Algoritmi pentru reprezentarea grafurilo r folosind matricea de incidcnta


Din matricea de inciden ta puteti obtine urrnato arele info rmatii:
Graf neoricntat
Gradul unul nod ; este egal eu s uma ele me ntelo r de pc linia t.

Graf orientat
Gradu! intern al unul nod i est e ega l ell num arul de cle m ent e eu va toa rea 1 d e pe tini a; Gradu t extern at unul nod i este ega t cu num aru l de c lem ent e eu va loa rea -1 de pe lin ia i. Sucecsorii nodului i sunt nodurite j 0=1 ,n) pentru care eleme ntc lc din li nia j sunt ega lc eu 1 in cotoana k (k=1,m) in care etementele de pe

Nodurlle adiaeentc nodulu i i sunt nodurile j 0= 1,n) pentru care c lementel e di n linia j su nt eg ate eu 1 in cotoana k (k=1 ,m) in care ~i etementele de pe tinia i au valoa rea 1:

>[i][ k]

= 1 ~ i ' O][ k] = 1.

Iinia i au valoarea -1: altl lkl = -1 ~i al l lkl =1 Predcecsorii nodu fui i sunt nodur ile j 0=1,n) penru care elc mentcle di n Iinia j sunt ega Ie ell
-1 in coloan a k (k=1.m } in care etemen lete de pe

linia i au varo arca 1: alll l kl

= 1 ~ j ' Ul[k] =-1.

Informatica
. ~.

177
..

Grafneorientat

Graforientat
Nodurile adiacente nodu lui i sunt date de

Numarut de vecini at noduJui j este ega l ell qradul nodului Muchia k - Il.ll a grafului este deterrninata de doua elemente ale matncef a{i}kj] ~i a[j]k;} , care

indeplinesc conditia a[i][k]

=1 ~ i aO][k ] =1,

reuniunea dintre rnultimea succesorilor si multimea predecesori lor nodulu i. Numaru! de vec!n! a! nodul ui i esle egal ell cardinalul multimil de noduri adiacente nodului i. Arcul k = [i,j] al grafului este determina t de ooua elemente ale matr icei, a[i}kj] si a[j]kJJ, care

~i

indeplinesc conditia a[i][ k]

=-1 ~i allllkl =1, s!

sem nifica faptul ca mu chia k este inci denta ell n odurile j i ~

sernnifica faptul ca arc ul k les e din nodul i i in t ra in nodulj

2. 3.

4. 5.

6. 7.

1. Scrieti matricea de incidenta a grafului neorientat G4 . Folosind inferrnatiile din matricea de incidenta, deterrninati: gradul nodului 5, nodurile izolate si nodurile terminale. Scrieti matricea de incidents a grafului neorientat G Ce proprietate are acest graf? Scrieti matricea de incidents a grafului G8 _ Folosind inforrnafiile din matricea de incidenta , determinati: gradul intern al nodului 5, gradul extern al nodului 4 , succesorii ~ i predecesorii nodului 2 si predecesorii nodului 3. G", Scrief matricea de incidents a grafului orientat G16 din figura 11. ~. Scrieti matricea de incidenta a grafului G 11 . Folosind informatiile din matricea de incidenta ceterm inati: gradul intern al r:t\ ("';\ nodului 5, gradul extern al nodului 2, nodurile adiacente \...'!J \... 3 ..J nodului 5, succesor ii ~i predecesorii nodului 4, nodurile termiFig. 11 nale si nodurile izolate . Scrieti matricea de incidenta a grafului G13 . Cum identificati, in matricea de incidents, nodul sursa al unui graf? Scrieti matricea de incidenta a grafului G14 . Cum identrficati, in matricea de lncidenta, nodul destinatie al unui graf?

,4 .

Implementarea algoritmilor pentru reprezentarea grafurilor cu matricea de inc identa 1. Crearea matrice i de in ci denta pr in int rod u cerea datel or de la t astat ura. Det er minarea gradului unu i nod. Salva rca matricci de in cld en ta 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 in fisier . Pentru testarea programelor se folosesc graful neorientat G, ~i graful orientat Gg . Graful neorientat. Functia g ra d () se foloseste pentru a determina gradul unui nod.
# include < f s t re e m . f-> i n t a[ l OJ [lO j,n ,m ; fstream f( Hgraf5 .txt " , i o s : i ou t. j v o i d s c r i e () { i n t i , j ; .f-ocn-c-c " " men d l ; for ( i = l ; i <tin ; i+ + ) (fo r{k ~ 1; k < ~ m; k ++ ) f -c-ca l i ] fk] " '" f. close () ; )

f e ndl ; )

178
int g r a ct (i n t
i)

h u plemc ntarca st rncl ur ilor de dare

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 vn uma r de n oduri " ; cin n ; couexc vn umar de rau ch .i i. " . cin m;
for ( k = l; k < ~ ~; k + + )

{co u t "p r i mu l nod a l muc hi e i " k": "; cin i ; c out " a l doile a nad al muchiei " k ": "; cin j ;
a[i] [k] =l; a[j] [ k ]=l ; }

c out" nod u l = It; cin p ; c ou t " Gr a d u l nodul u i " p" este " g r a d {p )endl; sc r Le () ; }
Graful o rlontat . Functia g r ad_ i ot () se toloseste pentru a determina gradul intern al unui nod, iar functia gra d_ex t () 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 .t x t " , i o s : : o u t ) ;

io t serie ()

{ / /est e .i.de n t i.c e ell cea de la graful neo r i e n t a t

int grad int{ i n t i) l i nt g=O , k :


f or ( k = l; k < ~m ; k ++ )

if ( a[ i] [k j

ee

L} g++ ;

return g ; }

int grad_e xt (i n t i)
(int
g~O ,

k, if (a[ i]
[ k} ~~ - l)

for ( k ~ l ; k < ~ m ; k ++ )

g++ ;

return g ; I

void main () tint i , j , p ,k :

ccut-cc vn urna r de nodur i "; ctn>n . ccutx-cv nume r de much i i ". cin>>m;
fo r ( k ~ l ; k < ~; k + + )

{CQut" n od u l i n i t i a l al a r c ul ui " k" :


ccu e-oc vn o d u j
ali ] [kJ=- l; a[ j] [k ]=l ; }

It ;

cin i;

f i n a l a I a rc u l u i " k " : " ; c in j;

CQut" n odu l = " ; cin p ; c o ut " Gr a d u l inte r n a 1 nod ul u i " p " este " g r a d_ i n t {p lendl; c ou t " Gr a d u l exte rn a1 n odului " p" est e " g r ad_ c x t (p }endl ; scr ie () ; }
2. Crea rea matricei de in c identa prin citi rea da te lor din un ui nod .
fi~ier.

A fi sarea v ecinil or

Se citesc din fisierele create anterior (graf5.txt, respectiv graf6.txn matricele de incidenta ale celor doua grafuri ~ i 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 ncorien tat. Functia vecini. ( ) se totoseste pentru a determina vecinii unui nod.
#i. nc l ude <f s t r e a m . h > in t arlO] [lO],n ; fst ream f{ "gra5 .txt " , i o s : : i n ) ; v o id c t t.e s r e () lint i ,k ; f ~ m ; f or ( i = l ; i <= n ; i t + ) f or {kv Ls kx em r k t-t I f a [ i ] [ k ] ;

f . c l o s e () ; )

I nfunnatica
void veci ni( i n t {int k ,j ;

179

i)

for ( k= 1; k <= m; k H I if ( a [i ] [ k] ==1) for ( j = l ; j<=n ; j++) if (j != i && a[j ][k]==l ) cou ccc j cc '' H;) void main ( )

(int P i cout" no d u l = It; c in Xi citeste() ; cou t" Ve c i n i i nodului " x" sunt nodu ril e " ; vec i n i( x) ; } Gralul orientat Vectorii binari s ~i p se folosesc pentru a memora succesorii, respectiv predecesoni nodului x . Elementul i are valoarea 1 daca nodu l i este succesor, respectiv predecesor al nodului x ; altfel, are valoarea O. Functille succ () ~ i pred () se lolosesc pentru a determina in vectori i 5 ~ i p succesorii, respectiv predecesorii unui nod. Functia vecini () se foloseste pentru a determina vecin ii unu i nod, prin reuniunea mu ltimii predeces orilor ~j a succesorilor.

#include <f s t r e a m. h >


int a [ 1 0 ] ('.0 ] ,n ,m ,s [1 0 J ,p [1 0 ] ; fstream f ( flgraf6 .tx t " , i o s : : i n ); void c i.t.es t e ( ) { / / e s t e .i den t i.ce c u cea de 1 a g raful neo.rIe nt.e t

void succ( i n t i) {for (int k=l ik<=m ik++)


if l a [ i] ( k]=.= - l) fo r (i n t j ~l; j < = n ;j ++) if ( j ! = i && a[ j] ( k J = = l ) s lj J= ] ; )

vo id pred (i n t

i ) {for l i n t k=l ; k<=m ;k++) if (a [ i ] [ k]==l) for (i nt

j~ l;j<=n;j++)

if ( j ! = i

&&

a [j][k]=~ -l)

p[j] = l ; )

void veci~i ( i n t i ) lint j ; s~CC {i Ji pr ed (i ) ;


f or ( j ~ l ; j <~ n ; j ++ )

if

( j ' ~i

&&

( s[j]= ~ l

I I p[j)==l ) ) cou t-oc j-cc" "; )

vo i d main () l i n t X i cout" n o d u l = " c out" Ve c i n i i n o dului

" X"

cin z ; c i t e s t e () ; sunt nodurile " ; vecini (x ) i }

3. Crea rea matricei de ln ci denta prin citi rea mu ch iilor (arcel or) d in fis ier. Pre lucrarea in form atiilor as oci at e muchiilor.

Datele se citesc din fisierul text grafT. txt , pentru gralul neorientat, ~ i grar8.txt, pentru graful orienata!. in fisier sunt scrise, pe primul rand, despartite prin spatii, numarul de noduri si nurnarul de muchii (arce) ale gralulu i, ~ i apoi, pe cate un rand, separate prin spatiu, cele doua noduri terminale ale fiecarei muchii (arc) ~i 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 c i. teste () se foloseste pentru citi datele din fisier. functia rne di e () pentru a determina lungimea medie a muchiilor (arceor) din graf iar functia afisare () pentru a afisa much iile (arcele) care au lungimea mai mare decat media. Fisierele text se creeaza cu ajutorul unui editor de texte. Pentru testarea programelor se foloses c gralul neorientat G, ~i gral ul orient at G g. i n aceste grafuri se asociaza fiecarei much ii (arc) 0 valoare pentru lungime . Graful neorientat
#include< f s t r e a m . ~ >

int a[ 1 0 ] [1 0] , d [ 1 0 ] , n , m;

fstream f ( " g r a f7 . txt

II I

ios: : in ) ;

180
vo id c i t e s te i) t i n t k , if j , 1 ; f n :ll;
fo r ~ l ; k < "'l1l; k ++ )

Implcmentarca st r uc t u r ilor de date

{ f i j l ; a li ]

[k ]~l ;

a[jJ (kJ=l ;

d[ k ) ~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 ur n ( fl o a t ) s / f:",; )

v oi d af i seaza () t i n t i ,k: fl o at dm=me d i a ( ); fo r ( k= l : k<=m; k++ )


if (d [ k ] >dm l { f o r ( i = l ; i < = n ;i +-q i f ( a[ i] [ 1:] =: = :') coc e cc i c c "
or .

cou t " cu lung imea " d [ k l e n d l ; } }


v oid mai n () {c Lt e s t e ( ) ; o o u t .c-C'He d i.a Lu nq i m.iI e s t.e : " me d i a ccu t .c-cvxu ch .i i. Le s un t: "<x emd L: af i se az a ( ) ; }

end l ;

Graful orientat

#i n c l ude < f s tr e am. l: > i n t a r l O] 115J , d I 1 5 ] , 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 ;
fo r ( k ~ l; k < =m ; k ++ )

( f i j l ;

al i] [ k]= -l ; a[ j ] [ k ]= l ;

d :'~ ' =l; ) ~t

f. cl o s e () ; ) f l oat medi a( ) {/ / e s r e Ld e n t Lce c u c ee de 1a 9 :-a: 1;1 r.e o r i.e n c v oid e f i.seaz a t j t i n t i ,k /x ,Y i fl oat d~=ffiedia() ; 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] [ \;]~=ll 'r " ; ) ccu u-ccx-o c v-o'<x yc-c" cu Lun-r.i ruea "<x a l k l c-ceridL r L} vo i d ma i n ()

{c i teste () ; c ou ecc vtce d t a Lu nq i.rnL; e s t e : " me d i a () end 1 ; cou t c c vA r ce l e aun t.: "<x emd L: a f i s ee z a () i}

4. Creare a matricei de in cidenta prin citl rea datel or di n matric ea de adiaconta. Afi sarea mu ch iil or ~ i a no d urilo r izo late. 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) ~ i 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 ~ i 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 ~ i b pentru matricea de incidenta ~ i functiile ci te s te () pentru a citi matricea de adiacenta din fisier, salvea za () pentru a salva in fisierul text inforrnatiile despre muchiile (arcele) grafului, t ra ns fo rr.t a () pentru a obtine matricea de incidenta din matricea de adiacenta, af iseaza_ n Oduri_ i zo l a t e () pentru a afisa nodurile izolate, !?i a f i s e a z a _ mu c h i i () pentru a afisa muchiile (arcele). Pentru testarea programelor S8 folosesc graful neorientat G, si graful oriental Gg.

Informatica
Graful neorientat

181

#include <fst r e arn. h >


int .[lOI(lOI ,b[lO] { ZOI , n , m; fst re a m 1 ( "g ra f l . t x t ", i o s : : in ) , 2 ( " g r a 9. t xt " I ios : : ou t ) i void c i t e s t.e ( ) tint i ,j ; f Lo o-n : for (i =l; i <=n ; i ++ } for (j ~ l; j < ~ n; j ++ ! { n . [ i ] [ j] ; i f ( a [ i ] [ j l ~ ~ l ) 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 ( j ~ l ; J < i ;j ) if (a [i ) [ j J ~ ~ 1) ( b l i l Ik J~l ; blj l [ k) ~l ; kt+ ; ) ) void afi s eaz a mu c hii () {for {i n t 1:=1 ; k<=~ ; kt + ) {cout" L vJu c h i a " <ck-cc" : " . for {Ln t; i=l; i<=n ; i t t) if (o [ i ][I:]==l ) c out-cc l -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

(i=l ;i<=n ;i+~)

{for ( k= l ,x = O; k <=m && x ==::O ;l:++) if {!x} cou c-c-c r -cc" " ;}} void sa lvea za ( )

if

(b [ i lLk] = =l)

x= l ;

( 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+)

i f {b[i ] [k ]=o;;=l) f2 i " ";

f 2 e n d l ; }

f2 . clos e () ; ) void main ()

{c i t e s t e J) ; t r a ns forma () ; a f i.s e a a a unuc h .ii. Lj r


cou t.c-C'Ho d 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 voaz e () ; }

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 .t xt " , i o s : . an ) , f 2 ( " g raf 9 . 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 + +) for (j ~ l; j < ~ n; j +t ! { f l a [ i ] [ j]; if i a [ .i ll j ] ~ ~ l ! m++ ; ) f l. e l o s e () ; ) void tra nsforrna() {int i , j I k e L: for ( i= l ; i < =n ; i ++ ) for : j ~l; j< ~ n ; j++) if (al i ) [ jj~~l i {b.l L] [k l ~-l ; bljl lkJ~l ; k++ ; ) ) void afis eaz a arc e() {in t L, k , x , y ; for (ko;;= l ; k <=m ; k+ +) {cout" Ar c u l " k " : "; f or ( .i~l; i < ~ n ;i+ + ) (if (b [ i ) [ k ) ~ ~ - l ) x ~i; if (b [ i) [k l ~ ~l) yv.i } cout x" - " yendl; }} void a f l s ea za ~oc url~ l z ol a t e ()

l int i ,k ,x ;

182
fo r ( i = l i i <= n ii++) {fo r ( k~ l , x =O ; k < =m && x ~ = O ; if ( ! xl c cu e-cc f .c-c'' " ; } ) v o i d sal v e a z a () li n t i ,k ;
k+ + )

Im plementa rca str uctur ilor de date


if (b[ i] [ k] ==l I I b [ i ]
[ k ] ~ - l)

x=l ;

f2 n " " rn endl;


fo r ( k= l ; k<=mi k++l {for ( i ~ l; i<=n ; i ++) (if (b[i) [ k]== - lj
x~i;

if

(b[i] [ k ] == l) y=i ; }

f2 z " " yendl ;}


f2 . close () ; } void main () ( c iteste( ) ; t r an s f orma {); e f i s ee z a a rc e(J ; cou c-ocvNod u r i Le i z olat e s unt : " ; af i seaza nodu r i sa lve a z a( ) ; }

.i zc Le t e () ;

1. int r-un fisier text este scrisa a matrice , astfel : pe prim ul rand - doua numere separate prin spatiu, care reprezinta num arul de linii si numarul de coloane ale mat ricei, si, pe urrnatoa rele randuri - valori numerice despartite prin spatiu , care reprezint a eleme ntele de pe cate 0 linie a rnatricei , a. Scrieti un program care verifice daca aceasta matrice poate fi matricea de incidenta a unu i graf neor ientat. in caz afirmati v. sa S8 afiseze cate noduri izolate are graful (ln dicatie. Se verifica urmatoarele cond itii: a) sa fie a matrice binara: b) suma elementelor de pe fiecare coloan a sa fie ega la cu 2; c) sa nu existe doua coloane identice. Un nod este izolat daca sum a 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 nod uri care au gradul intern ega l cu gradul extern exista (lndicatie. Se verifies urrnatoarele conditii: a) pe fiecar e coloana sa nu existe cecat 0 valoare e9a la cu 1, una eqala cu -1 ~i restul egale cu 0; b) sa nu existe doua coloane identice. Un nod are gradul intern ega I cu gradul extern daca suma elemen telor de pe linia sa este eqala cu 0). 2, Scrieti un program care citeste din fi ~ier ul text graf6.lxl matricea de incidenta a grafului orientat ~ i care : a. aftseaza nurnarul de vecini ai unui nod p a carui eticheta se citeste de la tastatura: b. genereaza mat ricea de adiacenta a grafu lui din mat ricea de incidenta ~i a salveaz a in fisierul graf6a.txl .

sa

2,7.4,3, Reprezentarea prin lista muchiilor


Lista muchiilor unui gra f este fe rmata din m el em ente ca re contin, fi ecare, ca te 0 pereche de doua noduri , Xi!i Xi, care Iorrnea za 0 m uch ie, ad ica pentru ca re [X i, Xj)E U, Imp lementarea acestui tip de reprezen tare se poate face folosind una dintre urrnatoarele structu ri de date :

-7

Matricea muchiilor u c u dimensiune m x 2, in care fiecare linie coresp unde unei muc hii (arc) ~ i in fiecare lin ie se inregistreaza i n ce le doua coloane etichete le nodurilo r care se gasesc la extr ernitatile muchiei (arcului) .
int u [<rn>] [2] ; Referirea la nodurile adiacente much iei (arcului) i se face prin u [i 1 (01 - extremltatea initiala a muchiei (arcului), respectiv u [ i J [1 ] - extrem itatea finala a muchiei (arcului).

I n fo r m at i ca
7

183

Vcctorul muchiilor u cu dimensiunea m ale carui elemente sunt Inreqistran, fiecare i nregistrare fiind fermata din doua carnpuri x ~i y ce con tin etichetele nodurilor care se gasesc la extrernitatile much iei (arcului). Pentru elementele vectorului se defineste tipul de data muchie, de tip i nregistrare.

s t ru c t muchie { i n t 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 2 3
4

5
6

7 8 9

1 1 1 2 2 3 3
6 6

1 2 3
4

3
4 4

Graful neorientat G 1 Implementarea cu vector de lnroqlstrari Muchi ile


~

5
7

- -- - - - - - ---"------ - - - - - -

lmplementarea cu matrice

o
1

......!.... 2
Graful orientat G,
Im pJ eme nta rea cu vector de inregistrari

2 2 1 3 -".2 ..!4 _.3 ..2 ~5 3 5 6 4 2 5 7 4 8 5 3 9 5 6 10 6 5

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 lnreqistrari, atunci pentru oriee muchie (arc) i,u [i ] . x" u [ i ] .y . Acea sta re prezentare este recomandata pentru problemele in care se face prelucrarea succesiva a m uchiilor (arcelor). Are avantajul ca permite adauqarea la tipul de data muchie ~i a altar cam pur; (Iungime, cost, timp etc.), corespunzator unor ma rimi care pot fi asoc iate muchiilor (arce lor).

184

Implcmenturea st r uct u r ilnr de da le

Algorilmi p enlru reprez enlarea grafuri lor f ol o sind li sta much iilor Din lista muchiilor puteti obtine urrnatoarele informat ii:
Graf neorienta t
Gradul unui nod i este egal , in funct ie de implementare, cu num a rul de apa ri tli al e et lch et cl no d ului in matrice. respectiv in carnpurile vectorul ui de tnreqist rari .

Graf orie nta l


Gradu l extern al nodului i este egal, in functie de implernentare. cu numaru l de aparit f ale etic hetel nod ului i n coloana a matricei. respectiv in pnmul camp , in vectoru l de lnreqistrari. Grad ul in tern al nodu lu i i este ega l, in functie de tmptementare, eu nurn aru l de apa ritf ale etichetci nodu lui in coloana 1 a matricei. respectiv i n al doilea cam e. in vectorul de inre ci strari. Succesorii nodului i sunt, in funcl ie de implementare, euchetete j di n coloana 1 pentru care u[k][O]=i, respectiv etichetele j din carnpui (I{k] y pentru care u[k].x=i (k=l ,m). Prcdecesorii nodu lui i sunt , i n functie de implementare. etichetele j din colo ana 0 pentru care u[k][1 ] =i , respectiv etichetele j din carnpul (I{k]x pentru care u[k].y=i (k=l, m). Nodu ri lc adiaccntc nodului j sunt date de reuniunea dintre multirnea succesorilor ~i multi mea predece sorilor nodului. Num aru! de vecini ai nod ului i este ega l eu cardinalul rnultimi i de nodur i adiaeente nodului l.

Nc d urile adiacc ntc nod ulu i j sunt , in functie de implernen tare. etiehele le j din coloan a 1, pentru care u[k][O] =i , sau din coloana 0, pentru care u[k][1]=i, respectiv etich etele j din carnpul u[kj.y, pe ntru care u [k] .x=i , sau din campul u{k]x. pentru care u[k] .y=i (k=1.m).

Nurna ru l de vccin i ai nodulu i i este egal eu

gradul nodului.

2. 3.

4.

G" 5.
6.

7.

1. Scrieti lista muchiilor a grafului G4 Folosind informatiile din lista muchiilor, deterrninati: gradul nodului 5, nodurile izolate si nodur ile lerminale. Scriet i lista muchi ilor a grafu lui neorienlat G 14 . Ce proprietate are acest graf? Scrieti lista muchiilor a grafului Ga. Folosind inforrnatiile din lista muchiilor , deterrninafi: gradul inlern al nodului 5. gradul extern al nodului 4. succesorii ~ i predece sorii nodului 2 si predecesorii nodului 3. Scrieti lista muchiilor a grafulu i G ll . Folosind informatiile din lista muchiilor. determina ti: gradul intern al nodului 5, gradu l extern al nodului 2, nodurile adiacente nodului 5, succes orii si predecesorii nodului 4, nadurile termi nale si nodurile izolate . Scriet i lista muchiilor a grafului orientat G" din figura 12. F010- ~f2\ sind inforrnatiile din lista muchi ilor. identificati nodurile izolate. 1 ~0 Scrie ti lista muchiilor a grafului Gn Cum identificati, in lista _ 7 muchiilor. nodul sursa? 3 6 Scrieti lista muchiilor a grafului G ,4. Cum identificali, in lista muchiilor, nodul destina tie? Fig . 12

Im plementa rea algorit m ilo r pe ntru reprczen tarea grafur ilor eu Ils ta m uehii lor 1. Crea rea matrieei eu lista much ii lo r prin intro dueerea datelo r de la tas tatura, Deter minarea g ra dul ui u nu i n od. Salv area intormatillo r des pre m uch ii i ntr- un fls ier text.

Se citesc de la tastatura muchiile (arcete) unui graf oriental (neoriental). Se creeaza matricea eu muchii le grafului. Se afiseaz a nodurile izolate lij terminaIe. Se satveaza matricea eu muchiile grafului i n fisierul te xt 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 nurnaru l 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 prcqramelor se lolosesc graful neorientat G, si graful orientat Gg. Graful neo rientat . Functia gra d () se foloseste pentru a determina gradul unui nod.
#i nclu de < f s t r e a m. h > int a[lO J [2] , n, m; fs tr eam f t vq r a f l l c t x t t'v Lo s : : o u t ); int g r ad( i n t i) lin t k , g=O; fo r (k ~l ; k<=om ;k"+) i f (af k] [OJ==i I I ark]
void sc r i e ()

[ lJ~~i)

g++ ;

return g ; }

lin t 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 {) ; }
v o i d main () l int i ,j ,k ;

ccutioc vn uma r de nodur i "; c.i r c c-n : couccc vnuma r d e rnuchii " ; c i n>>m; fo r {k=l; k <=m; k ++ ) {cout" p ::i mu l n o d a1 mu c hi ei u k ": " ; cin i ; c ou t " a l do i lea no d a1 muchiei " k" : "; cin j; ark ] [ 0 ] =;' ; ar k] [l ]=j ; } cout "Nodu r i l e izol a te s unt : IT; f or (i =l ; i <=n ; i ++} if (g r a d{ i)==O) c ou t i" c outendl " No d 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 cc ccc t c -c" If ; scrie () ; }
II .

Graful oriental Functia grad_ int () se foloseste pentru a determina gradu l intern al unui nod, iar functia grad_ext () se foloseste pentnu a determina gradul extern al unui nod.
#inc lude <f s t r e arn. h > int a[lOJ [2j,n ,m ; fs tre a m f ( " g r a f 1 2. tx t" , i o s : :out ); i nt grad int( i n t i ) l int q =O,k ; fo r {k=l; k < =m; k ++ l i f (a [ k ] [l]==i) g++ ; return g ; } in t 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 ; } v oid sc ri e() { I l e s t e identic 5 e ll cea de l a gr af u l neorie n t a t
v oid main ()

l int i ,j , k ; cou't-ocv numa r de ncdur i. "; c i n ni c c u ec c vmcnar de arce "; cin>>m;

f o r (:'< =1 ; kc -m : k+ -r )
{c o u t " n o ciu l initial a1 a rcului " k ": "; c in i; cou t .c-cvn o d u L final a L arcului " k" ': " ; cin j; ark] [ O ] ~ ;' ; a rk] [ :l ~ j ; } cou t " No d u r i l c iz o late sunt : It; f o r ( i = l; i < =n; i ++ j i f ( g ~ a d _ i n t{ i ) + g r a d_ e z: t( i } = = O ) coc e c -cd c -c" If; c ou t e ndl" No d u r i l e t erminale sunt : " ;

f o r (i =l ; i <=n i i +';' } if (g r a d_ i n t( i) +g r a d e x t{ i)==l) cout i "


sc r ie () ; }

If;

186

Implementare a struct urilor de date

2. Grearea vecto rului de m uc hii prin c itirea m uchiil or (arcelor) din fi sier, Prelucrarea info rmati ilo r 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 aprop iat 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 gratu l neorientat G , si gratul orientat G g . Graful neoricntat. Functia izolat () determine daca nodul este izolat.
#include < f st r e a m . h> struct muc hie t int x, Y, d;}; muchie u [2 01; i n t n, m; fstream f ( "g ra f7 . t xt Jt I Lo s : : in ); void ci t.e s t e t) {int k; f n rn; for (k~ l ; k<~m ; k++ ) f u [ k ] . x > u [ k] . y u t k l . d : f . close () ; } int i zola t ( i n t i ) lint k ,g~O ; for (k~ l ;k< ~m ;k++ ) if ! U[ k ) . F ~i II u [ k ]. y ~ ~i ) g++ ; return void main ( ) {int k ,p /min ; ci tes te () ; cou t-oc vtco d u L : " . cin p; if (i2 0 1at(p }) cout" Nod u l " p" nu a re vecini " ;

g~ ~O;)

else
{ke I ;

while {u l k lc x l e p & & u l k l mi. n eu [ k ] . d :

. y ! ~p )

kH ;

for ( k++ ; k<=ffi ; k++ ) if ( u[k] , F~P II u [ kl .y ~ =p ) if (u l k l d -cmi .n ) rni n =u [k ] . d ; cout" Di s t a n t a mi nima e st e "<<mi n<<endl; eout" No d u r i l e af l ate l a dist an ta minima sunt : "; for ( k=l ; k < =~ ; k ++) {if (u [ k) . cc - o-p && u'l k l . d ~ ~m in l cou t-ocu l k l . y" "; if ( u [ k) , y~~p && u[k ] .d~ ~m i n) cou t.oc u l k j x-c-c" "r Ll I
v v

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 identic~ C ll c ea de 1 a gra f ul neor ie n 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 m a tica
vo i d main ()

187

{in t k , p , mi n ; cite ste( ) ; cou t " Nod u l : "; ci n p ; if ( ! slice (p) ) cout " No d u l u p" nu are ve c ini l a c ar e s a se p oa t a a junge " ;
else

{ ke L : wh ile (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 neulk I . d; cou t " Di s t a n t a min i ma e ste n mi n e ndl ; cout " No d u r i l e a f l a te 1 a ctt s r anre min ima s ant : "; for (k=l ;k<=m ;k++ ) if l u [k ] . x e e p && u[k] . d= =mi n ) cou t c-c uj 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 afise aza aeeste noduri; c. genereaza matricea de adiacen ta din matricea much iilor si 0 salveaza in fisierul text graf12a.txt. (lndicatie, 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 fis ierul lext graf2.txt ~i care dete rrnina vec inii 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 fisier, lista muchiilor unui graf neoriental (oriental). Nu rnaru] de nodur i ~ i nurnar ul de muchi i se citesc de la tastatu ra . 4. Scrieti un program care sa genereze aleatori u, i ntr-un fisie r, lista muc hiilor unui graf neorientat (orientat) in care muchiile au asoc iate 0 marirne nurnita cost. Se citesc de la tastatura: numarul de nod uri, nurnarul de muchii :;;i Iimitele intervalului i n care ma rimea cost poate lua valori .

2.7.4.4. Reprezentarea prin lista de adiace nta


Lista de adlacenta este fer mata din Iistele L, (1::; i'::;n) ca re c ont in toti vecinii unui nod Xi la care se poate ajunge direct din n odul Xi, ad ica to at e noduril e Xj pentru care [Xi,X j] EU.
Obs erv at ie. in cazul graful ui neorienta t, lista li a vec inilor unui nod Xi al grafu lui este fermata din nod urile Xj ad iacente nodului Xi . i n caz ul graful ui orien tat, lista li a vecinilo r unui nod Xi al grafului este fermata din nodurile Xj care sunt succesorii nodului Xi. Implementarea ac estui lip de reprezenlare se poate face : -7 static , folosind una dintre urrnatoarele structuri de date : A . Matricea lis te i de adi acenta B. Vectorii liste i de ad iace nta -7 dinamic , cu ajutorullistelor lnlantuite. Graful nco ricntat G ,
~_o d

lmplementa rca statica


A. Matricea Iistei de adiaconta L cu 2 Iinii si n+ 2xm coloane pent ru graful neorientat, respectiv cu n+m coloane pentr u graful orie ntal, defm ita ast fel :

1 2 3 4 5 6

l.ista de adiacenta 2,3,4 1,3,5 1,2 ,4,5 1,3 2, 3

7, 8
6 6

7 8

188
-

Implcm cnta rcu structuril or d e dat e

Prim a lin ie contine etichetele nodurilor ~i listele de adiacenta ale fiecarui nod; este fermata din doua secnuni: Grafu l orientat G g a. Primele n coloane contin etiche tele nodurilor: Nod Li sta de ad ia ce nta L[O] [ i]= i (1';i.;n). 1 2 b. Urrnatoa rele m x2 caloa ne , respectiv m coloa1,3 ,4 2 ne , co ntin in ordine cele n liste de ad iacenta 3 5 ale celo r n noduri. 4 2,5 - A do ua Iini e cont ine inforrnatiiie necesa re pentru a 5 3, 6 identifica in prima linie lista de ad iacenta a fieca rui 5 6 nod ; este fermata din c oua sectiuni: a. Primete n coloane contin , in ordine, pen tru fieca re nod i (1 ::;i::;n), indicele coloanei din prima linie din care in cepe llsta de ad iacen ta a nodului: L [1] [i 1= j , unde j este indice le coloa nei de unde in cep e lista de adiacenta a nodului i. Daca nodul este izolat, se va memora valoarea 0 - L [1 ] [i] =0 (nu exis ta lista de adiacenta pentru acel nod). b. Urrnato arel e mx2 caloane. respectiv m caloane, contin in ordine mformatii despre modul i n care se in lant uiesc eternenteie din lista. Daca nod ul L[O ] [ i ] se gase~te i n interiorul listei, atunci L[l ] [ i ] =i +1 (indicele urrnatorului element din lista) . Daca nodul L [0 ] [i] se gas e'ite la sfars itul listei , atunci L [ 1] [i] = 0 (s-a term inat lista de adiacenta a nodului i). Matricea este defin ita astfel :
a} pentru graful neorientat in t L [ 2 ] [ <n >+ 2 k <;n>; i b) pentru graful orient at: i n t L [2 ] [<n >+<m>J ;

Gralu l neoriental G, Nod uril e


A

...

L1

L2

L3

L4

Ls

L,

L7 L,

8 2 3 4 1 3 5 I1 2 4 5 26 10 11 0 13 14 0 16 17 18 0 8 9 10 11 12 13 14 15 16 17 18
~ ~

Grafu l orienlal G, Noduri le


r
A

Ind icii colo ane lo r

--------

,--L, ~

L1

L2

L3

L4

Ls

L,

--

1 2 3 4 5 6 2 7 8 11 12 14 16 0 1 2 3 4 5 6 7

1
9 8

3 4 5 2 5 3 6 8 10 0 0 20 0 22 0 0 9 10 11 12 13 14 15 16 -.,..--

----

Ind icii co loan clor

B . Vectorii Iistei de adiacenta: un ve cto r L cu dirnensiunea m x2 , pen tru gratul neorientat, respectiv cu dimensiunea rn, pentru gratul orienta t, care conti ne listele de adiacen ta ale fiec arui nod, si un ve ctor cap , cu dime nsiunea n . care contine indicii de la care incepe lista vecinilor fiecarui nod in vec torul L. Indicii din vecto rul cap corespu nd

etichetelor nod urilor . Ce i doi vectori sunt defini ti ast fel: a) pen tru gratu l neorientat: int cap [ ':'"1> j , L (2 "'<:n> J ; b) pentru graful orientat: in t c ap ~ <ri> J , L [<m> 1 ;

lntorrnutic a

189

L3
Graful orientat G, cap

C-1 J

4 S 6 7 8 9 10 [ 3] 4 ] 6 '-y-l '----y---I '-y-l '-------y--J '-------y--J '-y-l L1 L2 L3 L4 L5 L6

n1 1

>
2 3

234 2 S

1 =U

S 8

[JQ

J /

5 _U TIT iJ

Ls I
S8

Observatie . Fiecare lista de vecin i Lr, contine indicii coloanelor j in ca re de 1 in matricea de adiacenta (a [ i] [j] ~ 1 ) .

gasesc valori

lrnplernentarea dlnarnica
Lista de adicenta a fiecarui nod S8 memoreaz3 intr-o lista simplu in!antulta, ale carei elemente sunt de tip nod (informatia utila mernoreaza eticheta unui nod din iista), iar adresa primului elem ent din fiecare lista S8 memoreaza intr-un vector L care are lungime a lcqica egala cu nurnarul de nodu ri n si ale carui eleme nte sunt de tip pointe r catre tipul nod:
stru c t n o d {int i n f o;
Ho d

u.em ; } ;

n od *L [< n >] ;

2 1 2
3
4

_I

.~1 41fj
5

~s ic 1

5
6

-t--f:II~--ITJI.O
5

Gr aful orientat G,

190
L

Im pleme nt a rea str uetur ilor de date

1 1
2

3 4 5
6

1 1
2
G ratul neorientat G 1

7 8
Acoasta reprezen tare este recornandata pentru grafurile care au un nurnar mare de
noduri ~i un nurnar mic de muchi i.

A lgoritmi pcntru roprozcntaroa g rafurilor fo losind Hst elo de ad iacenta


Din lista de adiacerita irnplornontata static cu rnatr ice puteti obtine urmatoarele intorrnatii: Graf neo rie ntat
Lung imea ustc! de adiacenta a nodu!u i l neizolat , cu eticheta mai mica decaf n , este egala cu dife renta dintre pr imu l indic e j (j=i+1 .n1) diferit de 0, din prima sectiu ne a liniei a doua (L [1] [j] :t-O), ~i indicele caloanei din care in cepe

Graf oriental
Lungimea listei de adiacenta a nodului i neizclat. cu eticheta mai mica cecat n, S8 calculeaza la fel ca l?i in cazul grafutui neorientat. Pentru nodul n lung imea listei de adiacenta este egala eu (n+m +1 - L[1][n] ), Gradu l exte rn al nodului i este egal eu lungimca li stei de adtacenta a nodu lui. Gradul intern al nodului i este egal, eu numarul de aparitii ale etichetei nodului in a doua secnune a pr imei linii a matrice i (L[OlU] =i, cu j=n+1 ,n+m).

lista de adiacenta a nodului i (L[1l Ol . L[1][i])


Pentru nodu Jn . lungimea liste i de adiacenta este eqala eu diferenta dmtre nurna rul tota l de eoloane, plus 1, si indicele coloanei din care incepe lista de adiacenta a nodu!ui n (n+2x m +1 - L[1][n] ). Lungimea listei de aolacenta se mai poat e determina prin numarare a 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 iacen te nod ulu i i sunt nodurile a carer eticheta apare in lista de adiacenta a nodului i

Succeso rii no d ulu l i sunt nodurile a carer etiche ta apare in lista de adiacenta a nodului i Pr ed ec esorii n od ului i sunt nodurile j i n a c arer lista de adiacent a aoare nodul i.

Info rm a tica
Graf neorientat

191 . - .
Graf orientat
Nodurile adia c ente nod ulu i j sunt date de reuniunea dintre multimea succesorilor ~i multimea prede cesorilor nodului . Num ar ul de vc ctn! ai nodu lui j este egal ell cardinalul mu ltimi i de nod uri ad iacente nodului i. Arcul [i ,j] al grafului rep rezinta nod ul ; s! un nod j din lista de ad iacent a a nodului i din vectorul L

Nurna rul de vect n t at uodutu ! i este egal ell

aradul nodului,
Mllchia [i,j] a grafu lui reprez inta nodul ; ~ j un nod l din lista de adiacenta a nodului i din prima Iinie a

matrioei (U Oll i1El;).

llil EL,) (U O

Din lista de adiacenta imptomontata static eu doi vectori puteti obtine urrnatoarele intormatii:
Graf ncorientat
Lu ng im ca listei d e adiacenta a nod ului i neizolat. cu eticheta ma i mica decat n, este egala cu difere nta dintre primu1indice j U=i+1,n-1) diferit de 0, din veeto rul cap (cap[jl;tO), ~ i indice le elemen tului de la care in cep e lista de adiac enta a nodului i (capO] - cap[i] ). Pentr u nod ul n, lungimea listei de ad iace nta est e ega li3 eu diferenta dintre nurn arul tota l de elemente ale vectorul L, plus 1, ~i indicele elementului din care ineepe lista de aoiacenta a nodului n (2xm +1 - cap [n]) .

Graf oriontat
L un gimc a li st ci de adiacenta a nodului ; neizolat. cu eticheta ma i mica decat n. se calcule aza la fel ca ~ i in cazu1grafului neo rientat . Pentru nodul n . lungimea listei de adia cent a este egala eu (m +1 ca p[n] ). Gr adu l extern al nodu tui I este ega l eu lun gimea li stei de aot ac on ta a nodulu i. Grad ul int ern at nod ului r este ega l eu num arul de apa ritii ale et iche te i nod ului in

vsctoullistei l (l UJ=;, cu j=1 .m).

Gradu l unui nod ; este egal eu lungi mea Iiste i de adiacenta a nod ului sa u cu nurna rul de aparitii ale et ichetei nodului in vectorullistei L

(l O l =;, cu i=1,2m).
Nodurile adia centc n od utul I sunt nodurile a ca rer eticheta apare in lista de adiacenta a nodului i din vectorul L. Suc cesorii n odulul I sunt nodu rile a carer eticheta apare in list a de adia centa a nodului i din veeto rul L. Pr ed cccsori i nodulul r sunt nodurile j in a carer lista de adiacenta din vectorul L apare nodu li. No d ur il e adiacente no dutul I sunt date de reun iunea dlnt re mu ttirnea succesorilor ~ i mult imea pred eces orilor nodulu i, Num arul d e veci ni at no dut ulr este ega l eu eardina lul multimii de nod uri adiacente nodu lui l. n rc u! li.Il a! grafulu i reprezinta nodu l i :;; i un nod j din lista de adiace nta a nod ului i din veetoru l L

Nurn aru! de vecinl a! no d ului f este ega! cu qradu l nodului . Muc hia [i,j] a grafului reprezinta nodul ; ~i un nod j din lista de adiacen ta a nodului i din vectorul L

(L01EL,)

(l !ilE L,).

Din lista de adiacenta irnp lernentata d inamic putet i obtine urrnatoarele inforrnatii;
Graf n eori entat
Nu m aru l de ele mente d in toate listele simplu inla nlu ite este egal eu 2xm ( du blul nu ma rului de m uchli), Lung ime a nst e! de adlacenta a nodului ; este eqala eu numeru ! de nod uri ale listei ce are adresa nodului p rim ecata cu un.

Graf o rio n ta t
Num aru t de ele me nte din t oate liste 1e simp1u Inlantuite este ega l eu m { n um aru l de a rce). Lung im ca Iis tei de adtacen ta r este ega la cu num arul de noduri ale Iiste i care are adre sa

nodului prim eoata cu l [i]

192
Graf neoriontat
Gradul unui nod i e ste ega l ell lungimea listei de a dlacenta .

Im plcmen tu r ca st r uet u r ilo r de date


Graf orientat
Gradul extern a! nodului i este egal eu lungimea Iiste i de adlacenta a nodului. Gradul intern al nodului i este egal, ell numaru l de aparitii ale etichetei no dulu i in toate Iistele simplu Inl antuite. Succesorii nodului ; sunt nodurile a care r etichet a apare in lista ce are adresa nodului

Nodurile adiacente nodului ; sunt nodurile a

carer eticnet a apare in lista ce are adresa nodului prim egala ell L[i].

prim egala eu L[i ].


Predecesorii nodului ; sunt nodurile j in ale care r liste (ee au adresa nodului prim egala ell LOll apare nodul i. Nodu rile adiacente nodu lui i sunt date de reuniunea dintre rnultime a succesorilor sl multimea predecesorilor nodulu i, Numa ru! de vecini ai nodului j este egal cu cardinalul rnuttirnii de nod uri adiacente nodului i. Arcul [i.j] al grafului reprezinta nodul i ~i un nod j dinlista ce are adresa nodului primegala cu L[i].

Numarul de vecini at nodului i este egal cu

qradul nodului. Muchia Ii.Il a grafului reprezinta nodul i ~ i un nodj din lista ce are adresa nodului prim eQ ala cu L[i]

2. 3.

4.

6.

7.

1. Scr ieti lista de adiacenta (Iolosind eele trei me tode de imp lemenlare) a grafulu i neorientat G4 . Folosind lnforrna tiile din lista de adiacenta, deterrninati: gradul nodului 5, nodur ile izolate si nodurile terminale. Scrieti lisl a de adiac enta a grafului orientat G Se vor folosi eele Ire i melo de de implementare. Ce prop rietate are aeest graf? Scrieti lista de adiacenta a qrafului orientat G8 (foloslnd eele trei meto de de impleme ntare). Folosind lntorrnatiile din lista de adiacenta, determinati: gradul intern al nodului 5, gradul extern al nodulul 4. sueeesorii ~ I predeeesorii nodului 2 ~ i pred eeesorii nodului 3. Scrieti lista de aoiacenta a grafu lui orientat G ll . Se vor folosi eele trei metode de implementare . Din lista de adlacenta , deterrninati: gradul intern al nodulu i 5. grad ul extern al nodului 2 , nodurile adiacente nodului 5, succesorii si predecesorii nodului 4, nodu rile terminale ~ i nodurile izolate. 1 'ft_ "'-' Scrieti lista de adiacenta a graiu lul orlentat G' 8 din figura 13. Se vor folo si eele trei met ode de implementare . Scri eti lisla de adiacenta a gralului G 13. Se vor folosi eele trei melod e de im pleme ntare. Cum identificati - i n fieeare impleFig 13 men tare a lis tei de ad iacenta - nodul sursa al grafului? Scri eti lista de ad iacent a a qrafului G". Se vor folosi eele trei melo de de im pleme ntare. Cum identifi cati - in fieeare imp lementare a listei de adiacenta - nodul destinatie al gral ului?

,4 .

Implementarea algoritmilor pentru reprezcntarca grafurilor cu lista de adiacenta 1. Crearea listei de adiacenta in implementare statica prin citirea Iistelor de vecini din flsi er. Determinarea gradului unui nod. Obtine rea matricei de adiacenta din matricea Iistei de ad iac ent a,
in tr-un tisier text se gasese urrnatoarele informatii desp re un gra! neorienta t (~ i varianta orie ntat) : pe prima linie, valorile pentru nurnar ul de noduri n !?i numarul de rnuchii m, despa rtite orin spauu , iar pe urrnatoare le n linii, de spartite prin spatiu , nurnarul de veeini ai unui nod si lista vecinilor (:;;i varianta nurnarul de succe sori ai unui nod si lista succesorilor).

Informatica

193

Se citesc din fisierul text aceste informatii ~ i se creeaza lista de adiacen ta irnplernentata cu rnatrice, respectiv cv vectori. Se afiseaza nodur ile cv gradul eel mar mare (liii varianta cu gradul extern cel mai mare ). Se obtine matricea de adiace nta din lista de adiacenta. Se salveaza apoi matricea de adiacenta intr-un fisier text. in fisierul text S8 scriu: pe primu l rand ordinul grafului, iar pe urmatoarele randur i - liniile matricei de adiacenta, Functia citeste() se folose ste pentru a citi listele de adiacenta din fisier , functia g rad() pentru a determ ina gradul (~i varianta gradul extern ) al unui nod . functia g rad_ma x ( ) pentru a determ ina gradul ma xim ( ~ i varianta gradul extern max im) al nodurilor din graf , funct ia transpune ( ) pentru a obtine matricea de adiacenta din lista de ad iacenta , iar func tia scrie ( ) pentru a scrie matricea de adiacen ta in fisier . lnforrna tiile 58 citesc din fisierul text grar13.txt, pent ru graful neorientat, ~ i qrett a.txt, pentru graful orientat, ~i se satveaza in fisierul text grar15 .txt , pentru graful neorien tat, ~ i grar16.txt , pentru graful oriental. F i ~ i e re l e text grar13.txt si qrett a.txt se creeaz a cu un editor de texte . Pentru testarea programelor se folosesc graful neorientat G , ~ i graful orientat G, .

Graful neo ric ntat

~i

g raful oriental _ impl cmcntarca cu matricc

#i nc l ude < f s t r e a m. h >


i nt n, m , ~[ 3 J [ 50J , a [ 1 0 J [10 J ; //pentru graful n e o r i e r. t a t: fstr e am 1 ( " qraf13 .t xt " , i o s : :in l , 2 ( "g r af l.') . L:{t " , i o s : :out ); // pe n t r u g r a f u l o rienta t // f s t r e a m f l ( "gru f l lJ . t x t " , i o s : :in ) , f 2 (" g r z,. f 1 6 . t z t ",ios: :ou t ); v o id c i t.e s te () tint L j , x , k ; f l n:n ; fo r (i = l; i < o=n; i ++ ) L[1J [ij ""i ; j =- n+l ; for ( i = l; i <= n; i ++ )

{rI o>x ,
if
( F ~O) L [2 ] [i) = O; e l s e { L [ 2 ] [ i]=j ; f or ! k = l ; ~ < = x ; k~ +1

{ f l L [ l } [j]
if ( k '~ " 1 ~ [ ] [j) = j + l ; else L [ J [j; =O;

J++ ; ) ) )

::1 . close {} ; } int g rad {i n t i ) lint g ,j=L[2 ] [i] ; i f (1,[ 2J ( i. ; = =O) 9 =0 ; else { g o= "2.; while (!'[ 2j [j J ! =Ol { g ++ ; j ++ ;)} return c; ; } int ~!:"ad_ma;; () tint i ,I;:ax=C; f or ( i = l ; i< =n ; i+f) if iq rad\ i1 >max m a x = g ~ 2 d{i) return :n2X ; l void t r aaa pune ()

lint i ,j ; f or (i =1 ; i< =n ; { j = L [ 2 J [i} ;


if

i+ + )

(L[ 2j [ i. ; ! = O) {wh a Le ILl 2] [j] ~ o' O I {a l i ) [L [l ] [jJJ = l; a l L] ( L[ l J )j]]= l ; )})

j++ ; }

194
void s c r ie()

I m p lc m cnta rca st r ucru r llor de d ate

(int i ,j ; f 2 n e nd l ;
for {i""l ; i<~n ; i ++) {for (j = l ; j<~n ; jT +1 2 a [ i ) [j ] " " . f2 e n d l ; ) 2 . close () ; ) void main () {inti; citeste () ; cout" Gr a d u l eel mai maTe este " g r a d _ma x () e n d l ; oou t-c-C'N o d u r i.Le vc u gradul eel ma l mare s1Jnt~ : " ; for ( i=l i i< = n; ij ,,,) if (g r a d (i) -o- q r ad max {} [" ccc ecc r -c-c '' t r an spun e t-j scrie() ; }

".

Gra fu l nc ori en tat si qra f ul o rie ntat - im p lem c ntarea eu vocto ri . #include < f s t r e a rn. h > int n,m , L[ SO] , a r l O] [ 1 0] , c a p ( 1 0 ); /Ipentru graf ulneCrienat fstre am fl ( " g r a 1 3 . txt " , ios: : in ) , 2 ( "gr-af1 5 . txt " , ios: : out ) ; I/pentrugraful o r l e n a:: / I f s t r e a mfl ( " g r a f 1 4 . t x t " , ios : : in ) f2( " g r a f 1 6 . txt " , ios: : out ); void ci tes te ( ) lint i , j =l , x , k ; fl n m;
f

for { i = l; i < ~ n ; i + + )

{ fl x ; if ix ~ ~O I cap[ i] = O; else {c a p Ci ]""']; for (k ~l;k<~x ;k H f lo close () ; } int g r a d ( i n t i ) (int g ,j ; if ( c a p[ i J ~ ~ O ) g~ O ;

( fl L [j ]; j ++ ; ) } )

else
{if ( Lcn j
{ j ~ i + l;

while ( c a p [ jJ=~O &&j<= n) j++ ; i f ( j==n+l) g=2 A- m+l ::" c a p [ i J ; II g =m+l -cap[ i ] ; pentr u grafu l else g ~cap[j ]-cap[iJ ;}

orientat

else g =2*m+l -cap [ il ; }


return g ; } int grad max() ( / /este Loe n t tcc cu e ea de l a implementarea e u mar r i.ce j void t ran s p u n e ( ) ti nt i, j; for ( i = l ; i< =o ; i ++) for ( j ~ O ;j<grad ( i) ; j ++ 1 a [ i] [L[c a p [ i] f j] ] ~l ; } void scrie{) { / I e s t e .i.d en t i ca ell e ea de La i mple rnen t a r e a CD ma t r Lce } void main() { / / e s t e iden t i c a cu o e e de la .i.mpLemen t a r'e a cu rnatrice }

2. Crearea list ei de adiace nta i n implem en tare sta tica din m atricea de adiacenta. Salv area listel or de adiacanta intr-un fi sior.

Se citeste din fisieru l ereat anterior (grafI5.lxI, respectiv grafI6.lxl) matricea de adiacenta a grafului ~ i se obtine din ea lista de adiacenta irnplernentata cu matrice, respectiv cu vecto ri. Sc salveaza listele de adiacenta 1ntr-un fisier text (grafI7.lxl, respectiv grafI8.lxl) , astfel: pe prima linie, valorile pentru nurnarul de noduri n ~i nurnarul de muchii rn, despartite prin

Inform atica

195

spatiu, iar apoi. pe urrnatoarele n Iinii, despartite prin spatiu, nurnarul de vecini ai unui nod si lista vecinilor pentru graful neorientat , respectiv nurnarul de succesori ai unui nod si lista succesorilor pentru graful orientat. Functia ci teste () S8 foloseste pentru a cif matricea de adiacenta din fisier. functia transpune () pentru a obtine lista de adiacenta din matricea de adiacenta, iar functia scrie () pentru a scrie nstere de adiacenta in fisier,

Pe nlru teslarea progra melor se lolose sc gralul neorientat G,


#include < f s t r e a m. h >
in t n ,m ,L[ 3 ] [ 5 0 J, a [ l OJ [lO J ;

~i

gralul oriental G9 .

Graful neorientat ~i gra fu l o riental - implemc ntarca cu m atri cc

/Ipe nt r u gr a f u l neorientat
fs t r e am f l( " g raf 15 " , i o s : : i n ) , f 2 ( " g r a f 1 7 . t x t " , i o s : : o u t ) ; //pentru gr a ful orie nta t Il f s t r e a m f 1 ( "grafI6 _t xt " , i o s : : in ) , 2 ( "graf I8 . tx t " , i o s : : o ut ) ; v o i d c i, t este () {int L j ; 1n ; for ( i = !; i <= n ; i T+ ) for l j ~ l; j < ~ n; j ++ ) f fl a [ i ] [j] ; i f l a [ i ] [ j] ~ ~ l) m l + ; ) fl . c l o s e l) ; m=m/ 2 ; } //numai pen tru graful neori entat v oid transpune { ) {int i ,j ,k ,g ; f o r ( i ~ l; i < ~ n ; i. t+ ) L[ lJ [ l ]~ i. ; ke-n -t I r
f or ( i = l ; i < = n ; i + ' ~ ) ffor l j~ l, g ~ O; j < ~ n; j + + )

if (a[ iJ [j]~~ l) { L [ l ] [ k] ~ j ; L [ 2 ] [ kJ ~ k - l ; k++ ; g++ ; ) I g~ ~O) L[2] [il ~O ; e l s e f L [ 2 ] [ iJ~ k -g ; L[2] [ k -1J~O ; ) ) ) i nt grad( i n t i ) {I / i d e n t i c a eu e e a de la ~~lerrntarea eu rna t r i ee } void s c r Le () {in t .i ,j=l , J.: ; f2 n " " me nd l; f or (i= 1 ; i <=n ;i++) if (L[2 J [i] ~ ~O) f2 0 e n d l ; el se { f 2 g r a d ( i) -cc'' " ; f or (k ~l ;k <~grad(il ; k++, j ++ ) f2 L[ 1] [ j J" " ; f2 e n d l ; ) f2 . c l o s e ( ) ; ) v oid main () {c i t e s t e ( ) ; tr a n s p une ( ) ; seri e() ; } if

Graful ncorientat

~i

g raful orientat _ im plcmcntarea cu vecto ri

#i n cl u d e <f s t r e a rn. h > int n ,m ,L[ 50 j,cap[lO] , a[10 1 [lOJ ; I /pcnt. r u graful neo r i e n ta t f s t r e a m 1 ( " g ra f13 ; tx t " , i os : : i n ) , 2 ( " g ra f I S . txt " , i o s : : ou t ) ; I/pentru graful orientat // f s t r e a m fl ( " graf14 . t x t; " , i os : : i n ) , 2 ( "gra f16 . txt " , i o s : : au t ) ; void cites t e ( ) (/ / e s t e roen t.t ca eu cea de 10. imp.Icrnente rea c u me t rLce l v oid t r a n s p u n e() {i n t i , j,k=l ,g ; f ar ( i = l ; i <=n; i + + ) { fo r ( j ~ l; g ~ O; j < ~ n; j ++ ) if (a[ i l [j] ~ ~l) { L j kl e j s k++ ; g++ ; ) if ( g ~ ~ O ) ca p[ i] ~O ; el se cap[ i J ~ k -g ; ) ) i n t g rud{ i n t i ) { I l i de n ~ i c a eu cea de l a L~pl~ntarea ell vectori }

196
v o id sc r i e {) { i n t i I j ; 2 n. " " <cm-cce ndf :
f or ( i = l ; i < = n ; i + ~ }

Imp lemcntareu st r uct u r ilor lie da te

{f 2 q r a ci ( i) " ";
f e r ( j= O; j <g r a d ( i ) ; j - + 1 f2 L(cop[i]-j] " ". f Zx -c eri d L: } f 2 .cf cs e tj r j v oid mai n () { I / e a t e ide n t Lca e ll cea de 1a i mpleme n tar ea e ll rna t r i c e)

3. Crearea listei de adiace nta in implementare dinami ca prin citirea lis tei muchiil or din fi sier. Determ in area veci nilor ~ i a gr ad ului unu i nod.
inlr-un fisier text se gasesc urmatoarele mformatii despre un graf neo rienta t (~i variant a orientat) : pe prima linie, valorile pent ru nurnaru l de noduri n si nurnarul de muchii m, iar de pe urrnatoarele m linii, cate 0 pereche de numere de spartite prin spa tiu, care reprezinta etichetele nodu rilor ce tormeaza a muchie (arc). Se citesc din fisierul text aceste informatii ~i se cree aza lista de adiacen ta implernentata dinamic. Se afiseaza vecinii ~i gradul fiecarui nod . se Ioloseste pentru a initializa cu va loarea NULL eleme ntele vectorulu i L Functia ini (pointerii nodului prim al listei de adiacenta a fiecarui nod din graf) , functia adauga _ nod 0 pentru a adauqa un nod ina intea nodulu i p r im la lista simplu Inlantuita a unui nod din qraf, functia c r ea re ( ) pentru a crea lista de adiacenta, functia g rad () pentru a determina gradul (~ i var ianta , gradu l extern) al unui nod, functia af isa r e _ v ec i n i ( ) pe ntru a afisa veci nii fiecarui nod, iar functia afisa r e _ g r a d () pentru a afisa grad ul fiecaru i nod. lnforrnatiile se citesc din fisierul text graf11 .txt pentru graful neorientat ~i graf12.txt pentru graful oriental. Pentru testarea progra melo r se l olosesc graful neorientat G , si graful orientat G g . # i n cl u de < f s t r e a rIl. h> st ru ct nod t i nt i n f o ;

to

nod * u r m.

j ,

nod * L [ 2 0 ] ; i n t n ,m ,' f stream f l ( " g r afl l . t x t " , i o s : : i n ) ; voi d init () { : n ~; f or ( i n t :=l ; i<=r. ;i++) L[i}=NULL; } voi d a da ug a_nod( ::1od *&p r i :n, int y)

{Lod *p =n e w nod ; p- >i nfo:o:y ; p - >u r m=pri m; pr~ rn= p ; } v oid c r e e r e () t i n t Y. ,y ; wh i le (f x y) ( a d a u g a _ n o d ( L [ x . , y ); a d a u g a _ l1 o d {L [ y ], x );} f . close () ; } v o id af~sare_vecini() {for (i n t ~=: ;i< =n ;i -+)
{ co u

c c v v e c Ln

i i.

nodc Lu

i.

" < x L c -c '" :

" ;
It .

f o r (nod *p '""'L [ i l ; p ! =cNULL ; p=f:- >u r m) cou t p - >l nf c " cou t endl ; }} i nt g r ati ( i n t i) t i n t 9"'0 ;
fo r (nod * p = :" [ =-- ]; p ! =NULL; p = p ->urm) g++ ; r e t urn g ; }

vo id afis are grade(} {fo r (i n t i = l ; i <= n; i ~+ ) cout" Gr a d u l n o du lu i " i ": " g r a d (i ) e nd l ; ) v oi d main () {i n i t : l ; c r ea r e t ) , afis are_v e c ini() ; afisa r e _9ra d e{) ; }

I nformati cii

19 7

1. Scrieti un program care citeste listele de adiacenta ale gratului din fisierul text graf I 3.txt, penlru gratul neorientat, respectiv din fisierul grafI4.txt , pentru gratul orienlat, ~i care afiseaz a nodurile izolate. Liste le de ad iacen ta S8 implementeaza dinamic ~i static, in cele doua var iante. 2, Scrieti un program care citeste listele de adiacenta ale gratului din fisierul text graf I 3.txt, pentru gratul neorientat, respectiv din fisierul grafI4.txt, penlru gratul orienlat , ~i care afiseaza muchii le (arcele) gratului. Listele de adiacenta se implernenteaza dinamic ~i static in cele dOUc3 variante . 3, Scrieti un program care citeste din doua fisiere text, respectiv din g5.txt un grat orientat, reprezentat prin lista muchiilor, ~i din fisierul g6.txt un grat orientat, reprezentat prin lista vecinilor, si care verifica daca cele doua qrafuri sunt identice (lndicat ie. Se reprezinta ambele grafun prin matricea de adiacent a si S8 cornpara cele ooua matrice de adiacenta),

2.7.4,5 , Aplicatii practice


1. i ntr-un grup de n persoane s-au stabilit doua tipuri de relatii: de prietenie si de vecinatate. Scrieti un program care sa citeasca matricele de adiacenta ale celor doua grafuri dintr-un fisier text (pe primul rand, nurna rul de persoane, ~i pe urma toare te randuri, in ordine, liniile fiec are i matrice de adiacenta) ~i care sa afiseze: a. persoanele care sunt i i prieten e !?i vecini (lndic atie. 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 (lnd icat ie. Se determine gradul maxim in gratul intersectie a cetor c oua grafuri.) Pentru testarea programului forrnati un grup cu 10 dintre coleg ii vost ri ~ i descrie ti cu ajuto rul a doua graturi cele doua tipuri de relatii. 2. intr -un grup de n persoane s-a stabilit 0 relatie de cunosti nta: persoa na x este in relatie cu persoana y daca 0 cunoa ste pe aceasta. Relatia de cun ostinta nu este reciproca. 0 celebrit ate este 0 persoana care este cunoscuta de toate persoanele din grup , dar care nu cuno aste nici 0 perscana (este un nod destinatie al gratulu i). Un necunoscut este 0 persoan a care cuncaste toate pers oanele din grup dar nu este cunoscuta de nici 0 perso ana din grup (este un nod sursa al gratu lui). Un singuratic este 0 persoana care cunoaste 0 sinqura perscana din grup sau este cun oscuta de 0 sinqura pers oana din grup (este un nod term inal al gratul ui). Un strain de gru p este 0 persoana care nu cunoaste nici 0 persoana din grup ;;i nu este cun oscuta de nici 0 perscana din grup (este un nod izolat al gratului). Dernonstrati ca in 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 precizez e: persoana care este cunoscuta de cele rnai putine persoane si persoana care cunoa ste cere mai multe persoane ; c. daca exista sin qurotici, sa se precizeze persoanele; d . daca exista strbini de grup, sa se precizeze persoanele; e. cate perso ane cun osc dear doua persoane din grup iii sunt cunesc ute la randul lor de trei persoane din grup (nodurile care au gradul intern egal cu 3, iar gradul extern egal cu 2);

198
f.
g.

Implcmcntarca structurilor d e da te
cate persoane sunt cunoscute de un nurnar de membri egal cu nurnarul de membri pe care Ii cunosc (nodurile care au gradul intern ega l cu gradul extern);
care sunt persoanele care S8 cunosc reciproc (pe re chile de nodur i intre care

exista arce duble). 3. La graful judetelor, adauqati un nod cu eticheta 0, care reprez inta exteriorul tarii, ~i muchiile corespunzatoare , care evidentiaza judetele limitrofe. Creati cu un editor de texte fi~ieruljudete .txtcare sa ccntina urrnatoarele inforrnatii: pe primu l rand , numarul de judete. pe urmatoarele rand uri 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 Rornanie i separate prin spatiu, si apoi, cate un rand pen tru fiecare judet limitrof, in care scrieti separate prin spatiu urmatoarele inforrnatii: eticheta nodului ~i tara (tarile) cu care se i nvecineaza, precizate prin nurnarul de ordine din lista numelor. Scrieti un program care sa citeasca aceste inforrnatii din fisier ~i 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 ~i 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. Intr-o zona turistica exista n localitati. intre unele localitati exista legaturi directe, fie

prin sosele nationale, fie prin sosele judetene. l.eqaturi!e directe sunt caracterizate de lungimea drurnului, rnasurata i n kilometri . Se vor folosi doua graluri : Go=(X ,U o) pentru leqaturile prin sosele nationale ~i GJ=(X,UJ) pentru leqaturile prin sosele judetene, Cele dou a grafuri se vor citi din doua fisiere text, care contin pentru fiecare legatura directa, pe cate un ra nd, separate prin spatiu , cele doua etichete a le noduri lor asociate localitatilor si distants dintre localitati. Scrieti un program care sa citeasca aceste inforrnatii din fisier si sa Ie transpuna intr-o implementare a grafului, adecvata prebleme i, si care sa afiseze: a . localitatile la care nu ajung drumuri nationale (nodurile iz olate, in primul graf) ; b. cea mai scurta leqatura directa dintre doua localitati - se va prec iza eticheta nodurilor asociate localitatilor, distanta dintre local itati ~i tipul scselei prin care se asiqura leqatura : c. pentru doua localitati prec izate , a ~i b (etichetele noduri lor a si b se citesc de la tastatura) , sa se precizeze daca exista leqatura directa . daca exista . sa se rnai precizeze tipul soselei si distanta dintre locahtati: d . pentru 0 localitate p (eticheta p a nodului se citeste de la tastatura ), sa se afiseze toate localitatile cu care are leqaturi directe ~i distants pana la aceste localitati (ln d icat ie. Se dete rrnina grafu l reuniune a celor doua grafuri .); e. loca litatea care a re cele rnai multe leqaturi directe cu alte localitati - ~i sa se afiseze localitatile cu care are lega turi (nodul cu gradul maxim in graful reuniune). 5. intr-un munte exista n grote . Fiecare grat a i se qaseste la lnaltimea h; fa\a de baza munte lui. Intre unele grote exista comunicare directa, prin intermediul uno r tuneluri . Exista si grote care cornunica cu exteriorul. Desenati a retea ipotetica de grote ~i construiti matricea de adiacenta a grafului neorientat asociat {grotele sunt nodurile, ja r

Info rmuticii

199

tunelurile sunt muchiile) . In altimile grotelor S8 vor memora intr-un vector. Gasiti 0 modalitate de a evide ntia grotele care comunica cu exteriorul. (Ind icat ie. Adauqati la graf nodul 0, care reprezinta exter iorul munte Jui.) Scrieti matricea de adiacenta ~ i vectorul cu Inaltirnile grotelor, in fisierul text grote.txt. Scrieti un program care sa citeas ca matricea de adiacenta si vectorul din fisier - ~i care sa afiseze : a. numarul de tunelu ri de comun icare (nurnarul de muchii ale gratului); b. grotele care au leqatura cu exteriorul (nodurile i pent ru care exista muchie cu nodu l 0); c. grotele care cornunica direct cu cele mai multe grote (nodurile cu eel mai mare grad); d. grotele care nu co rnunica prin tune luri cu alte grote (nodurile izolate); e. ce a mai ina Ita grat a si cea mai [oasa grata ca re cornu nica cu exterio ruJ ; f. pentru a grot a a carei etiche ta se citeste de la tastatu ra, sa se afiseze grote le cu care cornunica direc t, precizand pentru fiecare tunel daca suie, cob oara sau este la acelasi nivel cu grota .
6. Reteaua de strazi dintr-un oras este fermata din strazi cu dou a sensu ri ~ i strazi cu sens unic de circulatie , Ea poate fi reprezentata printr-un graf orientat, i n care intersecfiile sunt nodurile, iar arcele - sensul de circulat ie pe strazile care leaga doua inter sectii (traficul auto) . Nodurile sunt intersectii de eel putin 3 strazi. Pentru a stabili prioritatea i n intersectii si pen tru a fluidiza traficul intersecuile vor fi modernizate. Pentru mod ernizare se vor folosi panouri cu semne de circulatie, semafoare - :;;i se vor amenaja sensuri giratorii . Pentru fiecare strad a din ca re se poate intra in intersectie , se rnonteaza in intersectie un panou cu semn pentru prioritate. Pentru fieca re strada pe care nu se poate intra din intersecue se rnonteaza in intersectie un panou cu semnul de interzicere a circ ulatiei , i n toate intersectiile vor fi montate panouri cu sem ne de circulatie , corespunzator strazilor incidente cu intersectia. Fiecare dmtre aceste mijloace de modemizare are un cost panoul cu semn de circulatie - costul c t , sernaforul - costul c2. ~i sensuI giratoriu - costul c 3. Pentru a stabili modu l in care este rnodernizata fiecare intersectie, intersectiile au fost c1asificate in intersec tii rnici (intersectii cu 3 strazi, i n care var fi mantate numai panouri cu semne de circulatie). intersectii mari (intersectii cu 4 strazi, care vor fi semaforizate ) :;;i intersectii foarte mari (intersectii cu peste 4 strazi, in care se vor am enaja sensu ri giratorii). Desenat i o retea ipotetica de strazi :;;i construiti matricea de adiacenta a grafu lui orientat asociat. Scrieti matricea de adiac enta in fisierul text strazi.txt . Scrieti un program care sa citeasca matrice a de adiace nta din fisier :;;i care sa afiseze: 3 . inte rsectiile la care nu se poat e ajunge din nici 0 alt a inte rsec tie (nod urile care nu au predecesori ); b . inte rsectiile de la care nu se paate ajunge la a nici 0 alta intersectie (no durile care nu au succesori ); c. daca exista intersects tara nici a intersecue succesor sau tara nici 0 intersectie predecesar, sa se corecte ze desenu l retelei (prin adauqarea unui nurnar minim de arce), astfel i ncat sa nu existe asemenea intersectii - :;;i sa se actualizeze si fislerul strazi.txt. d. intersectiile la ca re se poat e ajunge dire ct din cele mai mu lte intersectii (no durile care au ce l ma i mare grad intern ); e. inte rsec tiile de la care se poate aju nge direc t la cele ma i multe inter sectii (nodurile ca re au cel ma i ma re g rad extern ); 1. num aru l de strazi pe care se circula i n ambele sensuri (nurnarul de pe rechi de noduri i ~ i j pentru care . i n matric ea de adiacenta, elementele a[i][j) ~i aOWl sunt ega!e cu 1);

200

Irnplcm cntn rc u st r uct ur ilor de date

g, numarul de intersectii mici, mari si foarte mari (clasificarea nodurilor i n functie de nurnarul de noduri adiacente: noduri eu 3 noduri adiacente , cu 4 noduri adiacente ~ i cu cel putin 5 noduri ad iacente ); h. numar ui de pan ouri eu semne pentru prior.tate care S 8 var folosi (suma grade lor interne ale nod urilor): i. nurnarul de panouri eu semne pentru interzicerea circul atiei care S8 vor folosi (diferenta dintre suma grade lor externe ale nodurilor ~ i nurna rul de straz i cu sens dub lu de circulatie): j. numa rul de sema foare care se vor men ta (suma grade lor interne ale nodurilor care au 4 nodur i adiacente ); k . costul de rnoder nizare necesa r pentru fieca re lnterse ctie ~ i costul total al modernizarii. 7. Pe un munte exista mai multe parcele eu Ianete ale saten ilor. Unele tanete au aeces direct la dru mul satesc, all ele nu. i ntre propr ielarii parcel elor veci ne exista relatie de prieten ie - sau nu . Dac a do; propr ietari vecini sunt prieten i, i ~ i perm it unul altuia accesu l pe propr ia parcela. Pent ru a transporta fanul, saten ii care nu au acces la drum ul satesc , trebu ie sa trea ca peste parcelel e all or sate ni, ca sa ajunqa la el. Un proprietar este co nsiderat izolat daca nu are aeces direct la drumu l sate sc si nici nu este i n relatie de prieteni e cu vr eunul dintre vecinii lui. Se vor folosi dou a grafuri: unul pentru a repreze nta relatia de vec inatate a fan etelor, iar allul penlru a reprezenta relatia de prietenie dinlre proprietari. Desenati 0 harta ipotetica a fane\elor si stab iliti relatii ipotetice de prieten ie i ntre vecini. Constru iti rnatrice le de adiacen ta ale celor doua grafuri asoc iate. Scr ieti malricele de adiacenta in fisierele texl Ien ete.txt ~i prie teni.txt. Scrieti un prog ram care sa citeasca matricele de ad iacenta di n fisiere ~ i care sa furnizeze urrnatoarele informatii a. daca exista prop rietari izolati, sa se afise ze lista propriet arilor vecin i cu care trebuie sa stabileasca relatii de priete nie, pent ru a ajunge la drumul satesc, !iii sa se iden tif ice vecin ii care au acces direct la drumul satesc; b. care este proprietarul eel mai neprietenos (care are eel ma i mare procent de vecini cu ca re nu este prieten). 8. Se anal izeaz a rniqrat ia unei specii de pasari catatoare pe perioada unui an. Migra\ia are doua etape : rniqrat ia de toarnn a, can e pasarile migrea z8 din zone Ie reci catre zonele calde (migra\ia de la rece la cald), si rniqratia de prirnavara. cand pasarile miqreaza din zone le calde cafre zonele reci (miqratia de la cald la rece). Fiecare etapa a miqratiei va fi reprezenta ta printr-un graf oriental. in graful rniqratiei de la rece la cald, nodurile care apart in zonei reci au numai succesor i, iar nodurile care apartin zone: calde au numai predec esori. i n graful rniqratiei de la cald la rece nodurile care apartin zonei calde au num ai succesori, iar nadurile care apart in zonei reci au numa i predecesari. Fiecarui nod i se asoc iaza coordonate le geogra fice. Oesena ti cate 0 harta ipotetica pentru fiecare etapa de rniqratie. Construiti. cu un ed itor de texte, fisieru' migraliel. /xt, care va contine pe prima linie n1, nurnarul de noduri ale prirnului graf, pe urrnatoarele n1 linii, matricea de adiacen ta a graf ului, ~i apoi, pe urrnatc arele n1 linii, coordonatele geografice ale fiecarui nod de pe harta (sunt 6 entitati de intorrnatie, separa te prin spatiu: doua valori nume rice i ntregi pentru latitudine, in grade ~i minute, ~ i un caracte r pentr u ernisfera, doua valori nume rice intregi pentru longitudine. i n grade si minute . si un caracter pentru meridian). Construiti cu un editor de texte fisierul migratio2.txt, care va cont ine acelas i tip de informat ii, pentru cel de al doilea graf al miq ratiei. Scrieti un program care sa

Informa tica

201

citeasca aceste informatii din fisier, sa Ie transpuna intr-o implementare a grafului adecvata prob lemei (rec om and are - implementare prin matrice de adiacenta si vector de structuri pentru coordonatele geografice) si care sa afiseze urrnatoarele inforrnatii: a. daca cele doua grafu ri sunt corecte (daca a[i][j]= 1, atunc i au][i]=O - , i produsul dintre gradul intern , 1 gradu l extern ale fiecarui nod trebui e sa fie 0; in plus, treb uie ca nodu rile din zon a calda sa coincid a - i n ambe le grafuri); b. dac a in gra ful rniqratiei de la rece la cald exista un nod destinatie al grafului - , i ce sern niflcatie are exis tent a lui pentru rniqratie ; c. daca pasarile s-au rein tors i n aceleasi zone , prirnavara (nodurile din zona rece coincid in cele do ua grafu ri); i n caz con tra r, sa S8 specifice no lle locatii aparute i n zona rece in care a ajun s specia respective: d. sa S8 obtina matricea de adiacenta a har1ii rniqratiei, pe in treaga perioada a anului , prin reuniunea celor coua grafuri (daca dupa rniqratia de primavara au aparut noi locatii pe harta in zona rece, se vor adauqa la primul graf ca noduri izolate).

2.7.5. Grafuri spccia le


Se definesc urrnatoarele grafuri specia le: -') g raful n ul; -') g ra ful c om pie!.

2.7.5.1. Graful nul


Graful G=( X,U) se nurn este graf nul daca m ultim ea U es te v ida (U=0), adi c a graf ul nu are mu chii. Reprezent area sa in plan S8 face prin noduri izolate . Exemplu: 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 nod uri dar nu are muchii) - figura 14. Observa tie . Matricea de adiacenta a unui graf nul e ste mat ricea zero (nu ' contine nici un element eu valoarea 1).

(1) @ 0)

Fig. 14

2.7.5.2. Graful complet


Un gTat e ll n nod uri este un g T af compl et daca are proprieta tea ca, orica re ar fi do ua n od uri ale gra fului, ele s un t ad iacente. EI S 8 no toaza ell K n. Ob serv atli . 1. S8 poate construi un sin gur gra f neoricn tat co m plet, ell n noduri , deo arece i ntre doua noduri , x si Y. exista 0 singura muchie [x,yj . in figura 15 este prezentat graful neorientat complet K4 . EI are 6 muchii. Desenati grafurile neorientate complete Ks si K6. Nurnarati cate much ii au aceste grafuri.
Teorema 6

CD:0
~
Fig. 15

Nurnarul m de rnu c hii ale unui grat neo rientat ca mplet , e ll n noduri (Kn), es te:
111 = I1X -

11 -1
-

202
forma dintr-o rnultirne cu n clemen te, aoica m =

Im plementarea structurilor de date


C/~

ncmon st rat!e . Nurnarul de muchii cstc cat de numa rul de subrnultimi de 2 clemente care se pot

2. Se pot construi mai multe grafuri orientate com plete, cu n noduri , deoa rece dOU3 noduri x ~ i y pot fi adiacente In trei situatii: exista arcul [x,V], exista arcul [Y,x] sau exista arcele [x,Y] si [y,x] .

Teorema 7
Nurnarul de grafuri orientate complete care
S8

pot construi cu n noduri este egal cu

Dem on stratie Deoarece nurnarul de subrnultimi de 2 nooun care se pot forma dintr-o muttime de n

noduri este a=

CI~ ' ~ j pentru fiecare pereche astfel deflnita S8 pot defini trei situatil de adiacenta.

a rezurta ca numarul de grafur i complete ca re se pot co nstrui este de 3 .

Exemplu . Pentru n=4 se pot 6 defini 3 =72 9 graluri orientate complete. In l igura 16 sunt prezentate patru dintre acestea . Definit i alte patru gralur; complete cu 4 noduri.
Obsorvatii

~M~~ ~~~~
Fig . 16

in cazul matrice i de adiacenta a unui graf neorientat complet , valoarea fieca rui element care nu se gase~te pe diagonala principa la este 1. 2. in cazul matricei de adiacenta a unui graf orientat complet - pent ru orice pereche de noduri , ; ~i j . dilerite l ntre ele (iej} - a[i]UJ=1 sau aO][i]=1 . 3. Nurnarul minim de arco in tr -un graf ori enta t comple t ell n noduri este ega 1 ell nurna rul de much ii ale grafului neorientat complet Kn. 4. Numarul maxim de aree intr-un graf oriental complet ell n noduri este ega l cu dublul nurnaru lui de muchii ale graf ului neorie ntat complet Kn.
1. Algoritmi pe ntru prelucrarea grafurilor comp lete
1. Al goritm pentru a determina nurnarul minim d e aree ca re trebuie ad auq ate la u n g ra f o rienta t , pentru a obtin o un graf o rie ntat camplet.

A lg oritm u i. Se nurnara perechile de nod uri i si j (i:,t:j) int re care nu exista nici un arc. Impl em entarea algo ritm u lu i i n program , inforrnatiile despre graful orientat se citesc din fisierul text gc.txt: de pe prima linie numarul de noduri , ~ i apoi , de pe urmatoarele randuri matricea de adiacenta.

#i n c l ude <i o s t r e a m. h >


i n t n ,a[lO J [ l OJ ; fstream ( "gc.t xt" , i o s : : i n );

voi d c.l t e s t e t ) void main ()

{ l i s e c .i t e s.t.e ma t r i .ce a d e arf i a cen t.a d i n f i s Le r }


i
[J J ~~O

{int i ,j ,m "-'Oi c i t e s t e O f or ( i =2 i i <=n ; i ++)


fo r ( j ~ l ; j < .l ; j ++ 1

.If (a [ L]

&&

a[j ]

[ .l J ~ ~ O I

m++ ;

cout" Numa r u l de are e ca re trebuie ada ugate este " m;}

lnformatica

203

2. Alg oritm p entru a determ in a nurnarul m axim de nodu ri izolate p e care poate Ie cantina un graf n eori cntat care are n noduri ~i m muchii.

sa

Algoritmui. Se identifica graful compl et care S8 poate forma astfel l ncat sa consume cat mai multe muchii (mrna x) din cele m muchii ale grafu lui (mma xsm). Graful complet astlel obtinut are nl noduri:
mma\ =nl x -

111 - 1

SIIl

Numa rul de nod uri nl este partea intreaqa din radacina pozitiva a ecutiei de gradul II:
xm] III = 1+ " I + M [ 2 Pentru diterenta de muchii rarnase (m-mma x ) mai este necesar un nod, pentru a lega aceste rnuchii de nodurile grafulu; complet care s-a fonmat. Numarul de noduri izolate este: n - nl - l, #inc lude < i o s t r e am. h >

ffinc l ude<ma t h. h >


voi d ma i n () ( i n t m, n , n l : c o u t" mu c h i i= " ; c in rni ccu e .c-cvn o d a r i> " ; cin n; nl-l i n tl{( 1+ s q r t(1+8-mIJ/ 2) ;

cou t "Numarul ma x i m de no dur i izolate

e ~t e

" n- n l - l ;}

1. Scrieti un program care citeste , din fisierul text graf.-cl. txt, inforrnatii despre un graf neorientat (de pe prima linie, nurnaru l de noduri, apoi mat ricea de adiacenta) , ~i care verifica daca este un graf com plet. 2. Scrieti un prog ram care citeste, din fisierul graf_c2.txt. info rrnafii des pre un graf orientat (de pe prima linie , nurnarul de noduri, apoi matricea de adiacenta) - si care verifies daca este un graf complet.

2.7.6. Grafuri derivate dintr-lIll graf


Se definesc urrnatoarele grafuri : -7 graful pa rt ial; -7 su bgraful ; -7 graful c om plem en tar.

2.7.6.1 . Graful partial


Fie graful G = (X,U)
~i

multimea VS;;U. Graful Gp = (X,V) se nu m csto graf partial al gratulu; G.

Altfel spus, un graf partial al grafului G esto 01In susi s au un graf ca re 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), definit astfel: -7 rnultimea n odurilor este X,={1 ,2,3,4,5,B,7,8}. -7 multim aa muchiilor este U,p ={(1,2], [1,3], [1,4J, [2,3], [2,5J, [3,41 , [B,7]}. este subqraf al grafului G , - figura 17. Grafu l
GI (I

G,

~~

!Ec:> ~
Fig. 17

~'@

Graful partial G, p

204

lmpl cm cn tarcu s t r uc ru r ilo r lie da te

2. Pentru graful orientat G IO=(XlO.UlO) definit anterior, grafu l G10p = (Xr o, U1CP ) definit astfel: -7 rnu lt irne a nodurilor este X lO={1 ,2,3,4,5,6,7,8,9,10j, -7 rnultlm ea arcelo r este U, oP=([2,3) , [2,5J, [2,6), [2,7J. [4,1], [7,2), [8,9] , [9,8)}, este subgraf al grafului Gl 0 - figura 18.

5
Grafu l G, o

~ ......
.J

4
Teorcma 8

Fig . 18

~
9

partial
G 10P

Grafu i

m Numarul de grafuri partiale al e unui gra f c u m m u chii (a rce) este eg a1cu 2 .


Dcmc nstratle. Grafurile partiale se pot obtine: tara eliminarea une! much ii (arc) - obtinandu-se gratul initial; prin elim inarea unei muchii (unui arc) - obpna ndu-se grafurile partiale cu rn-1 muchii) ; ..: prin elimi narea a m- 1 muchii (arce) - cbtinandu-se grafurile partial e cu 0 muchie (un arc): ~i a tuturor muchiilor (arcelor ) - obtinandu-s u un graf partial numai cu nod uri ~ i rara rnuchi i (arce), adica gratu l vid: Numarul de grafuri partiale care se pot obtine cu m mucnu (arce):
Numarul de grafuri pa rtiale care se pot obtine cu m -t muchii (arce ): Nurnarul de grafuri part iale care se pot obtine cu m -z muchii (arce). :

em ," cm - l
'" '" '"

(,m -~

Nurn arul de gra fur i parti ale care se pot obtine cu 0 muchie (un arc ): Nurn arul de grafuri pa rtials care se pot obtin e Nurn arui total de grafu ri part iale este :

cl

rara
I

nici 0 muchie (nici un arc ):


l

C ::: + c:::- + c:::-

+ .. + C~l1 +

C :
1

2'''.

Algoritmi pentru prelucrarea grafurilor partiale

1. Ge ne ra re a tut uror gra furilor partia le ale unui graf neorien tat.
Algo ritmul. Se fotoseste m etoda backtracking . i n stiva se vor genera muchi ile ,;p,;m), se va apela repetat partial, Deoare ce grafu l partial poate avea p much ii (O gramul bt ( ) , la fiecare apel qenerandu-se variantele cu p much ii. Fiecare apel al gramulu i bt ( ) trebuie sa gen ereze C:: de muchii (arce) din graf . La fiecare apel al gramului, solutia se obtine atunci cand i n stiva s-au gene rat cele p muchii ale partial . Evidenta muchiilor este pastrata i n matricea de incide nta . grafului subpro subprosubprografului

Implc m entar ea aigoritm u lui. Se cites te din fisierul text graf i S.txt mat rice s de adiace nta a unui graf necrientat, Pe ntru fiecare graf parti al S8 afise aza muchiile . Matricea de incide nta b se obtin e din matricea de adiacenta cu functia t r an s fo rma re () . I n variabila nr se cont orizeaza nurna rul de grafuri partial e generate , in functia ti pa r () se afise aza graful partial general. Pentru testa rea programuiui se Ioloseste grafui G,.
#inc lude < i 0 s t r E a ~ . ~>

f s tre a m f ( "g :::-a ::::" 3 . :x t " , ':c ,s : : i :d ; typedef i ~t 3 t i v A [ l OOJ ; in t ;l ,ffi,p ,k , ev , as ,a lClflO] ,o[lOlf 20] ,nr ; s tiva ~l ; void ci t.e s te (}

III fo r ma ticii
t int L j 1nx ; for (i= ; < =n ; i + '~ )
f or { =
m=~ / 2 ;

205
; j < = n ; j + + } { f l a [ i ] [jJ ; i f (a:i] [jl == l) m+-i- ; }

.c l os e () ; }

void
f or

~ra n s fo ~mare(j

tint i, j , k = l;
(i = l ; i < = n ; i ~ +)
j < i ; j ++ i

for ( j ~ l ; v o i d i n i t l)
{if
{i f

if

(a[ l ]

[j ] ~ ~l i

{b [ i ]

I k ] ~l;

b[j]

I k]~ l;

b+ ; II

{ 3 t [ k ] ~ 0;}

int succ e sor- ( )


(s t [ k l <m) { s t [ k ] = s :: [ k ] 1 -1; return l ; } else r e t urn OJ }

i n t va li d i l
fo r

( k>: (i n t

&&

i=l ;

s l: [ k ] <st [ k -l ] ) r eturn 0 ; i<k ;i -l~.l i f (s t I k j e-e s t. i1J

return 0 ;

r e t ur n I i }
in t solu :: ie () { r e t u r n i:==p ; } v o id t i p e r t ) t i nt .i ,j ; n r-t e s

c out " Gr a f u l p art i a l


f or l l = l; i < = p; i ~ + ) {for ( j ~ l ; j < ~ n; j ++ )

"< Xn.r-c-ce rid L, o o u t.c -cvlqu c h i.a I e : ".


if (bl j ] [ st[ i J ] == l ) cou t.cc j -c-c'' ".

cou t c c'" , c o ut endl;}


v oid b t I )

"; }

{ / / p u r t e a f i x tl a a Lqo r i .t mu Lu.i ba c k r r -a c k i n q }

void main ( ) ( c i t e s t e {) ; t r a n s f o :r8ar e { ; f or (p=r.; p>=O ;p - -) b L() ; }

2. Ver ifi carea d aca un g raf G p este graf part ial al unu i graf G. Al goritmu l Se verifica daca cele doua grafuri au acelasi nurnar de nodur i si daca graful G p nu contine muchii care nu exist a in graful G. Im plementar ea al gori tmu lui. Se cilesc , din doua fisiere text glp .txt ~ i g2p ./x/, inforrnatii despre doua grafuri neorientate (sau orientate ): de pe prima linie, nurnaru l de noduri, si apoi, de pe urm atoarele randuri , rnatricea de adiacen ta. Matricele de ad iacent a ale celor doua grafuri sunt a ll}i a 2, cu dimensiu nea n, respect iv m. Functia grafp () verifies daca grafu l G p est e graf part ial al grafului G.
# i n clude < 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 ( " g 2 p . : xt " , i o s : :in ); in t Cl ,n , a1[ :0) [:0] , a 2[:O : [10) ; i n t g ra f p () {i f (m t e n ) r eturn 0 ; el s e f or ( i n t i=l i i< =n ;it--t-) f o r (i n t j~l ; J <~n ;j"+) if (a 2[i) [ j ' ~1 && 01 l i l [j]~ O i r e t urn 0 ; r e turn 1 i } v oid ma i n ( ) l i nt i , j ; f l ~l ;
for { i = l ; i < = n ; i + ~ )

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

Implem entarea strncfn rilor de d a te


"; else cout" n u c ste gra f p artia l " ; J

if (grafp(J ) oou b-ocv e s t e q r a f partial

3. Ob t inerca unui g raf partia l G p al unul graf G. Algoritmui. Se elimina din graful G much iile, 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 ..

Im pl em entarea algorltmu lui. Se citesc, din fisierul text g3p.txt, informatii despre graful neorientat: de pe prima linie nurnarul de noduri n ~i eticheta unui nod x , ~i apoi, de pe urrnatoarele rand uri, matricea de adiacenta a grafu!ui. lnforrnatiile despre graful partial obtinut se scriu in fisierul text g4p .tx/, astfel: pe primu! rand nurna rul de noduri n , 1numarul de muchii m si pe urrnatoarele m rand uri - muchiile, 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.e s 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 much iile care au la extrernitati un nod cu gradul par si nodul x (muchiile [v[i),x) pentru care a[v[i)] [x]~~l),i se elimina aceste muchi i. Pentru testa rea programu!ui se va folosi graful G3 si nodul 6.
itinclude < i o s t r cem . h > fstream f 1 ( " g 3p . t x t", ios: : in ) f 2 (H g 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 ad i acen \-.3 d i n f i.$ i er ) int g r a d (int i ) tint j , g = O; for ( j=l ; j <~n ; j++) g+=a [i ] [j ] ; return g ; } void graf~part i a l ( ) tint .i , k~ O ; for ( i =l ; i< =n ; i++) i f (g rad (il %2--0) ( k++; v[ k ]- i ; ) for (i = l ; i<=k ;i++) i f ia[v [i]j l x] - ~ l ) { a l v j i I ] [x )-O ; a [x ] l v [j ]] - O; m-- ; ) ) void csc ri. e j ) {int i, j; f2 n " " mendl;

for (i =l ;i<=n ;i+ +)


for ( j - l ; j <l ; j'+j i f (a[ i] lj l - -l) f 2 i " " jendl; f 2 . close () ;} void main() { c i t.e sve t i g raf_ 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 to ate grafurile pa rt ia le care se pot obtine . lnforrnatiile des pre 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):

lnfurm utica

207

de pe prima linie nurnarul de noduri, apoi matricea de adiacenta, ~ i ca re verifies daca

unul dintre grafuri este graf partial al celuilalt. in caz afirmativ, se afiseaza care este graful care este graful partial. (lnd ica tie . Daca cere doua grafuri au acelasi ardin n , se identifica graful care are mai multe rnuchii (m) sl num arul de muchii ale celuilalt graf - p (rnzp). Pentru grarul cu m muchii, se genereaza taate matricele 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 celuilalt gra!.) 3. Scrieti un program care cites te din fisieru l 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 . Pentnu testarea programului se va folasi gratul G4.

,1

2.7.6.2. Subgraful
Fie graful G = (X,U). Graful Gs= (Y,V) se num esta subg raf al gr afului G dac a Y ~ (subgrafu l contine num ai noduri ale grafulu i) 9i mu chiile (arc ele) din multimea V sunl t0 3t8 muchiile (arcel e) din rnultimea U care au ambele ext rernitati in multirne a de no duri Y. Se spune c a subg raful Gs esle ind us sau general de multirnea de noduri Y. Altfel spus, un subg raf al grafului G esle el insu si sau un graf care s -a obtinu t prin suprirnarea din graful G a unor nod uri ~ i a tuturor muchiilor (areelar) incidente cu

aces te noduri.
Exernpl e: 1. Pentnu graful neorientat G, = (X"U ,) , definit anterior, gratul G t s = (Y"V,). definit aslte l: ~ rnultlmea nodu rilor este y ,=(1,2.4 ,5,6.7). ~ rnultim ea muchi il or este V, =([1.2]. [1 A]. [2.5]. [6,7]}. este subgraf al grafului G, - figura 19. Gratul (; "

G,

~ ~ q~ ~ ~ 0 '@
Fig . 19

cifiJ

Subgratul
G ts

2. Pentru graful arientat G lO =(X lO, U lO) . definit anterior, gratul GlOS= (YlO ,VlO) definit astfel: G ~ multimea nodurilor este Y1O={1,2,3,6,7,9,1OJ. -7 multlmoa arcclor este V lO=([ 1,2], [2,1], [2,3], [2,6], [2,7], [7,2]}. este subgrat al gratului GlO - figura 20. 5)

~@ q ~
Fig . 20

Subgraful Gt os

Teorerna 9
n Nurnaru l de sub grafuri ale unui graf cu n nod uri este ega I cu 2 -1.

208

Implemcntureu st r uct u ri lor de date

n em cn atret re. Subg rafurile se pot obtme : prin elirmnare a niciunui nod (obtinandu-se grafu! initial ): a unui nod (obhnan du-se subg rafurile cu n-1 noduri): ...; a n-1 noduri (obtinandu- se subqraf urile eu un nod): Numaru! de subg rafuri ca re se po t obtine eu n nod uri: Numarul de subgrafu ri care se pot obtine eu n-1 nocun: Numarul de subgrafu ri care se pot obtine eu n-2 nod uri: Nurnarul de sub grafu ri care se pot obune eu 1 nod " Nurnarul tot al de subgrafuri este : C~ +

c::-r + <:::-1+ .

+ e ll

;;

2" _1.

Algoritm i pentru prelucrarea subgrafuriJo r


1. Genera rca tuturor s ubg raf urilo r unui g raf.

Alg or itmui. Se foloseste metoda backtracking . in stiva se genereaza nodurile subgrafului. 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 C~ de noduri din gral . La fieeare apel al subprogramului, sotutia se obtine atunci cand In stiva s-au generat cere p noduri ale subgrafulu i. Pentru nodurile generate in stiva se afiseaza muehiile (areele) care exista in graf. Implem entar ea alq orltmulul . Se citesc , din fisierul text gra fl./x/ , matricea de adiacenta a unui graf neori entat, respectiv, din fisierul graf2.txt, matric ea de adiac enta a unui graf oriental. Pentru fieeare subgral general. se afiseaza numarul de noduri ,i muehiile (arcele). in variabila n r se conto rizeaza nurnarul de subqrafuri generate . in functia tip ar () se afise aza subqraful general. Pentru testarea programelor se l olosese gralul neorientat G, si graful orientat G g
ff include < f s t r e a m. h >

f s tr e am f{ "g ~a ': =- .t x t " , i o s : : i n ) ; 1/ f s tre a m f( "g:-a f2 . t.x :. " , i o s : :i n j ; pen t r u q r-a f u L o ri .ent .a t t ype def i ;. t s : ~va{lOCJ ; int n. , !=' , ,(,ev ,a s ,3[lOl [10, . r. r .

s:Lva st ;
v oid c it e s t e ( ) ( I / s e c it ~ ~ t e ma t r icea de a d i ac enta din f i ~ i e r} v oid .i n.i t I I ( 3 t [ k ] = O;) int 2\1CCe SOr ( ) {if ( s t[ k J<n) { ~ t r k ] - s t l k J + ]; return I ; } el s e ret urn O J } in t v a lid () (if Ik>: && s~[ k :<s t[ k - :]) r eturn 0 ; for , i n t i=l ; i < k ;i +-) if (st[;:]==st:i]) r e t urn 0 ; r etu r n 1 ; } in t 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 " S Lb g r afu L " n rendl" Nod u r j J. e:" ; (i=l ;i <=p ;iH') cout.c -cs t l i l c c " or; c ou t e ndl ; t.c-c v i i I! t t fo r (i= : ; i<=p ; :..,.. _)
fo r
c o u M u c h L e : " ; c c u c-c vA r c e L e : " ; p e n r u q

L c n

fo r ( j = j + l; j < = Pi j + ~ ,

II

f or { j = : ; j < = p ; ~ + ~ ,

pe ~ ~ ru

gra f ul o rie nt a t

I II form a tid
if (a l st [L ] ] coutendl;}
[ s t li ] ]~ ~1 i

209
c out s L [i j " - " s t [J J "
" .

void b t ( ) { / / p art e a fix 3 a a I'qo r i t mu Lu i. back tr a cki n g } v o id mai n () t c Lt oa t o t j : for ( p ~ n ; p > ~ 1; p - - 1 btl ); )

2. Verificarea daca un graf G s este sub graf al unui graf G. Algoritmul. Se verifica daca : -7 nurnarul de noduri din graful G s este rna! mic sau cel mult ega l cu nurnarul de noduri din graful G : -7 etiche tele nodu rilor din graful Gs exista printre el ichetele grafului G : -7 intr a nodurile din graful G s exists muchiile dintre nodurile din graful G si numai acelea. Im plemen tarea alg o ritmu l ui. Se citesc , din dou a fisie re te xt glslxt ~i g2s.lxt. inforrnatii despre doua grafuri neo rientate (orientale ): de pe prima Iinie nurnarul de noduri ~i apoi, de pe urrnatoarele randuri, matricea de adiacenta . i n fisie rul g2s txI pe ultim ul rand, du pa matricea de adiacenta, este mem orat un sir de numere care reprezinta etichet ele ncdu filar din acest graf. Matricele de adiace nta ale celo r doua grafur i sunt a l ~i a2 , cu dim ensiun ea n , respectiv m. In vectorul v S8 merno reaza etichet ele nodur ilor celui de aJ doilea graf . Fu n ctia subg ra f () verifica da c a graful G s este subgraf al grafului G.
#include <. i. c s t r e am. ~ >

i nt ol, n ,a1[10] [ 1 0 1, a 2 [ 1 0J [101,v[10 ];


f str e am fl( " g l s .txt " , i o s : : i n) ,f2( "q2 s .: xt " , i o s : : i n } i in t s ubq r a f () {i f (m>n ) r e t u r n 0 ; el se { fo r ( 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 :
fo r ( i = l ; i ~ = n ; i + + ) fo r ( j ~ l; j < ~ n ; j ++ ) fl al l i J Ij ]; :l . c l o s e () ; f? rn i fo r (:i =I ; i<=ru ; .1. -! +) f or ( j = l ; j < o;; m; j + + ) 2 a2[i] [j ] ; fo r ( i =l; i < =nl ; i +T } f 2 v [ i } ; f2 . c l o s e ( ) ; if ( s u b (j r a f ( ) ) c cu t-cc ve s t c s ubq.ra f " ; e l se cou t o cv r:u e s t e subgr'af " ; )

3. Verif icarea da ca doua matri ce de adiaconta pot reprezenta ma tr icele de ad iacenta ale unu i graf ~i ale unui s ubgra f al aces tu ia. Algor itmu i. Ma tricele de adiacenta ale celor coua grafuri au dimensiunea n , res pectiv p . Se identifica graful care are ordinul mai mare (n) ~ i grad ul cetuilalt graf - p (nz p). Pentru graful cu n nod uri se genereaza toate matrice le de adiacen ta ale subgrafurilor cu p noduri ~i S 8 verifica dac a una dintre ele este identic a cu matricea de adiace nta a celuila lt graf). Generarea tuturor subgra fur ilor cu p noduri S8 face cu m et od a ba cktracking . In stiva S8 vor ge nera nodurile subgraf ului. Impl ementa re a algoritmului. Se citesc din doua fisie re l ext, graf_ls.txt ~ i gra f_2s .txt. inforrnatii despre mat ricele de adiacenta a doua grafuri neo rientate : de pe prima linie,

210

Im plcme n ta rea st r uc t u r ilor de dat e

numarul de noduri, apo i matricea de adiacen ta. Se verifica dac a unul dintre grafuri este subgraf al celuilal!, iar in caz afirmativ, 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 valo area 0, a doua matrice de adiacenta se asociaza unui posibil subqraf, iar daca are valoarea 1, prima matrice de adiacenta se asocia za unui posibil subgra f. Variabila loqica ga s i t S8 foloseste pentru a determina daca una dintre matricele de adiace nta reprezinta matricea 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 gene rate in stiva. Functia ze ro ( ) se toloseste pentru a initializa cu 0 elementele matricei b - inain te de generar ea fiecarui subqraf. Functia tipa r () S8 toloseste pentru a genera matricea b ~i pentru a a campara cu rnatricea asocrata unui posibil subgraf. Functia furnizeaza un rezultat logic : 1 - true , daca matrice a qenerata ~i matricea asoc iata 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 posib il subqra! (gasi t==O) ;;i se mai pot cauta solutii pentru matricea generat;; (k > O).
#i nclude <i o s t r e a n. h > in t n ,p ,al[lOj [lO} ,a2DO] [ lO} ,b(2.0] flO] ,v[lO] ,n r , x ,as ,ev , k , ga si': ; fstrea m fl( "grafl_s " t:-~t " , i o s : . Ln ) , f 2 (" g r a f 2 _ s. t x t"/io s : : i n ) ; typedef int stiva[lOO] ;
s t Lve s t : v o id zero ()

{for (in t i=l ; i <=p ;i+ +)


fo r (int i~ ] ;j<-p ;j ++) v o i d i n i t ( ) ( s t [k ]=O; ) b ii J
iiJ~O ; )

i nt succ e 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 jc s t j k -iL] ) r e t urn 0 ; for ( i n t i-l ;i< k ;i ++) if l st[k]==st[i] ) retu r 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 + + )
for ( ~ = l; <=p ;j~+)

if
if

(alfstfi]] l s t l j l l e

l I b[iJ [jJ=l ;

for ( i = l; i <=p; i ++ )
for l ; - I ; : < = p ; j ~ + )

{a2{i]

(j~

:=b[':'] [j.)

return

a; }

else (for

i-. ;i<=p ;i+~)

for j=l ;j<=p ;j++)


for ( i - : ; i < - p; i T ~ )

if (a2 s t I i

; [st[jJJ==lj brio fi; =l ;

for ( ~ = .Io ; j < = p; j - + ) if (al(i~ [j) !"-b[5..) {jl return O; } r eturn I ; } v oid b t. t ) {1 / p .J. r t e a fixa a e Lqo r i tmu Lu i be c k t r ac k.i nq } v oid main () tint i ,j /m ; I I o c-n :
for { i = l ; i < = n ; i ~ T )

f or (j=l ; j<=n ; j

t-+)

': 1a 1 I i ] [j

J; :"1 " close ()

I II fo rmuticii
f2 p ; for ( i = l ; i <=p ; i l t
if
'

211

for ( j ~ l; j < ~ p ; j ++ )

(p >n)

f2 a 2[i ] [ j ] ; f2 . c l o s e () ; {m=n; n=p ; n=H\ ; x=l ; }

else x -=- O;

b t () ; if (gasit)

( x ) cou t .ccv p r ima matrice de ad j acent a e s t e a sub g r a f ulu i "; else cout "a doua ma;:rice de a.d i a c e n t 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 - ~ i care gen ereaza taate subgrafurile ca re S8 pot obtine. lnforrnatiile despr e subgrafuri se vor salva in fisie rul text gralsI6. txt. Pentru 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) ~i pe randut urrnator textul Arcele - urm at de lista de arce a subg rafului general. 2. Scrieti un program care citeste din doua fisiere text , gralls.txt si gral2s.txt inforrnat ii desp re matricele de adiacenta a do ua grafuri orientate (de pe prima Iinie numarul de noduri, apoi matricea de adiace nta) ~i care verifies daca unu l dintre grafuri este subgraf al cel uilalt. in caz afirmativ , se precizea za ca re este grafu l si ca re este subgraful. 3. Scr iet i un program care cite ste din fisierul text grafl6.txt matricea de ad iacenta a unui graf orient at - ~i care genereaza subgraful care S8 obtine prin elimin a rea nodulu i ca re
are cei ma i mu lti vec ini.

if

2.7.6.3. Graful complementar


Fie graful G = (X,U) ~ i rnu lt 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 gra ful G c, nu m ai dacii nu sunt ad iace nte in graful G (U " V = 121). Altfel spus , un graf com p leme ntar al qr afului G contine aceleasi noduri ca dar nici 0 muchi e din ac est graf. Exemple : 1. Pentru graful neorientat G, = (X" U,), definit anterior, graful Grc = (X" V, ), definit astfel : -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. Graful G, c
~i

graful G,

G,

~ ~

~
6

rl
L....(

~GrafUI compleme ntar 6 c.,


(.;\

4
Fig. 21

2. Pentru graful orie ntat GlO=(XlO,U lO), definit anterior, graful Gl 0c= (XlO,VlO) , definit astfel: G10c -7 multlm ea nodurilor este X,o={1.2 .3,4.5,6,7,8,9,1OJ. -7 rnu ltirnea arcelor este V,o={[1.3J, [1,5J, (2,4J, [2,8J, [3,2J, [4.2J, [5,2J, [5,6J , [7,1]. [8.2J, [9,31 . [9,10]) este graf comp lementar al qrafului G10- figura 22.

212
5
1
Gratul

Implem entarea s t r net nr ilur de date

G,o
Fig . 22 Scrieti un program care citeste din doua flsiere text graCi c.txt si graf_2c.txt inforrnatli despre doua grafuri neorientate - si varian ta orientate - (de pe prima linie. numaru: de noduri, apoi matricea de adiacenta) $i care verifies daca unul dintre graturi este grat complementar al celuilalt graf. (Indlc at ie. Oaca cele doua grafuri au acelasi nurnar de nod uri, S8 determine graful inter sectie, care va trebui sa fie gratul vid).

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 relatle de priet enie . (lndicatie. Se genereaza gratul cornplementar.) 2. Din grupul de n persoane intre care s-au stabilit relatii de cunostinta, elirnmati strainii de grup ~i singuraticii. (Indicatie. Se genereaza un subgrat al qrafului initial, pnn eliminare a tuturor nodurilor izolat e sau terminale.) 3. La gratul judetelor, construiti un vector in 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:'5 h2. Venficati cate dintre aceste grate cornunica direct cu exteriorul rnuntelui. Valorile pentru lnaltirnile h1 si h2 se crtesc de la tastatura. 5. in reteaua de strazi a orasului, doua strazi se inchid pentru a fi reparate . Etichetele intersectiilor care sunt legate de aceste strazi se citesc de la tastatura. Sa se veritice daca, prin inchiderea acestor strazi, traficul auto nu este perturbat, in sensuI ca vor exista intersectii la care nu se mai poate ajunge. (lnd ica tie. Se genereaza gratul partial al traficului, prin elimina rea 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 tanete. (Indicalie. Se verifica daca gratul cu mai putine rnuchii este grat partial al celuilalt graf).

Info rm atica

213

2.7.7. Concxitatca grafu r ilor


2.7 .7.1. l.antul
intr-un graf G= (X,U) se d efineste lan tut ea fiind 0 s ue eesiune de noduri care au proprietatea ca, oricare ar fi dow! noduri succesi ve, ele sunt adia cente. G raf u l neorientat Daca mu ltirnea noduri lor unu i graf neorientat este X={X" X2 , , x.}, un lant de la nod ull- la nodul i, - L(I, .ikJ - va fi defini t prin rnultimea L(I, .I, )= i l" 1 I; . .. . , I, } , unde I,EX pentru 2 orice i (1<;i<;k) , ia r muc hiile [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 in care

S8

, ,1 parcurg aces te muchii: [1 2], [1 2,1 3] , [1 3 ,1 4 ] , ... , [l k k ] . Fiecare pe reche de noduri succesive din "l Ian! reprezin ta pa rcur ge rea une i much ii. Daca exista L( x;,xj) , se spune ca nodul Xj es te

accesibil din nodul


Graful orientat

Xi .

, la Daca multirnea nodurilo r unui gra f orien tat este X={X" X2, x o}. un lant de la nodul 1 ] , , I; , ... , I unde I;EX , pent ru nodu l Ik - L(I, .lk) - va fi definit prin rnultimea L(I"I,) =[I 1 k 2, " ,1,], [1 ,1 J, ..., [l ] au proprietatea ca , oricare ar fi doua arce orice i (1s isk). Arcele [1 , ,1 2 ] , [1 2 3 4 k
"I, succesive, ele au 0 extremitate comuns. La defi nirea unui lant, nu S8 line cont de oric ntarea arc el or , ci numai de faptul ca doua nod uri sun t legate de un arc .

Terminologie : ~ Lungimea unui lant reprezinta nurnarul de parcurgeri ale muchiilor, respectiv arceJ or. De exemplu , lungimea lantului L(I ,) este k-1. Daca a muchie (un arc) este parcursa de "I dintre parcu rgerile sale . ma i multe ori, S8 va numara fiecare -7 l. antu l de lungime minima dintre nodul Xi ~i nodul xJ - L min( x j,X j) - este lantu l cu nurnarul minim de muchii (arce) , din rnultirnea nevida de lanturi L(x" x,). ~ Ext rernitat ile unu i Ian! sunt formate din nod ul cu ca re lncepe si nodul cu care se , ~ i Ik ) . terrnina lantu l (1 ~ Sublantu l este fo rmat dintr-u n sir continuu de nod ur i din lant. De exemplu , pen tru lantul L(I" Ik)= {I 1 " 1 0+1, ..., 1 " " I,l este 2 , ... , I" ..., I" " ', Id , L, (I" I,), definit astfel : L, (I;, 1,)= [1 un sublant allan"tului l. G 19. 1. Pentru graful neori entat G19= (X 19 ,U , definit astfel: '9) ~ rnuttirn ea nodurilor este X , 9={1 ,2,3A ,5,6 ,7,8}. ~ rnultirnea m uc hiilo r este U 19 =([1 ,2], [1,5], [1,6], [2,3J, [2,5], [2 ,6], [3,4], [3,6], [3,7), [3,8], [4,8], [5,6], [6,7J, [7,8]}. L , (1,7)= (1, 2 , 3 , 8 , 4, 3, 6, 5, 2, 3, 7} este un lant lntre nodul cu elicheta 1 i nodu l cu eticheta 7 (figura 23 ). Lungimea lantului este 10. ~ G",
2. Pentru gra ful orientat Gzo = (X'O,U20), definit astfel: ~ multlm ea nodu rilo r este X 2o={ 1 ,2,3A ,5,6 ,7}. ~ mullimea ar celor este U 20 =([1 ,2] , [1 A ), [2,3J, [2A], , '-~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 lantu lui este 8. Exemple:

214

lmplcmcutarca structurilor de date


Clasificarea lanturilor - in functie de : Muchii (arce) Simple
Toate muchiile (arcele) din lant su nt

Noduri

Elementare
Conl in numai noduri distincte doua cate dou a: 1 ,-0"-12 : 1 1 ~IJ7 ; ... ; I,;t.lk: 12"~ [3; . . . ; Ik. 1",lk - acelas i nod poat e fi parcu rs a singura data.

diferite i ntre ele: [1,,1,] ~ [1,.1 ,1: (I,.I,J ~ [I, .I,J: ...; [1 ,,1,) ~ [I" .IJ; ...: [lk 2 .1 k.,1;t. [1" "'1<] - aceeas! much ie (arc)
peate fi parcursa 0 sinqura data .

Neelementare
Con tin noduri care se repeta - prin acelasi nod se poate trece de rnai rnurte ori.

Compuse
in lant se pot re peta u ne le much ii (aree) - aceeasi mu chie (arc) poate fi parcursa de mai multe ori .

Exemple: 1. Pentru graful neorientat G 19 : -? l.an tul L , (1,7) definit anterior este un lant neelem entar , deoa rece se repeta nodul cu eticheta 3. Este un lant campus , deoarece in lant se repeta muchia [2 ,3) -? l.antul L, (1,7) = {1, 2, 3, 6, 7} esle un lant elementar deoa rece fiecare nod este parcurs a sinqura data. -7 l.an tul L, ( 1,7) = {1, 6, 3, 2, 6, 7} esle un lant simplu , deoarece nicio muchie nu se repeta, dar este un lant neelementar, deoarece se repeta nodu l cu el ichel a 6. 2. Pentru graful oriental G,o : -? l.antul L , (1,5) definil anlerior esle un lant neelementar, deoarece se repeta nodul cu el ichel a 6. Este un lant campus, deoarece i n lant se repeta arcul [6,7]. -? l.an tul L, ( 1,5) = {1, 2, 3. 7, 6, 5} este un lant elementar, deoarece fiecare nod este parcurs 0 sinqu ra data . -? l.antul L, (1,5) = {1, 2, 4, 5, 2, 3,6, 5} este un lan] sirnplu , deoarece niciun arc nu se repeta, dar este un lant neelementar deoa rece se repeta nodul cu eticheta 2. Teorem a 10 Daca un graf confine un Ian! i nt re doua noduri, x ~i y, atunei contine un Iant elem entar intre nodurile x si y.
Dern on strati e Consideram lantul L(x,y)=! x, 1 1, 1 2..... Ik, YI . oa ca tantul nu este elementar, el confine 1_ "', Ik V}. eel putin un nod z care se repeta - exista i ~ i j , astfe l inca! I;; IJ; z: L(x,y)= {x, 1" 12, ..., lr. ..., 1 Nodul z apartinand lantului L(x,y), tnseerrma ca el este acces ibil din nodu l x, iar nodul y este accesibi l din nodul z. l nseamna ca din tant se poate elimina sublantul care leaga nodul z de el Insus i: L(x ,y)= ~x . 1 1. 1 2, ..., Ii, Ij+1. "', Ik, y } in ace tas! mod , se pot elimina din lant , tcate sublantunle care leaqa un nod de el tnsusi, obtinandu-se i n final un lent in care fiecare nod nu apa re decal 0 sinqura data , adica un lant elementar.

Exemplu : i n graful neorien tal G '9, lantul L ,(1 ,7) este un lant neelementar. Prin eliminarea din acest lanl a sublantului {B, 4 ,3}, se obtine lantul {1, 2, 3, 6, 5, 2, 3, 7}, care esle un Ian! neelemenlar. Prin eliminarea din acest lant a sublantului {6, 5, 2, 3}, se obtine lantul {1 , 2, 3, 7}, care este un lant elemen tar.

Informatica
Tcorcma 11

215
Dacii un Ian! esl e elemenlar, alunci este ~ i Ian! simplu.

oemcnetrat !e - prin recuc ere la absurd. Presupunem ca lantut elementa r este J an! campus . Daca este lant campus, el treb uie sa parcurqa de dou a on aceeasi muchie (arc), ceea ce ar insemna sa treaca de doua ori prin nodurile adiacente muchiei (arcului). l.antut fiind elementar, nu trece lnsa de doua ori prin acelasi nod.

Algoritmi pentru determinarea lanturilor elementare intr-un graf 1.


Afi ~a rea

lanturilor elementare dinlre doua noduri.

Algorilmu l. Pentru generarea lanturilor elementare intre nodul x ~ i 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 much ie (un arc) cu nodul adauqat anterior in suva ~i sa nu mai existe in stiva (conditia ca lantul sa fie elementar). Solutia se obtine atunci cand nodul adauqat in stiva este nodul y. Imp lementa rea algoritmului. Se citeste din fisierul text graf1 .txt matri cea de adiacenta a unui gral neorientat . respectiv , din fisierul graf2.txt matric ea de adiacenta a unui gral orientat. Se mai citesc de la tastatura doua valori numerice care reprez inta etichetele a do ve nodur i din grar. Se cauta toat e lanturt le elementare care exista tntre cele coua noduri ~ i se afise aza. Oaca nu exists nici un lant elemen tar, se afiseaza un mesaj . Functia c i t es t e () se foloseste pentru a cif matricea de adiacen ta din fisier . Variabila este se foloseste pentru a verifica daca s-a gasit un lant elementar intre cele doua noduri (are valoarea 0 - False, dacii nu s-a gasft un lant elementar). Pentru testarea programelor se lo losesc gralul neorientat G, ~i 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.t e s t e ma t r Lceu de ad i a ccn t a din f i s Le r I v oid init() { s t [ k } ~ O ;} int succ e s o r () { i f (st[ k] <nJ ( s t [ k ] =s t 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 ucc e si v e sa f i e a d i a c e n t e i f la [s t[ k-1 ] 1 Ist:[k l j ==O) r eturn 0 ; ! /pe n t r u gr a f ul orie n t a t Il if (e l s t j k ] ] [st[k -1] J ~ ~0 && a Ls t Lk -T l ] [st lk J ] ==O) return 0 ; f or (i n t i~l ;i<k ;i++) Il co nditia ca 1 an t u l s 5 fie eleme n t a r i f Ist[k]==st[i]) r et u r n 0 ;

r e t ur n I ; }
int solutie() { return st[k}==y ; } lise ob~ine solu~ia 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 ++) couts t[ i] " " ; coutendl;} void bt () {/ I p a r t e a fi xa a a lg o r i t mu l u i } { k = 2; init () ; wh i l e (:<>1) ( a s =-1 ; ev=O ; while {a s && l e v )

216
{a s =s uc c e s o r ( };

Impl em entarea st r uct u r ilur de date

if {a s ) ev=va lid ( ) ; } i f ia s ) i f ( s o l u t i e ()) t i p a r ( ) ; e ls e { k++ i in i t () ; } e l se k - - ; } } v oid ma i n e) ( c i t e s t e ( ); cou c-oc " >; "; ct rc- >x , c o u t" y = ". c i n y ; st[l] =z:; bt () ; i f ( ! est e) cout" Nu e x Ls t a l an t " ; }

2.

A fi~a rea

tutu ror lanturilor elementare din g rato

Algoritm ul. Pentru generarea tuturor lanturilor elementare din grat, se vor genera lanturile elementare dintre nodul x (t sxs n) ~i nodul y (1$y$n), folosind metoda backtracking . care se va apela pentru fiecare pereche de noduri x 'Ii y (x>,y) . Imp leme nta rea al gori tmului. Se citeste din fisieru l text grafl.txt matricea de adiacenta a unui grat neorientat, respec tiv, din fisierul graf2./xt matricea de adiace nta a unui graf oriental. Se cauta toate lanturile elementa re care exista In 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, .
#include < f s t ~ e a m . h >

typedef sLi va[lOOj ; int a[20] [20} , n, k , a s , ev , x , y , e st e =O; s :: ':" v a st ;


fstream f( " =J=a:'~ .t xt " , i o s : :in ) ; void c Lt e s ce t ) ( l I l a te l c a l n e x e mpL u I p r e ce d ent; void Lnj t () { f /1<.1 Ee L C 3 in e x e rnp Lu L pr e c edent: } i n t .succe sc r t ) { / / La fe l c e i n e x emp Lu L pre ce d e n t

in t va La d {) { l i l a te l c a i n e xernp lu .l. p r e c edent } i n t s oL u t i.e ( ) { / / La f e L c a in e x e mpl ul p rece d en t } void t i po r ( ) { I l I a fel ca i n e x e mpl u l pre cedent } void bt() { I / pa r t e a fi x 5 a algo r ~ tmu~ u i - c a i n e xempl u l preceden t } void ma in () { c Lt e s r.e t j fo r :x=l ; x < = ~ ; x~+j for (y=l ; y<= n ;y++) i f ( z !~y) { 3 t [ 1 : = ~; btl) ; }
if

(!este) cou t c c vt tu e x t s-;c Lan t ur ;

e Ier-enc a r ev r }

3.

Ver ifi carea u nu i sir de et ichete de noduri daca Iorrnoaza un Ian! simp lu.

Algor itm ui. Se verifica daca : ~ sirul de etic hete poate forma un lant (daca fiecare pereche de noduri consecutive din lant este leqata prin much ie. respec tiv arc); ~ lantul este simp lu (se verifies daca muchiile formate cu noduri le din lant nu se repeta). Impl ementarea alg or itmului . Se citesc din fisierul text graf3 .txt lista muchii lor unui graf neorientat. respectiv , din fisierul graf4 .txt lista arcelor unui graf oriental. Se citeste apoi, de la tastatura, un sir de k numere , care reprezinta etichete ale nodurilor din graf. Se verifica daca acest sir de noduri poate reprezenta un lant simplu in graf. $iru l de numere citite de la tastatura se mernoreaza in vectorul v . in vectorul z cu Inreqistrari de tip muchie, se memoreaza muchiile (arcele) pe care Ie formeaza doua noduri succesive din sirul de numere. Pentru a identifica doua muchii (arce) identice, perechile de etichete care torrneaza 0 muchie sunt memorate ordonat. Functia ci t e s t e () se fotoseste pentru a citi intorrnafiile din fisier 'Ii pentru a Ie memora in matricea de adiacenta a grafului , functia La rrt. () se

\n 1'0 rm a tica

217

toloseste pentru a verifica daca sirul de numere poate reprezenla un lant din graf, functia si mp lu () se toloseste pentru a verifica daca lantul este un lant simplu. Pentru testarea programe lor se folosesc graful neorientat G, si graful orientat G, . #includ e <f s t r e a m. :-t> s truct ~u chie t in t x, y; };

mi.:chie <: [10 J ;


i n t < ,n ,m ,a [ 1 0 ) [ 10 ) , v [ 1 0 ]; fst re a m f { "g r a f J. t x L" , ios:: i n ) ; v oid ci t este {/

t i nt i ,x ,y ; f nm ;
f or {i <; i <9n ; i ++ ) { f x y ; a [x ] I y ]~ l; aryl Ix] =l ; ) f . c l o s e ();) i n t lant () { f o r (int i = L i<Y.. : i++) i f (a{'/[ i ] ] [v(i+1]) = =0) r e t u r n 0 ; r e t ur n I ; } in t s i.mp lc {} {fo r l i nt l=l ;i<k ;i++) f o r (i n t j= i ~ l ; j < =k ; j ~~ } i f {z [i ] .x==z i j ]. x && z [i j . y= =z [ j ] . y ) ret~ -n 0 ; r e t ur n 1 ; ) v oid main () tint i ; c Lt.e a t.e t j , ccu t c c vk-. " ;cin k ; f or ( i = l; i <= f'. : i ++ ) {co u t .c-C'E 't i.c h e t a " 1. " = It ; c i n v[ i] ; } f o r {i = l ; i < k; i ++ ) i f (v [ i]<v [i+ 1 ]) { z [ i ] .x ~v [ iJ ; z [ i ] . y =v [ i + l ]; } el s e { z I L ] .z~ v [ i+ l ) ; : [ i } . y =v l i ] ; } i f (Lan t f l ) i f Ls i .rnp Lu t l ! c cu c-cc ve s t e La n t. s i.mp L u" , e ls e cou t cc vn u e s t c Lan t s iu.p Lu" , e lse cout" n u e 5~e :'a.nt " ; }

b.

c.

d.

e. f. g.

1. Scrieti un program care citeste dintr-un fisier text lista much iilor unui graf nearientat (g ra /3. /xI) sau varianta graf orientat (g ra /4.IX/), ~i care: a. Ve rifica daca un ~ir de k numer e citite de la tastatura reprezinta un lant ele me nt ar pentru graf . Cauta toate lanturile elementare cu lungimea d ~ i Ie afiseaza. Valoarea numerics d se citeste de la tastatura. Daca nu exrsta nici un lant elementar cu lungimea d, se afiseaza un mesaj. Cauta toate lanturile elementare . eu lungimea cea mai mica, ce exista intre coua noduri x si y, ~i Ie afiseaz a. Etichetele nodurilor se citesc de la tastatura. Daca nu exista nici un lant elementar , se afiseaza un mesaj.. Cauta toate lantunle elementare intr e doua noduri x si y , care tree printr-un nod z care are gradul minim in graf. Etichetele celor doua noduri se citesc de la tastatura. Daca nu exista nici un lant elementa r. se afiseaza un mesaj. Cauta toate lanturile elementare de lungime maxima ~ i afisea za cate lanturi s-au gasit ~i care sunt ele . Daca nu exista nici un lant elementar , se afiseaza un mesaj. Cauta ~i afiseaza eel mai lung lant elementar care este format din noduri care au etichete cu numere consecutive, ordonate crescator. Cauta si afiseaza eel mai scurt lant elementar care trece prin p noduri si prin q rnuchii (arce) date. Se citesc de la tastatura urmatoarete valori numerice: p - nurnar de noduri, un ~ir de p numere , care reprezinta etichete ale nodurilor din graf t q - numar de muchii ~i un slr de q perechi de numere, care reprezinta muchii (arce) din graf.

2. int r-un fisier text sunt memo rate informatii despre doua grafuri neorientate G' ~i G" : pe primul rand nurnarul de noduri ale celor ooua grafuri (n, ~ i nz), pe urrnatoarele n,

218

lmplcmenturca st r uct ur tlor de dale

rand uri mat ricea de adiacenta a grafu lui G', iar pe urm atoa rele n2 randuri matricea de adiacenta a grafului G " . Scrieti un program care citeste din fisierul text informatiile despre cele cou a grafu ri ~i care determina doua noduri p si q (p din graful G' ~ i q din graful G" ) care - daca se leaga printr-o much ie - asiqura leqatura , printr-un Ian! de lungimea k , i ntre doua noduri precizate x ~i y (x din graful G' ~ i Y din grafu l G" ). Valorile pentru x , y ~ i k se citesc de la tastaura.

2.7.7.2. Ciclul
Un Ian! care are toate muchiile distincte doua cate doua extrornitaf care coin cid - se numesto ciclu .
~i

Ciclul este un Ian! simplu ([1, ,1,) '" [1, ,1 ,,1 ,) '" [1 ,., ,1 ,)), 3 ,I, J; ...; [I" I,l " [I,." I,J; ...; [I,." I,.,J " [1 3 ); [1 in ca re extremitatile coincid : 1 ,=lk_ Un graf far a cicluri se nurne sts graf ac iclic .
Daca toate nod uriIe unui ciclu sunt distincte doua cate doua , cu excepti a extrernitatilor, ciclul S8 nurnes te cic lu clcme nta r.

Exem pl e: 1. Pentru graful neo rientat G 19 : ~ Lantul L, (1,l ) ={1, 2, 3, 6, 2, 1) nu este un ciclu deoarece in Ian! se repeta muchia [1,2). ~ Lantul L s(1 ,l ) = {1, 2, 6, 3, 7, 6, l)=C, este un ciclu neelementar deoar ece se repeta nodul cu eticheta 6. ~ l.ant ul Lo(l ,l ) = {1, 2, 3, 7, 6, 1)=C 2 este un ciclu eleme ntar deoarece nu se repeta niciun nod .

2. Pentru graful orie ntat G, o:


l.antul L4 ( 1,1) ={1, 2, 4, 5, 2, 1} nu este un ciclu deoarece i n lant se repeta arcul [l ,2J . l.an tul L5(1,1) = ( 1, 2, 5, 6, 3, 2, 4, l }=C, este un ciclu neelementar deoarece se repet a nodul cu etic heta 2. ~ t.ant ut L6 (1,1) = {1, 2, 3, 6,5,4 , 1} este un ciclu eleme ntar deoarece nu se repe ta niciun nod. . G~ .. 3. Un circuit elec tric poate fi reprezentat cu ajuto rul unui graf orientat G 21 , i n care nodu rile rete lei sunt nodurile grafu lui, iar sens ul arce lor este dat de sensu I ales pentru curentul electric - figura 25.
~ ~

R,

1 1 I 1 2

--.
I, +'
E, R,

R,

R,
2
~ I,

R,

E,

4 :;

l~

Rs

1~5' Ie" E 2

Fig. 25

Un ochi al retele i electrice repre zinta un ciclu in graful orientat. Fiecare arc k are asociate trei rnarirni: rezistenta R k, intensitatea curentului Ik ~ i tensiunea electromotoare a sursei Ek. Semnul curentului electric este dat de sensul arcului: daca arcul intra in nod, curentul electric are semnul plus, iar daca arcul lese din nod , curentul electric are semnul minus.

l nfo r rn a tica
Pentru fieca re nod din grat , se aplica teorema lntal a lui Kirc hhoff:

219

2:1, = 0
k= l

I'

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:
" 2:E,
1;", 1

q 2:1, x R,
1;= 1

unde q este nurnarul de arce ale ciclului. ......-----. ....-..... Pent ru circu itul electric din figura 25, S8 considera cunoscute urrnatoarele marirni: R" R2, R3. Rs. Rk, I" E, ~i E2. Scrieti un program care sa calculeze - in graful circuitului electric - rnarirnea rezistentei R4. Teorema 12 Daca un g raf coniine un ci clu, atunci contine ~ i un ciclu elementar.
Demons t ratie - Ia fel ca derno nstr atte de la Teorerna 11, de la sub capitoul Lant uri.

Doua lantu ri - L 1={ 1 1, 1 2, ." Ij, ... , Ik.1, I k, Ii } ~ i L'1={I'1 ' 1'2, ..., ( i l " " I'k_1, I'k t I'd care au aceeas i l ungime k, formeaza acetasi ciclu daca ex is ta un nu rna r i ntreg j , astfel incat li= I' (i+j) mod k+1, pentru orice i=1, 2, 3,... , k.

Exemp lu : in gratul neorientat G' 9 lanturi L,= :I" I" 1 3 , I" 1, 1 = { 1, 2, 6, 5, 1} ~i L ,={ I " 1 4 , I', ) = {2, 2, 13 , 1 ,=1 ~i 1,=1. Din (1+j) 6,5, 1, 2 ) care au lungimea 4 , forrneaza acelasi ciclu. Se observa 1 mod 4 + 1 = 4, rezulta ca j=2. Verificam daca pentru acest j si pentru orice i= 2, 3, 4, exista doua noduri cu aceeas i eticheta in ambele lanturi: ;=2 <> (2+2) mod 4 + 1 = 1; dar: 1 , =2 si 1 .,=2 => 1,= . 1, . si 1 ,2=6 c> 1 =1. i=3 => (3+2) mod 4 + 1 = 2; dar: 1 3=6 3 2. i=4 c> (4+2) mod 4 + 1 = 3; dar: 1 , =13 . 4= 5 ~ i 1 3 =5 => 1 In gratul neorientat G ' 9 lanturi L,= {I" 1 .3 , 1 2, 1 3, 1 4 , I, ) = : 1,2, 6, 5, 11 ~i L ,=:;" I" 1 4 , I , ) = { 2, 5,6 ,1 , 2 } care au lungimea 4, nu forrneaza acelasi ciclu . Se obse rva 1,=1 si 14 =1. Din (1+j) mod 4 + 1 = 4, rezulta ca j=2. Veriflcarn daca pentru acest j ~ i pentru orice ;= 2, 3, 4, exista doua noduri eu aceeasi eticheta in ambele lanturi: , i=2 <> (2+2) mod 4 + 1 = 1; dar: 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 Alg oritmul. 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 rack ing , 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 algoritm ului. 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 ciclu rile elementare care exista in graf ~ i se afiseaza . Daca nu exista niei un ciclu elementar, se afiseaza un mesaj. Pentru testarea programelor se lo losesc gratul neorientat G, si gratul orientat G9 .

220
#in clude < f s t ream .L>

Implementa rea stru cturllor d e d a t e

typedef s tiv a [lOO J ; int a[2 0 J [20 ] , 0 , k a s , ev , x , e s t e e O, s t i v a st ;


i

void citeste() void .i n i t Cl

fstream f( "g ra f l .txt " , i o s : :i n ) ; ( I I :;; e c i t.c s t c me t .r i cee d e e d a a cent.a d in f.i s i.e rI

{ / / es t e ident i c a c:.:: cea de 1a a f i $area l a n t;:ur i lor elen;e:1tare }


int s u c c e s o r ()

{! Ze s t e .i d e n t L o a CD CEa de La c L i se rce Lan t u .. ri L c r e Lemen t a r e } int va Li d () { / / s-s t e Ldent t ca ell cea c e La af t s e re a Lan t ur i.Lo r element are } i nt ~') o l 1J r, i e ( ) {return a [ s t[ k] ] j x ]== l && k>2 ; }
lise ob;;:ine solut;:iaatunci canci ultimlJl nodadaugat este ad iacent //nodu lui x ~i in s t i vb cxist~ eel pu~i n troi Docturi
void t Lpa r () {f or (i n t i=l , e st e= lii <= k; i ++ ) ccuts t [i] " "; cou t xendl;} void bti} { / I p a r t e a fix a a e Lqc r i t.mu l ui.
v oid main () { c i t e st e.t I :

for ( z=1:x<=n ;x++j { s t j Ll e x : bt () ; } i f (Le s t.e j oou t.c-cv Nu e x i.s t.e n.i c i. u ri c .icl.uve L eme ri ua r" i }

1. i n exemp lul prece de nt, sunt afisate lanturi care tormeaza acelasi cicl u (acelas i ciclu este afisat de mai multe ori: deosebirea consta do ar in nodul cu care se i ncepe ~i se i nchei e ciclu l). Modificati programul astfel tnca t sa se elimine afis area inforrnatie i redu ndante (afisarea aceluia si cicl u de mai multe ori ). 2. Scrieti un progra m care cites te din fisier ul te xt graI3 !x! lista muchiilor unui graf neorientat - si afiseaza to ate cicl urile elementare care trec printr-un nod cu grad ul minim . 3. Scrie ti un prog ram care citeste din fisieru l text graI3. !x! lista muchiilor unui grat neo rientat si care verifica daca un sir de k numere citite de la tastatura reprezinta un cic lu eleme nta r pent ru graf .
4. Scrieti un program care citeste din fisierul text graI4.!x! lista arcelor unui graf orientat si care:

a. Cauta toate cicluri le elementare care exista in graf !?i Ie afiseaza. Daca nu exists nieiun eic!u ele mentar, S8 afiseaza un mesaj. b. Ca uta toate cicluri!e elementare care tree prin toate noduri le gra fului si Ie aflseaza. Daca nu ex ista nici un eiclu elementar care trece prin toate nodurile grafului, se afiseaza un mesaj. c. Cauta toate ciclurile elementare de lungime ma xima care tre e prin nodul x - ~ i Ie afiseaza. Etieheta nodulu i se cite ste de la tastatura . Oaca nu exista nici un cielu elementa r care sa trea ca prin nodul x , se afiseaza un mesaj.

2.7.7.3. Drumul
Intr-un gral orientat G= (X,Uj se doflnosto un drum ca f ii n d a succesiune de noduri care au proprietatea ca - oric are ar f i doua nod uri succes iveele sunt legate print r-un arc . Daca , intr-un graf orientat , rnultimea nodur ilor este X ={X1, X2, ... , xn}, iar multirnea areelor este U=(U" U2, ..., Urn}, un drum de la nodul d , la nodu l dk - D(d k) - va f definit prin "d

Infonnaticii

221

rnultim ea nadurilar D(d k) = {d d" ..., dkJ, unde d,EU, pentru orice i (t si sk ), iar arcele "d[dk- l ,dk)"E U. Drumul poale fi privit ca un lant In care parcu rgerea [d d, ], [d 2,d 3 ] , [d 3 ,d4], ..., " S8 faca in sensu ! arcului care leaqa nodurile. Oaca exista de la un nod la altu l trebuie D(xj,xj), S8 spune ca nodul Xj este ac cesibil di n nodu l x..

sa

Terminolog ie :

-7 Lungimea unui drum este data de nurnarul de arce care i l compun . in cazu l in care
arcele au asociate lunqirni, lungimea unu i drum este data de suma lungimilor arce lor care iI com pun . -7 Drumul de lu n gim c minima dintre nadu l d, ~i nadul dJ - Dm,"(d" dj) - este drumul cu numa rul minim de aree din m ultimea nevida de drum uri D(di,dJ} . -7 Subdrumul este format dintr-un sir cantin uu de nod uri din drum. De exem plu, pent ru lantu l D(d d k)= {d d" ..., d, ..., dj , ... , dk:, 0, (d" dj ) definil astfe l: D, (d" dj) = :d" d,., , _ " " dj_1 , dJ ) - este un subdrum al drum ului D.

Drumul elementar este drum ul in care nodurile sunt distincte doua cate doua , Dru mul simplu este drumu l i n care arcele sunt distincte dou a cate doua.
Exe m ple - Pen tru graful arientat Gzo. -7 l.antul L,( 1,6) = (1, 2, 5, 6) nu este un drum dea arec e parcurgerea nu se face i n sens ul saqetilor, -7 l.antul L 8(1,6) = (1 , 2, 3, 6, 3, 6) = 0 , este un drum neelementar, deoarece se repeta eli cheta nadurilar 3 si 6 - si campu s, deaarece prin arcul [3 ,6] s-a trecut de doua ori. -7 l.antul L,( 1,6) = (1 , 2, 3, 7, 6) = 0 , este un drum elementar, deaarec e nu se repeta nici un nod . -7 t.antul L9 (1,6) = (1, 2, 4, 5, 2, 3, 6}= D, este un drum sirnplu , deoa rece nici un arc nu a fost parcu rs de doua ori. dar este un drum neelemen tar, deoarece se repeta nod ul cu etich ela 2. Teorema 13 Daca un grat neorientat confine un drum intre doua noduri, x i atunci, contine i un drum elementar, Intre nodu rile x i y.
nemon strat!o - la fel ca demonstratia de la Teorema1 1 de la subcapitolul Lanturi.

y,

A l g o r it m i pentru determina rea drumurilor elem cntare intr-un g raf orientat 1. Aftsarea drumuri lor el em entare din grato Algoribnul. Se va folosi algoritmul pentru determinarea tuturor lanturilor elementare din graft la care elementul solutiei generat in 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 algoritmu lui. Se cite ste din fis ierul graf2tx t mat ricea de adiac enta a unui graf orientat. Se ca uta toate drum urile elemen ta re care exista i n graf - si se afiseaz a. Dac a nu exista nic i un drum ele mentar , S8 afiseaza un mes aj . Pentru testarea prog ramului se folos este graful oriental Go-

#inc lude <fs 'Cre a m. h >


typedef
stiva [~OC] ;

int a l20J [ 2 0 } , 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 ) ; vo id c i t.e s t.e.l ) { / I s e c it.e s t e rna t r i cee de c d i ac en t a d i n f La i.e.r }

222
void ini.t ()

Im plemcnt a r ea str uct u rt lor dc d atc


{/ / coenttce ell c ea de 'La atLsaroa Larrt.u.r i.Lo r'< e Lemerrt .ar e ]

int s u c c e s o r () {! lea c e e vcte 1a af i se rce Lan t.u .ri.Lo r c Iemcnt ar-e )


int valid ( ) {if i k > l ) if (a[ st[ k - 1J] [ s t [ kJ ]~= O I return 0 ; for {i n t i"'=l ; i<k ;i ++l i f ( 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 {)
II.

{for (i n t i = l , e s t e ""=l ; i <= k ; i ++ ) cou t st[ i] "

cout xendl;}

void bt O { / lpar teo fi xa a a Lq o.r i t rnul ui }


void main () {c i teste fi ; f or (x=l; x<=n ;x++J f o r Cy~l ; y < ~ n ; y H I if ( x! ~y l i f { ! es t e I cout" Nu e xi s ta " ; }

( s t [ l l ~x ;

bt. () ; }

2. Algoritmul Roy -Warshall de determ inare a rnatricei drumurilor. Matricea drumurilor este 0 matrice patrat a binara de dimen siune n (n rep reze ntand ordinul grafulu i), delinita astlel: a[ilDl ~ { 1, daca exista d rum de la nodul i la nodul j 0, daca nu exista drum de la nodul i la nodul j lnforrnatiil e din rn atri ce a drumurilor se pot folosi pentru a verifica daca exi sta drum i ntra doua noduri al e grafului Algoritmul. Daca nu exists un arc de la nodul i la nodul j , con siderarn ca exista d rum de la nodu l i la nodul j , daca exista un nod k (ksel ~i k*j) care are propri etatea ca exi sta un drum de la nodul i la nodul k ~i un drum de la nodul k la nodul j . Matneea ~ 2 drumurilor S8 obtine din matricea de adiacenta prin transformari 3 4 5 sueeesive, astfe l: se gene:eaza toate nodurile k (1;;k;; n), iar pentru fieeare nod k se genereaza toat e perechile de noduri i (Lek) ~, j (jek ) Fig , 26 si se verifica daca a li ] [kJ~l ~i ark] [j]=1. in eaz afirmativ, i n matri cea de adiacenta S8 atribuie valoarea 1 elernentului a [i] [j]. 3 4 5 1 2 G" Pentru graful G" din figu ra 26 matrieea de adiacenta sutera 1 0 1 0 0 0 0 1 0 0 urmatoarele cinei transformari. La fiecare transformare , daca 2 0 1 1 0 1 0 3 dru mu l de la nodul i la nodul j trece prin nodu l intermediar k 0 0 0 0 1 4 (drumu l treee de la nodul i la nodul k si de la nodul k la nodul 0 0 0 1 0 J), atunci el ementului a [i] [j ) i se va atribu i valoarea 1. 5

k=1
1
2

k=2
1 2 3
4

k=3
345 1 0 0 0 1 0 1 1 0 1 0 0 0 1 0

3 4 5

0 0 1 0 0

2345 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0

0 0 1 0 0

2 1 0 1 0 0

1
2

3
4

1 1 1 1
0

1 1 1
0

5 3 ---- 1 1 1 0
4

~ - ~5 1 1 1 1

1 1 1 0 0

CeQ1 IQ
1 0
0 1 0

k=4

k=5

"

2
1 2 3
4

~ 1 1
0

1 1 1 0

3 1 1
1 0

4 1 1 1 0

5 0 0 0 1

1 2 3
4

1 1 0

2 1 1 1 0

-- - -

1 1 1 1

~ - - _ .

I n f orm al ica

223

Interpretarea datelar din matricea obtinuta in urma transfo rma rilor se lace astfe l: exista drum de la nadul i la nadul j daca a [i 1 [ j 1~ 1. De exemp lu, exista drum de la nadul 2 la nadul 4 . dar nu exists drum de la nadul 4 la nadul 2.
Implem entarea alg oritm u l ui. Se citeste din fisieru l graf20.txt matricea de adiace nta a unui gral oriental. Se afiseaza toate perechile de naduri din gral intre care exista un drum . Functia ci teste () se foloseste pentru a citi matricea de adiacenta din fisier, Functia transforma () S8 foloseste pentru a transforma matricea de adiacenta in matrieea drumurilor. Matricea de adiacenta va suferi n transforrnari succesive (pentru fiecare noua valaare a lui k) , astlel: fiecare element a [i 1 [ j], cu Leek ,i j"k , este inlacuit cu valoarea produsului a [iJ [k ] *a [k] [j] - ceea ce este echivalent cu a atribui valoarea 1 acestui element daca ali ] [k]~l, i a rk] [ j]~1. Functia afiseaza() se foloseste pentru a afisa toate perechile de noduri i !?i j intre care exists drum. Aceste perech i sunt identificate in matricea drumurilor ca fiind indicele pentru linie si indicele pentru colcana ale elemente Jor care au valaarea 1. Pentru testarea pragramului se Ioloseste graful arientat G" .

#i nclude <fs t ream .h> int a[20 ] [20],n ;


fstream ( " g r a f 20. txt " f Lo s : : in ) ;

void cit es te()

{l i se

c i tc~ te

mat r i cea de ad iacent5 din

f i~ ie r }

void t r e ns tc rme () . {for (int k=l; k<= n ; k++} for {int i = l; i <= n; i + + ) for{int j = l ; j<=n;j++ l

i f {a [ i ] [ j]~ ~ O && .il e k && j! ~ k ) a li. ] [ j ] ~ a [i. ] [k] *a[kl [j ] ; ) vo id a f i ae a z a t) {c o ut " Ex i s t a drum intre perechi lede nodilri " e nd l ; for (int j.::-""l,- i<=n ;i i+) f or (int j =l ; j <"-" n;j++-} i f (a [i. ] [ j ] ~ ~ l && .i ! ~j) cou t;e ;e;" ( " i. " , " j " ) "" " ; ) voi d main() { c i.te s t. e t L : t. c a n a r o r ma ri . a f Ls eaz a Ll : } Complexitatea algarilm ului Ray -Warshall
Algoritmul de transformare a matricei de adiacenta Tn matricea drumurilor are ordinul de complexitate O(n xnxn)= O(n\ deoarece fiecare stru'ctura repetitiva for se executa de n ori, iar structurile fo r sunt imbricate.

Scrieti un program care citeste , din fisierul text graf4 .txt, lista muchiilar unui graf orientat - ~ i care a. Verifica daca un sir de k numere cit ite de la tas tatura reprezinta un drum elementar pentru graf. b. Cauta to ate drumurile elementare cu lungimea cea mai mica dintre dou a noduri x :;;i y :;;i le afiseaza . Etichetele nodurilor se citesc de la tasta tu ra, Daca nu exista niciun drum elem entar, sa se afiseze un mesaj . c. Cauta toa te drumurile elementare de lungime maxima :;;i afiseaza cate dru muri s-au gasit :;;i car e sunt ele. Daca nu exists niciu n drum ele mentar, sa se afise ze un mesa j.

2.7.7.4. Circu itul


lntr-un graf ori entat un drum care are toate arcele distincte doua ca te doua ~i extrernitati care coincid se nurneste c ir cuit.
Circuitul este un drum simplu (arcele sunt distincte doua cate doua ([d"d2I t~[d"d 31: [d ,]t[d 3,d4 ] : ... ; [d , ] t [dk_ ki; ...; [dk~"d k~ 11~t[d k~1,dJ) in care extrernitatile caincid (d,~d k). "d "d "d

224

Implement area st r uc t u r ilor de date

Circuitul oternentar este circuitul i n care toate nodu rile sunt distincte doua cate doua, cu exceptia primulu i ~ i a ultimulu i - care coincid. Exe m ple - Pentru gral ul orientat 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) ~i [6 ,3) au lost parc urse de doua ori. -7 Lantul L,, (1,1) = {1, 2, 3, 6, 3, 7, 6, 5, 2. 4, l}=C, este 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) =C2 este un circuit elementar , deoarece nu se repeta eticheta niciunui nod .

Toorerna 14
Daca u n graf co nt ine un ci rcuit, atunc i contine
~i

un c ir c uit elem en tar.

Demcn st rati e - Ia fel ca dernonstratia de la Teorema11 de la subcapitolul Lanturi.

Algoritm pentru determinarea circuitelor elementare intr-un graf orientat Al goritim ul. Se foloseste acelasi algoritm ca
~i

in cazul determinarii ciclurilor elementare intr-un

graf orienta t, cu deosebirea ca se tine cont de orienta rea arcului care lea qa dou a nod uri.

#i nc l ude ~fs tYe am .~> typedef st i v a [lOO] ; in t a [ 20J (20] , :l, k, a s, e v, x ,e s t e= O; stiva st ; f s tre am f ( "gra::2 . t x t " ios : : in ) ; vo i d c i t e s t e t ) { l i s e c i t e s t;e ma tr Lcea de ad Lac ent.e di n f i.s i e r } void ini t ( ) {! / i de n ti c B cu cca de la a f l.so rce Lantu r j Lo.r c l e ment.e r e l i n t succe so r () { / / Jcenr t ca C'J cea de La af i serca Lant.u r i Lor e Lement a r e } in t VC11id () ( i f l k > l ) i f (a [st [k-l IJ l sr I kl 1~~O I r e tu rn 0 ; fo r ( 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 s o Lu t La a tunc i, caner ultimul nod a c<'fJugat e s t e acl i a c en t / In od"u lui x $1 1n e r Iva e x i ar e eel pu t Ln ooua nodu r i void t1E-'u I ( ) {for {Ln t; i =l,este"-:' ;i<=}: ;i++ } cout cc s t Li l c-c " " ; c o ut x endl ;} void b t () ( / /pa r t e a f i x a <;). e I q o r j trn c Iu i } 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 ou t.c -C'N u c x i s t e c Lr cu i :''3 '' ; }
I

Scriet i un program care cite ste, din fisieru l text graf4. txt , lista arcelor unu i gra f orientat - si care : a. Cauta toate circu itele elementare care exista in gra f si Ie afiseaza. Oaca nu exi sta niciun circu it elementa r, se afiseaza un mesaj . b. Cauta toate circu itele elementare de lungime maxima care trec printr-un nod x si Ie afiseaza. Eticheta nodului se citeste de la tastatura. Oaca nu exista nic iun circuit elemen tar ca re sa treaca prin nodu l x , S8 aflseaza un mesaj . c. Cauta toate circuite le elementare care trec prin toate nodurile grafului ~i Ie afiseaza . Daca nu exista nici un circu it ele mentar care trece prin toate nodurile grafulu i, se afiseaza un mesa j .

InI'll rill a t i cil

225

d. Cauta toate circuitele elementare care tree numa i prin noduri ca re au gradul intern ega l cu gradul extern - ~i Ie afisea za. 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, exlsta un lant care sa Ie lege.

Altfel spus, un graf este conex daca , pentru orice pereche de noduri {x, X j}, care au proprietatea XjTXj exista un lant de la Xi la XJ. Exemple: 1. Graful neorientat G ' 9 = (X,.,U' 9) definit anterior este un graf conex, deoarece oricare ar fi doua noduri din rnultim ea X" ele pot fi legate printr-un lant. De exemplu, (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 cone x, 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 = (X23,U23) - figura 27 - defimt astfel: G" -7 rnultimea nodurilor este X23={1,2,3,4,5,6,7,8}. ' - - " 6 \ _ ... -7 rnult imea muchiil or este U23 ={[1 ,2J , [1,4J, [2,3J, I 1 2 \ I " 1 5 I I [2,4J, [3,4J . [5,6J , [5,7J}. I I .... ,/ 3 / \ . __ ~ " I nu este con ex, deoarece nu exista niei un lant intre un \. 4 ... -' nod din rnultirnea C,={ l ,2,3,4} ~ i un nod din multi rnea C1 C2 C2={5,6,7}, sau din muttimea C3={8}. Fig . 27 Daca un graf G=(X,U) nu este conex, se poate defini un subgraf conex al grafului G, adica se poate defini a rnultirne X'eX care sa indues subgraful G'=(X',U'), ce are proprietatea ca este conex .

'~ '
-_

It@\ C3

Dac a un graf G=(X,U) nu este co nex, se nurn est o componenta conexa a grafului un sub qraf co nex al sa u C=(X',U'), m aximal in rap ort cu aceasta pro prietate [contine numa rul ma xim de nod uri din G ca re au proprietatea di sunt legat e cu un lant}, Altfel spus, subgraful conex C este a components conexa a grafului caca are proprietatea ca nu exists nici un lant, al grafului G, care sa uneasca un nod x, al subqrafului C (X, EX') cu un nod x, care nu apartine subgrafului C (X ,EX-X'). Observ ati e: Un graf conex are
0

sinqura cornponenta conoxa (grafuJ insusi).

Exemplu - i n graful neorientat G23 definit anterior, fiecare dintre cele trei rnultimi de noduri, C l , C2 si C3 , induce cate 0 components conexa . Daca un graf este defin it prin multimea nodurilor si rnultirnea muchiilor, -7 rnultirnea nod ur ilor este X23={1,2,3,4,5.6,7,8}. -7 rnul tim ea m uchiilor este U23 ={[1Z], llAJ, [231. [2.4J , [3.41, [~'l , [~J} . pentru identificarea componentelor conexe, procedati astfel: PAS1. Se formeaz a prima components conexa , pornind de la prima muc hie. Se scriu nodurile incidente cu muchia i n prima cornponenta conexa - C,={l ,2} - ~ i se marche aza rnuchia: [12]. Componenta conexa C l este componenta cure nta.

226
PAS2.

Implementa rea struetllri lor de date

Se parcu rg celelalle rnuchii. Dad; se qaseste a much ie nernarcata, care contine noduri din com ponenta conexa curenta, 58 adauqa nodu rile la cornponenta : C,; {1,2,4,3), se rnarche aza much ia: [11], ~ , !L], QAj. PAS3 . Daca rna! exista much ii nemarcate , S8 identifica prima muchie nernarcata si S8 formeaza urrnatoarea componenta conexa, scriind nodurile incidente cu muchia - C, ;{5,6} ~i S8 rnarcheaza mu chia: [5 .6.1. Componenta conexa C 2 este componenta curenta. PAS4. Se parcurg celela lte muchii. Daca se gase, te a muchie nernarcata care contine nod uri din componenta conexa curenta, S 8 adauqa noduri le la cornponenta: C,;{5,6,7} si se marcheaza muchia: [w. PAS5 . Se executa Pasul 3 ,i Pasul 4 pana se marcheaza toate muchiile, ldentificand urrnatoarete componente conexe . PAS6. Se verifica daca t0 3 t8 nodurile din rnultirnea nodu rilor 58 reqasesc i ntr-o components conexa. Daca exists noduli care nu apartin unei componente conexe, acestea sunt noduri izolate, , i vor forma, fiecare dintre ele, a compcnenta conexa. C3 ;{8}.

,i

Teorema 15
Numarul minim de muchii

mmin

necesar e pentru c a un cortex este n..... 1 .

g ra f

neo rient at,

eu n

n o du r i . s a f l e

Altfe l spus , intr-un graf neorientat con ex cu m rnuchii 9i n no duri: rnzn -d .


Demonstratie. Notarn cele doua prop czitii, astfel: (1) - G raf ul G neorientat, cu n noduri, are n -1 muchii si este conex . (2) - Grafu l G neorientat , cu n nodu ri, este conex ~i minima l cu aco asta proprietate (d aca se Inlatura orice mu chie din graf , el devine neconex). Trebu ie sa oernoostra-n ca (1).:;::>(2) - Se foloses te pnncipiu l inductiei matematice (se note aza 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 prop rietate (nu ma i exist a much ii care sa fie elimin ate ) P2 - G rafu l G2, cu doua nodu ri 9i a muchie (m ::2-1=1), es te cone x (muchia nu poate lega cecat ce te doua noduri) 9i este minima l cu aceasta propne tate (prin elimina rea muchiei, noduri le sunt izolate cbtinan du-se coua componente conexe). P3 - Graful G3, cu tre i nod uri si c oua muchii (m=3 -1 =2), este conex (cele d oua muchii sunt Inctdente: unul dintre nod uri este adiacent cu ce \e doua much ii - ;;i prin el va trece lantu l care leag a celelalte doua nod uri) ~ i este min ima l cu aceasta proprietate (prin el imina re a unei muchii, unul dintre noduri este izolat, obtmandu -se doua com ponente conexe ). Pn - Graful G n, cu n noduri ;;i n-1 muchii, este conex ~i min imal cu aceasta pro prietate (se presupune adevarata ). P n+1 - Considerand prcpozitia Pn adevarata . trebuie sa demonstram ca grafu l G n+1 , cu n+1 noduri ~i n+2 muchi i, este conex 9i m inimal cu aceasta propr ietate. Prin adauqarea un ui nod s! a unei mucb li la grafu l G n, se poate obtine un graf con ex . Nod ul adauqat se leaqa cu much ia noua de graful G n (;;i, im plicit, la lanturile din acest graf) , obtinandu-se un nou graf con ex . Presupunem graful obtinut nu este min imal cu aceasta propri etate. Inseamna ca, pr in eliminarea une i much ii, se obtine un graf conex. Daca eliminarn muchia adauqata, se izole aza nodul n+ 1, cbtina ndu-se doua com ponente cone xe . Daca se elirni na a much ie din graful G n, se obtin dOU8 comp onen te conexe, deoare ce graful G n est e m inima l cu aceasta proprietate . Rezulta graful G n este minimal cu aceasta proprietate .

ca

ca

Exemple de grafuri conexe cu n noduri 9i nurna r minim de much ii: ~ Fiecare nod es te legat de aile doua. cu exceptla a doua nod uri term inale Exis ta n-2 noduri cu gradul2 ~i doua noduri cu qr adulf ;
1lI " ,in ::::

2x( n -2 ) +2 x l 2

n- t

Informatica
~

227
~i

Un nod este legat de celela lte n-1 noduri. Exista un nod cu gradul n-1 IX( I1 - I) +(I1 -I)xl
Ill",;"

n-1 nod uri cu gradul1 .

n -I

Propozitia 4 . Daca un graf cu n noduri are p compo nente conexe , atunci nurnarul minim de muchii care trebuie adauqate , ca sa devina conex, este p-1.
Demonstratle Putem considera fiecare cornponenta conexa ca un nod a! unui graf cu p nodun.
Numaru! min im de muchii necesare pentru ca acest graf sa fie conex este p-1 .

Propozitia 5 . Daca un graf conex cu n noduri are n-1 muchii, atunci orice pereche de noduri este leqata printr-un lant, ~i nurnai unul.
Dem onstratie - prin redu cere la absu rd. Graful G fiind conex , rnsc amna ca exista eel puttn un lant care leaqa cricare dou a nod uri, x ~ i y . Presupunem ca exista eel putin dou a lantur i i ntre ncdurile x ~ i y : L1 ~ i L 2. Insearrme ca . suprimand a much ie din lantul al do ilea. graful rarnane conex , deoa rece nod uriIe x ~i y vor fi legate prin lantul L1. lnsearn na ca un graf cu n noduri s! n-2 muchii este conex , ceea ce cont raz ice Teorema 15. Rez ulta ca cele doua nodu ri, x ~i y , nu sunt legate decaf printr-un singur tent

Propozitia 6. Daca un graf neorientat cu n noduri ~i m rnuchii este conex, nurnarul maxim de much ii care se pot elimina pentru a obtine un graf partial conex este: m -n+1 .
Demonstratle. Oeoarece numaru l minim de much ii necesare pentru ca un graf sa fie conex este n-1, atunei din graf se pot elim ina restu l much iilor: m-n+1 .

Teororna 16
Un graf neorientat conox cu n noduri ~i n...:.1 muchll este aciclic ~ i maximal cu aceasta proprietate.
Demonstratle: Notam eele coua propozi tii, astte l; (1) - Graful G neor ientat, cu n noduri, este conex ~ i are n-1 muchi i. (2) - Gra ful G neo rientat , cu n noduri, este aciclic si maxima l cu aceas ta prop rietate Trebuie sa dernonstram ca (1)::::>(2). 1) Este acieli c - prin reducere la absurd . Presupunem ca acest graf confine eel putin un ciclu. C= lX l , X2 , X3 , ..., Xi, x, f. Insearnna ca, daca vom lnlat ura din graf muchia [x - . X2], se obtine un graf conex - nodul va fi legat de toate celelalte nodu ri din ciclu prin lantul L :;; ~X2 , X3, ..., Xi, x- } - ceea ce cont razice teo rema anterioa ra. CEl un graf cu n noduri ~i n-1 muehii este eonex si minimal eu acees ta proprietate . 2) Este maximal eu acea st a pr opriet ate (daca S8 adauqa 0 noca mue hie, grafu l nu mai este aciclic) - prin reducere la absu rd. Pres upu nem prin adauparea une i m uchii oarecare [x,y], se obtine un gra f aci clic. Graful fiind conex , tnseamna ca Intre nodurile x ~ j y exista un Ian! L(x,y) elx , .., z, ... , y:, tar prin adauqarea muchiei [x.yjlantu l se i nchide, torman d un ciclu Ceqx, ..., Z , . .. , y , x ) - ceea ee cont razice presupunerea ca gra ful este aciclic.

ca

Propozit!a 7 . Daca un graf neorientat conex are n noduri ~i m rnuchii, nurnarul de much ii care trebuie eliminate , pent ru a obtine un graf partial eoncx aciclic , este egal cu m-n+1 .

n emon stratr e. Din Prop ozitia 6, rezutta CEl - i nlaturand din graf m-n+1 muchii - se obtine un graf partia l conex , iar din Teo rema 16 rezulta ca acest graf este acidic. Graful fiind eonex , lnseamna ca Intre oricare do ua noduri. Xi ~ i Xj , exista un lant elementar ~ i numai unu \ (Propozitia 5). Orice noua muehi e [ Xi, Xj] adauqata va forma eu acest lant un ciclu elemen tar.
Propozitia 8 . Daca un graf are n noduri, m muchii si p compo nente conexe, nurnarul de much ii care trebu ie eliminate, pentru a obtine un graf partial aeie lic , este egal cu m -n+p.
Demonstratie. Fiecare cornponenta con exa i
(1:s:i ~

p) va avea nj noduri

~i

m, muchii, iar:

228
I'

Implcmcnt urcn st r ucru r ilu r d e <l ate

:;;i 2)n j = 111


;"'1

Nurnarul de muchii care trebuie eliminate din compon enta conexa i, pen tru a obtine un graf part ial cone x aciclic . este egal cu rn, - n: +1 (Propo zina 7). Rezulta numarul total de rnuchii care trebuie eliminate din grat, pentru a obfine gra f partial conex acidic, este egal cu :

ca

I(m,- n + I) = I
i
j ", 1

I'

II

Ill , -

j "' l

i=]

In, + P = m- 11 + "

II

Propozltia 9. Pentru a obtme, dintr-un gra! neerientat cenex, doua componente conexe, nurnarul minim de muchii care trebuie inlaturate mm in este egal cu gradul minim din graf: Hl mln = grad m in .
Dem onstrati e. Ce le d OUE! co m ponente conexe ale unui graf neo rientat con ex G=(X,U) S8 obtin astfel: ~ Componenta con exa C1=(X1,U1) S8 formeaza dintr-un nod izolat Xi - pent ru a elim ina un numer minim de mucnu, nodul S8 alege dintre nodurile care au gradul minim: X, = {Xi } ~ i U,=0 . ~ Cam panenta conexa C 2=(X2,U2) se forrneaza din restul nodurilor din graf: X2=X-{Xi} ~i card( U,}=rn-grad min

Teorema 17 Numarul maxim de muchii rnmax d intr- un graf neorientat , cu n noduri ~ i p componente conexe, este :
m
ru3\

= -,I, ' ',-_ - -'.I':.c )_ x-,: (, ' ',_ - -'.1'_+ :........:. 1)


-

Dernon strati e - prin reducere la absu rd. Numarul m axim de rnuchii corespunde unor p-1 com ponente cone xe forma te din naduri izolate s! a cc mponenta conexa ferma ta cu n-p+1 nod uri. Pentru ca sa se ab!ina nurnarul maxim de rnucttii. ultima componenta trebuie sa fie un graf comp let K n_p care are nurr-arul de much ii m:

+ ,

III

:::0

"--'-"-7'---'--"-

(n -p ) x (n -p +l )

Sa pres upu nem ca exis ta Ins a un graf format din p-2 componente conexe forma te din noduri izolate ~i cu dou a cornponen te conex e C, cu n, noduri ~i muchii ~i C2 CU na noduri ~i 1n2 mu ch Ii, cu n , ~ n 2~ 2, n, + " 2 = n-p+2 care are numarul maxim de muchii m, + m z = m max Cele doua componente conexe pe ntru a avea un numar maxim de muchii trebuie sa fie qrafuri complete: C, =K n1 ~i C2=K n2 Modificam ace st qraf rnutand un nod din companenta C2 i n componenta C, . in com ponenta C, acest nod trebuie unit prin much ii cu cel e n, nod uri ale componentei. Nurnarul de muchii ale componentei C, va fi m, + ", . in componenta C2 prin eurnmarea nodului. se inliHura ~i cere na - 1 rnuchii care iI uneau cu celelate noduri din graf. Numarul de muchii ale componentei C2 va fi m 2- "2 + 1. Numarul tota l de muchii al nou lui gra f este + n, + m 2 - ttz + 1 ~ 1n1 + m2 + 1 = m max+ 1. Concluzia contrazice ipoteza ca gratu l initial avea nurnarul maxim de muchii. lnsearnna ca graful care are nurnarul max im de muchii es te cel care conune p-1 compo nente conexe form ate din noduri izolate s! o cornpcn enta conexa forrnata cu n- p+1 noduri care este graful complet K n_p

In,

In,

+ '.

2.7.7.6. Graful tare conex


Un gra! orientat G se nurneste gra! tare conex daca are proprietatea ca, pentru ori ce perech e de noduri diferite i nt re ele, exi sta un drum care sa le leg e. Aille l spus , un gra! orientat este tare conex caca - pentru orice pereehe de noduri { Xi, Xj} , ca re au proprietatea x /*Xj - exista un drum de la Xi la Xj.

Informatid Exemple : 1.

229

Graful orientat G20 = (X 20,U 20 ) , detinit anterior, este un graf tare conex, deoarece exista un circ uit elementar care trece prin toate nodu rile grafulu i: (1,2,3,7,6,5,4 ,1): altfel spus , oricare ar fi doua noduri din multimea X 20 , ele pot fi legate pri ntr-un drum . G'4

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 arce lor este U'4 =([ 1,2], [1,41, [2,31 , [3, 1], [4,5], [5,4]). nu este conex, deoarece nu exista niei un drum lntre un nod din multirnea C, =(4,5} ~ i un nod din rnultimea C,=(1,2 ,3}, sau din rnultirne a C,=(6}. Daca un graf orie ntat G=(X,U) nu este tare conex , se poate 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 con ex .

2.

- -, -,
C3

C1

Fig. 28

Daca un graf G=(X,U) nu este cone x, se nurn este componenta tare conexa a grafului un subgraf con ex C=(X' ,U') al sau, maximal i n raport cu acea sta propri etate [confine nurnarul maxim de noduri din G care au proprietatea ca sunt legate printr-un drum ). Altfel spus , subgraful tare conex C este 0 cornp onenta tare conexa a grafului daca are propr ietatea ca nu exists niei un drum al grafului G care uneasca un nod Xi al subqrafului C (X;EX') cu un nod xJ care nu apartine subgrafului C (XJ EX-X') .

sa

Exem plu - i n grafu l orientat G24 defini t anter ior, fiecare dintre cele trei multirn i de noduri C 1 , C 2 si C 3 - induce cate 0 cornp one nta tare ccnexa . Observatie : Un graf tare conex are 0 sinqura cornponenta tare conoxa (graful insusi) .

Terminologie : -7 Subqraful predecesorilor unui nod este format din ace I nod si din multimea noduri lor din care este accesibil nodu l. -7 Subgraful succesorilor unui nod este format din acel nod si din rnultirnea noduri lor care sunt accesibile din el. Observatie: Componenta tare conexa di n care face parte un no d este data de intorsectla dintre subgraful predecesorilor l?i subgraful succesorilor ace lu i no d.
Daca un graf este definit prin multirnea nodur ilor si rnultimea muchii lor, -7 multirnea no duril or este X 24=(1 ,2,3,4,5,6). -7 multirnea arcelor este U'4 =([1 ,2], [1,4J, [2,3J, [3,1], [4,5], [5,4]). pentru identi ficarea componentelor tare conexe procedati astfel: PAS1. Se identifica subgrafu l succesorilor primului nod din primu l arc (1n exe mp lu, nodu l 1), folosind algo ritmul de deter minare a unei componente conexe: S, =(1 ,2,3,4,5). PAS2. Se ide ntifica subgraful predecesorilor primului nod din primul arc (i n exemp lu, nodul 1), folos ind algoritmul de determinare a unei componente conexe , in care se iau i n calcu l num ai nodurile care apar in arc in a doua pozitie: P1={1,2,3}. PAS3. Se determine com ponenta ta re conexa - prin intersectia celor doua rnult imi de noduri: C ,= S,n P, ={1 ,2,3). PAS4. Se identifica, in multimea arcelor, primu l nod care nu face parte din compone nta tare conexa evidentiata anterior (in exemp lu, nodul 4) ~ i se reiau Pasul 1, Pasul 2 si Pasul 3, pentr u a determina subgraful succesorilor, respecti v subgraful predece-

230

Im p lcrncn ta rca stru ct ur ilor dc date

sorilor nodul ui si apoi urmatoarea cornponenta conexa . prin intersectia celor doua rnultirni (in exempl u, nodul 4 ~i S2={4,5), P2={1 ,2,3 A, 5} ~i C2= S2" P2 ={4,5)). Se repeta acest pas pana cane nu S8 mai identifica in rnultirnea arcelor niciun nod care sa nu apartina unei componente tare conexe. PAS5 . Se verifica daca toate nodurile din rnultimea noduri lor se reqasesc intr-o components tare consxa. Daca exista noduri care nu apartin unei componente tare canexe, acestea sunt noduri izolate - si vor forma , fieca re dintre ete 0 com pone nts conexa. C,={6}. Graful componentelor lare conexe ale unui graf care nu esle l are c onex G=(X ,U) 58 obtine prin reducer ea fiecarei co m ponente conexe la u n no d.
Identificarea grafului componentelor tare canexe este utila in rezolvarea uno r prob leme, prin descompunerea problemei in subprobleme (rezolva rea problernei pentru fiecare componenta tare conexa) ~i combinarea solutiilor - strategia di vide et im pera.

Exe mplu:

T'C,c ~ .", in graful oriental G25= (X25,U'5) - figura 29 - definit astlel : ~ mult imea no durilor este X 25={ 1 ,2,3A ,5,6,7}. ~ multi m ea arce lo r este U' 5 ={[1.2], [1 A], [2,3], [3,11, [4,5], [5,61, [6A ], [7,5J, [7,3]} 1i':';\ Gc" componentele tare conexe sunt C , ={1,2,3), C,={4 ,5,6} ~i C,={?}, .'. iar graful componentelor tare conexe Ge2S = (Xe2S ,Ue2S) - figura 30 - este definit astfel. ~ mu lt irnea nodurilor este Xc 25={ C C" C,} . ~ rnultirnea arc elor este Uc25 ={[ c, " C2], [C " C , I, [C " C z]}.

,
C3 Fig . 29

Algorilmi pentru delerminarea conexitatii grafurilor 1. Deter min area c ompone nte lor co nexe in t r-un graf.

Fi g. 30

Alg o ritmul. 0 components conexa este fermata din toate nodurile intre care exista un lant elemen tar. 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 vectoru lui 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 exista un lant elementar intre dow! noduri x si y se folosese metoda backtracking. Observ ati e, Acest algoritm poate fi folosit atat in grafurile neorientate, cat si in grafurile orientate. Mai poate fi folosit ~i 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 nodu rile grafului. Im pl em enlarea algoril m ul ui. Se citeste din fisierul graf19 .txt matricea de adiacenta a unui graf neorientat (varian ta din fisierul graf20.txt - rnatricea de adiacenta a unui graf orientat) ~i se aflseaza componentele conexe. In vectorul v se mernoreaza nod urile 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). Varia bila rn se foloseste pentru a nurnara componentele conexe identificate. Functia ci te ste () 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 intr-o cornponenta conexa (v I x l =0), se cauta toate nodurile y (1:5y:5n si y*x ) care sunt legate cu un lant elementar de nodul x . Pentru un nod y gasit, se rnarcheaza in vectorul v faptul ca a fast adauqat la a components conexa (v [yJ ~ 1 ) . Pentru testarea programului se folosesc graful neorientat G, ~ i graful neorientat G22. #include < fs t r e a m.h > t ype d e f st iva[lOOJ ; in t a[20] [20] ,n,k ,as ,ev , x , y ,v[20) ,este=O ; stiva st ; f stream f ( "gr8a19 . txt " , ios : : in) ; void c.l t e s t e t ) { l i s e c Lt.es t;e matricea de ad i ecen t 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 de n t i ca ell cea de 1a afi$area lan~urilor elementare l int valid (} {I l i de n t i c a eu cea de 1a afi$area lanturilor elementare } int so Lu t.Le () {re turn st l k l ==y ; } lI s e 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 ab i.La este va avea v aJoarea 1. v o id bt(} { l l i d c n t i c a cu cea de 1a af i sa r ea Lant ur Ll.c r e Lemen t a r e } v oid cOffiponente{) {i n t m""' O;
f or ( x ~ l; x < ~ n; x + + )

if

( v[ xJ ~~OI

(m++ ; s t [ l J ~ x; v l x l e L, c cu t -ocvCompon e n r a conexa "<cmcc": "<e x-ec"


fo r ( y ~ l; y < = n ; Y + - 1

n ,

if (x!=y l (este =O; bt l );


if {e s t e )
{ v [ y } ""l; cout-ccy-;c" " ;}}

coutendl ;}} void main() t c Lce s t e t j componente () ;}

2. Detenninarea co m po ne nte lor c onexe i ntr-un gr af oriental. Alg oritmui. 0 components conexa este fermata din toate nodurile intre care exista un drum, eel putin de la un nod la altul (drumul nu trebuie sa asigure leqatura in ambele sensuri). Altlel spus, daca exista un drum de la un nod x la un nod y , cele doua noduri x ~ i y apartin aceleiasi componente conexe - chiar daca nu exista si un drum de la nodul y la nodul x . $1 in acest algoritm se foloseste un vector cu n elemente pentru a memora nodurile care au fast deja ln reqistrate intr-o cornponenta conexa . Pentru a verifica dac a exists un drum de la nod ut x la nod ul y se tolososte mat ricea drurnurilor. Pentru graful G 22 din Figura 26, in matricea drumurilor se observe ca exists drum de la nodul 1 la oricare celelalte patru noduri din grar. Graful are a sinqura cornponenta conexa .
, 1 2 3 4 5 Impl cmentarca algoritmului. Se citeste din fisierul graf20.txt 1 1 1 1 1 matricea de adiacenta a unui graf orientat lii se determina 1 1 1 1 1 1 daca graful este conex. Oaca nu este, se afiseaza compo- 2 1 1 1 1 1 nentele conexe. in vectorul v S8 rnemoreaza nodurile care au 3 4 0 0 1 1 0 fast deja Inregistrate Intr-o components conexa. Functia 5 0 0 0 1 1 ci tes te () se foloseste pentru a citi matricea de adiacenta in fisier. Functia t rans forma () 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 d e 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 ac errt.a din fi s ie r } void transfonna () (for (in t 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] ; ) v oid ccmponente(} tint i ,j ,m=O ; fo r ( i nt i=l ;i<=n ;i+T ) if (v[i)==O) {m.... --- i v[i)=l ; c ou t-ccv Ccn-ponen t 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 tendl; } } v oid main() {c i.t.e a t e t j : t rcns t'orma t j corr.por.ente() ; }

3. Detenn inar ea com pon entelor tare co nexe in tr-un graf orien tal.
Algo ritm ul. 0 cornponenta tare conexa este fermata din toate nodurile i ~i j intre care exista un drum elementar de la nodul i la nodul j , dar ~i de la nodul j la nodul .i.. Se foloseste un vector cu n elemente, pentru a memora nodurile care au fast deja inregistrate i ntr-o cornponenta tare conexa . Initial, elementele vectorului au valoarea 0 (nici un nod nu a fast inregistrat intr-o cornponenta conexa), iar daca un nod L va fi adauqat la a cornponenta conexa, valoarea elementului i din vector va fi 1. Pentru a verifica daca exista un drum elementar de la nodul .i, la nodul j , se pot folosi doua variants ale algoritmului: Vari an ta 1. Se fo losese metoda backtracking. Imp lementarea algo ri tm ulu i. Se citeste din fisierul graf20.txt rnatricea de adiacenta a unui graf orientat - ~i se determina daca graful este tare conex. Oaca nu este, se afiseaza componentele tare conexe. Variabila e s t e l se foloseste pentru a verifica daca s-a gasit un drum elementar de la nodul i la nodul j (are valoarea a- False , daca nu s-a gasit un drum elementar), variabila este2 se foloseste pentru a verifica daca s-a gasit un drum elementar de la nodul j la nodul .i. (are valoarea a - False , daca nu s-a gasit un drum elementar), iar variabila e s t e se foloseste pentru a verifica daca s-a gasit un drum elementar de la nodul x la nodul y (are valoarea a- False , daca nu s-a gasit un drum elementar). Tn vectorul v se rnemoreaza nodurile care au fast deja in registrate intr-o components tare conexa. Variabila m se foloseste pentru a numara componentele conexe identificate. Functia c i. te ste () se foloseste pentru a citi matricea de adiacenta din fisier. Functia c omponen te () se foloseste pentru a afisa camponentele tare canexe ale grafului: pentru fiecare nod i (1.$.i.$.n) care nu a fost afisat intr-o cornponenta conexa (v [ i ] =0 ), se cauta toate nodurile j (1,;j';n ~i j;ti) care sunt legate cu un drum elementar care porneste din nodul i , dar !?i de la care porneste un drum care ajunge i n nadul i . Pentru un nod j qasit, se rnarcheaza in vectarul v faptul ca a fast adauqat la a components tare conexa (v [ j J =1). Pentru testarea programului se foloseste graful orientat G'2.

III form a tid


#inc lude <fs t r e a m. h > typedef st i va [ l OOI ; int a[20 } [20J , n, k ,us ,ev , x , y ,v[2 0 J , c s t e l, e s t e 2, e s t e -= O;
s t L va s t : f stream f( " g r a f1 9 . t x t " ,io:s : :i n };

233

v oid c i t e ste() {l i s e c i te ~t e mat r i c e a d e adiac en ;a di n f i s i e r } void i ni t() {/ I :"de n t i c a ell cea d e la afi~a :-e a drumur i l o r elementa re } int succ e s o r() {/ I i den t i ca cc cea de 1a afi 9 a ~e a d rumurilor elementa re } in t va l i .d () { / / Ident i.ca eil c e a de la af i s e ree d rumurilor e Lemen t e r e I
int ao Lu t i.e L)
vo i d
t

{re t urn s t[k] ===OY i }


{e s t e = 1;)

lI se ob t i n e solutia atune i cand ultimul nod adaugat in stiva este y


Lpe r ()
s olu~ ie (u n d ~um intre nodurile x $i y j , // va r i a bi l a este va avea val oarea 1 void bt ( ) { / i i d c n t i c 5 ell cea de La af i s ar-ee d r umu r i.Lo r e Lemen t e r c } void coxponen t e () l i n t i ,j , m=O i

// d a c3 ex ista

fo r ( i = li i <= n; i + + )

if

( v[ iJ ~~O)

{m+ + ; v [ i ] = l ; cou t c c vCc mp o neri t a co ne x e for ( j = l ; j <= n ; j t + ) i f (j ! ;;o: i ) {z = i; y = j ; s t l l l e x cstc;;o:O ; b tl) ; x = j; y .... i : s t j l j ex : es te=O ; bt (} ; if (estel & & E: 3 ': e 2 ) {v[j ]=l; cou t cou t e n d l ; } }

" <c mc -cv :

" <x i c c "

II.

c s t.c l. ee s t e : e ste2=este ;
c -cj c-; " " ; }}

voi d ma i n ()

{c .i teste () ; component.e () ; )

Var ianta 2. Se fotoseste matricea drumurilor. 5e deterrnina dOU8 matrice ale drurnurilor: una corespunzatoare grafului G ~i alta core spunzatoare unui graf i n care toate arcele au sensu l invers decal i n graful G (Gt - graful lranspus al grafu lui G). Din intersectia celor doua matrice, se va obtme 0 matrice in care vor fi evidentiate numa i drumurile care exista in ambe le sensuri, intre oricare doua noduri i ~ i j . Pent ru graful Gn din figura 26, prin inversarea arcelor se obtine graful transpus G22t din figura 3 1. Malricele de adiacenta ~ i matricele drumurilor pentru cele dou a grafur i ~ i matricea intersectie sunt preze ntate ma i jos.
Matri cea de adiacenta G22 Matricea d rum u ri lo r G22

G22t '~

~ Fig. 31

2 3
4

1 0 0 1 0 0

2 1 0 0 0 0

3 0 1 0 0 0

4 0 0 1 0 1

5 0

~ 0
1 0

1 2 3 4 5

1 1 1 1 0 0

2 1 1 1 0 0

3 1 1 1 0 0

4
1 1 1 1 1

5 1 1 1 1 1

Matri cea intersec tie

1
2 3 4

1 1

Matricea de adla ce nta G22t

1 2
3
4

1 0 1 0 0 0

2 0 0 1 0 0

3 1 0 0 1 0

4 0 0 0 0 1

5 0 0 0 1 0

Matricea 1 1 1 2 1

drumu ril or G22t 2 3 4 5

e-!1
0 0

3
4

1 1 1

1 1 1 1 1

1 1 1 1 1

0 0 0 1 1

0 0 0 1 1

2 1 1 1 0 0

3 1 1 1 0 0

45 0 0 0 0 0 0 1 1 1 I 1

234

Implem enta re a structurilor de d a te

Interpretarea datelor din mat ricea intersectie se tace astfel: doua noduri i ~i j fac parte din aceeasi cornponenta tare conexa - daca exista drum de la nodul i la nodul j (a [i] [j] ~ 1) . Pe matricea intersectie se pot identifica cele doua componente conexe : C1={l, 2,3} ~ i C2={4 ,5}. Im pl ementarea algoritmului . Se citeste din fisierul graf20.txt matr icea de adiacenta a a unui graf orientat. Se foloseste matricea ap in care S8 rnernoreaza arcele i n sens invers si matricea drumurilor obtinuta din aceasta. Pentru a identifica nodurHe i si j intre care exista un drum atat de la nodul i la nodul j , cat ~i de la nodul j la nodul i , se obtine matricea b care este intersectia celor doua matrice ale drumurilor: a ~i ap. Functia ci teste ( ) S8 foloseste pentru a citi matricea de adiacenta din fisier. Functia transforma_ s ( ) S8 foloseste pentru a transforma matricea de adiacenta a in matricea drumurilor, iar functia transforma_p () pentru a transforma matricea de adiacenta ap in matricea drumur ilor. Functia intersectie () se foloseste pentru a obtine intersectia celor coua matrice ale drumurilor. Functia compone nte () se foloseste pentru a afisa camponen tele canexe ale grafului: pentru fiecare nod i (15i5n) care nu a fast afisat Intr-o components conexa (v [i] =0 ), se cauta in matricea intersectie a drumurilor b toate nodurile j (lSjSn ~ i jo'i) la care ajunge un drum ce porneste din nodul i. Pentru un nod j gasit, se marcheaza in vectorul v faptul ca a fast adauqat la a cornponenta tare conexa (v (j] ~1 ) . Pentru testa rea programului se toloseste grafu l orienta t G". #include <fstream .h>
typedef s t i va [lOO j; int a[20] [20 ] , n , v [20] ,ap[lDJ [ l D] , b [ l D] [ l O] , n r; fstrearn f( "g re f19 .txt " , i o s : :in ); void c Lt c c t e () { / Isecite;;;te mat r i cee de e d i a cen t

di n .f .i e .i.er l

void predecBso r()


{for (int i = l ;i<~n ;i++) for l i n t j=l ;j<=D ;joHl april [j )=a[ j] I i ] ; }
vo.i.d vtr arre f'o rrne s.I )
j

{for (int k=l ; k<=n ;k++) for {int i =1 ; i<=r: ;i++) for (int j~l ; j<=n ;j++} if( a l i ] [j ]==O && i! = k && j! =k) al i ]
v oid t ran s fo ~ma ~ ( )

I j ) ~a [ 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 ] Ij]~~O & & .i l e k && j != k ) apri l [ J ) =a p [ i ] [ k ] * a p [ k] [ j] ; ) vo id i n t e r s e c t i e ( ) {for {int i = l; i <=Jl; .L++ } for l i n t j ~l ; j<~n ;j oH) b l i ] [j ] = as [i ] [j] *apli ] [j] ; )

void cornp'onerrt e ()
{for (int i = l ; i<= n ; i+ +)
if
(v[i] ~=O)

( n r + +; v[i ] =l ; cout endl" Comp oo E: n t a " n r" : " i. " for t i n t j=l ;j<=n ; j+ I:)
if (bli ]
[j ]~ ~l

&&

i != j l

{coutx-c j c-c'' ";


( ) ;

v[j] ~ l; ) } )

void main ()
{c i t e ste ( ); predecesor{) ; t r a n s f o r m a ~ s i n t e Ls e c t i e ( ) ; componente() ; }
t r a n s f o rm a ~p ( ) ;

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 ve rifica 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 mesa j de informare. 3. Cornparati, din pu nct de vedere al eflcientei , cei doi algoritmi de determinare a componentelor tare con exe dintr-un gral oriental. 4. Scrieti un program care citeste din fisierul text graf2.!xt mat ricea de adiacenta a unui graf orientat - -?i ca re determine graful componentelor tare conexe !?i nurnarul minim de arce care trebuie adauqate pentru ca gralu l sa devina tare can ex. 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 vecin i prieteni, (In dicat ie. Se deterrruna componentele conexe pentru fiecare gral.) 2. Folosind informatiile din graful judete lor deterrninati nurnarul minim, respect iv numarul maxim, de judete prin care trebuie sa treaca un turist care tranziteaza prin Roman ia, stiind ca vine din Ungaria si trebuie sa ajunqa in Bulgaria. (Ind ica t 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. (Ind icatie. 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 gene reaza graful partial al traficului , prin eliminarea arce lor dintre nodurile precizate ~ i se verifica daca graful obtinut este tare conex .)

2.7.8 . Parcurgcrca grufului


Parcurgerea grafului reprezinta operatia prin care sunt exam inate in mod sistemat ic nodurile sale , pornind de la un nod dat i , astl el lncat lieca re nod accesibi l din nodul i pe muchiile (arcele) adiacen te sa fie atins 0 sinqura data . Vecinii unui nod sunt repreze ntati de toate nodurile adiacente lui si accesibile d in el.

236

I m plcrn c nta rca stru cturllor d e date

Vizitarea sau traversarea unui graf este operatia prin care S8 parc urge graful trecandu -se de la un nod i (nodu l curent) la nod uriIe vecine lui, intr-o anurnita ardine , in vederea prel ucrarii inforrna tiilor asocia te nodurilor. Pentru parcurgerea grafurilor , exista urrnatoarele doua metode : 1, Metoda d e p arc u rge re "i n latirne" - Breadth First (BF ). Se viziteaza mai Intai un nod initial i, apoi vecinii acestuia . apo i vecinii nevizitati ai acestora, 9i asa mai departe pana cano se parcurg toate nodurile grafu lui. 2. Meto d a de parcu rg er e "in adancime" - Depth First (OF ). Se viziteaza mai Intai un nod initial i , dupa care se parcurge primul dintre vecinii sai nevizltati, de exemplu j, dupa care se trece la primul vecin nevizitat al lul j , ~i asa mai departe - pana cand se parcurge Tn adancime ramura respectiva. Cand s-a ajuns la capatul ei, S8 revine la nodul din care s-a plecat ultima data, ~i S8 parcurge urrnatorul sau vecin neviz itat.

G" Ex em pl u - pentru graful neorientat G" = (X'6,U'6) - figura 32 - definit astlel:


-7 mu lt irne a noduril or este X26={1 ,2,3,4,5 ,6,7,8,9j. -7 rnu ltirnea rn uchiilo r este U26={[1,2], [1,3], [1,4], [2,5], [3 ,5], [3 ,6], [3,7], [4 ,7], [5,8] , [6,8J, [6,9]}
Graful G' 6 poate fi parcurs astfe l, pornind din nodul 1: 1. In cazul metodei de parcurgere SF - "in la\ime", vor fi parcurse pe rand nodurile: Fi g. 32

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 d e mem ori e: n pentru nurnarul de noduri ale grafulu i, k pentru nodul care 58 prelucreaza . i si j pentru parcurgerea matricei de adiacenta si a vectorilor. 2. Matri cea de ad la ca nta a g raf u l ui a. 3. Vect orul de v iz itare vi z i ta t . EI contine n elemen te in car e S 8 i nreqistreaza nodurile vizita te . Elementele vectorului vizi ta t [i] sunt definite astfel:
\'I ZI

. it a t "1 { 1, da ca no dul i a fast v izita t I =

0, daca nodul i nu a fo st v izitat

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 dou a 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 eleme nt din lista (coada cozii). in 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 vecto rului 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 g oritmul pentru parcurgerea gra fului este urrnatorul: PAS1 . Se citesc din fisier , valoarea pentru variabila n ~i matrice a de adiacenta a grafului.

In f orma tiea

237

PAS2 . Se initiatizeaza cu 0 elemente le vectoru lui de vizitare vizi ta t , deoarece initi al nici un ul din tre nod uri nu a fa st vizitat. PAS3. Se int roduce de la ta statura valoarea variabilei de memorie k . corespunzatoare primu lui nod eu care incepe parcurgerea grafului. PAS4 . Se lnitia lizeaza coada de astept are c (indicatorii ~i continutul primului elemen t intradus i n coad a de asteptars), astfel: p r Ime-L, u l t im ~l l}i c [prim] -k, deoarece, in coada de asteptare c este i nregistrat doar nodul k cu care incepe parcurgerea. PASS. Se actualizeaza vect orul v i zi ta t - atribuind elementului k al vectorului valoar ea 1, deoa rece a fost vizitat (v i z i tat [k] <-1 ). PAS6. Cal li m p coada nu este vida (p r im<=u 1 tim) executa PAS7. Se extrage urrnatorul element din coada de asteptare , corespunzator nodu lui caru ia i S8 vor vizita vecin ii (k e-.c [pr J.m] ;) . PASS . Pentru toa te nodurile i vecine ale varfu lui k , nev izitate inca , executa PAS9. Se incrementeaza valoarea indicatorului u l t i m, pentru a inreg istra urrna torul nod care va tre bui vizitat prin adauqare la coada cazii de astepta re [u L t irnt-ul ti m+ 1 ; ). PAS10 Se acauq a la sfarsitu l coz ii de aste ptare c , nodu l i vecin nodu lui k care nu a fast inca vizita t (c [u l tim ] ~ i ;) . PAS11 P rin adauqarea nodului j la coad a de asteptare c se considers ca ace st nod a fost vizitat - !?i se actualizeaz a elementul din vectorul de vizitare care corespunde acestui nod (v i z i ta t [i] <- 1 ; ). Se revine la Pasul 6. PAS12S e pre qateste indicatorul pri m pentru a se extrage urrnato rul nod din coada de aste ptare , ai carui vec ini vor fi vizitati (p r-L me-pr-L m- t r ). Se revine la Pa sul 7. PAS13 S e afisea za lista nodurilor vizitate, i n ordinea in care au fost vizitate , prin extragerea lor din vec torul c , porni nd de la elementul 1 ~ i pana la elem entul n . Pentru graful G 26 pornind din nodul 1. nodu rile in coada de
v iz ita t
C

a~t e p tare

sunt adauqate astfel: 0 9 10

0 2

0 3

0 4

0 6

0 7

0 8

L...:.. 1 -'-_ .,....,J_ _.l......~..L...--,-...L_--c. l~

' ~~'"l-~"""""'''''---''

l nit ia lizarea cozii de a;;teptare cu primul nod: prirn= l ; ul tim=l.


v.i z i t ;:H. ' I~ _ 1
1
C

1
3

10

v iz itat
C

'

10

vi zi t a t
C

'

...

...

10
pri m= 3
e> ul t i rn= 7 .

238

Implemen tarea st ru ct uri lur lie date

viz i ta t

'--'--'--::--.J'---:--'--'--'-O--'--:--'_,O--'--:--'---'o----'
Prelucrarea nodului: prim=5
~

10

c ul tim=B .

viz i ta t

'--'--'--::--.J'--:---'---'--'-o--'--:--'_,o--'--:--'_,,:-,
Pr elu c rarea nodului : prim= 6 e> ul t i m= 9.

10

v iz i ta t L--'---'----'----.JL--'-----'-----'-----'_-'----'-----=---'_,-'----L----=---'- '------'
c

10
c
viz i ta t '--'--'--::-~'---:---'---'--'-o--'--:--'_,o--'--:--'_,':-'
c

10

prim= 9 :..:::- u l tim=9.

10
prirn-1 0 ::::::) ul tim-9 . Tcnninarc : pr irn> ul tim

Pentrn imp lementarea algoritmului se lo loses c subprog ramele : -7 functia pro cedural a ci teste creeaza matri cea de ad iacenta , prin preluarea inferrnatiilor din fisierul f (dimensiunea 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 te ste aza coada de astepta re daca este vida; -7 lunclia procedurala adauga adau qa un nod la coada de astepare : -7 funct ia proce durala e l i mi 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 acestu i nod ~i apoi iI etimina din coada de asteptare: -7 functia procedura la afisare afiseaza nodur ile grafului i n ordinea pre lucr arii.

Pentru testarea programului, S8 tolose ste grafu l neo rientat G26, a carui matrice de adia centa se citeste din fisieru l text graf21 .txt.

int n , a [10] [10] , v i z i t a t [20) , c [20] , p r i m, u Lt Irn , 1: , fst ream f{ "graf21 .t: xt " , i o s : :in ) ;
void citeste() { l i s e c i t.e s t.e ma t r i.cea de ad i e ce n t.a din f Ls Le r } void init( i n t k) { p r j mcu Lt.Lmc l , c l u Lr Lm l e k : v i z i t a t l k l e- Lr I

I II for ma tid
i n t est e v i d a ( ) {retur n ul t im<p r i m; } v o id ad a u g a ( i n t i) ( u l t i m++ ; c [ u l t i m l ~ i ; v i z it at [ i] = l ; ) v o id e L'im .i n e () {p r i m+ + ;} v oi d pre luc ra r e() ti nt i ; k=c[p r im ] ; for (i= l; i < ~ n ; i++) i f (a [ k J [iJ ==l && v i. z i t a t l i j e c Oj adaug a l i ) ; el im i n a{} ; } vo id e r Ls e r e () {for {i n t i =1 ; i <=n; i ++ } cout c [ i ]" ";}
void main() ( c i t e s t e () ; c o u c-ccv n o d d e p o r n i r e:

239

"; c in k;

i n i t ( k) ;

while ( ! e s t e vida()) p r e l u crare{) ; c o u t " Nod u r i l e v i z i t a t e pr In metoda BF sunt : "endl ;


~ ~ /\ tcnric ~
~

a f i s a r e() ; }

Prin pa rcu rg erea in lati rne a unui graf , determl nati lanturil e, resp ectiv d ru m urile de lungim e minima.

Cornplcxitatca algoritmului de parcurgcre in latirne

Algo ritmul const a in eliminarea unui nod din coada de asteptare "i adauqarea vecin ilor (succeso rilor) sai in coa da de asteptare. Fiecare nod va fi adauqat i n coada de asteptare o data si, prin urmare, va f eliminat din coada de astepare 0 sinqur a data. Comp lexitatea operati ilor de eliminare a celor n noduri din coada de astept are este O(n). Pentru a adauqa noduri la coada de asteptare, sunt exarninati vecinii (succesorii) nodului curent. Vecinii (succesorii) unui nod sunt exarninati 0 sinqura data , atunci cane nodu l este eliminat din coada de asteptare. Nurnarul total de vecini exarnina ti este egal cu m nurnaru l de much ii (arce) ale gra!ului. Complexitatea operatiitor de adauqa re de noduri este O(m). Comp lexitatea algoritmului este liniara O(m+ n). 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 in 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 vecto r (p) - pentru a memo ra predecesorul unui nod in parcurgerea in la\ime: lrnplementaroa algoritm ului. 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 !oloseste variabila globala x , pentru nodul din care porrneste drumul, si implicit, parcurgerea in latirne a gra!ului. Functia ze ro () se toloseste pentru a initiaiza cu valoarea 0 vectorii v i zi tat si p ina inte de a incepe 0 noua parcurgere a grafului, pornind din nodul x . Functia adaug () a fost modificata prin adauqarea instructiunii de actualizare a vectorului p la adauqarea unui nod in coada de asteptare (in elementul corespunz ator nodului vizitat i S8 mernoreaza predeces orul 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. in aceasta functie se Iolosesc urmatoare le 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 inre gistrate in ordine inversa:

240

Im plcm enta 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

[ O ~~

#include < f s t~ eam . h> typedef sLi va[l OO] ; in t a [ 10j [ 1 OJ 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

f s tr e a rn f {"graf 21 . t xt " , i o s : : i n) ; voi d c Lt e s t e t ) { l i s e c i t e s t;e matriceade ad Lac.ent a din f i$ ier ) void z e r o() {for (i n t i=l ; i<=n;i++) {v i z i t e t Li.L e O', p[il = D; }} void i n :if(i n t k ) { p r i m = u l: t 'L m ~ l ; e [;Jl t i rn] .:= k ; '.Ii z i t a t lkl = l ; p [k ]= O; } int es t e j v i de () {return u L t i.mcp.r Lm r } void a d aug( i n t i , int }c) {u l t i rn+ +; c lu l t im j-e i , v i zi t .at Li l e l. : p[iJ .=k ; } vo i d p r e l u c r a r e ( ) {i n t i ; kvcLp r jm l (i;;;ol ;i<= D i i + -l ) i f j && i lt t ls.e L i kr ,
f o r L a k ] [ 1 ] = = 1 v z a L i O ) a d a u q l

prim++ ; }
void a r i s a re ( )

li nt i ,j , e st e , y ,d[lO ) ; cou t-c-c't Drumu.I minim car e po rn e s t e d .i n 'no d u I " x " : " <xe n d.l : for {j =l ; j <e n : j+ + ) i f ( j !=x ) {cout" p a ~ a 1a nodu2. " j" : "; for (:L=l , c s t e = O; i <= u l t i m && ! est e;i++ ) if (c[il==:i) es t e v l : if (c ste=~: ) {y =p [j ]; i=O ;
while ( '1) ( i t +; d[i }=.y ; y =-p [ y] ; ) for (;i>=l ;i- - ) cout d [ i ]" " j" "; } else cou t.-oc vri u ex i.s t a d rum " ; cout endl ; } cou tendl; } void main () { c Lt.e s t e () ; cou t-ocv Dr-umu r i.L e d e Lunq Lme mi nimaintr e doua nodu r i. sunt : f o r (x =l ;x<=n ; x ";-+ ) { z e r o {); ini t(x) ; while ( ! e s t;e vida ()) p re Lu c r a r e () ; a f isar e () ; } }

"<Xe rid.L:

2.7.8 .2. Parcurgerea in adancirne - Depth Firs t


Pentru aceasta metod a de parcurgere a unu i graf cu n nodur i se folosesc urrnato arele structuri de date ~ i date elementare : 1. Var iabilele de m em orie. n pentru nurnarul de noduri ale grafu lui, k pent ru nodu l care se pretucreaza , i ~ i j pentru parcurgerea matricei de adiacenta si a vecto rilor . 2. Matri cea de adl acenta a gr afului a. 3 . Vecto rul de viz itar e v izi tat. EI contine n elemente i n care S8 tnreqist reaza nod uriIe vizitate . Elementele vectorului vizi tat [i ] sunt definite ca ~i in metoda pre ceden ta 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 folo sest e impl emen tarea static a cu

Inform aticii

241

un vector st CU n elemente . in stiva vor fi Inreqistrate , In ordine, nod uriIe vizitate in adancirne , pe 0 directie Initial, stiva contine un singur element care corespunde nodului cu care incepe parcurgerea grafulu i, iar valoarea variabilei 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 to ate nodurile i vecine cu nodu l k care nu au fost vizitate inca. Algaritmul pent ru parc urge rea grafului este urrnato rul: PAS1 . Se citesc din fisier valaarea pentru n ~i 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 valo area variabilei de memorie k , corespunzatoare primului nod cu care incepe parcu rgerea grafului , si se afiseaza eticheta lui. PAS4 . Se initia llzeaza 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 elementuJui 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 , elemen tul corespunzator nadului caruia I se vor vizita vecini i (k e-e t. [vf] ;). PAS8 . Se initlalizeaza nadu l i cu care lncepe cau tarea (i<-- l;) . PAS9. Cat tim p nu s-a gasit un nod i vecin nodului k , nevizitat inca (i <=n ;;i (a[i ] [ k ] = O sau (a[i] [k]=l ~ I viz itat[1]=1))) ex ecu ta PA S10. Se trece la urrnatorul nod , in vederea verificarii (i~i +l ; ) , ;; i se revine la Pasu l 9. PAS11. Daca nu s-a mai gasit un nod i vecin nodului k nevizitat inca , atunc i se elirnina nodul k din stiva, prin coborarea varfului stivei (vf~ vf -l) , altfe l se afiseaza nodul gasit i , se adauqa in varful stivei (vf~vf+l; st [vf] ~i ; ) si se actualizeaz a elementul din vectorul de vizitare care corespunde acestui nod , deoarece prin adaugarea nodului i la stiva st se conside ra ca acest nod a fast vizitat (v i z i tat [i] <--1; ) ~i se revine la Pasul 6. Pentru graful G'6, parni nd din nadu l 1, nadurile i n stiva sunt adaugate as\fel :
vizi ta t st v izitat st vizitat st vizi tat st

IT 1
1

o=J~-r-T'~T.-r===T l nitializa rea stivei cu primul nod : vf-l.

0 2

0 3

0 4

0 5

0 6

0 7

0 8

0 9 10 1 = = r_ :::J
1 0 9 1 1 0 9

1
1

1 1
2

1 1

0 1 0 I 0 I 0 1 0 1 0 7 8 4 3 5 6 1 i~ I 1 I 1 I Prelucrarea nodulu i: vf- l ::::? vf-2.


1 2

10

I
10

11 -0~5i

1 1

0
3

1 0
4

1 1 5

I
I

0
6

Prelucrarea nodului: vf= 2 <> vf=3 .

~C-=:J

1 0 7

0 8

1 1

1 1

1 1 I 1 I 0 I 1 I 0 I 0 I- 0-10 4 2 3 6 7 8 9 5 1 2 I 5 I 3 I I Prelucrarea nodului: vf= 3 => v f=4 .

::I.

r:=:::=:r

10

242
vi zi t at

Implem enturca stru ctur ilor de date

1
1

st
vi zita t I

1 1
1

1 0 1 I 1 I 0 0 4 3 5 6 7 2 8 I 2 I 5 I 3 I 6 I I Prel ucrarea nodului: vf=4 => vf=5 . 1

I I
I

0 9

10

I I I I

1
2

I I I I

st
v i z ita t I

1 1
1

5 I 3 I 6 I I Prel ucrarea nodu lui: vf=S c> vf=6 .

1 3

0
4

1
5

1
6 8

0
7

1
B

0 9

10

I
I

1
2

st
viz ita t

1 3 5

I
I

0
4

I I I

1
5

1 6

0
7

I I

1
8

3
0

Prelucra rea nodului: vf- 6 :::::;. v f= 5 .


2

I 8 I

0 9

10

I 1 I 1 I 1 I
1

st
vizit at

1 I 1 I 0 I 1 5 7 6 8 I 2 I I 3 I 6 I 9 I I Prelucrarea nodului: vf= 5 ::::::> vf= 6 .


3 5
4

1
9

10

C1 I
1

1
2

st
vizita t

6 5 7 3 ! 6 I 9 I I 2 I I Prelucrarea nodului: v f = 6 c> vf= 5 .


4

1 3 5

I I

1
8

1
9

10

I 1 I 1 I 1 I

0
4

st
v iz i tat

n
I

I
1
1

2 2

3 5

1
5

1
6

I
I

0
7

1
8

1
9

10

I I I I I

I 0 I I
1
6

Pre luc rarea nod ului: vf= 5

I
1
7

~ v f = 4.

I I

1
2

I I I I I

st
vi zi tat

1 3 5 1 3 5

0 I 1 4 5 3 r--7
1
4

I I

I I

1
8

1
9

I
I

Prelucrarea nodului: v f _4

I~

10

e> vf=5 .

1
1

I
I I

st
vizi tat I

1 1
1

1 2 2 1
2

I I

1
5

I
I I
1

1
6

I I
::::::>

1
7

I
I

1
8

1
9

Prelu crarea nodului: v f= 5

v f =6.

II~
1
9

10

st
v izitat

1t~1

Prelucr area nodului: vf= 6

1 I 1 I 1 4 3 5 5D~

1 6 4 1
6

I I I I

1
7

I I

1
B

10

::::::> vf=S .

0
1

1
2

I I I I

st
v i zitat

LlJ
C1 I
1

1 3 5 1 3 5 1 3 5

I I I

1
4

I
I I

1
5

I I I I I I

1
7

1
8

1
9
10

Prelucrarea nodului: vf= 5 :::::;. vf=4 .

I
I I
1
8

1
2

1
4

1
5

1
6
::::::>

st
viz ita t

I I I

I 3 I I
1
4

Preluc rarea nodului: vf- 4

I I I
I

1
7

1
9

10

v f- 3 .

1
1

1
2

st

2 I I Prelucra rea nodului: vf::::: 3

I I

1
5

1
6

1
7

I I

1
8

1
9

10

c> vf=2 .

III forma t icii


vi zi t a t

243

st
v izitat

I
I

1 1 1

1
2

1
3

I
1

1 4

I I

1
5

1 1

1
6

1
7

I
I

1
8

1
9 10

I 2 1

Prelucrarea nodului: v f- 2 => vf- l .

st

1 I 1 I 1 I 1 I 1 1 1 I'1 I 1 I 1 4 7 1 2 3 5 6 8 9 I 1 I 1 I 1 I I 1 I Prelu crarea nodului: v = l => vf=O. Term in ar e : vf=O

10

Pentru implemen tarea algoritmului se folosesc subprogramele: -7 functia procedurala c i t e s t e creeaza matricea de adiacenta prin prel uarea informatiller din fisierul text f ; -7 functia proce durala ini t lnitializeaza stiva cu primul nod vizitat; -7 functia operand este_vida testeaza stiva daca este vida; -7 functia procedural a adauga adauqa un nod la stiva: -7 functia proced urala el imi n a elirnina nodul din varful stivei; -7 functia procedurala pre l u crare prelucreaza nodul din varful stivei: cauta primul veci n nevizitat ~ i dac a gas e~te un astfel de nod, i l afiseaz a ~i i l adauqa in stiva: altf el, nodul din varful stivei este eliminat (nu mai are vecini nevizitati) : Pentru testarea programului se foloseste graful neorientat G 26 a carui matrice de adiacents se citeste din fisierul text gra f2 1.txt.
whil e

Obs ervati e. Pentru grafurile orientate, i n functia p relu cra re () conditia structurii repetitive este: Lc en s s I la[ k] [ iJ ~ ~O I I ali] [ k J~~O) i l I(a[ k ][ i ] ~ ~ l I i a l i ] [k] ~ ~ l) && v Lz i r e t l i l e s Lj )

int n ,a [l O] [l Ol ,v i z i t a t r2 0 J ,st f2 0 1 ,v ,k ; fs t ream f ( " g :-a f2 1 . t x t " l i a s : : in ) ; v o id c i t e s t e() { l i s e c Lt es t e matricea de ad i acen t.a din f i.s i.e r I vo id i nit ( i n t k ) { v f = l ; s r Iv f l e k r vi z itat[kJ =l ; } i nt este_ v ida ( ) {r e t u r n vf==O ; } v o id adauga {i n t i ) {v f ++ ; s t[vf]=i ; vizitat[i] =l ; } v oid el i mi n a () { v f - -;} vo i d preluc ra re( ) t i n t i.= l; k=st (v f ] ; while li< ~ n && (a (k ] [ iJ~~O II la (k] [i] ~ ~l && v.i z i t a t l Ll e -e ll l ) i ++ ; if (i==n+ l) e limi n a ( ) : e lse {cou t i" "; adau g a(i ); } } v oid ma in ( ) {c i t e s t e ( ) ; coc ti-oc't n odu I de p o r n Lr e : " ; cin k ;

cou t " No d u r i l e vlzitate prin metoda DF s u n.t : "end l;


o ou ti-c-ck-c-c" " ; in it (k) ; whil e ( ! e s t e _ v i d a() preluc rare() ; }

~ Prin parc urge rea in adancime a unui graf detenninati nodur ile f tcnne ~ c are apart m aceleiasi componente co nexe, respectiv ~ubrafului ~ de succes o ri ai unui nod .

Complexitatea alg oritmului de parcurgere in adancirne Algoritmul consta in extragerea unui nod din stiva ~ i adauqarea vecinilor (succesorilor) sai in stiva, iar daca nu mai are vecini, nodul este eliminat din stiva. Fiecare nod va fi adauqat in stiva a data si, prin urmare, va fi eliminat din stiva 0 sinqur a data. Complexitatea

244

Implemcnta re a st r u ct u r i lo r!l c date

operatiilor de eliminare a celor n noduri din stiva este O(n). Pentru a adauqa noduri in stiva sunt exarninati vecin ii (succesorii) nodu lui din varful stivei . Vecinii (succesorii) unui nod sunt exarninati 0 sinqura data , atunci cand nodul este extras din stiva. Numarul total de vecini exarninati esle egal cu m - nurnarul de rnuchii (arce) ale gratului. Comple xitalea operatiilor de adauqare de noduri este O(m ). Complexilatea algoritmului esle liniara O(m+ n) Determinarea conex itatii grafurilor cu ajut oru l algo r itm u !u i d e p a rc urg e re in

adancime
1. Afi sarea compon entalor con exe dinlr-un grato Algor itm ui. J dentificarea rnultimii de noduri care forrneaza 0 components conexa S8 face parcurqand in adanclrne gratul pornind de la un nod initial. Nodul cu care incepe parcurgerea in adancirne pentru 0 cornponenta conexa S8 cauta printre nodurile nevizitate inca . Grafu l 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 algo ril m ului. Se citeste din fisierul graf2 1.txt matricea de adiacenta a a qrafului neorienl al G26 ~i se afiseaza loale com ponente le 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, in ordinea etichetelor nodurilor.
in t n ,a[IOj [IOJ , vizit~t[20j ,str20j ,v: , ;: ,:u ; f s t r e a m f ( "g ra f21 . ::'XL " , .i. o s : : in ) ; vo id c i t e s t e r ) { l i s e c i t e s c e mc t r t cee de adj ace n 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 (v i z i t at(i]==O ) re tu rn i ; r e t urn O ; } v o i d init{ i n t k ) { v f = 1; st[v f} =k ; v i z i t e t l k l e-L r I int este_v i d a{) {re t u r n v f = = O; } voi d 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 preluc r are{) tint i=l ; k= s,,::vf] ; whi le (i< =:1 && (a[K] [ i] ==O I I (a[ il[k}==l i s, vt z Lce t Li j -v-Lj j j i+ + ; if (i-"'=n+l) elirnin() ; e ls e { c o u t.c -ci c -c'' It ; a c a u q Li Lr } } vo id 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 ) ; cou tendl" Co mp o ne n t a conexa "<x m oc" : "<ck-oc " " . while ( !es~e_vida()) prelucr are() ;
~ :=call::.a

o . }}

2. Afl saroa componentelor tare co ne xe dintr-un g raf 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 predeces orilor. Prin intersectia celor doua subgraturi (rnu ttirni 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 form a tic

245

vizitat numai daca a fast adaupat la 0 components tare conexa. Prelucrarea componentelor tare conexe prin parcurgerea i n adancirne a grafu[ui S8 va face pana can d vor fj vizitate toate nodurile . Daca graful este tare conex, S8 va afisa 0 singura components tare conexa care va fi fermata din toate nod uriIe grafu lui. Imp leme ntarea algoritmu lui. Se citeste din fisierul graf20.txt matricea de adiacenta a a grafului orientat G22 ~ i S8 afiseaza toate componentele tare conexe ale graful ui. Vec torii pred 9i su cc S8 foJosesc pentru a determ ina 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; altfe l, are valoarea O . Functia ze ro () 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 etichete lor nodurilor. Functiile prel ucrarel () :;;i prel ucrare2 () se folosesc pentru a parcurge grafu l in adancirne in vederea deterrn inarii subgrafului predecesorilor, respectiv subgrafului succesorilor nodului care se prelucreaza. Funct ia comp () se foloseste pentru a determina 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 .tx t " , i o s : :in ); vo id ci t e s t e () ( l i s e c.l t e s t.e ma t r Lce e de -adfacent a di n f i s Le r I int ceut c () {I / e s t e .rden t Lc avc u ce a deiLe exemp Iu I ante r ior } void z.e r o Li. n ti vx l ] -) {fo r {int i -=:= l ;i < =n ; i + + } x[ i 1=O ; } void in it( i n t k ) {vf= l; s t[v fl = k ; } int este~vida ( ) {return v f ==O ; } void a de uq t a n t; i, i n t X l ]) {v f ++; st[vf] "='i; x fi] ~l ; } void e L i ni.i n ( ) {v f --;} void pr el uc ra rel ( i n t x [ J ) lint i ~ l, k~ s t [v f]; x I.k l e L, while (i< ~n && (a[i] [ k ]~~O I I ( a [ i ] [k] ~ ~l && x[i]~~ lll ) i ++; i f ( ~ = = n + l ) el i m i ~ () ; else adaug {i ,x ) ;} void pr e luc r a re2( i n t x []) lint i~ l , k~st[vf] ; x[k ]~ l ; while ( i < ~ l1 & & ( a [ k ] [ i ] ~ ~ O II l a[ k] [ i ] ~ ~ l && x [ i] ~~ l) ) ) i ++ ; if ( i =~ ~+ l) elimin ; else ada ug (i ,x ) ; } void comp (i n t x I l . int y[ ]) (for (int i= l;i < = rl ; i~ "~) if ( x [ i ]"==l && y [ i ]== l) {cou t.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=cau ta () ; m++ ; cout.ocv c omp o n e n t e I e t ars conexe : " <Xe nd 'l , wh ile ( k ) [coutendl m": " ; i n i t ( k) ; z ero (p r e d j ; while (!es t:e~ \l id a () ) pre l ucrarel(pred ) ; init(k ) ; zer o( s uc c ) ; while ( !e s 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 uc cl : k=cauta() ; m+l:- ; } }

246

Implcmc ntarca stru cturilor lie date


1. Scrieti un program care citeste din fisierul text graf4.txt lista arcelor unui gral orientat ~ i care. folosind algoritmul coresp unzator de parcurgere a unu i graf orientat, realizeaza: a. Afiseaza lanturile de lungime minima dintre noduri. Verifica daca doua noduri x ~i y apartin aceleiasi componente conexe (sl variants . aparlin aceleiasi componente tare conexe). Etichetele nodurilor se citesc de la tastatura, Veriflca daca graful este tare conex si afiseaza un mesa] de informare .

b. c.
2.

unui graf S8 pastreaza numere naturale. Gra ful pune i n eviden ta divizorii unui nurnar, astlel: numarul x memorat i n nodul i este i n relatie cu nurnarul y memo rat 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 . (lndicatie. Se parcurge mai intai gral ul, pornind de la nodul eu eticheta 1 - pentru a qasi nurnarul - si, T n cazul in care S8 gase~te, S8 reia parcurgerea grafu lui pornind eu nodul in care s-a gasit numaru l - ~i S8 verifies daca au fost ga siti toti divizorii. Pentru testarea program ului 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 nurnarulu i 20.

in nodurile

2.7.8.3. Aplicatii practice


1. Din grupul de n persoa ne i ntre care s-au stabilit relat ii de prie tenie, afl sati cel ma i mare grup de prieteni. (lndicatie, 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 cu nostinta, afisati grupu l format din cele mai multe persoane care se cunosc reciproc . (ln d lcatie, Se deterrnina componenta tare conexa care contine eele mai multe noduri.) 3. Din gralurile care pun in eviden ta relatiile de vecinatate ~i de prietenie ale satenilor care au fanete , obtineti urmatoarele inforrnatii: a. Care sunt saten ii cei mai l ndepartati de drumu l satesc . (In dic atie. Gasi ti eel ma i lung lant din lanturile de lungime minima din graful fanetelor. ) b. Care sunt satenii izolatl. (l ndicat ie. Sate nii care nu se gases c in gralul de vecinatate i ntr-o componen ts conexa i n care se afla ~i 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 in tre 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) ~ i 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 genera l costul muchiei. Functia f se numeste functia cost Un graf G

= {X,Uj pent ru

care s- a defini t 0 func tle cost se n u meste gr~1 pondorat

Observatii : 1. Gra ful ponderat se mai nurneste si graf cu costuri. 2. Grafurile ponderate se folosesc in aplicat ii i n care trebuie dete rrninata valoarea minima sau valoarea maxima a unei rnarirni asociate grafu lui, adica a functie i cost.

In forma tica
3.
4.

247

Se defineste costul unui drum de la nodul x la nodul y ca fiind surna costurilor muchiilor (arcelor) care torrnea za acel drum. Metoda cea mai adecvata pentru reprezentarea unui graf ponderat
este rnatricca costurilor .

Exemplu - Graful G 27 din figura 32 .

G I 1.,f. FV P

1l'tJ$

I SwdbhlL Ole Cal.Z I


Seop : exemplificarea unei aplicati i in care pentru reprezentarea datelor graf ponderat.
S8

foloseste un

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 unu i graf neorienta t in care fiecare muchie reprezinta 0 leqatura

directa pe sosea lntre doua localitati. Fiecare muchie are asociata

rnarirne - distanta,

Aceasta rnarirne este costul muchiei , iar grafu l 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 perso ene irebuie sa se deplaseze cu autoturismul cat mai repede intre doua intetsectii din ores. Traficul intre aou iniersectii nu este intotdeauna in ambele sensuri. Cunoscent: 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 probleme i este de a determina un drum cu tirnpul de parcurgere minim (cu costul minim) intre doua noduri ale grafulu; Obsurvatie , Grice problema la care solutia este de a gasi drumul cu costul minim (sau maxim) dintre doua puncte se rezolva reprezentand datele printr-un graf ponderat _ ' ~I 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 unu i graf este 0 matrice patratica de dimensiune n (A n,Il)' ale c arei el emente aiJ sun! definite astfel tncat sa puna i n evidenta costul asociat fi ecarei muchii (arc), in functie de cerinta aplicatiei, exists doua forme de reprezentare a matrice i costu rilor: ..,. matricea c osturilor minime - pentru a determina valoarea minima a functiei cost ; ..,. matri cea c ostu rilor maxime - pentru a determina valoa rea maxima a funct iei cost. a) Matricca costurilor rninlrne . Elementele arj ale matricei sunt definlte astfe l:

'{C ' dac,aex . ista a muchie (un' .a.rc) T .,u . costul c ~i Ojntr~ nodurile i~i j, cu i *j
ai,j

= 0, daca 1= J
.. . . .'

. ' .t: .' ~ . ' . "', daca nu exista a muchie (un arc) lntre nodurile i si j, cu i " j
-- . ~
. "

..

< , . '. ',.

>,-,.

. '.-.

.-

";,,

248

Im plcm cn tarca st r uct ur ilor d e dat e

Fiecarei muchii (arc) care nu exista in gral i se asocia za 0 valoare lo arte mare, deoarece, cautancu-se costul minim, acea sta muchie (arc) nu va mai 1 2 3 4 5 fi selectata. Deoarece pentru impleme ntarea matricei nu 1 0 4 3 00 00 S8 poate folosi simbolul 00, in locul lui S8 va folo si cea mai 0 7 8 00 00 mare valoare ce S8 poate reprezenta in calculator pentru 2 3 00 00 0 00 00 tipul de data asociat costului. 4 4 0 00 00 00 Exem pl u. Pentru gralu l ponderat G 27 din figura 32 matri5 2 2 0 00 00 cea costurilor minime este prezentata alatura t.
b) Matri cea costurilor maxime . Elementele
a i,j

ale rnatrice i sunt definite astfel:

c, dac_a ~xista 0 muchie (un arc) cu costul c > 0 intre nodu rile i si j , cu i " j
H i, i =

O, daca 1= J - 00 , daca nu exista a muchie (un arc) intre nodurile i

~i

j, cu i

;C.

Fiecare i muchii (arc) care nu exista in graf i S8 asociaza 0 valoare foarte mica, deoarece, cautandu-se costul maxim, aceasta muchie (arc) nu va ma i fi selectata. Deo arece pentru implementa rea matricei nu se poate l olosi simbolul - 00 , i n locu l lui se va lol osi cea mai mica valoa re ce se poate reprezenta in calculator pe ntru tipul de data asoc iat costului . Scrie ti matricea costurilor maxime pentru gralul din figura 32.

Algoritmul pentru c rearea matricei costurilor Pentru a crea matricea costurilor trebuie sa se citeasca pentru fieca re muchie (arc) nodurile de la extrernitati " i costul asociat fiecarei muchii (arc). Aces te inforrnatii se pot citi de la tastatura sau dintr-un fisi er. Alg ori!mu l pentru crearea matricei costurilor este: PAS1 . Se initializeaza matric ea astl el: toate elementele de pe diagona la principala cu valoarea 0, iar restul elementelor cu valoarea coresp unzatoare pentru 00 (-00). PAS2 . Se act ua li zea za ma t r icea cu informatiile despre costurile asociate muc hiilor (arcelor) astlel: pentru fiecare muchie (arc) li ,n cu costu l c . ele mentului alilU] ; se va atribui valoarea costu tui c. Impl em entarea algoritmului pentru matrices costurilo r minime a unui gral oriental. Pentru initializarea matricei costurilor S8 foloseste functia ini t () , iar pentru actualizarea ei functia c i t i re ( ) . Elementele matricei fiind de tip i nt nu se poate folos i pentru simbolul 00 constanta de sistem MAX INT, deoarece i n algoritmii de determinare a drumului cu costul minim prin adunarile repetate ale elementelor matricei (care pot avea sl valoarea MAXI NT) se depaseste capacitatea de reprezentare a tipului int o Exista doua solutil: a. pentru eleme ntele matricei se alege tipu l long , chia r daca acest tip de data nu este justil icat de valori le loarte mici ale costurilor ( ~ i se obtine 0 utilizare inefic ienta a memoriei interne); b. S8 defineste 0 constants cu 0 valoare foarte mare in comp aratie 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 nodurile de la extremitatea unui arc - i si j - ;;i costul asoci at arcului C.

Pentru testarea program ului se foloseste gralul Gn

I II form " tid


# i nc l ude < fstr e a m. h >
int a [ l OOJ ( 100 ] , n ;

249

int con s t MAX ~ 50 00 ; f s tream f( " c o s t. t x t " , i o s :: i n ); v o i d in i t t I / I s e Ln i. t.La.l i z eaz a ma t r i cee c os turil o r {int L j : f n ; for ( i = l ; i <=n ; i ++ }
f o r i j ~ l; j < = n; j ++ )

voi d citi r e{) lise {int Lj ,c ; wh i le ( f ijc) a {L] l j l =c ; f .e t oe e () ; } vo id ma i n () { . . . }

a[iJ [jJ=O ; els e ali] [j]=:'JA Z; ) actuali zea z a ~atricea costurilor eu date:e d i n

if

( i ~ ~j)

fi~ier

Scrieti un program care creeaz a matricea co sturilor 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 (m axim )


Pentru determinarea drumului cu costul minim (maxim) intre doua nod uri ale unui graf se poate folosi: -7 al goritmul Roy -Floyd; -7 algor itm ul Dijkstra Ambii algoritmi folose sc principiul enuntat prin teorema lui Bellman : d rum ul opti m (cu cost ul minim, respectiv maxim ) intre doua nod uri oarecare i l?i j co nt in e numai d ru m u ri partial a optim e (cu costu ri min ime , respe ctiv maxime) care trec prin alte noduri ale gratu lui. Altfel spus , dac a drumul optim dintre doua noduri oare care i ~i j trece printr-un nod k, atunci ~i drumurile de la i la k ~i de la k la j sunt optime. Cei doi algoritmi difera prin modul in care se identifica noduri le intermediare k.

Fig. 33

a) Algoritmul Roy-Floyd
Al goritmul foloseste un principiu asernanator cu cel care a fast utilizat pentru determ inarea matricei drumurilor: gasirea drumului optim intre doua noduri oarecare i si j prin descope rirea drumurilor optime care iI compun si care tree prin nodurile k se face prin transformarea matricei costur ilor . Matricea trece prin n transformari, in urma carora fiecare element a [ i ] [ j] va me mora cost ul drumului minim dintre nodurile i si j . PAS1 . Penlru etiche te ale nodului k de la 1 la n (adica pentru arice nod al grafu lui) exec uta : PAS2. Penlru arice pereche de noduri din graf i ~ i j (cu t s is n si t sj sn) executa: i PAS3. Dac a suma dintre costul drumului de la i la k si costu l drumu lui de la k i la j (a [ i ] [ k]+ a [ k] [jJ) este mai mica decat costul drumului de la i la j (a [ i ] [ jJ) , at unci in matricea costurilor cost ul drumului direct de ! la i la j este inlocuit cu costuI drumului ca re trece prin nodul k

!
i

(a [ i ] [ j]= a li] [k J+a [ k ] [ j J) .

Pentru grafu l din figura 32 matricea costur ilar sutera urmatoarele cinci transforrnar i. La fiecare transformare , daca drumu l de la nodul i la nodul j are costul mai mare decat costul drumur ilor care trec prin nodul intermed iar k (de la nodul i la nodul k si de la nodul k la nodul j) , atunci elementului a [ i] [ j] i se va atribui valoarea a t il [ k] + a [k] [ j] .

250
k=1 2
1

Implernentarea strueturilor de date


k=2 34
3
co

0
co co co

2 3
4

0 5
co

'" 7
eo

'" 8 '" '" 0


k=4
2
4

1
2

1 0
co

2
4

3 3
eo

0
4

0 2

3 4 5 3 3 11 0
4

'" '"
2 4 11 7 12
0

0 5
co

0
4

6 5 12 8 13 17
0

4 5 11 12 7 I 8 12 13 0 1 ", 2 I 0

1 1
2 0
co

k=3 345
3

3
4

'" co
2
4

4 0 5 9
6

'" 0
4 5

5
3

11 7 12 0 2

12 8 13 17 0

k=5
1 2
3 4 5

1
2 3 4 5

0
co

'" '" 2

0 5 9
6

1 0 10 15 19 2

2 4

0 5 9 6

3 11 0
4

11 7 12 0 2

5 12

8
13 17 0

Interpretarea datelor din matricea obt inuta in urma transformarilor se fac e astfe l: drumul de la nodul i la nodul j are costuI minim a[ i ] [j ] . De exemplu , drumul cu costul m inim de la nodu l 2 la nodu l la nodul 4 are costul minim 7. Matric ea nu furnizeaza informati i des pre etichetele drumului cu c ostu l m inim . Pentru im plem entarea algor itm ului se folosesc subprogramele: -7 funct ia procedurala in it initializeaza matricea costurilor: -7 functia procedurala c it ire actua lizeaza matricea costurilor cu date1e din fisier: -7 functia procedura ta tra nsformare transforrna matricea costurilor; 7 functia procedural a afisare afiseaza lungim ea drumu rilor min ime i ntre toate nodurile grafu lui.

#include < fstream .h> int a[ lOO] [lOO],n ; int canst M AX =5000 ; f stream f ( " c o s t . tx t ", i o s: : i n ); vo i d init () { l i s e i n it i a l i zeaza mat ri cea c o s t u r i l or l void citir e(} {l I s e actuali zea za mat r i cea costur i l or ell date l e din fi $ier } v o id t r ans f o r ma r e ( ) li s e trans forma mat r i cea costu rilo r { f or (i nt k~l ;k<=n ;k++)
for {int i =l ;i<=n ;i++) for (int j~l ;j<~n ;j++) i f (a [ i J[ k ] +a [ k J [j]<a[i] [jJ) ali) [j]~a[i] [k]+a[ k) [j] ; } v oid afisa re () {cout" c o s t u l drumu r ilo r minime intre nodurile : " e n d l; f or {i nt i=l ;i<=n ;i+~) fo r (i n t j=l ;j<=n ;j+ +) if (a [ i J [jJ<f1AX && i !=j) cout" (" i" ," j" )-" a f i ] [j] endl ; } v o i d main () {i n i t {) ; citire() ; transf orrnar e ( ); a f isare{) ; }

lnformatiile din m atricea c ost urilor transformata prin algoritmul Roy Floyd se pot fotosl pentru aver if ica daca ex.sta drum cu costul minim intre doua noduri ale grafului , iar in ca z afi rmat iv , se poate atrsa lungimea lui ~i se poate descopcri drumul ,

Algoritmul de descoperire a drumului eu cost ul minim pornind de la matricea costurilor transtormata foloseste acelasi rationarnent ca la transformarea ei: daca lungimea drumului minim dintre noduriIe i ~ i j este eqala cu suma dintre lungimile minime a coua drumuri care tree printr-un nod intermediar k (a [ i ] [k]+a[k j [j]=a[i] [j J). atunci nodul k face parte

Informa tica

25 1

din drumul de lungime minima de la i la l Deoarece problema pentru determinarea nodurilor


care forrneaz a drumul de lung ime minima S8 descompu ne in doua subprobleme: de terrnina -

rea drumului minim de la nodul i la nodul k (cu k" i) ~i determinarea drumului minim de la nodul k la nodul j (cu k.;j), in implementarea algoritmului se foloseste strategia divide et im pora Pentru implementarea al goritm ului prin care se determina drum ul minim dintre doua noduri x ~i y (a carer eticheta se citeste de la tastatura) se folosesc subproqra mele :

-7 fun ct ia procedurala init initializeaza matricea costurilor;


7 functia procedu rala citire actuali zea za matricea costurilor cu datele din fisier:

-7 func tia proced urala transformare transforms matricea costurilo r;

-7 func tia procedurala d r um deterrnina nodurile dru mu lui eu cost minim;


-7 functia procedu rala afisare afiseaza costul drumulu i minim drumu l; #inc lude <fstream .h> i nt a[lOO J [lOOJ , n; iot const MAX=5000 i
fstream f{ " c o s t . t x t " , i o s: : in) ;
~i

nodurile care torrneaza

void i n i t ( ) {! /se initia lizeaz a me t r i.cee cos t ur i.Lo r l void c i t i r e { ) {/ I s t:: ectualLzeeze rnet r i cea costurilor cu da tele din fi$ier } void t r a n s f o r ma r e ( ) { l i s e transformamatricea costuri lor }
void drum (i n t L . int j) // se de t e r mi. ne noduril e d rumu 1u i mi nim {int k , qa s i.t : for (k=l, gasi t=O ; k ee-n && l.qe s Lt , k+ +) if l i ! ~ k && j !~kl && (a[iJJj] ~~ i1[ i}[k]+a[k J .lj Jl {d r uml i , k ); d rum( k , ] ); gasi t = l ; } if (!gasit) c ou t j " "i } void a f i s a r e (int x , int y ) {if (a(x Jly ]<MAX) {cout " d r umu 1 minim d e 1a Dodul " x " 1a n o d Ul " Yi c ou t; c c" a re c o s t.u L " a ( x] [y] e nd l ; cout x " H; drum{x ,y ) ; } e lse cout " Nu e xista d rum " ; }
voi d main()

{int x, y ; cout " x = " i cin x; cou t " y = It; c in y; i n i t n; c itire () ; t.rensIorme re rj a fisare(x,y) i }

Complexitatea alqoritrnului Roy -Floyd Algoritmul de transformare a matricei costurilor are ordinul de complexitate O (nxnx n )~ 0 (n
3 )

deoarece fiecare structura repetitiva for se executa de n ori, iar structurile for sunt imbricate. Algoritmu l de de terminare a drumurilor cu costul minim din matricea costuri lor transtorrnata

are ordinul de complexitate al algoritmului di vid e et imp era: 0(n xlg2n). Ordinul algoritmului 3 3 este 0(n )+ 0(n xlg 2n) ~ 0(n + nxlg2n) ~ O(n'). Modificati programele care implementeaza algoritmul Roy Floyd astfel
lncat sa 5e determi ne dr um ur ile cu costul maxim .

b) A lqoritm u l D ij k stra Algoritmul lui Dijkstra construieste drumurile cu costuI minim care pornesc de la un nod oarecare x - nodul sursa - pana la fiecare nod din graful G ~(X ,U) - nodul destinatie. Algoritmul lntretine 0 multirne cu nodurile care au fost deja selectate - S, si 0 coada de
prio rita t i Q cu nodurile ca re nu au fas t selectate inca: Q=X -S, astfel:

252
~

Im ilcmcnturca st r u ct urilo r de date

Un nod y este declarat selectat atunci cand s-a det erminat costu l final al drumul ui cu c ost ul minim de la nodu l sursa x la el. Selectare a unui nod nu este echivalen ta cu gasirea drumului cu costul minim deoarece este po sibil ca in urma calc ula rii costului sa rezulte ca nu exista drum de la nodut x la acel nod. ~ i n coada Q prioritatea cea mai mare 0 are nodul pentru care costul drumu lui are valoarea cea mai mica dintre toate costurile de drurnuri care porn esc de la nodul x la celelalte noduri nese lectate i nca. La fiecare extragere a unui nod din coad a de prioritati Q , nodul este adauqat la rnultirnea S, iar coada de prioritati este reorqanizata i n functie de acest nod (se recalculeaza costul drumurilor de la nodul x la noduril e rarnase i n coada, co nside rand ca unele drumuri, daca tree ~i prin nodul extras, pot sa-si rnicso reze costul). Pentru calcularea drumurilor de lungime minima S8 i ntretine 0 rnultim e 0 in care S8 rnerno reaza co stuI drumurilor de la nodul x la nodurile neselectate, costuri care S8 reca tculeaza la fieca re extragere de nod . Drumul cu costul minim care porneste din nodul x este fonmat din nodul initial x ~i creste pana cand coada de prioritati Q nu mai corinne noduri. Deoarece, cele doua rnultirni S ~ i Q sunt disjuncte, iar reuniunea lor este multimea nodurilor X, este suficient sa S8 in tretina numai multimea S. Aigo ritmul foloseste strategia greedy , deoar ece intotdeauna alege nodul eel rnai apropiat de nodul sursa x. PAS1, Se initializeaza: S=8 , se citeste nodul initial x ~i se atribuie multimiiS . PAS2, Se initializeaz a multirnea D cu cost urile drumurilor de la nod ul x la toate celela lte noduri ale grafului (sunt preluate din matricea costurilor elementele a [xl [i i ). PA S3. Cat timp coada de prioritati Q nu este vida (mai exista noduri neselectate) ex ecuta PAS4 . Se cauta printre nodur ile neseleetate nodul y cu eel mai mic cost al drumului (reprezinta elementul care trebuie eliminat din coada de priorita\li Q) . PASS. Se adauqa nodul y la rnultime a S: S=Su {y} (tnsea rnna extra gerea nodului y din coa da de prioritati Q si declararea lui ca nod selectat ). PAS6. Pcntru fiecare nod neselectat (nod din coada de prioritati) executa i PAS? , Se recalculeaza costul drumului de la nodul x la acest nod folosind ca J nod intermediar nodu l extra s. PA sa, Daca acest cost este mai mic dedit eel din rnultirnea D, atunci el va fi noul cost.

i i

Implementarea algoritmului. Se folosesc trei vector! ~ Vectorul s pentru rnultimea nodurilor selectate, definit astfel : D' ca ca nod ul i nu a fost selectal s(i) = { 1, da ca nodul i a fost selectat
lnitial, elementele vectorului s au valoarea O . cu exc eptia etem entului s [xl care are valoarea 1. La terminarea executie i alqo ritmului, toate elementele din vectorul s vor ave a valoarea 1. Nodurile i pentru care s 1i ] =0 se consldera ca fac parte din coada de prioritati Q ~ Vecto rul d contine costul drum urilor, astfel: d[i] = costul drumului minim gasit la un moment dat de la nodul x la nodul i (co t s tsn ). lrutial d [ i ] =a [x l [ i 1. La terminarea algoritmului, d [i ] = costul minim al drumului de la nodul x la nodul i. ~ v ectorulp mern oreaza drumurile gasite intre nodul x ~i cele lalte noduri i ale grafului. Memorarea drumului se face prin leqatura cu predecesorul care este defin ite 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 nodu l i), p [i] =><; altfel p [ i ] =0.
Nodu l i care S8 extrage din coa da de prioritati Q trebuie sa lndeplinea sca urmatoare le conditii: ~ s Id j eu. ~ d[i]=min{d[ j] 1 1s: js:n ; s [ j J=O) . d[i ] reprezinta eostul minim al drumu lui de la nodu l x la nodul i.

Pentru reo rgan iza rea eozii de prioritati se proceceaza astfel : pentru fieeare nod j eu s [ j J =0 se calculeaza costuI drumulu i 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 ] ~i se actualizeaza veetoru l p : p [j ] =i. Pentru grafu l din figur a 32 , considerand x= 1, algoritmul se excuta astfel : lnitial :
Vectorii

. 2
1 0 0 0
4

s
d

3 -

4
~

. 5
0
co

0
3

I co 1 I 0

Drumul cu eostul eel mai mic este eu nodul 3: d [3 1=3. Nodul 3 se va extrage din eoada Q. Se analize aza nodurile care raman in coada de pnoritati: Nodul 2. d [3] +a [ 3] [2] = 3+5 = 8 > 4. Nu se rnodifica nimie. Nodu l 4. d [ 3 ] +a [ 3] [4 ] = 3+r = a: > 4. Nu se rnodifica nimie. Nodu l 5. d [3] +a [ 3] [5 ] = 3+r , = r > 4. Nu se mod ifies nimie. Ve c torii 1 2 3 4 5 1 0 1 s 0 0 4 cc d 3 0 "" p 0 1 0 1 0 Drumul eu costuI eel mai rnic este eu nodul 2: d[ 2 ] =4. Nodul 2 se va extrage din eoada Q . Se analize aza nod urile care raman in coada de prioritati: NoduI 4. d [ 2 ] +a [2 ] [4J =4+7=11 <". Se modifiea: d [ 4 ] =11 ~i p [ 4 ]= 2 . Nodul 5. d [ 2 J+a [ 2} [ 5] = 4+8 = 12 < Y. . Se rnodifica : d [5] =1 2 si p [5] =2. Ve c tor ii 1 2 3 4 5 5 1 1 1 0 0 11 0 d 4 3 12 0 1 1 2 2 P Drumul cu costu I eel mai mie este eu nodul 4: d [ 4] =11 . Nodul 4 se va extrage din eoada Q . Se analize aza nodurile care raman in coada de prioritati: Nodul 5. d [4] +a [ 4] [5] = 11+,., = >J> 12. Nu se modifica nimie.
Vc ct orii
5

1 P Drumul cu eostul eel mai mic este eu nodul 5: d [ 5] =15 . Nodul 5 se va extrage din eoada Q.
Coada este vid a
~ i S8

1 0 0

1
4

1 3 1

1 11 2

0 12 2

termin a executia alqoritmului.


Vectorii 1

Final:

. 2
1
4

. 3
1 3 1

5 . 1 12 2

s
d

1 0
0

1 11 2

254

Implcmenta rea struetnrilor de date

Din datele care se qasesc i n vectorii d ~i p la terminarea algo ritmului se obtin urmatoarele 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 reconstitu ie 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 imple mentarea 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 functia procedurala init initializea za matricea costu rilor; -7 tunctia procedura la c it ire actual izeaza matricea costurilor cu datele din fisier; -7 functia procedura la gene rare_drum transforms vectorii d si p conform algoritmuJu i pentru a obtine drumur ile cu costu l minim de la nodul x la oricare alt nod i din graf; -7 functia procedu rala drum dete rrnina 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 drum ul; #include < f s t r e a m. h > int a[ l OOJ [l0 0 ] , d [ l OOJ , s [ l OOJ , p I1 0 0 J ,n ; i nt c ons t 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 costu ri 1or} vo i d ci tire() {l i se actua1i zeaza matricea c os t Bri1or cudate le din f i ~ier } v o i d gene r are=d rum(i n t xl lise gene reaz a drumuri1 e {int i ,j , min ,y ; s lxl=l ; for ( i =l; i< =n ;i++.}
{d [ i ] ~a [ x J

if

(i '~ x

&&

[ i J; d [i]<MAX!

p [i]~x ; )

fqr ( i =l ; i <=n - l; i ++ )
{fo r ( j =l , mi n =M AX; j<=n ; j++) i f (s [jJ==O && d[jJ<m in! s l y l ~ l;
for ( j ~ l; j <~ n; j + + )

{mi n =d [j J ; y~j ; )

if

(s[jJ ~~O &&

d[j J>d [yJ+a[yJ

[il!

{ d [ j l ~d [ Y J + a [ y ]

[jl; p[j J~y ; ) ) )

v oid drum( i n t i} { if {p l i ] ! ~ O l dr um(p [i]) ; cou t-oc i c-; " " ; } voi d afisare( i nt xj {for ( i nt i ~l ; i<=n ;i++) if (i.! =x)
i f (p[i]
!~O)

( c cut c cv d r umu l cu co s t.u I minim d ela nodul " x; coutH 1a nodul "i" are castu1 " d [ i 1endl ; drum( i) ; c out endl ;} el s e c out " Nu exista d~um de 1a " x" 1a H i e n d l; }
vo i d main ( ) {i nt x ; c ou t " x= H; c i n x; .i n i.t.Ll : c itire () ; qe ne .rar-ej d r-umt x j Co m p lex ita tea algo ritmulu i lui Dijkst ra

e r i.e e re (x) ; }

Pentru determinarea drumului cu costuI minim se executa pasii algoritmu !ui. Pasul 2 are ordinul de complexitate O(n). Pasul 3 se executa pentru fiecare nod din graf, mai putin nodu! sursa, deoarece fiecare nod trebuie selectat a data (se executa de n-1 ori). Pentru

In forma tic a

255

fiecare nod selectat S8 ana lizeaza cel elalte noduri , exec utandu -se : Pasul 4 de n ori (S 8 cauta printre toate cele n nod uri da ca mai exists in coada de prioritati, iar printre cele care mai sunt in coada de prior itati S8 cauta nodul cu costu l drumul ui eel mai mic), iar Pasul 6 de n ori deoarece treb uie identificate printre cele n noduri care mai sunt in coada de prioritati.
Ordinul de com plexitate al algor itmu lui f. entru dete rm ina rea drumului cu costu l minim va fi: 2 O(II )+O (lI x( II+ II)) = 0 (11)+0 (11 ) 0(11 ). In algor itmul pentru afisarea drumu lui sunt ana lizate toate cele II noduri ale grafu lui, iar pe ntru fiecare nod i se deter rnina recursiv drum ul. Complex itale a algoritmu lui de afisare va fi 0(11) x 0(lI xlg211) = 0(1I 2xI92n).

-------- ~ Mo dificati prog ramul care irnplernenteaza algoritm ul Dijkstra astfe l ,~ J tn cat 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 do ua puncte situate fiecare lntr-o intersect ie. Traficul intre coua intersectii nu este intotdeauna in ambele sensuri , dar intre oricare doua inte rsectii 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 fisie r, astfel: de pe primul rand, nurnarul de inte rsectii, iar de pe urrnatoa rele randuri, triplete de numere x , y, z care sernnifica fa ptul ca pen tru traficu l de la intersectia x pana la inte rsectia y sunt nec esa ri 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 do ua puncte de lucru exista a legatura prin intermediul retelei de sosel e. Distanta dintre doua puncte de lucru lntre care exista leqatura directa este rnasura ta In kilametri. Firma trebuie sa-si stabileasca lntr-unul din punctele de lucru sed iul central. Criteriu l de alegere este ca suma dlstantelor la celelalte puncte de lucru sa fie min ima . Scrief un program care sa stabile asca punctul de lucru care va fi ales ca sed iu. Dal ele se citesc dintr-un fisier , astfel: de pe primul rand, nurna rul de puncte de lucru , iar de pe urmatoa rele randuri, triplete de nu mere x , y , d care semnifica faptul ca punctele de lucru x ~i y sunt legate direct de 0 sosea cu lungimea d . lndi 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 une le dintre aceste puncte de lucru ~ i lntre oricare doua puncte de lucru exista 0 leqatu ra prin interm ediul trafic ului 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 in tre 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 calecteze 0 cantitate cat mai mare de arnbalaje. Datele se citesc dintr-un fisie r, astfel: de pe primul rand, nurnarul de intersectii, iar de pe urrnatoarele randuri, triplete de numere x , y , c care sernnifica faptul ca intersectia x este leqa ta direct de intersectia y prin traficul de pe 0 strada de pe care se poate colecta can titatea c de amba laje. Elichetele intersectiilor A ~ i B se citesc de la tastatura.

256

Implcm entarea s tr uct urilor d e date

4. 0 firma se poate aprov iziona cu trei sortimente de mater iale de la mai multe depozite situate i n localitati raspandite i ntr-o zona geografica. intr-un depo zit nu este obligatoriu sa existe toate cele trei sortimente . a retea de sosele leaga direct unele dintre aceste locaiitati 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
kilome tri. Firma trebu ie sa S 8 aprov izioneze cu unu l dintre sortiment ele de materiale. Scrieti un progra m care stabileasca depo z itul de la care S8 a proviz ioneze firma astfel i ncat drumul care tre buie parcurs pentru aproviziona re sa alba lungime a minima. Fie carui 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 localita ti. m . De pe urrnatoarele m randuri se citesc triplete de numere x, y, d care sernnifica faptu l ca loc alitatile x si y sunt legate direct de o sosea cu lungimea d . De pe fiecare dintre ultimele trei rand uri, in ordine a etichetelor sortimentelor de materi ale , se citeste cate un slr de numere despartite prin spatiu cu

sa

sa

inforrnatii despre locatiile depozitelor unde se gas e~ te acel sortiment de material: primu l nurnar rep rezin ta numarul de depozite, iar urrnatoarele numere etichetel e loc alitatilo r in care se qa sesc aceste de poz ite . Nurna rul sortimen tului de materiaIe p se cornun ica de la tastatura. lndicatie. Se deterrnina distants minima de la localitatea i n ca re se gase~ te firma la loca litatile i n care se gasesc depoz itele si se alege dintre acest e distante cea ma i mica distanta care corespunde unui depoz it ce confine sortimen tul de mat eria l p.

2.7.1 . Grafuri spcciale


Exista urrnatoar ete grafur i speciale: -7 graf uri bipartite ; ~ grafuri hamiltoniene: ~ grafuri euleriene : -7 grafuri t urn eu.

2.7.10.1. Graful bipartit


Graful G = (X,U) se numeste graf bipartit dac a exista dou a rnul tirnl nevide de noduri A ~i B ca re au urmatoarelo pr oprietati : AuB=X ~ i A"B=0 ~ i orice muchie (arc ) din rnultl mea U are 0 ext rem ita te in m ultim ea de noduri A ~i 0 alta ext rem itate in rnul tirnea de noduri B. Example:

1. Graful neorientat G4 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) = X4 ~i Ar>B=0 ~i ca fiecare muc hie uEU, ={[1,2J, [1,4] , [2,3J, [3,4J, [3,5J , [5,6J, [5,7], [5,8J, [7,9]} are 0 extrem ite in rnultirnea A ~i cealalta extremitate i n rnultirnea B:

, ,
1
1

, , , ,

[1,2) c> 1EA si 2 EB [3,4) c> 3EA si 4 EB [5,7) c> 5EB si 7GA

[1,4) c> 1EA si 4eB [3,5) <> 3EA ~i 5EB [5 ,8) c> 5EB si 8EA

[2,3) "" 2eB ~i 3eA [5,6) "" 5eB ~i 6 EA [7,9) c> t e. ~ i geB

, , , , , ,
\

, , ,
I
/

,
I

1 , ' ,@ , , , ' @O'

Obs erv ati e. Nodurile izolate pot face parte din oricare dintre cele doua rnultirn i.

Fig .3 5

I II fo r III a tic ii
2. Graful orientat Gg definit anterior este un graf bipartit deoarece exista ' mult irnile A ~ i B care sa i ndepllneasca cond itiile din definitie: A ; A ; (1. : 3, 4, 6) ~i B ; (2, 5). Se obse rva ca: AuB ; (1, 2, 3, 4, 5, 6) ; X g ~i I AnB;0 si ca fiecare muchie UEUg; {[1,2J, [2,1J, [2,3], [2,4], [3,5], [4,2], : [4,5J, [5,3], [5,6], [6,5]) are 0 extrernite in rnultim ea A ~i cealalta extre- I mitate in multimea B: I
. I I

257
-,

[1,2] => 1EA ~ i 2EB [2,4] => 2 EB si 4 EA [4,5] => 4 EA ~ i 5EB

[2,1] c> 2 EB si 1EA [3,5] => 3EA si 5EB [5,3] => 5EB ~i 3EA [6,5J => 6 EA si 5EB

[2,3J => 2 EB ~i 3EA [4,2J => 4 EA ~ i 2 EB [5,6] => 5EB si 6 EA

I ~

Fig . 36

Graful bipartit G ; (X,U) se nurn ests graf bipartit cornplet dac a - pentru orice nod Xi EA i orice nod xje B - exista 0 muchie (un arc) fe rmata din cele doua nod uri care apartine rnultimii U; [Xi, Xj]EU, Exemple: 1. Graful neorientat G,,;(X28 ,U' 8) definit astlel: X28 ;{1 , 2, 3, 4) ~i U'8;{[1,2]. ~3 [1AJ, [2,3], [2.3]) este un graf bipartit complet. deoarece exists multirnile A si B care indeplineasc conditiile din definitie: A;{1 , 3) ~i B;{2, 4). Se observa ca: 2 4 AuB; (1 ,2,3A }; X, si A, ,-,B; 0 si ca fiecare nod din rnultimea A este legat cu 0 Fig . 37 muchie de fiecare nod din multimea B. 2. Graful orientat G29 ; (X 29,U29) definit astfel: X29;{1 . 2. 3, 4) ~i U, g;{[1 ,2], ~ 2 [1,4J, [2,1], [2,3], [3,2], [4,3]) este un graf bipartit complet, deoarece exists G2~ rnultimile A ~i B care sa Indeplineasca conditiile din defin itie: A;{1 , 3) si 3 4 B;{2 , 4). Se observ e ca: AuB;{1, 2, 3, 4};X, si AnB;0 ~i ca fiecare nod . din rnultimea A este legat cu cel putin un arc de fiecare nod din rnultirnea B. Fig . 38 Observatie. Graful neorientat bipartit complet se noteaza cu Ka,b ~ i are axb rnuchii, unde a; c ard (A ) ~ i b; ca rd(B). De exemplu , daca graful neorienta! are 3 noduri, S8 obt in urrnatoarele variante de grafuri bipartite complete:
Elementele multimii A 8 1 2.3 1,3 2 3 1.2 1.2 3 2 1.3 2,3 1 1,2.3 0 0 1.2.3
Muchiile ar afului

[1 .2J. [1.3J [2.1J. [2.3] [3.1]. [3.2] [1.3J. [2.3] [1.2]. [3.2] [2.1]. [3.1] nu exista, deoarece 8- 0
nu exista. deo arece A- 0

Numaru! de muchii ale arafului 1/2-2


1x2=2

1/2 -2
2x1 =2

2/ 1-2 2/1-2 3xO- 0 Ox3-0

Algoritmi pentru prelucrarea grafurilor bipartite 1. Generare a tutu ror 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 eleme nte (exceptand rnultimea inltiala ~ i multimea vida). Nurnarul total de submuln timi obtinute este 2 - 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 corespunzatcare indicelu i elemen tului apartine rnultirnii A; altfel , apartine multimii B.
Impl ementarea alg oritmului. Functia ge n e r are () qenereaza grafurile bipartite complete. T n vectorul a se genereaza nodurile mult irnilor A si B. Initial elementele vectorului au

258

Implem en ta rea st r uctur ilor de date

valoarea O. Variabila po sLbd L se foloseste pentru a verifies dac a mai exista posibilitati de genera re de submultirni (are valoarea 1 - true , atunci cane mai este posibil sa se genereze subrnultirni ).
# inc l ud e < i o s t r e a ~ . h>

# incl u d e <ma t h. h > vo i d ge n e ra r e ( i n t n) lint a [ 1 0 ] ~ { O ) , i ,j ,k~ 0 ,posi bi l ~ 1 wh i l e (po s ibil)


l j ~ n;

wh ile

(j> O & &

a [ j] ~ ~ l)

{ a [ j J ~ O;

j-- ;}

if

I j~~O I

po sibi l ~ O ; (k < ~ p ow (2 , n l - 2 1

e lse

{ a [ j ] ~ l ; k + +;

if

{cout "Cr a f u l ': k endl "i' hl l t i me a A : "; fo r (i = 1; i <= n ; i + t) if (a [ i]) c o uu c c i, .c c "


cout " i1u l t i me a B : fo r ( i =l ; i <= n ;i-tt) ".

tI

i f ( ! a[i]) cou t c c i c c " couten d l ; cout;c " Hu cb i i.Le sunt : " . for {i=l ; i<=n ;i ++) i f (a[il~~l)

If

f o r (j = l ;j<=n ;j-t+) i f (a[jl==O & & i ~ = j) cout" [ " i " , " j "] to; couten d l ;} }}} void main { } ( i n t n ; c out" n uma r de nodu rL > 'I; cin n ; c c n c r e re tnl r )

2. Ver ifi c ar ea un ui graf dac a es te graf biparti t . Algo ritmul. Pentru a verifica daca graful este bipartit, se genereaza rnultimile de noduri A B pan a cand ace ste mult irni i ndeplinesc conditia unui graf biparti t, sau pima cand s-au generat toate multimile ~i nici una dintre variante nu a indeplinit condit ia pentru gra! ul bipartit. Gra!ul este bipartit daca i ntre orice pereche de element e din cele doua rnultiml (x ,y), cu x EA si YEB - exis ta muchie care sa Ie lege in gra! ([X,y] EU). Pentru generarea rnultirnilor de noduri A ~ i B se pot folosi doua variante:
~i

Vari anta 1. Ca ~ i in algoritmul prece dent, se qenereaza ln tr-un vector toate submultirn iIe care se pot obtine din cele n etichete de noduri (exceptand rnultirnea initiala ~i multimea vida) ~ i se verifies daca nodurile apartinand celor doua rnultimi generate pot fi rnultirnile unui graf bipartit. Impleme ntarea algorit mul ui. Se citesc din fisieru l text gb.txt info rrnatii despre un graf neorientat (nurnarul de noduri ~i matricea de adiacenta ). Functia bipar t i t () verifica daca graful este bipartit furniz and un rezultat logic. Elementele vectorului x in care se genereaza muttirnile A ~i B sunt initial O. Variabila ga si t se foloseste pentru a veri!ica daca s-au gasit cele doua rnultimi de noduri corespu nzatoare unui gra! bipartit (are valoarea 1 - true , atunci cand s-au gasit).

# inc l ude <: s t r e a m. h > #inc lude <ma t h. h > f stream f ( " g b . txt " I i o s: : i n ) ; i n t a[ I O] [ l O],n ; v oid ci t e s t e ( ) { l l c i t e C? t e matr icea de a di acen1;.a di n i nt biparti t () lint x [ ~ O ]= { O I , i , j , m ,k = O ,p o s ~ b i l =l ,g as it = O ; wh i l e ( pos ~b il && ! g asit l

fi ~i e r }

Informatica
{m=n; while (m>O && x [ m ] ~ ~ l i f (m==OI posib i l~O ;
e lse
{ x l m ] ~ l; k ++ ; l

259
(x[rn] =O; m- - ; )

i f ( k <~p ow ! 2 , nl - 21 fo r ( i=l ,gas i t=l ;i <=n && gasit ; i ++) for (j=l ;j<=n && gasi t ; j ++ )
i f (a[i]
[j]~~l)

i f I( x[i]~l && x[j] =ll II !di] ~O && x [ j J ~ O ) qesLt -O r l j return g asit i } void maine) {c i t e s t e ( j; if (bi?a rt:'t()) cout " Es t e bipa r t i t "; else cout " Nu este bipartit " ; } Var ian ta 2. Elementele multirnilor A ~ i B se genereaza separat , in doi vectori. Pentru generarea multirnii A se foloseste me toda back tracki 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 lom enta rea algo rit rnului. Matricea A este matricea de adiacenta a grafului, iar in vectorii a si b S8 gene reaZ8 elementele multimilor A ~j B. in functia t i pa r ( ) 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 1 0g;c13 gasi t . Tot in aceasta functie 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 gralul este bipartit. (are valoarea 1 - true , caca nu rnarul de muchii qasite este egal cu nurnarul total de muchii ale gralului m].
#in c l u de <fs t r e a ~. h >

fstream f( "gb .txt " , i o s : :in ) ; typedef int stiva[lOO] ; int n , k , ev ,a s , 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 ~l ;j<~n ;j++1 ( f .~ [ i ] [j] ; m=m+A [ i] [ j ]; J L c l o se [) ; vo i d i niL() { s t [ k ] = O; J int suc::::e sor () {if (st[k]<nj { s t [ k ] = s ~ ( k ] + l; return 1 ; } el se return OJ } i nt valid () { i f n:>:1- && st[k]<st[k- l]} re t 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 Lu t i.e L) (return k= =p ; ) void t..i p a r {} {int 1 j ,q=O ,gasit ,nr=O ; for ( ~ l;i<~p ;i++) a[i]~ s c[ i ]; for ( =1 ; i<=n ; i++)

rn~m! 2 ; )

260

Implemcntarca stru ct urllor de dat e

{f o r ij=l ,gasit=O; j < ~p & & '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 ~l ; j<=q ; j++) i f (~.[a [i) ] [b[jJ] ~ ~l ) n r ++ ; if {nr==m ) este=l ; } v oi 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 ls e cout" Nu este b ipar t i t " ; } 1. Scrieti un progr am care citeste din fisieru l gra f.-b1.txt matricea de adiacenta a unui gral neorientat si, de la tastatura, doua siruri de num ere ce reprezinta noduri d in graf - si care verifies da ca cele doua siru ri de numere pot reprezenta pentru gral cele doua rnultirn i ale unui gral bipartit. 2, Com parati din punct de vedere al eficientei cei doi algorit mi prin care se dete rrnina daca un gral neo rien tat este bipartit. 3, Scrieti un pro gram care cite ste din fisierul graf.-b2.txt matricea de adiacenta a unui gral orienta t 'Ii care verifies c aca gralul este bipartit. in caz afirmativ, se afiseaz a 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. Altlel 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 ex iste un ciclu hamiltonian este necesar ca pe langa un lant hamiltonian sa mai existe 'Ii a muchie care sa lege primul nod allantului de ultimul 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 oarecarese pot parcurge 0 si nqura data to at e noduril e grafului, revenind 13 nodul initial.
G, o Gralu l G" din figur a 39 contin e ciclul ham iltonian 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, in care fiecare varf al poligonului este legat de celelalte varfuri prin diagonale, iar varfurile poligonului parcurse pe laturi forrneaza un ciclu hamiltonian.

Fig . 39

Seop: exempl ificarea unei aplicatii i n care solut ia problemei este un graf ham iltonian. Problema voiajorului comercial. Un voiajor comercial trebuie sa ceietoteesce in mai multe orase pentru a-i prezenla proousete. Se CL IIJO ate eostul deplasarii intre localitati. Trebuie sa se stabileasea un traseu prin care sa se ajun ga in toate loealitatile, astfel incat

Informatica

261 se

costuf deplasarii sa fie minim. voieiorut va trece 0 singura data prin fiecare focalitate si va tntoerce in locafitatea de pornire.

Localitatile torrneaza nod urile unui grat, iar traseul voiajorului trebuie sa fie un ciclu hamiltonian i n acest graf. Daca exista mai multe cicluri hamiltoniene, S8 va alege eel cu costuI minim (ciclul i n care suma cost urilor asociate muchiilor este minima). Obs ervatie, Orice problema la care soluua este de a gasi un traseu - care porneste dintr-un anumit punct, l rebuie sa treaca prin puncte precizate, cu revenire la punctul de pornire - se rezolva prin gasirea unu i ciclu hamiltonian. De exemp lu: -7 0 firma de mesagerie trebuie sa distribuie zilnic colete la mai multe adrese. Ma~ i n a care distribuie aceste colele pleaca de la sediul firmei, ajunge la mai multe puncle din eras ~i revine la sediul firmei. Leqatura directs dintre doua puncte este caracterizata prin distants rnasurata in kilometri (costul asoc iat fiecarei muchii). Trebu ie sa S8 ga seasca traseul de lungime minima pe care trebuie sa-l parcurqa masina. -7 0 persoana doreste sa taca un circuit prin l ara ~ i sa viziteze mai multe puncle turistice, plecand din localitatea de domiciliu ~ i Intorcandu-se in aceeasi localitate. Legatura directs dintre doua puncte turistice este caracterizata prin distants rnasurata i n kilornetri (costul asocia t fieca rei muchii). Trebuie sa S8 gaseasca circuitul turistic de lung ime minima. -7 0 persoana doreste sa viziteze mai multe cabane , intorca ndu-se la locul de plecare. Leqatura directa dintre doua cabane este caracteriz ata prin timpul necesa r parcurge rii traseul ui de munte (costul asociat fiecarei muchii). Trebuie sa se gaseasc a circuitul de vizitare a cabanelor care sa se faca i n timp minim. ....

Teorem a 18 Daca gratul G=(X,U) este un grat cu mal mult de doua noduri (n<:3) ~ i gradul . flecarui n od X EX sat isface co nditia d(x)<:nf2, atunci gratul G este ham ilto nia n,

Observatie. Aceasta teorema precizeaza numai condltia sufic ienta ca un graf sa fie hamiltonian. Acea sta conditie nu este Insa ~i necesara. Astfel, este posibil ca un graf sa nu Indeplineasca aceasta conditie 9i sa fie totusi hamiltonian. Din aceast a cau za , teorema nu poate fi folosita pentru a const rui un alqoritrn care sa verifice daca un grat este hamiltonian.
Dem ons trat ie. Notarn cele doua propozitii, astfel : (1) - Gr aful G are m ai mult de dOU3 nodun ~i gra dul fiecarui nod XEX satisface conditia d (x)~n/2 . (2) - Graful G este hamiltonian . Trebu ie sa derno nstr arn ca (1)=>(2) - prin reducere la absu rd. Pres upunem ca graful G nu este ham iltonian . Adau ga m muchii la acest gr af pima se obtine un graf hamiltonian (in eel m ai rau ca z se ajunge la un gra f cam plet , car e sigur es te hamiltonian ). Prin ada uqa re a de noi muchii, gradul u nor nod uri creste , ceea ce in se amna ca se pastreaza ineg alitatea din propozitia ( 1). Adauqarea ace stor muchii se face pa na ca nd se obtine graf ul G , ca re nu este hamiltonian, da r ca re . pr in adau qare a unei singure muchii de vine ham iltoni an . Acest graf nu e ste sigur un graf com pte! !iii tnseem na ca exists eel putin doua no du ri ne adi acent e. Luam dintre aceste noduri dou a nodu ri x ~ i y ~ i [X,Y] EU, ca re au propriet ate a prin adauq area muchiei [x,Y] ta graful G, . se cbtin e un cidu hamiltonian C = {x, Xl. . .. . xk-t Xk, y, x} . lnsearrma ca i n graf ul G 1 exis ta un lant elem entar L(x,y) ca re con tine toate nod urile grafului. Oeoar ece d(x):2:n/2 , rezult a ca i n gra ful G , mai exis ta un nod xi cu care este adia cent. Acest nod face parte din lantul Llx.y). Fie Xi., nodul care precede nodul Xi in lan1ul L(x,y). Da ca nod urile xi.1 ~i y Iorrnea za 0 mu ch ie ([Xi_ l ,y] e U, ), lnsearnna ca gr aful G, ccntine un ciclu hamiltonian C, = {x, Xl ' ,, Xi_ '. y , Xk. Xk_ l , ..., Xi, X} , ceea ce contrazice presup unerea ca graful G , nu e ste hamilton ian. Rezulta ca nodul y nu formeaz a muchie cu nici unul dlntre nodurile care i l preced in la n~ul L(x ,y) ~i care sunt adiacente cu nodul Xi . inseamn a ca nodul y nu poate fi adiace nt decat cu cel mult n- 1-d(xi) noduri , adica

ca.

d ( y)~

n-1-d(x,). Dar, d(x;)2n/2. Rezulta ea

d ( y)~

ipoteza. Cont radictia a aparut din presupun erea

ca gr aful G nu este hamiltonian .

n-1 -n/2=n/2-1, adlea

d(y) ~ n/ 2 ,

ceea ce contrazice

262

Implcm entarea stru ct urilnr de date

1. verificati daca gra ful ham iltonian G, o din figura 39 lndeplineste conditiile preciza te in teorerna . 2. Desenati toate grafurile hamiltoniene cu 4 nodu ri. G 31 3. Veriticati daca este hamiltonian graful G31 =(X 3 1,U3 1) cu X 31= {1,2,3,4,5,6,7j si U31={[1, 2], [1,5]. [1,6]. [1,7]. [2,3], [2,7]. [3,4), [3,5], [3.7]. [4,5]. [4,6J, [5,6J). Daca este graf hamiltonian, gasiti un ciclu ham iltonian si veriticati daca graful lndepline.;;te conditiile precizate in teorerna . 4. Dernonstrati ca un graf bipartit cu nurnar impar de noduri nu poate fi graf hamiltonian. 5. Dernonstrati ca nurnar ul ciclurilor hamilloniene din graful com plet cu n noduri este I n ~ I) ! . Alqoritmul pentru parcurgerea unui graf hamiltonian A lgoritm ul. Pentru a determina daca un graf este ham iltonian S8 verifies daca exista un clclu hamiltonian. Este suficient sa S8 caute lanturile elementare care pornesc din nodul cu eticheta 1 .;;i S8 Inchid in acest nod. Se poate folos i fie metoda backtr ack i ng, fie metoda parcu rge rii i n l a~ime a g rafu lu i. Prin aceste met ode S8 pot determina .;;i toate ciclu rile hamiltoniene, caca exista, astfe l: se cauta toate ciclu rile elementare care , pornind dintr-un nod, parc urg toate celelalte noduri ale qrafulu i ~ i se i nchid printr-o muchie cu nod ul de porn ire. Im plem entarea algoritm ului. Se citeste din fisierul graf_h.txt ma tricea de adiac enta a unui graf neo rientat. Daca graful este ham iltonian , se afrseaza ciclurile ham iltoniene gasite. Daca nu exist a nici 0 solutie , se afiseaza un mesaj de informare. Pentru generarea lanturilor elementare se foloseste me toda backtrack ing. 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 pom ind d.n nodu l cu eticheta 1 (are valoarea a- False , daca nu s-a g5s lt un ciclu hamiltonian).
#~ncl ude < f s t r e a m . n >

typedef s t i v a [ l OO]; in t <'"1 [2 0 J [201 ,n ,k ,o s ,e,t ,este=0 ; s t i ve s.t , fstream f( "grafh .t x t " , i o s : :in }; void c i te s t e ( ) { / / s e c i t e .:;o t e matricea de ad ia c e n ta } v o i d i n it () { s t ! k J ~ O ;}

int s u c c e s 6 r ()
{ i f (st[KJ< n) {s t[ k J = 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 [ c t [ k] ] ~ ~ O ) retu rn C; for (i n t i = l ; i <k ; i ++) if (st lkJ==st li]) return 0 ; r e t ur n 1; ) i n t so lut ie () ( r e t u r n a[st[k } ] [l]==l && k ==n ; } v oid tipar () ( fo r (i n t i=l , es t e = l ; i < ~ n ;i + + } cout s t [ i J ", " . c o u t s t [ l ] e n d.1; } v o id bt(} {I / i cle n t i c a ell ceo de La qeoe r.a re a La n t u r i.Lo r e Le me n t.a re l void main() { c i t e s t e {); st[ l ]=l; fJt { ) ; if ( ! este) ccu t c-c vrjr -a Iu I nu este h a uu.Lt.o n i.e nvr j 1. Scri eti un program care citeste din fisie rul text graf.-M. txt matricea de adiacenta a unui graf hamiltonian, verifica daca graful ln depline ste con ditia precizata i n teorerna pentru un graf ham iltonian ~ i verific a daca este hamiltonian - folosind metoda parcu rgerii in la1ime a grafului. 2. Scr ieti un program care cites te 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.7.1Q .3. Graful eulerian


intr-un gr at G=(X ,Uj , se numeste lant eulerian lantulcare confin e 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 initia l coincide cu nodul fina l se numss te ciclu eulorian.
Ca i ntr-un graf sa ex iste un ciclu eulerian este necesar ca , pe langa un lant eu lerian , sa mai

existe si a much ie care sa lege primul nod al lantului de ultimul nod al lantului, 'Ii acea muchie sa nu rnai fi fast parcursa . Un graf c are contine un cicl u eu lerian so numesto graf eulerian. .Altlel spus, un graf eulerian este un graf in care, pornind de la un nod oarecare se pot parc ur ge 0 sinqu ra data to ate m uchiile grafu lui , revenin d la nodu l initial. Graful G" din figura 40 contine ciclul eulerian C= (1, 4, 6, 7, 4, 5, 7, 8, 3, 2, 8, 5, 2, 1}.
Ob serv ati i 1. Un graf eulerian poate co nt ine no duri izolate 2. Pentru ca un graf poata fi tacut eulerian prin adEiugarea muchiilor trebuie sa fie i ndeplinite urmatoarele conditii:

GJi

sa

-7 daca nurn arul de noduri este par, sa nu existe noduri cu gradu l maxim ;
nurnarul de noduri cu grad impar sa fie par. Nurnarul minim de much ii care trebuie adauqate este egal cu jumatate
din numa rul de nod uri eu grad impa r.
~

~
2
3

8 .

Fig.40

[ 1tuMjlju

de

cez l
s,
r

Scop : exempl ificare a aplica tiei In care solutia problemei este un graf eulerian.
. . Pro blema pod urilor d in o rasu l Konigsberg . ~ in acesl ores exist septe poduri peste della . teului Pregel care !oaga cele palru sectoare ale '-.

oresulu! """" '" Problem: un traseu prin care un vizitator sa parcurga toate ~ cele patru sectoero ale oresutui lA, B, C ! 0), ~~ in tcrceti du-se in punclul de unde a plecat, trecetid peste fiecare pod a singura data. 0... -"": $~

00"'";''' ,"M,

~," ~
~
,

...

~~~ . ~ .
~_

a\ ,

~, , Cele patru zone (notate ~~ Fig. 41 . ", ~ 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 parcu rqa toate muchiile a sinqura

"

F' 42 Ig.

data, adica un ciclu eulerian. Matematicianul Euler a demonstrat maternatic, in anul 1736, ca aceasta problema nu are soluni ~ (ca acest graf nu este eulerian). ~

264
Tcorema 19

I mplementarea strueturilor de date


Un g raf G=(X,U), ca re nu co nfi ne no duri izolate, este eulerian daca ~ i numai daca este concx si qradele tuturor nodurilor sunt nurnero parc.

n emonstrane . Notarn cele doua prcpozitii, astfel: (1) - Graful G nu coniine noduri izola te ~i 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 es te co ne x. Trebuie sa demonstram ca, oricare ar fi nodurile x ~i y din graf, exlsta un Ian; L(x ,y) care le leaga Pentru cele coua noduri poate sa apa ra una dintre urma toare te sltuatii: ~ Sunt adiacente ([X,Y]EU ), lnseamna ca exista iantul L(x,y). -7 Nu sunt adiacente ( [x,YJ~ U) . Oeoa rece graful nu are noduri izolate , insearnna ca ex lsta alte doua noduri z ~i 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 ambe le situatii exista un lant L(x ,Y), tnsearnna ca graful este conex. pentru un nod oarecare b. Gradele tuturor nodurilor s unt numere pare . Trebuie sa demonstra-n X EX, d (x) este un numar par . C iclul 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 poa te sa apara in aces t ciclu de p ori. Fiecare aparitie a nod ului x in acest cictu Insearnna existenta a ooua muchii diferite incidente cu el. Rezulta ca d(x)=2xp , adica un numar par.

ca

(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 oa recar e x :;;i Y lntre ca re exls ta 0 muchie ([ X,y] EU ). Nodul Y evano gradu l un numar par, tnscamna CEl exista un nod z cu care formeaza 0 much ie ([ y,z] eU ). Continuand in aces t mod, se ajunge la un nod W care forrneaza much ie cu nodu l x ([ w ,x] eU ), deoarece :;;i grad ul nodului x este un numar par. Rezulta ca in graful G exista un c ic 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 cic lul 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 ipotez a ca graful G este conex. Fie muchia [X,Y] EU, cu XEC . Pom ind de la aceasta muchie, pe muchii care nu apartin ciclului C, trecand prin noduri ale ca rer gra de nu au fast epu izate , se obune . dupa un numar finit de past, un no u cic lul 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 lung ime . lnsearnna ca el confine toate much iile grafului :;;1 graful este eulerian. Observatie, Aceasta teorema. precizand conditiile necesare ~i suficiente ca un graf sa fi e eulerian , poate fi fo los ita pentru a construi un algoritm care Sa verifice daca un graf es te eulerian .

G34

1. Verificati condititle din teorerna pentru graful eulerian G32 din figura 40. 2. Verificaf daca graful G 34 =(X34.U34) cu X34={1 ,2,3,4,5,6.7) "i U34={[ 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 fu l este eulerian , gasiti un ciclu eulerian ~i 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 leg ate printr-un lant eulerian - dac a si nu m ai d aca ele suntsi ngurele noduri cu g rad impar di n g ra f. 4 . Desenati toate grafurile euleriene cu 4 nod uri.

G"

5. Verificati daca graful conex G35 =(X35,U3S) cu X3s={1,2,3,4,5,6.7,8) U3s={[ 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 a firm a tiv , precizati cate rnuchii trebuie adaugate ~i care sunt aceste muchii.

"i

Inform atica

265

6. Verificat i daca graful necon ex G36=(X36,U3 6) 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 prin adauqare de muchii. In caz afirmativ, precizaf cate muchii trebuie ada uqate ~i care sunt aceste muchii. Gasit i un algoritm pentru generalizarea problemei. 7. Sa se dea exemple de urma toarele 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 hamiltonia n si eule rian. Algoritmul pentru parcurgerea unui graf eulerian Pent ru a imp lementa graful S8 foloseste ma tricea 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 nod uri izolate. Daca "are nod uri izolate S8 considers ca graful nu est e eulerian . in implementarea algoritmului se foloseste functia i z o l a t () care testeaza gradul nadurilar ~i furnizeaza un rez ultat 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 gra dul fiecarui nod este par. in implementarea algorit mulu i se foloseste 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 ve rifica daca graful este conex . Pentru aceasta se va pa rcurge graful in adancirn e si se verifica daca raman noduri care nu au fost viz itate. i n implementarea algoritmului se foloseste vecto rul vi z i ta t pentru a tine evidenta nodurilor vizitate. Conexitatea se veri fic a prin fu nctia 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 eu ler ian . Daca graful este eu lerian se poate dctermina un ciclu eulerian Acest algoritm foloseste de rnonstratia de la teorema precedents. Construirea ciclului eulerian se face astfel: PAS1 . Se porneste dintr-un nod aarecare din graf ~i se construieste din ap roape in aproape ciclul C , pe muc hii incidente care exista in graf, scazand gradele nodurilor prin care trece si eliminand muchiile. PAS2. Cat timp 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 ciclu l C, se construieste ciclul C1 ~i se concateneaze ciclul C1 la ciclul C. Solutia se va obtine intr-un vecto r c care contine nodurile parcurse care au fast adauqate la ciclul eulerian. Vecto ru! c l se foloseste pentru extind erea ciclu lui eulerian. Se mai folos esc urrnatoarele variabile de memorie: -) n - nurna rul de noduri ~i m - numarul de muchii; -) i, j , k - contori pentru pa rcu rge rea matricei de adiacenta si a vectorilor to lositi ; -) q - variabila in care se pastreaza nod ul de la ca re incepe ciclul c 1; -) p - variabila i n care se pastreaza lungimea loqica a vectorulu i cl.

266

I mp leme nt area structurilor de da te

Aigoritm ul pentru dcte rminarea cic lulu i eulerian este urrnatorul: PAS1. Se citesc va lorile pentru va riabilele de mem orie n si m ~j matri cea de adia cen ta a . PAS2. Se ver ifica daca graful este eulerian. adica daca l ndeplineste cond itia sa nu alba noduri izolate, nodurile sa aiba grad e pare ~ i sa fie co nex : (in imp lementarea algorit mului: e u l e ri a n = ! v izolat ( ) &&g r a d p ar () && oon e x () ). PAS3. Daca grafu! nu este' eul erian( variabila eUl er ian~re valoa rea false), atunci S8 afiseaza m esaju! 'Grato! nu esle eulerian' fji S8 terrnina algoritmul; alttel , S8 serie me saju l 'Graful este eulerian' si S8 trece la Pasul 4 pentru a determina un ciclu eulerian . PAS4 , Se pleac a dintr-un nod oareca re (de exempl u, nodul 1: e [ 1] =1) PASS. Ex ecuta urrn atorii pas i pentru a construi i n vectorul c un prim cielu prin parcu rgere a din apro ape in aproape a muchiilor grafului, pornind de la nodul eu etieheta j eq ala cu 1: j ~ 1 (acest cielu exista, deoarece grad ul nodului de porni re este par, eeea ee lnsearnna ca orieare ar fi muehia pe care se porn este, mai exis ta cel putin a muc hie care soseste i n acest nod) . PAS6 . Cat t i m p nu s-a qasi t a muchie lntre nodul curen t k din coa da c (e [ k n.~ i un alt nod j din graf (j<=n ) exec ut a: PAS? Daca exists a muchie i ntre nodul curen t k din coad a C (c [ k ] ) ~i un alt nod j din graf (a [ e [ k] ] [j ]~~1 ) , atunc i se trece la Pasul 8; altfel, se trece la Pasul 11. PAS8. Se adauqa nodul j la coada C ( k ~ k + 1 ; e [k] ~ j ;) . PAS9 , Se micsoreaza cu a unitate grad ul celor doua nodu ri parcurse (g [ j ] -- ; g[e[ k -1 ] ] -- ; ). PAS10 . Se ste rqe din matricea de adi ac enta muchi a pa rcursa (a [e [k ]] [ j ] =D ; a[j] [e[k]] =D;). PAS11 . Se trece la urrnatc rul nod prin ' incrementarea lui j (j ~j+ 1) si se revine la Pas ul 6. Pana can d nodul curent din coada c (c [k]) este diferit de nodul de pornire. PA S 2. Cat timp rnai exista muchii care nu au fast incluse i n ciclu (k - l <rn ) exec uta PAS13 , Se cauta In 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 parcu rse (gr ad [ e [ i] ]>0 ). PAS 14. Se initializeaza cu acest nod ciclul c1 (e1 [1]= e[i )) si se rnerno reaza acest nod i n variabila q. PAS 15. Se construie ste 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 ciclul c1 cu ciclul c astfe l: mai i ntai se de plasea z8 eleme ntele din vectorul c , l ncepand din pozitia q , cu p pozi tli spre dre apta , du pa care S 8 intercaleaza, lntre pozitia q sl pozi tia q+p , elemen tele vectorului c1. PAS1? Se afiseaza elementele vectorului c .
# i nclude < f s t r e ~ m . ~ >

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 0 1 , cl I 20 j; stivu st ;
fs t r eam
f ( " ':J :::- a f ~ e . t x t " , i o s ;

;i n ) ;

void c i t e s t e{ ) { / / s e c it ~~ t e matricea d e a d i a c e n t ~ } voi d i.n it( i r: t i) { v f = l ; s t j v f l e i : v .iz i t .a t Lt l e-L r } 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.rn i n t ) {v t':"'_;}

I nfo r mat ica


voi d l i nt
if
i~l ;

267
vizitat[iJ ~ ~l )))

p r .eLuc r-a re t) k ~ st I v fl .
i ++ ;

( i < ~n && (a[i][kJ ~~ O I I (a[ i ] ! k J~~ l && ( 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 ); whil e

while ( ! es te v ida () ) prel u crare \) ;


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 j ~ 1 ; j< ~n ; j++ ) 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 (g [i J=~O) return 1 ; r e turn Of} in t crad pe r l ) { f o r {i n t i~l; 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, g as i t :::: O; j <=n && ! g a s i t; j + + ) if (a[ c[kJ][j]==1) ( k~ k +l; c[k J ~j ; a[ c[ k -1 J hiJ =O ; a [ jl [c ! l:- 1 JJ ~O ; 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)
(for ( i = l, q ~ O; ~ <=k- l

&& 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 for ( j =l/ g a s i t = O; ~I < = n && !gasi t ;j++) if (e l c L j p l ] [j l ~ ~l) ( p ~p q; c Lj p j e j: a [ cl [p- 1 J Uj J ~ 0 ; a U J [ c l [1"- 1J J = 0; 9( j ] -- ; 9 [ c lf 1"Cl J J - - ; gas i t =1 ; ) while (e l [ p J '= c 1 [ lJ) ; for (j = k; j > ~q ; j -- I e [j +p -1J ~ c [ j J; for ( j =1; j<=1'- 1; i H) c !j+cjJ <c I [)"f1 J ; l: =l:+ p~ 1 ; II . void main () ( i n t euler ia n ; 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) cou t.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 Lce s t.e eu Le r Lan "<cendl : c .ic Lu j I : oou t-oc vc i cLu I e u le r i a n e s t e : " ; for (int i = l; i<=m+ l ;i-H) cou t-oc c l'i l c :' " ;}}

Observatie . Daca graful contine noduri izolate, alqoritrnli anteriori se pot ap lica pe subqraful conex care se obtine dup a tnlaturarea nodur ilor izolate . _....-... 1. Deterrninati comp lexitatea algoritmu!ui de qasire a unui ciclu eulerian. 2. Scrieti un prog ram care citeste din fisierul text graf_e1 .!x! matricea de adiace nta a unui graf eule rian si, de pe ultirnul rand, un sir de numere care reprezinta etic hete de noduri - ~i care verifica daca sirul de etichete reprezinta un ciclu eulerian . .

268

Implementarea strueturilor de date

3. Scrieti un program care citeste din fisierul text grale2./x/ matricea de adiace nta a unui graf neorientat care poate contine nodur i izolate si care verifica daca graful este un graf eulerian, iar daca este graf eulerian, aflseaza ciclul eulerian. 4. Scrieti un program care citeste din fisierul text grale3.txt matricea de adiacenta unui gral neori entat conex ~i care verific a daca graful este un graf eulerian, iar dac a nu este, verifica daca poate fi facut eulerian - In aces t caz, S8 prec izeaza nurnarul de m uchi i care treb uie adauq ate ~i care sunt aceste m uchii .

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


Observa tli 1. Arcul dintre doua noduri poate ave a oricare dintre cele doua orlentari . 2. Gralul tum eu este un gral complet .

Teorerna 20

~ ~
Fig . 43

Orice graf turneu contine un drum elementar care trece prin toate nodurile grafului.
Demonstratle - prin reducere la absurd. Presupunem ca nu exista un drum elementar care trece prin toate nodurde grafului. Conside rarn D (xj, xj ) un drum de lungime maxima din graf s! un nod x eD(xj, xj), Graful turneu fiind un graf cornplet, tnseamna ca nodul x este adiacent cu orice nod din drumul D( x i, xj) , inclusiv cu nodurile Xj si Xj. Pot sa apara ur rnatoarel e situ atii: -7 Exista arcul [x.x.] . i n acest caz, tnseamna ca exista drumul D(x ,xj) mai lung decat drumul D( xj ,xj) , ceea ce contrazice ipoteza. -7 Exista arcul [xj .x] . in acest caz, tnseamna ca exista drumul Df xr.x] mai lung cecat drumul D (x j,xj ). ceea ce contrazice ipoteza. -7 Nu exista arcele [X,XiJ :,?i [xj,x] . Oeoarece graful este complet, inseamna ca exista arcele [xj.x] :,?i [x.xj] . Daca pentru orice nod XkED(Xi,Xj) exista arce numai cu sensul [Xk,XJ. tnsearnna ca exista -drurnul D,{ xj, xj) mai lung cecat drumul D( x j,xj ), deoarece contine in plus muchiile [ Xj.1,XJ :,?i [x ,Xj]. Daca pentru ortce nod XkED (Xj,Xj) exlsta arce numai cu sensul [X,XkJ, tnseamna ca exista drumul D 2(xj,xj) mai lung cecat drumul D(xj ,xj) , deoarece confine in plus muchiile [Xj,x] :,?i [X,Xj+1]. Daca exista doua noduri adiacente Xk ~i Xk+1, care apartin drumului D( XhXj) pentru care arcele incidente cu nodul x au sensuri contrare, se obtine un drum D3(x j,x;) mai lung cecat drumul D (x j,xj) , deoarece coni ine ~i arcele [Xk,X] ~i [X,Xk+1J. ceea ce contrazice ipoteza. Rezulta CEI drumul D(xj ,xj) contine toate nodurile din graf.

Propozitia 10 Pentru mice gral tumeu, exista un nod x, astl el inca t toate nodurile y"x sunt accesibile din x pe un drum care contine un are sau doua aree .
nemonstrat!e - prin reducere ia absurd. Consiceram nodul x cu gradu l extern maxim - p

Inseamna ca intre nodul x ~i celelalte p noduri exista un drum format dintr-un singur are, Sa
presupunem ca printre ceJelalte noduri exlsta un nod y care nu este aeeesibil din nodul x prin coua arce. lnseam na ca din aeest nod pleaca p aree entre nodurile care sunt aecesibile printr-un singur arc din nodul x ~ i un arc catre nodul x. lnseamna ca nodul yare gradul p+1, mai mare decat gradul nodului y, ceea ce contrazice ipoteza

Propozitia 11

Pentru m ice nod Xi dintr-un gral tumeu cu n noduri, d+( Xi) + d-(X j) = n-1 .

Informatica

269

Demon strat!e. in graful turneu. fiecare nod Xi fiind legal de celelalte n-1 nod uri Xj din graf pnntr-un arc s! numai unul, insearnna ca orice nod Xi esle incident cu n-1 arce si suma dintre g radul intern ~i gradul extern este eqala cu n-t .

Propozitia 12 Intr-un gra! turneu cu n noduri


n " L d+( \ ,) = L d- (\,) = C;
i~ 1

, unde Xi este un nod din grato

1 =1

Dernonstrat ie . in orice graf nearientat suma dintre gradele interne ~j grad ele externe este egala. cu nurnarul de arce m ; iar numarul de arce intr-un graf turneu se determine la tel ca !?1 in cazul unui graf complet neonentat K n

Propozitia 13

intr-un gra! turneu

L d ' ( \,)' = L .r (\, )' , unde Xi este un nod din grato


i", )

"

1= 1

Dernon st ratie . d' (x,)' + d-(Xi)xd' (x,) = (n-1)xd' (x,) s! d-(x,)' + d' (x,)xd-(x,) = (n-1)xd-(x,) Scazand cele doua identitati, obtinem d +( x/ - d- (x/ = (n-1)x(d+(Xj) - d- (xj)). Acunand aceasta identitate pentru loate nod urile Xi obunern:

L d + (\ , )' - L d" (\ , )'


i- I i- I

= ( II - I) x (L d' (\ , ) i -I

L d- ( \ ,
I- I

= (II - I ) x (Ill - Ill ) = 0

1. Derno nstrati ca un graf turneu este tare conex, daca si numai daca contine un ciclu elementar care trece prin toate nodurile grafului. 2. Scrie ti un program care citeste din fisierul text grafJtxt matricea de adiacenta a unui gra! orientat , i care verifica daca gra!ul este un gra! turneu. 3. Dernonstrati ca nurnarul de grafuri turneu care se pot eonstrui cu n noduri este

2c~ .

I SWWlLlL de CaLZ I
Scop: exemplificarea unei aplicatii in care soluua problemei este un gra! tumeu. Enuntul problem ei. Pentru un concurs hipic s-au montat n obstaco/e. Pentru a parcu rge traseu l concursutui, catarelii pot incepe cu orice obstacol. trebuie sa treaca peste toate obstaeolele, iet de 18 un obsta col la altul pot citcute intr-un singu r se ns, stabilit inain tea concursului. Sa se precizeze ce trasee poate urm8 un cetsret. Obstacolele forrneaza nodurile unui graf orientat, in care fiecare doua noduri sunt legate de un arc. Deoarece drumul dintre doua obstacote nu poate fi parcurs decat intr-un singur sens, insearrma ca graful concursului este un graf turneu. A determina un traseu pentru parcurgerea obstacolelor , tnsearnna a determina in gra!ul turneu un dr um -e ~ eeleme ntar care trece prin toate nodu rile gra! ului. Algoritmul pentru parcurgerea grafului turneu Pentru a determina drumu l 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. in acest algoritm , se initializeaza vectorul cu nodurile cu etichetete 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], atun ci D [ 1] =1,i D [2 ] =2: altte l, D [ 11 ~ 2 PAS2. Se inltializeaza lungimea drumului. m. cu 2.
,i

D [2]=1.

270
PAS

lmplerncntarcu st r uc tur tlor de d at e


Pentru noduril e cu eticheta i de la 3 pima la n exec ut a: PAS4 . Daca exista arcul [ i , 1], atu nci pozitia de insera re k a nodului i este 1 ~i se trece la Pasul 7; aItfel , pentru a parcurge nodurile din drum se initiallzeaza indicele j cu vaioarea 1 si S8 trece la Pasul 5. PASS. Cat tirn p nu s-a ajuns la capatu l vectoru lui 0 (indicele j nu are valoarea m) ~i nu s-a gasit pozitia de inserare a nodului .i.. ex ec uta : j PAS6 . Dac a eXi~ta arcul i ntre nodul cu indicele j din drum ~i nodul i ~i J exista ~i arcul intre nodu l i si nodul cu indicele j + l din drum , at u n ci j pozitia de inserare k este j + l ; alttel , se trece la urrnatorul nod din ! drum prin incrementarea variabilei j ~i se revine la Pasul 6. ! PAS7 . Se deplaseaza eleme ntele vectorului din pozitia k (de inserare) spre , dreapta. ! PASa. Se inserea za nodul i In pozitia k. ! PAS9 . Se incrementeaza lungimea m a drumu lui 0 si revine la Pasu l 3.
~

Impleme ntarea alg o ritm ului. lnforrnatiile despre gralul neorientat se gasesc in fisierul grafJtxt: pe prima linie num arul de nodur i, apo i matr icea de adiacenta. Nodu rile drumului elementar vor fi genera te in vectoru l n . Se lolosesc urrnatoare le functi i; ci t es te ( ) pentru a citi matricea de adiacenta din fisier, gene r are () pentru a genera vectorul D l?i a r i.aa r e () pentru a afisa drumu l elementar gasit. in -functia gene r a re () S8 folosesc urmatoarele variabile locale: i - pentru eticheta nodului care se adauqa la drum, j - pentru a cauta eticheta nodului dupe. care S8 insereaza in drum nodul cu eticheta i, k - pentru pozitia in care S8 inse reaza i n vectorul drumului nodul cu eticheta i, m - pentru lungimea drumu lui la un moment dat (numarul de noduri adauqa te la drum) ~i gas i t - pentru a sti daca s-a gasit pozitia de inserare a nodului i in vector (este 0 varia bila logica - pentru fiecare nod i este inltializata cu valoarea False - 0 -' , cu sernnificatia ca nu s-a gasit i nca pozitia de inserare). Pentru testarea programulu i se foloseste gralu l G37. #include < f s t r e a m. h >
i nt n ,a[10 ] [ 10] , 0 [1 0) ; fst ream f ( ''r,;r a f _t . txt '' ,ios : :in i i void c i tes t e () { I I se ci t e s ce me tr i c e a de ad .iacen t a } vo id g e ner a re ( ) (i nt i ,j ,k ,m=2 ,gasit ; if 1,,[1; [2)~~1) ( O l l J~ 1; 0[2J~2 ; ) e lse { D [ l J =2 i ~[2] =1 ; } for ( i =3 i~<=n ii++) {if t a l L] [0[1] J ~ ~l) k ~ l; else {fo r . (j=l,gas it =O ;j<=n && ! g a si:: ;j":-+ ) i f ia[D[j:J [i]~~ l & & ali] [ D [ j +l ]] ~ ~l ) qa s Lt e l , ;:=j+1 ; ) f or ( j ~m+ 1;j> t: ;j - -1 0[ j l ~ 0 [ j -1 J ; D j k l e.i : m++ ; ) ) v oid afisare () {for (i n t i =l i i <= ni i ++ ) c o u t O[ i ] " " i } v oi d ma i n () { c i t e ste \} i qe n e r ar.e () i a f Lrsa z ..e () i }

Daca graful G 37 din figura 43 este gralu l unui concurs hipic; dete rrninati traseul pe care trebuie sa-l parcurqa un cala ret.

Informatica 2.7.10.5. Aplicatii practice

271

1. Graful miqratiei pas arilor cala toare este un graf bipart it, cele doua mul tirni fiind forma te
din locatiile din zona rece , i locat iile din zona calda . Verificati daca aces t graf este un graf bipartit complet in caz afirmativ , ce conc luzie traqeti despre rniqratia specie i de pasa ri studiate? 2. Consid erati ca graful din figura 39 reprezin ta graful oraselor prin care tre buie sa treac a voiajoru l come rcia l. Adauqati fiecare i muchii distanta in kilometr i i ntre erase . Scriet i un program care sa rezolve problema voiajorului comercial - care sa gaseasca traseul cu costu l min im. lndicatie. Fiecare ciclu hami ltonian gas il (nodurile depuse in stiva ), va fi memor at intr-o matrice cu n coloane, num arul de linii fiind egal cu nurnarul de cicluri gasite. Alege\i din ciclurile gasite pe cel cu costul minim .

3. Jocul icosian a tost inventat de William Hamilton in anul 1857. Era un dodecaed ru regulat confectionat din lemn (un polredru cu 12 tete sub form a de pentag oane regulate) , i care avea in fiecare varf cate un cui care era marcat eu numele unui eras (figura 44). Cu ajutoru l unei sfori , care trecea prin fiecare cui 0 singura data, trebuia sa S8 gaseasca un traseu care sa parcurqa toate orase le (sa parcurqa .. ', ..... ( , toate muchiile dodecaedru lui) cu reven ire la orasul de plecare . Scrieti un program care sa qaseasca solutii pentru . _' )"" ' <' J" acest joe, in trei variante: a) S8 cunoaste orasul de plecare ; b) se cunos c primele doua erase prin care trebuie s a treaca tras eul; c) S8 Fig . 44

cunosc prirnele trei erase prin care trebuie sa treaca lraseul. Etichetele oraselor initia le se cornunica de la tastatura . lndicatie. Dodecaedrul poate fi reprezentat cu ajutorul unui graf neorientat. in care trebuie sa se gaseasca un circuit hamiltonian . Nodurile sunt cele 20 de varfuri ale poliedrului (figura 45).

Fig . 45

4. Joc ol de sa h . Sa se gase asca un traseu de acoperire a lablei de sah cu una dintre piese (piesa tre buie sa treaca 0 sinqura data prin fiecare dinlre cele 64 de patrat e ale la blei de sah ,i sa revina la pun ctul de plecare). Piesa poate fi: a. calul - se cepl aseaza in forma de L (problema a fost studiata de Eule r i n anuI 1759); b. dama - se dep laseaz a in oricare dintre patratele adiacente; c . nebunul - se depla seaza numai i n patratele afiate pe diagonala patratului i n care se gase,te ; d . tura - se deptaseaza num ai i n patratele afiate pe verticala sau pe orizontala fa\a de patratul in care se gase,te . tn dicat ie. Ta bla de sah poate fi reprezentata cu ajutorul unui graf neorrentat i n care trebuie sa se gaseasca un circuit ham iltonian . Nodurile sunt cele 64 de patrate ale lab lei de sah, jar intre doua nod uri exista muchie numai daca piesa pea te sa se deplaseze i ntre cele doua patra te, conform regu lilor jocului.
5. Scri ef un program care sa demenstreze ca problem a podurilor din ora sul Ko nigs ber g nu are solut ii. 6.

a persoana dore ste sa viziteze mai rnutte cabane, legate prin trasee turistice , astfel l ncat sa parcurqa fiec are traseu 0 singura dat a , i sa se relntoa rca la locul de plecare . Leq atura dire cts dinIre doua cabane este caracterizata prin timpul necesar parcurgerii traseului de rnunte (costul asoc iat fiecare i muchii ). Scrieti un progr am care sa gaseasca traseul turistic si care sa determine timpul necesar parcurgerii lui.

272

lm pl em cntarca st r uct u r ilor de d a te

7. Masa rot unda a reg elui Arthur. Scrief un program care sa afiseze sotutia araojarii la masa rotunda a rege lui Arthur a celor 2xn cavaleri, stiind eel fiecare dintre cavaleri are n-1 dusrnanl ~ i ca la rnasa nici un cavaler nu trebuie sa stea Ifmga dusmanul lui. lnd icatie. Relatiile dintre cavaleri pot fi reprezentate cu ajuto rul unui graf neorientat in care nodurile sunt cavalerii, iar muchiile leaqa numai cavaleri care nu sunt dusrnani. Dernonstrati eel acest graf es te un graf eulerian ~ i gasiti un ciclu eulerian . 8. Scrieti un program care sa gaseasca solutia de a dese na figura 46 fara a ridi ca creion ul de pe hattie ~ i fara a trece cu creion ul pe a latura deja ce sen ata. ln d icatie . Figura geomet rica poate fi re prezentata printr-un graf neorientat , in care nodurile sunt varfurile figurii, iar rnuchiil e, laturile . Prob lema cons ta i n a gasi in acest graf , Fi . 46 care nu este eulen n, un lant euleria n. 9 9. 0 compet itie sportiva se desfasoara prin meciuri directe intre doi participanti. Nu exists meciuri nule ~ i nici meciuri eliminatorii (trebuie sa existe cate un meci int re fiecare doi participanti). Scrieti un program care sa afiseze 0 solutie de organiza re a cornpetitie sportive (ordinea de desfasurare a meciurilor). lnd icati e. Deoarece doi participanti nu joaca impreuna decat un singur meci, rneciul va fi defimt prin relatia nesirnetrica sportivul x [oaca cu sportivul y (adica, daca sportivul x joac a cu sportivul Y. atunci sportivul y nu mai joaca eu sportivul x). Graful campionatului este un graf orientat, in care nodurile reprezinta sportivii. iar muchiile, meciurile. Prin modul de organizare a cornpetitiei. el este un graf turneu.

Adovarat sau Fals:


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Nodul x este incident cu nodul y daca forrneaza Irnpreuna 0 rnuchie. Gradul intern al unui nod dintr-u n graf orientat este egal cu nurnarul de arce care ies din nod. Intr-un graf orientat, rnultimea predecesorilor unui nod este fermata din rnultimea nodurilor de la care ajung arce care intra in nod. intr-un graf oriental. suma gradelor interne si a grade lor externe ale tuturor nodu rilor este eqala cu dublu l nurnarului de muchii. Matricea de incidents a unui graf orientat este a matrice binara. in tr-un graf oriental. nurnarul de vecini ai unui nod este egal cu suma dintre gradul intern ~ i gradul extern ale nodului. Lista de adiacen ta a unui graf orientat este fermata din Iistele vecinilor fiecarui nod din graf . Graful nul corinne numai nodur i izolate. Un graf neorienta t cu 5 noduri poate contine maxim 10 much ii. Un graf orientat cu 4 noduri poate cont ine maxim 12 arce. Un subgraf se obtine prin eliminarea unor rnuchii (arce) din graf. intr -un lant elementa r fiecare muchie se parcurge 0 sinqura data. int r-un ciclu elementar 0 muchie poate fi parcursa de mai multe ori. Un drum este un lant in tr-un graf orien tal. in matrieea dr umurilor elementul a[ilDl are valoa rea 1 numai daca exista un drum de la nodul i la nodul j ,?i un drum de la nodul j la nodul i, 0 cornponenta cone xa a unui graf este un graf partial conex al acestu ia. Prin parcurgerea in latirne a unui graf se pot determina componentele conexe ale grafului.

Infurmat ica
18. Un graf conex cu n noduri
19. 20. 21. 22. 23.

273

~ i n-1 muchii confin e eel putin un ciclu . U n graf tare con ex e ste un graf orientat conex. Un gr af bipa rtit com plet este un graf comp let care este bipartit. Cu patru nod uri se pot gene ra 14 grafuri bip artite complete. Un graf ha miltonian poate co ntine noduri izolate. Dati; tntr-un graf cu n no dur i (n"53) gradul fiecaru i nod este mai mic deca t n/2, atunci

graful nu este hamiltonian. 24. l. antul euleria n este un lant elementa r car e parcurge toate muchiile grafulu i. 25. Un gr at eulerian poa te contine p componente co nexe , cu cond itia ca p-1 compon ente conexe sa fie formate numai din nod uri izolate. 26. in tr-un graf turneu cu n nodu ri, suma dintre gradul intern si grad ul exte rn ale ori carui nod este n . 27. Num aru l de arc e dintr-un graf turneu cu n nodu ri este n x( n- 1)/2 .

Alaqeti:
1. Deterrninati nurnarul total de grafuri neorientate distincte cu 3 nodu ri. DOUEl grafuri S8 considera distincte daca matricea lor de adiacenta difera . a. 4 b. 7 c. 64 d. 8 (Bacalaureat - Sesiunea special a 2003 ) 2. Nurnarul de grafuri orientate care S8 pot construi cu 3 noduri este: a. 8 b. 9 c . 64 d . 16 3. Numarul maxim de aree intr-un graf orientat cu 5 noduri este: a. 5 b. 10 c. 20 d. 25

Urrnatorii 12 item i se refera la graful neorientat cu 8 ncdu ri si avand much iile [1 ,2], [1,3], [1,4], [1,5], [2,3], [3,4] , [3 ,7J, [4,7] . [4 ,5). 4. Numarul de noduri care au gradul maxim este :

a. 1 a. 1

b. 2 b. 2

c. 4 c. 0

d. 3 d. 3 d. 46
d . 54

5. Nurnarul de nodu ri izolate este:

6. Numarul de e lemente de 0 din ma tricea de adiacenta este: a. 9 b . 18 c. 20 7. Nurna rul de elemente de a din matricea de incid enta este : a. 18 b. 9 c . 36 8. Suma elementelor de pe Iinia 1 din matr icea de incid ents este:

a. 8

b. 4 b. 3

c. 2

d. 6 d. 5
d . 22

9. Numarul de ciclu ri e lementare de lungime 4 este:

a. 4

c. 6

t n.Nurnarul de lanturi elementare de lungime 4 este a . 16 b. 8 c . 10 11. Numar ul de lan tur i eleme ntare in tre nodu l1 :;;i nodul7 este:

a. 6

b. 3

c. 4

d. 8

12. Numarul de subgratur i cu 3 noduri care se pot obtine din graf este : a . 10 b. 3 c . 20 d . 56 13.Numarul de grafuri parti ale cu 7 rnuc hii ca re se pot ob tin e din graf e ste: a. 72 b. 18 c. 36 d. 9 14.Numaru l minim de m uchii ca re se pot elimina din co mponen ta cone xa {1,2,3 ,4, 5,7} a grafului pentru a se obt ine un gr af pa rtial neconex este :

a. 1

b. 4

c. 3

d. 2

274

Im p lcmcnta rca structurilo r de date

15. Numarul maxim de muchii care se pot elimina din componenta conexa {1,2,3,4,5,7} a grafului pentru a se obtine un graf partial conex este:

a. 5

b. 4

c. 3

d. 2

Urrnatorii 11 itemi se refera la graful orientat cu 6 noduri si cu arce le [1.2J, [1.3], [1,4], [1,5]. [2 ,3], [3, 1], [3,4], [3 ,6], [4.1], [4,5], [4 ,6], [6,4]. 16.Numarul de noduri care au gradul intern egal cu gradul extern este:

a. 1

b. 2

c. 4

d. 3 d . 24

17. Nurnarul de elemente de 0 din matricea de adiacenta este: a. 9 b. 18 c. 26 18.N umarul de elemente de 1 din matr icea de incidenta este:

d. 8 a . 22 b. 11 c. 6 19.5 uma elementelor de pe linia 4 din matr icea de incidenta este : a. 8 b. 4 c. 0 d. 6 20. Suma gradelor externe ~i a grade lor intern e ale tuturor nodurilor este : a. 12 b. 24 c. 20 d. 14 21. Numarul de cicluri elementare de lungim e 4 este:

a. 4
22. Numarul a. 16 23.N umarul a. 2 24.Numarul a. 6 25.Numarul

b. 3

c. 0

d. 6 d. 22
d. 5

de lanturi elementare de lungime 4 este : b. 8 c. 10 de circ uite elementare de lungime 4 este : b. 4 c. 3 de lantu ri elementare l ntre nodu l 1 ~ i nodu l 6 este : b. 3 c. 4 de dru mu ri elementare lntre nodu l 1 si nodul 6 este :

d. 8

d. 5 a. 6 b. 3 c. 4 26.Numarul de componente tare conexe este: a. 1 b. 3 c. 2 d. 4 27. Se considera graful neorientat dat prin matri cea de adiacenta alatu rata . in graf , nodurile sunt numerotate de la 1 la 4. corsspunzator liniilor tablo ului. Sa S8 determine cate perechi de noduri neadiacente exista in graf. Se considera perec hile neordonate (perechea 1-2 este aceeasi cu perechea 2-1).

0 o1 1 010 0 1 0 1 1 o 1 0

a. 1

b. 2

c. 3

d. 4

(Bacalaureat - Sesiunea august 2003) ~ 3 28. Se considera graful neorie ntat din fig ura alaturata. Sa se determine care dintre urmatoarele liste reprez inta lista de adiacenta a nodului 3: 2 4 a. 1 2 4 b. 3 1 2 4 c. 24 d . 1 34 (Bacalaureat - Sesiunea lunie-iulie 2003 ) 0 o 0 29.Se considers un graf orientat avand matricea de adiacenta alaturata . 0 0 o 0 1 o 1 o0 0 Stabiliti care dintre nodur ile grafului au gradul intern egal cu gradul extern . 0 1 100

a. 3

b. 1

c. 0

d. 2

0 1

(Bacalaureat - Simulare 2003 ) 30.intr-un graf neorientat cu n noduri nurnarul maxim de muchii ce pot exista este: 2 a. nx(n+1 )/2 b. nx (n-1 )/2 c. nx(n -1) d. n (Bacalaureat - Sesiunea iunie-iulie 2003) 31 .Numarul maxim de muchii intr-un graf neorientat cu 8 noduri care nu contine niciun ciclu este: c. 27 d. 7 b. 8 a. 4 (Bacalaureat - Simulare 2005)

1 0

Inform atic a

275

32.$ tilnd ca un graf neo rientat fara noduri izolate are 7 muchii ~I 8 nodu ri, stabilit i nurnaru l maxim de componente conexe din care poate f format acesta.

c. 3 d.4 (Bacalaureat - Sesiunea augus t 2005) 33.Se considera graful din figura alaturata , Deterrninati matricea de adiacenta corespu nzatoare:
b. 2
a)

a. 1

TI
1 0 0 1 0 0 0 1 1 1 1 0

I0 I1 I1 I1 I
1 1 1 0 0 0 0 1 1 0 0 0

b) roT1lOl1l c) 1 0 1 0 0 1 0 1 1 0 1 0

I1 I1 I0 I1 I
1 0 1 1 0 1 0 1 1 1 1 1

d)

0 1 0 1

(Bacalaureat - Simu lare 2003) 34.Se cons idera graful neoriental din figura alatu rata . Sa se dete rmine M 3 etiche ta nodului care are lista de adiacenta 2 3 5. a. 5 b. 4 c. 3 d. 1 5 2 4 (Bacalaureat - Sesiunea iunie-iul ie 2003) 35. Se cons idera un graf orienta t dat prin listele de adiac enta : 1) 2 4 2) 4 3) 1 5 4) 42 3 5) 2 3 4. Stabiliti numarut de noduri care au gradul intern egal cu gradu l extern . a. 3 b. 1 c. 3 d. 2 (Bacalaureat - Sesiunea iunie-iulie 2003) 36. Numarul minim de nodu ri dintr-un graf neorientat cu 12 muchii , fara noduri izolate, graf format din exact 3 componente conexe: a. 7 b. 8 c. 9 d . 10 (Bacal aure at - Sesiunea specials 2005) 37.Nu marul minim de componente conexe ale un ui graf neorientat cu 9 muc hii ~i 12 nod uri este: a. 2 b. 3 c. 4 d. 5 (Bacalaureat - Sesiunea iunie-iulie 2005) 38.Ca re e ste nurnarul minim de much ii care pot II plasate intr-un graf neorientat cu 53 de nodu ri, astfel lncat sa nu existe nici un nod izolat? a. 27 b. 26 c. 53 d. 52 39.Se conside ra un gra f neorientat G cu 8 nod uri ~i 16 muchii. Nurnarul de noduri izo late
din G este :

c. eel mult 1 d . eel mu lt 2 (Bacalaureat - Sesiunea iunie-iulie 2003 ) 40.Stabiliti care dintre urmatoarele matrice de adiacenta corespunde grafului din figura alat urata . b I 0 1 0 1 0 c) 0 0 0 1 1 d I 0 0 0 1 a) 0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 (Bacalaureat - Sesiunea august 2003) 41. intr-un graf neorientat cu 20 de noduri numerotate de la 1 la 2 0 exista muchii numai lntre pere chile de noduri i si j cu proprietatea abs(i-j1 . Nurnarul de valor i egale cu 1 din matricea de adiacenta corespunzatoare grafului este: a. 190 b . 362 c. 340 d. 171 (Bacalau reat - Ses iunea iunie -iulie 2003) a. exact 1 b. exact 0

276

Implemcntarea structurilor de date

42.Care este matricea de adiacenta a unui graf neorientat cu 4 noduri, 2 muchii si eel putin un nod izolat?
a) 0

1
0 0 0

1
0

1 1
0

1
0

0 0 0 0

b)

0 0

0 0

1 1
0

c)

1
0 0 0

1
0

0 0 0 0

1
0 0 0

d)

0 0 0 0

0 0

1
0

1 1

1 1
0

(Bacalaureat - Simulare 2004) 43.Se considera un graf orientat cu 6 noduri etiche tate cu numere de la 1 la 6 si 6 arce astfel lnca t exista un arc de la fiecare nod cu eticheta i catre un nod cu eticheta ix2 daca exists un astfel de nod sau catre nodul cu eticheta i-1 in caz contrar. Care este lungimea maxima a unui drum in graf?

c. o; d. 2 (Baca laureat - Simul are 2003) 44.Stabiliti care dintre urrnatoarele variante este matricea de ad iacenta a unu i subgraf al grafu !ui din figura alaturata :
b. 3
a)

a. 4

0
0

to
1
0

0 0 0

0 0 0

0 0 0

b)

1
0

c)

1
0 0

1
0

1 1

1 1

1 1

d)

1 1

1 1
0

(Bacalaureat - Sesiunea speciala 2003) 45.1n matricea de adiacenta asociata grafului orientat din figu ra alaturata 3 nodurile sunt numerotate de la 1 la 4 corespun zator linillor matricei. Nurna rul de elemen te egale cu 1 aflate deasupra diagonalei princi pale depaseste numarul de elemen te egale cu 1 aflate sub diag onala 2 4 principa la cu 1 a. 2 b. 0 c. 3 d. 1 (Bacalaureat - Sesiunea iunie-iulie 2004) 46.Se considera un graf orientat cu nod urile numerotate cu 1. 2, 3, 4 , 5, 0 0 0 0 0 cor espunzator liniilo r matricei de ad iacenta alatu rate. Stabiliti daca 0 0 0 1 1 nodur ile 1 si 3: 0 0 0 0 0 a. apartin aceleiasi componente conexe b. sunt noduri izolate 0 1 0 0 1 c. sunt conectate printr -un lant d . sunt noduri ad iacente 0 1 0 1 0 (Bacalaureat - Simula re 200 3) 47.Care dintre urrnatoare!e secvente de nodu ri reprez inta un lant in graful o 1 0 1 0 1 0 0 1 0 neorientat dat prin matricea de adiacenta alatura ta stiind ca nod uriIe o 0 0 1 1 sunt numerotate de la 1 la 5 corespunzato r liniilor tabloului? 1 1 1 0 1 a. 3 4 1 2 5 b. 1 5 3 4 2 4 c. 4 1 2 4 5 d. 2 1 3 4 o0 1 1 0 (Bacalaureat - Sesiunea iunie-iulie 2004 ) 48 .Se considera graful neon entat dat prin matr icea de ad iace nta alaturata . in o 0 1 graf, nodurile sunt numerotate de la 1 la 4, corespunza tor liniilor tab loulu i. 1 0 0 1 o0 0 1 Sa se determine lun gimea maxima a unui lan\ ce uneste nod uriIe 1 si 3: 1 1 1 0 a. 1 b. 2 c. 3 d. 4 (Baca!aureat - Sesiunea iunie-iulie 200 3) 49 .Care dintre urrnatoarele secvente rep rezinta un drum in graful orientat dat o 1 0 0 prin ma tricea de adiac enta alaturata, stiind ca nodurile sunt num erota te de 1 0 0 0 1 1 0 1 la 1 la 4 coresp unzator liniilor ,i colaanelor tabloului? o0 1 0 a. 3 4 3 2 4 b. 3 1 2 3 c. 2 1 3 4 d. 4 3 1 2 (Bacalaureat - Sesiunea special a 2004)

10

Infor matica

277

50.Cel mai lung drum elemen tar In gralul orientat din figura alaturata are 3 lungimea .~ b. 4 c. CD d. 1 a. 2 (Bacalaureat - Sesiunea iunie-iulie 2004) 2 4 1 51. Se considera un graf neorientat cu 7 noduri si 3 rnuchii. Nurnaru l de componente conexe din care poate f format gralul este: a. exact 4 b. 4 sau 5 c. 3 sau 4 d. cel putin 5 (Bacalaureat - Simula re 2003) sz .Daca l ntr-un gral neoriental conex cu n nodur i, lista de adiacen ta a fieca rui nod este ferm ata din exac t doua elemente , atunci In gralul respectiv exista : a. eel putin n/2 cicluri b. exact n/2 cicluri c. e xact un ciclu d. eel putin doua ciclu ri (Bacalaureat - Sesiunea speciala 2003) 53.Numarul minim de muchii ce se pot alege pentru a f eliminate din gralu l neorientat din F igura alaturata astfel incat acesta sa devina neconex este:

.~.J\

a. 2

b. 4

c. 3
S8

d. 1
pot obtine
CU

(Bacalaureat - Sesiunea iunie-iulie 2003)


54 .Numarul de grafur i canexe aciclice care 4 nod uri este :

~
0 1 0 1 0

a. 2 b. 4 c. 28 d. 24 55. Se co nsidera un graf orientat tare conex . Stabiliti nurnarul circuitelor care ccntin t08t8 noduriIe gralului : a . exact unul b. cel mult unul c. nici unul d. cel putin unul (Bacalaureat - Sesiun ea iunie-iulie 2003)
56. G radul maxim a l unui nod ce S8 poate obtine intr-un graf neorientat conex cu n noduri
~ i n-1 much ii este (s-a notat cu [n/21catu l Impartir ii Intreqi a lui n la 2): a. n- 1 b. [n/2] c. n d. 2 (Bacalaureat - Sesiunea iunie-iulie 2003) 57.Se conside ra gralul neorientat avand nodurile notate cu 1, 2, 3, 4. 5 corespunzator liniilor matr icei de adiacenta alaturate. Stabilit i care dintre urrnatoare le prcpozi tii este adevarata.

0 1 0 0 o 1 1 0 o0 o1 o0 o1 o1

a . graful este conex c. graful este ac ictic

b. orice noua muchie s-a r adauqa graful devine conex d. orice much ie s-ar elimina graful dev ine ac iclic

(Bacalaureat - Simulare 2003) 58.in gralul neorientat dat prin matricea de adiacenta alaturata numaru l de 0 0 1 0
componente conexe este:

0 0

a. 0 59. Stabiliti a) 1 1 0

I0 I I I I

c. 3 d. 1 1 0 0 0 (Bacalaureat - Sesiunea iunie-iulie 2003) 0 0 0 0 care dintre urrnatoarele matrice de adiacenta corespunde unui graf conex aciclic: 1 1 0 b) c) 0 1 0 1 d), 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0

b. 2

I~ I -~T~-l

IOl1TOl

I I I I I

(Bacalaureat - Sesiunea august 2003) 60. C ite graluri hamiltoniene se pot erea cu 4 noduri? a. 1 b. 2 c. 4 d. 5 61. Cate graluri hamillo niene se pot erea cu 4 noduri si 5 muchii? a. 1 b. 2 c. 4

d. 5

278
a. 1 a. 1
putin un element

Implern en tarca structu rilnr de date


b. 2 b. 3

62. Cate graturi euleriene se pot crea cu 4 nodu ri?

c. 4 c. 4

d. 5 d. 6

63. Numarul de cicluri ham ilton ien e dint r-un graf compl et cu 4 noduri este:
64 .Deter minati nurnarut total de grafuri neorientate conexe cu 3 nod uri, doua grafu ri fiind considera te distincte daca ::iii numai daca matr icele lor de ad iace nta difera prin eel

d. 2 (Bacalaureat - Ses iunea august 2003) 65.Care dintre urrnatoarele fiqur i reprezinta un graf neorientat conex?

a. 7

b. 8

c. 4

a~

V. V
b o

c~ \

d 'D
0 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0

(Bacalaureat - Sesiunea august 2004) 66.Conslderand un graf neorientat avanc nodurile 1,2,3 ,4,5 , 6,7,8,9 cores punzato r liniilor mat rice i de adiacenta alaturate , stabiliti care dintre urrnatoa rele propo zltii este adevarata: a. este un grat bipart it b. este un graf conex c. este un graf eule rian d. este un graf hamiltonian 67. Cate muchi i are graful bipart it complet G=(X,U), cu 11 noduri ,?i cu rnultirnea nodurilor A si B definite astlel : AuB=X , An B=0 si card (A)=4? a. 4 b. 10 c. 16 d. 28 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 1 0

68. Care dintre urrnatoarele aflrmatii sunt adevarate? 3. un graf hamiltonian este un graf care contine un ciclu eleme ntar ca re trece prin
b. c.

toate nodurile ; un graf eule rian este un graf ca re contine un ciclu simplu care trece prin toate

muchiile:
un graf

fara

nod uri izolate este eulerian daca este conex sai gra dul fiecaru i nod

este par ; d. un graf co mplet este hamiltonian. 69. Stabiliti care dintre urrnatoa rele proprieta ti ale unui graf turneu sunt adeva rate : a. graful turneu trebuie sa fie un grat ham iltonian ; b. graful turneu trebu ie sa fie un graf eulerian; c . graful turneu este un graf orientat in ca re , i ntre oricare doua noduri , exist a un arc si numai unul , care Ie leaqa: d . graful turneu este un graf conex ciclic. 70.Stab ili\i cu care dintre urrnatoa rele valor! este egala suma elemen telor matr icei de adlacenta a grafulu i turneu: a. nx(n -1) b. nx(n- 1)/2 c. n d . n-1 71 . Stabiliti care dintre urrnatoarele este adevarata: a. suma elementelor din linia i b. suma elementelor din linia i c . suma elemen te lor din linia i d. suma elementelor din lin ia i propr ietati ale matrice i de adiacenta a grafului turneu

si coloana je ste egala cu n ; 9i coloana j este eqala cu n -1 ; si coloana j e ste eqala cu n -1 , oricare a r fi i 9i j; ~i coloana j este eqala cu n, oricare ar fi i 9i j.

Informatica

279

72. Stabiliti care dintre urrnatoare le egalita\i intre elementele matricei de ad iacenta a grafului turneu sunt adevarate: a. a[ilU) =1- aOHi). oricare ar fi i ~ i j; b. a[iI0l+aOlli)=1, oricare ar fi i"j ; c. a[ilU)+aOlli)=1 , or icare ar fi i ~ i j; d. a[ilOl =1 - aO)[i], oricare ar fi i"j ; 73. Un graf orientat avand nodurile 1,2,3,4,5 corespun zator liniilor matricei de adiacenta alaturate reprez inta un graf turneu pentru un concurs hipic, definit la Stud iul de caz , in care nodurile sunt obstacolele. Traseu l pe care poate sa-l urmeze un calaret , lncepand cu obstacolul 1, este: a. 1,3,2,4,5 b . 1,3,4,2,3,5 c. 1,3,5,4,2 d . 1,3,4,5,2

o0 1 0 o0 1 1 o1

1 0 1 1 0 0 0 1 1 0 0 0 010

74. Se considers grafu l turneu care corespunde matricei de adicen ta de la problema anterioara, Un calaret care in cepe cu obstacolul 1 poate alege din n variante de trasee , unde n are valoarea : a. 2 b. 3 c. 4 d. 5 75. Conside ram un graf neorientat avand nodurile 1,2,3,4,5 corespun zator liniilor matricei de adiacenta alaturate. Cate muchii trebuie adauqats pentru ca graful sa fie un graf eulerian ~i hamiltonia n? a. 1 b. 2 c. 3 d . imposibil

1 0 0 1
1 0 1 1 1 1 0 1 1 1 1 0

1 0 o1 o1 1 1

Miniproiecte:
1. Reteaua de strazi a unui oras este fermata din intersectii si strazi pe care se poate circula in ambele sensuri sau intr-un singur sens. Fiecare strada are 0 lungime rnasurata in metri . Doua automobile pteaca la acelasi moment, unul din intersectia A si altul din intersectia S, ~i trebuie sa ajunqa fiecare in intersectia C, respectiv intersectia D. Cele doua automobile merg cu viteza medie V1 , respectiv V2. Ambii autornobilisti aleq traseul intre cele doua intersectii astfel incat distanta parcursa sa fie minima. lnformatiile despre reteaua de strazi (nurnarul de intersectii, traficul auto intre intersectii ;;i lungimea fiecarei strazi) se citesc dintr-un fisier text. Se citesc de la tastatura etichetele celor patru intersectii ~ i vitezele automobilelor. Scrieti 0 aplicatie care sa furnizeze urmatoarele informafil: a. Care dintre automob llisti ajunge mai repede la destinatie? b. Oaca exists intersectii prin care tree arnbii automobilisti, sa se afiseze aceste intersects. c. Daca automobilistii se inta lnesc intr-a intersectie, sa se precizeze aceasta intersectie . d. Oaca , dupa ce au ajuns la destinatie, eei doi autornob'listi pornesc unul catre celalalt, care este eel mai scurt drum pe care trebuie sa mearqa. si in ce intersectie i~ i propun sa se l ntalneasca, astfel tncat timpul de asteptare in intersectie a autamabilistului care ajunge primul sa fie minim? 2. 0 retea de calculatoare are n servere. La calculatoare le server pot fi conectate mai multe calculataare client. Doua calculataare server pot comunica prin legaturi directe sau prin intermediul alter servere. tnformatiile despre topologia retelei (nurnarul de severe ~ i leqaturile directe dintre servere) se citesc dintr-un fisier text. Scrieti 0 aplicatie care sa furnize ze urmatoarele inforrnatii: a. Care este drumul eel mai scurt pe care un mesaj transmis de un client al serverului x sa ajunqa la un client al serverului y (elichetele severelor se citesc de la tastatura )? b. Sa se precizeze care sunt calculatoarele server care, daca S8 defecteaza, fac ca reteaua sa nu mai fie functionala (unele severe din retea nu mai potcamunica intre ele). c. Sa se precizeze care este serverul eel mai solicita t, Serverul eel rnai soticitat este serverul prin care este posibil sa treaca , la un moment dat, cele mai multe mesaje (serverul prin care trec cele mai multe lanturi),

280
d. Sa

Implementare a strucruri lor de da te


S8 reproiecteze reteaua prin adauqarea unui numar minim de leqaturi directe intre servere, astfel incat oricare dintre servere s-ar defecta , reteaua sa ramana functionala (cu exceptia clientilor serverului defect , restul clientilor trebuie sa aiba acees la resurse le retelei).

3. lntr-o tabrica S8 realizeaza un tip de prc dus care este format din mai mullte subansambluri. Fiecare subansamblu este produs de 0 sectie. Un subansamblu poate fi, la randul SaU , campus din alte subansambluri. Exista 0 sectie in care S8 asarnbleaza produsul final si sectii care , pentru a produce propriul subansamblu , nu au nevoie de subansambluri produse in sectii'e fabricii. Sectiile fabricii si relatiile dintre sectii pot fi reprezentate printr-un graf orien tat, astfel: sectii'e sunt nodurile grafului, iar arcul [x,y] insearnna ca subansamblu l produs de sectia x este folosit de sectia y . Desenat i 0 organigrama ipotetica a sectiilor fabricii. lnforrnatiile despre organigrama fabricii S8 citesc dintr-un fisier text: de pe prima linie n - nurnarul de sectii si m - nurnarul de arce ale grafului, de pe urmatorul rand un sir de n numere intregi care reprezinta stocul de subansambluri realizate in fiecare sectie , de pe urrnatorul rand un sir de n numere l ntregi care reprezinta nurnarul de anqajati din fiecare sectie ,i apoi, de pe urrnatoarele m randuri, cate trei valori numerice in tregi care reprezinta etichetele nodurilor terminale ale unui arc (x si y) i nurnarul de subansambluri pe care trebuie sa Ie furnizeze sectia x sectiei y , pentru a se putea obtine a unitate din produsul final. Scrieti a aplicatie care sa furnize ze urrnatoarele inforrnatii: a. Sa verifice daca se poate realiza 0 unitate din produsul final folosind subansamblurile care exista pe stoc in sectiile fabricli. Oaca nu se poate realiza a unitate din produsul final, sa se precizeze sectiile care sunt vinovate ca nu au produs suficiente subansambluri. b. in fabrica, se inchid coua dintre sectiile care realizeaza subansambluri (subansamblurile se vor cumpara de la alti producatori). Etichetele nodunlor corespunzatoare acestor sectii se citesc de la tastatura. Veriflcati daca, prin inchide rea acestor sectii, alte sectii ale fabricii nu devin inutile. a sectie devine inutila atunci cane prin inchiderea unei alte sectii, subansamblurile produse de ea nu mai sunt necesare. Daca apar sectii inutile, in urma inchiderii celor doua sectii initiate. afisati eticheta corespunzatoare sectiei ~i inchideti ~i aceste sectii, Reorqanizati fabrica prin eliminare de sectii - pana cand nu vor mai exista sectii inutile. Afisaf nurnarul de anqajati care trebuie disponibilizati prin inchiderea sectiilor. Afisaf organigrama fabricii dupa reorganizare , prin etichetele sectiiior care au mai rarnas, si arcele dintre acestea. (Ind icatie, Cenerat i subgraful initial, prin eliminarea nodurilor corespunzatoare sectiilor care se inchid . Generati apoi subgrafuri ale ultimului subgraf obtinut prin eliminarea nodurilor care au gradul extern egal cu O. Subgraful final cbtinut va corespunde noli organigrame. Cand elirninati un nod, adunati !a nurnarul anqajatilor disponibitizaf anqajatii din sectia corespunzatoare nodului). 4. Pentru realizarea unui proiect trebuie executate mai multe activitaf (analiza, elaborarea modulelor de program, testarea, elaborarea docurnentatiei etc.). Unele activitati sunt concitionate de executia altora (de exemplu, nu se poate scrie un modul de program fara sa se fi Iacut analiza aplicatiei), alte activitati se pot desfasura independent unele de altele (se pot scrie module de program sau se pot testa unele dintre module, independent unele de altele). Fiecare activitate are un timp maxim de executie. Sa se reprezinte sub forma unui graf orientat activitatile de rea!izare a fiecaruia dintre miniproiectele anterioare :;;i sa se determine timpul maxim de executie al fiecaruia dintre ele.

Informatica

281

---------

2.8. Arborele
2.8. I. Arborcle liber
2.8.1.1. Dafinitia arborelui liber
Se nurneste arbore Iiber A un graf neorientat conex ~i fara cicluri, Observatie, De obicei se amite adjectivul Jiber" , referirea la un graf conex acicl ic facandu -se numai cu numele arbore. Se numeste subarbore al arbore lui A=(X,U) , once arbore S=(Y,V) care are proprietatea: Yr;;;,X ~i V.;;U. Exem plu - figura 47. Graful G" cu 8 noduri este un arbore (un graf neo rientat conex ~i acielic), iar grafu l G 39 este un subarbore al acestuia . G --.. G
J8 39

< h. "",,"'G ,~ .;:


w,

c-

,c,'!.';:

c=)
6
Fig, 47

2.8.1.2. Proprietatlle arborilor liberi


Teorema 21 Urrnatoa rele definitii sunt echivalente pentru un graf G cu n noduri ~i m rnuchii: (1) G este un arbore . (2) G este un grat aciclic cu n -1 muchii . (3) G este un grat cone x cu n -1 m uchii . (4) G este un graf tara cicluri maximal (c aca i n grafu l fara cic luri G unim doua ncduri oa recare neadiacente printr-o muchie, gra fu l obtinu t contine un cic lu). (5) G est e un grat conex minimal (daca in grafu l conex G suprirnam 0 muchie oarecare , graful obti nut nu ma i este cone x). (6) Orice p ere c he d e n o d uri este le qata p rintr-u n Ian! ~ i n u mai unul. Demonstratle. Este suficient sa se demonstreze implicatiile (1)=>(2), (2)=>(3), (3)=>(4), (4)=>(5), (5)=>(6) . i (6)=>( 1). Prin tranzmvnatea acestor impficatii rezutta implicafiile (2)=>( 1), (3)=>(2), (4)=>(3), (5)=>(4), (6)=>(5) .' (1)=>( 6). Din aceste implicatii rezulta ca (1)"",(2), (2)"",(3), (3)<0>(4), (4p(5),
( 5 )~ 6) ~i (6) c ( 1). Din tranzitivitatea relatie i de echiva lenta rezutta oricare coua din cete 6 propozuii suntechivalente.

(1)::::)( 2). lpoteza: Graful G este cone x ~ i acic lic - din defin itia arborelui (1). Conctuzie : Graful G este aciclic ~i are "1 muchii (2). Proprietatea ca graful G este aciciic este cornuna ipotezei ~i concluzie i, Trebuie demonstrat doar ca un graf co nex aciclic are n-1 muchii. Oaca G este conex aciclic. nu trebuie elirn inata rue 0 muctue pentru a se obune un graf partial conex acic nc. Cum nurnarul de muchii care trebuie eliminate dintr-un graf conex pentru a obt ine un graf partial conex acicuc este egaI cu m-n+1, Inseamna ca in acest caz, m-n+1=O . Rezulta ca m=n-1 . (2)=>(3 ). Ipoteza: Graful G este aciclic ~i are n-1 muchii - din de finitia arborelui (2). ConcJuzie: Graful G este conex ~i are n-1 muchii (3). Proprietatea ca graful G are n-t muchii este cornuna ipot ezei :;;i concluziei. Trebuie demonstrat doar ca un graful cu n -t muchii fiind acicl ic este ~i conex. Se stie ca intr-un graf cu p componente cone xe. numarul de muchii care trebuie eliminate pentru a obtme un graf partial aciclic este egal cu m-n+p

282
Gratul G este aciclic (m-n+p=O)
~i

lmplcmentureu strueturilor de date


are n-1 muchii (m=n-1) st (n-1)-n+p=O. Rezulta ca p=1 (graful are 0

sinqura com ponenta conex a, deci este cone x). (3):>(4). lpote za : Graful G este conex ~ i are n-t muchii (3). Concfuzie: Graful G este aciclic max imal (4). G fiind conex, numarul de componente conexe p este ega l cu 1. Nurnarul de muchii m ale gra fului G este ega1cu n-t . Rezulta ca numaru l de muchii care trebuie eliminate din gra ful G ca sa se obtina un graf pa rtial aciclic este egal cu: rn-n- p > (n-1)+n+1 ;;: 0, adica nici 0 much ie. Rezulta ca gra ful G este aciclic, Grafu l este maxima l pentru aceasta proprietate, deoarece fiind conex , orice muchie [X i,X j]

care se va acauqa va forma un ciclu cu lantul L(xilxj) - existents acestui lant rezutta din conexitatea gratului G. (4):>(5). Ipoleza : Gratul G este aciclic maximal (4).
Concluzie: Graful G este conex minimal (5). a. Presupunem ca gra ful G nu este conex. EI are cel putin dcua componente conexe : C 1 !iii C 2' lnseamna ca exista coua nodu ri xe C 1 ~i y EC2 pe care Ie putem lega cu muchia [x,Y]. Da r, din a graf, e l va contine un ciclu . R ezu lta ca prin ipoteza , rezu lta ca once muchie am ada uq a J

adauqarea much iei [x,y] gratul va contine un ciclu lnsearnna ca gratul G este conex .

~i

ca, int re nodurile x

~i

y exista deja un

!an t ~i e le apartin ac el eia si co m po ne nte conexe , ceea ce co ntra zice pre supunerea

Ia cuta .

b . Presupunem ca gra tul G care este conex nu este minimal cu aceasta proprietate . Inse arnna ca prin eliminarea unei muchii se obune gratul partial H care are n noduri ~ i m-1 muchii , este co nex ~i aciclic, Gratu! G fiind conex ~i acidic, tnsearnna ca numarul de muchii care trebuie eliminate pent ru a obune un grat part ial conex aciclic este egal cu 0, adica m-n+1=0 ~i men-t . Numarul de muchii ale gra tului H este egaI cu rn-t =n-2. Fiind aciclic rnseamna ca nurnarul de much ii care trebuie eliminate pent ru a obfine un graf pa rtial aciclic este egal cu 0, adica (n-2)-n+p=0. Rezulta ca p=2, adica gratu l part ial H confine doua componente conexe, ceea ee contraziee presupunerea ca el este conex .
(5):>(6) Ipoteza: Graful G este conex minimal(5). Concluzie: Grice pereche de noduri este leqata printr-un Ian! ~i numai unu l (6). Gratul G fiind conex , insearnna ca exista eel putin un lant care leaga oricare doua noduri x ~i y . Presupunem ca exist a eel putin doua renturt Intre nodurile x :;;i y : L1 si L2. ln searnna ca, suprimand 0 much ie din lantul al doilea , gratul rarnane conex , deoa rece noduri le x ~ i y vo r f legate prin lantul L 1 , ce ea ce co ntrazi ce ipoteza ca gratu l G este co ne x m inimal. Rezulta ca cele doua noduri x s! y nu sunt legate cecat printr.un singur tanto (6):>(5) lpo teza: Grice pereche de noduri este legata printr-un Ian! ~ i num ai unu l (6). Conciuzie: Grafu l G este conex ~ i aciclic - din definitia arborelui (1). Deoarece in gra ful G , or iee pereche de noduri x s! y este leqata printr-un lant, tnseamna ca gratu l G este conex. Presupunem ca gratul G confine eel punn un ciclu . Considerand dou a noduri oarecare x ~i y care apartm aeestui ciclu . tnsearnna ca intr e cere doua noduri exista doua lanturi diferite, ceea ce 7contrazice ipoteza. R ez ulta ca gratu l G este acicli c.

Propozltia 14
Gri ce arbore cu n no duri are n- 1 much ii.
Derno ns tratie . Arb orele fiind un grat conex minimal, tnsearnna ca are n-1 muchii.

Propozitia 15. Grice arbor e c u " >=2 noduri contine eel pu!in doua noduri termina le.
Dcm onstralie - prin reducere la abs urd. Presupunem ca nu exista decat un singur nod terminal X. Oricare alt nod din arbore are eel pulin gradu! 2. Alegem din arbore, dintre lanturile elementare

care au

extremitate in nodul x, lan\ul de lungime maxima: L(x,y ). Nodul y avand gradul

mai mare decat 1, inse am na ca mai exista , in afara nodului ca re iI pr ec e de in lant , eel putin u n nod z ca re e ste ad iace nt eu el. Lantul fiind e lementar, inseamn a cil nodul y nu exista in

lan\ decat la extremitatea lui, iar muchia [y ,z] nu face parte din lan\ ~ i putem adauga aceasta much ie la lan\. Lan\ul fiind de lungime maxima, i nseamna ca nodul z aparline

Inform nrica
lantului si prin adauqarea acestei muchii la lan t definitia arborelui (graf aciclic).
S8

283
inc hide un ciclu , ceea ce contrazice

-------- -----.. 1. Precizati daca este arbore graful G4 0 (x" o, U40 ) definit astfel: X40={1,2,3,4,5,6,7,8,9,1O} U4o={[1,2J , [1,31 , [1,5J, [2,6], [2,7], [3,4], [3,9J, [4,8], [8,10] }.
2. Oernonstrati ca un arbore este un graf bipartit. Reciproca este adevarata? 3. Scrieti un progra m care citeste dintr-un fi~ i e r text intorrnatii despre un graf neorientat (de pe primu l rand , nurnarul de nodur i ale grafu lui - n , iar de pe urrnatcarele n randuri matricea de adiacenta a grafu lui) ~ i care: a. verifica daca graful este un arbore:
b. daca nu este arbo re, verifies daca prin eliminarea muchi ilor poat e fi facut arbore ; in caz S8 specifice cate muchi i trebuie eliminate ~i care sunt aceste muchii. afirmativ daca nu este arbore , verific a dac a prin adauqarea muchiilor poate fi fac ut arbore ; in caz afirm ativ se specifice cate muchii trebuie ad aug ate si ca re sunt aceste muchii.

0 40,: 0 "

, Jr

sa

c.

sa

2.8.2. Arborcle partial


2.8.2.1. Definitia arborelui partial
Daca un graf partial al unui graf G este arbore, el se numeste arbore partialal grafului G.
, W'

G " . ti;~~~

c::=)
Graful G 41 Teorema 22 Fig. 48 Arbo re partial al grafurui G 41
~i

Un graf G contine un arbore partialdaca

numai daca este un graf conex

Dernonst ra tie . Notarn cele doua propozitii, astfel: (1) - Graful G coruine un arbore partial, (2 ) - Graful G este conex .

Trebuie sa dernonstrarn ca (1)=>(2) , i (2)=>(1).


(1):::;::.(2). Sa considerarn ca graful G conune arb orele partial H. Din deflnitia arbo relu i rez ulta ca H este un gra f conex. Din de finitia arbo relui partial rezurta ca H este graf partial al gra fului G. Deoarece graful G se obtine prin adauq area de much ii la un graf conex (H), este ~i el un graf conex. (2):::;::.(1). Daca G este un graf conex minima l, inseamna ca este un arbore (din Teorema 21: (1) e> (5)) ~i H=G, Daca G nu este un graf cone x minimal , lnsearnna ca exista 0 muchie [x ,y] pe care 0 putem elimina astfel incat sa obtmem un graf partia l conex G 1 . Daca graful partial G1 este un graf conex minimal, tnseamna ca H= G1; altfe l se repeta procesul de eumtnare a cate unei mucfui pim a se obtine e partial H. un graf partial conex minima l. Acesta va fi arboreJ

2.8.2.2. Definitia arborelui partial de cost minim


Conside rarn un graf conex G::::(X,U), 0 funcne c :U~R+ ca re asociaza fiecarei muchii u un numar rear pozitiv cluj, numrt co stul muchiei , ~i un graf H=(X,V) care este graf partial al

grafuru; G (V,;;U). Functla c se numeste functia cost Definim: Costul grafuluieste s uma cos tu rilor muchiil or grafului .

284
-7 costulgrafuluiG : c ( G ) ~ Lc(lI )

Implementarea stru ct urilor de dat e

-7 costul gr afului part ial H: c( II ) ~ LC( lI )


v

Se nurneste graf partial de cost minim al unui graf G conex, cu functia de cost c . un gr af partial cone x H care are co stul minim . Teorema 23 Graful partial de cost minim al unui graf conex G, cu functia de cost c, est e un arbore .
Dern on stratie - prin reducere ta ab surd. Daca graful G este un arbore, atunci H=G, deoarece orice muchie am elimina din G si-ar pierde proprietatea de conexitate. Daca graful G nu este un
arbore, i nseamna ca el ccn tme un numar finit de grafuri partiale conexe. Alegem dintre aceste qrafuri

partiale graful H care este graful partial de cost minim. Presupunem eel acest graf partial nu estc
arbore. lnsearnna ca el corinne eel punn un ciclu !?i exista 0 rnucrue u=[x ,Y] pe care 0 putem suprim a astfel tncat sa obtinern un alt graf partial conex H1. Rezulta ca: c( H )=c( H 1)-c( u c( H 1)

Inegalitatea c(Hc( H1) contrazice faplul ca graful partial H este de cost minim. partial H este arbore.

lnseamna ca graful

A rborel e care este un gr af partia l de co s t minim al gralu lui conex G, cu fun ctia de c ost c . se nurneste arbore partial de cost minim (APM) .

[ mdllll.ll. de caz )
Scop: ide ntificarea aplicatiilor in care se Iolose ste arborele partial de cost minim.
Enuntul probleme i . a retee de cetcutetoero este formata din 7 cetcutotoero server conoetate intre ete si calculatoare cliont conectate ta servere. Unele servere pot fi tegate direct, enete nu. Pentru ca reteaua sa tunctionezo trebuie sa se esiqure transportul date /or intre oricete aou cetcutetoere server (daua servere trebuie sa comunice fie prin /egatura directa, fie prin intermetiiut altor servere). Fiecare legatura onect dintre doua 2 10 4 2 setvere are asociat un cost de constructie. Legaturife care se pot 5 face intre servere i costume asociate acestor legaturi sunt 1 1 1 prezentate in figura 49. Sa se gaseasca a sotutie de construire a 8 3 }-- n--{ reteiei de calculatoare (de a lega setvetete intre ele) astfel incet g costul de realizare a retelei sa fie minim. Fig . 4 9

0 0 retea de servere este un gral neorientat G" cu n noduri (i n exemp lu, n=7) , in care nodurile sunt serverele, iar leaqaturile directe dintre doua servere, much iile galului. Gralul este conex (oricare ar fi doua serve re din rete a, i ntre ele tre buie sa existe un lant care sa Ie perrnita sa comunice intre ele). Gasirea solutiei optime de conectare a serverelor, astfel tncat costul finan ciar sa fie minim , in seamna determina rea unui graf conex de co st minim , adica gas irea arborelui partial de co st minim al grafu lui. Observatie. Orice retea de transport (de calculatoa re, rutiera , de cale terat a, aeriana. de teteco muni cat ii, de ca nalizare etc .) este un graf neorientat con ex. Construirea cu ui costu ri fina ncia re min ime a unei asUel de reteIe se rezolva prin gasire a arbor eJ partial de cost minim al grafului asociat retelei. ~

-<I*"t>-

Info rma t ica

285

2.8 .2.3. Algoritmi pentru determinare a arborelui partial de cost minim


Algaritmii pentru determ inarea arba relui partial de cost minim folosesc strategia greedy: PAS1. Se alege un subarbore al arbare lui partial de cost minim - Hini' . PAS2. Gat timp nu s-a format arborele partial de cost mini m ex ec uta : PAS3. Se ale ge a much ie siq u ra din rnultirnea muchii lor nealese (rarnase), PAS4. Se adauqa muchia la subarbare. Mu chia siq u ra trebuie sa Indeplineasca urrnatoarele conditii; -7 sa alb a co stuI minim ; -7 sa apartina arborelui partial de co st minim . Dete rm ina rea arborel u i part ial d e cost mini m a) Algo ritmul lui Kruskal. b) Algaritmul lui Prim
S8

poate face prin:

Cei dai algar itml difera prin: -') modul i n care se aleg e subarbarele de la care se porne ste: -7 modul i n care este gasita 0 muchie siqura. a) Algoritmul lui Kruskal Graful partial al grafului G=(X,U ) care nu contine nici a much ie (are num ai nod uri izolate) este format din n arbo ri partiali disjuncti: H1=(X1,0) cu X1={X1} } H -X 0cuX -x

. 2~( 2, ) .

2~{ 2}

Hk=(Xk,0) cu Xk={Xk}
. . . . .. .. . .. . . ... ............

x jn 0 , v i.] (1,;i,;n , 1 ~,;n X1 u X2 u X3 u ... U Xn- X

xt

~i b 'D

H n=(X n,0) cu Xn={xn} Se porneste de la doi arbori partiali disjuncti Hi si Hj care S8 unif ica prin adauqarea une i rnuchii sigure . Mu ch ia s igura trebui e sa l ndeplineasca urrnatoarele conditii: -') sa alba costul minim ; -7 sa nu formeze cicluri cu muchi ile deja alese , adica extrem itatile sale sa apartina celor doua multirni disjuncte Xi ~i Xj - muchia este [Xi,Xj] cu XjEXi s i Xj EXj. Structu ra de date fo losita pentru implementa rea grafu lui este Iista muc hiilor. Pentru a qasi mai user muchia cu co stuI minim, lista much iilor este sortata crescato r, dupa cost. Algo ritmul pentru determinarea APM este urmatoru l: PAS1. Pen tru fiecare nod .i, din graf execu ta : se formeaz8 arborii partial i Hj. PAS2. Se sort eaza muc hiile din U in ordi nea crescatoa re a cost ului c. PAS3 . Se alege muchia u cu co stu I minim . PAS4. Se initializeaza APM cu muchia u PASS. Gat ti m p nu s-au selectat cele n - l muchi i exe cu ta: ! PAS6. Se alege 0 much ie sigura din rnultirnea muchiilor nealese (rarnase ) si se i forme aza un arbore partial cu aceasta muchie . 1 PAS? Se unifica APM cu arbo'rele format cu much ia siqu ra. Pentru a tine evide nta arbori lor partiali Hi care se dezv otta, se foloses te lista L i n fiecare element L(i ) al listei se rnernoreaza num arul de ordi ne al arborelui partial din care fac e parte nodul i. Initial, exist and n arbori partial! Hi. fiecare dintre ei contmand un nod al qraf ului, elementele liste i vor L( i)=i . pentru iE :1 , 2, 3, .. .. n }. Pe parcursul executarii alqoritmului, L (i)=j i nseamna CEl nodu l i apartine arbor elui cu numarul de ord ine j.

286

Implementa rea strueturi lor de date

Pentru ca muchia [x,y) care se alege sa fie 0 much ie sigura trebuie sa ind ep lineasca conoitile: -7 sa aiba costul minim - muchiile S8 aleg in ordine, din lista muchiilor, unde ele sunt aran-

jate in ordinea crescatcare a costului; 7 ex trernit atile sale Sa apartina la doi arbori partiali difen!i - trebu ie ca l(x)>,L(y).
Dupa ce s-a qas it 0 rnuchie siqura , unificarea arbo rilor 58 face astfel: 7 Daca L(x)<L(y), se adauq a arbore le partial din care face parte nodul y la care face parte nodu l x , adica se inlocuiesc toate elementele L(i)=l(y) cu 7 Daca L(xL(y), se adaug a arborele partial din care face parte nodul x la care face parte nod ul y , adica se inlocuiesc toate elementele L(i)=L(x) cu

arbo rele partial din valoarea l(x) . arbore le partial din valoarea L(y) .

Pentru graf ul G"

se obtine arbo rel e partial de cost minim din figura 50 . Alg oritmul se
Ll st a muchiiJ or

excuta as tfe l:

L[ i]

Arborii pa rtia li H;=({i},0 ) cu l $i$n

Muchia cu cestui minim este [4,5"] - ,- ,,, L[4]=4 4, 5 c> L[4] _ L[5] Nodul i ~ m ~l L[5J~5 4<5 => L[5] ~ L[4 ]~4 L[i] I ~ m_n- l ~6 A rborii parti al! sunt: H, - ({4,5},{[4,5])) . i H i ~ ( { i } , 0 ) cu IE{l ,2,3,6,7}

Urmatoare a muchie cu costul mr ln"" m= e",st" e-t1 ,-,,2'r-:::-r-:-r:~ -'-::-T--=-T":" L[l J~l 1, 2 => L[l ] _ L[2] Nodu l i 1 m ~3 L [2]~2 1<2 => L[2] ~ L[1]~1 L[i] 11 1 3 4 4 6 4 m,n- l ~ 6 Arbc rf part ial! sunt: H , ~ ( { 1 , 2 } , {[ l , 2 J} ) , H , ~ ( {4 , 5 , 7 } , {[4 , 5 J , [5,7])) .i Hi=({i},0 ) cu iE{3,6}

urmatoerea muchie cu costul m;:: ln" im=e",st"e-t 4""", 6!,--.-_,--,---,-_.---, L[4]~4 4, 6 c> L[4] < L16] I Nodu t i 1 2 I 3 1 4 1 5 I 6 I 7 I m~ 4 L[6J=6 4<6 => L[6] ~ L[4J~4 I L[i] 1 1 I 3 I 4 I 4 14 I 4 I m.n -l ~6 Arb ori i parti ali sunt: H t ~ ( { l ,2},{[l ,2])), H, - ({4,5,6,7},{[4,5], [4,6J, [5,7])) .i H , ~ ( {3 } , 0 ) Urrnatoarea muchie cu costul mi :;; .:..e ",s"te"-\, 1,,,,3 " 'r-,,--,---,-_.---.-- , rnim L[1]=1 h3 => L[lJ . L[3] 1Nod ul i 1 2 I 3 1 4 1 5 I 6 I 7 I m=5 L[31~3 1<3 => L[3] ~ L[ 1]~1 1L[i] 1 1 11 1 4 1 4 1 4 1 4 I m, n-l~6 Arbor ii part lall sunt: H t ~ ( { l ,2,3},{[1,2],[1,3]}) . ' H,- ({4,5,6,7},{[4,5], [4,6], [5,7])) Urmatoarea muchie cu costuI miin:;; ' lm .:..e",s"te"-\, [3", ,6 = -r-:-r:--,---:--r--::.,--:-.-,,, m=6 L[3]~1 h 4 => L[3] , L[6] c: N,:, o,:: d:.: lle.1i:+-, 1+-=--f--.":.+'-+~t-=+-'-j m=n-1 =6 L[6]=4 1<4 => L[6] ~ L[3] ~1 L[i 1 i L[7] ~ L[6] ~ L[5) ~ L[4 '-:: ] "' _ ""'L[""3],_.J... -l -'--'-'--L:....J....:..-L:-'-'--'--'---' Arborele partial de cost minim este: H t ~ ( { 1 , 2 , 3 ,4 , 5 , 6 ,7 } , ([l ,2], [1,3), 13,6], [4,5J, [4,6], [5,7]})

Infor ma tica

287

Pentr u implementarea algoritmul ui se folosesc urrnatoarele variabile ~i structuri de date: -7 variabile!e n si In pentru numarul de nod uri, respec tiv numarul de much ii ale grafulu i; -7 vectorul u , cu m elemente, pentru lista muchiilor; este un " f2\ vector de structun de tip rnuchie ; ~ \2.Z ~ -7 vectorul L , cu n elemente , pentru lista arbor ilor part iali: -7 variab ila ct pentru a calcula costul total al arborelui; -7 variabila k pentru a nurnara muchiile adaugate la arborele partial; initial are valoarea 0 - arborele nu contine nici 0 much ie - valoarea sa finala este n-1 (nurnarul de muchii ale unui arbore cu n noduri); -7 variab ila i pentru indicele cu care S8 parcurge lista muchiilo r; -7 var iabilele x 9i y pentru pentru a memora nodur ile de la extrernitatile unei much ii;

f4\-

~i

subprogram ele:
fi~ i e r

-7 functia procedurala c i tire creeaza lista muchiilor u prin preluarea datelor din

i n fisierul costapm.txt pe primul rand se citeste 0 valoar e nurnerica ce reprezinta ordinu l grafului, iar de pe urmatoarele rand uri trei valori numer ice separate prin spatiu care reprezinta nodurile de la extremit atile unei muchii ?i costul asociat muchiei : -7 funct ia procedurala ini t initiafizeaz a lista L a arborilor part ial i Hi cu cei n arbori forrnati din cele n nodu ri izolate (arborii care nu contin rnuchii ): -7 functia procedurala sortare sorteaz a lista muchiilor crescator dupa costul asociat:
#inc l u de <fstream .h> f s t r e a m f. tvco s t. a pm , t x t " , ios: :in ); in t n , ffi ,L [2 0} ; I l x /y=noQur i much i.e : c =c ost .asoci at muchi ei struct muchi e tint x ,y ,c ; }; Jlu~li st a muchii lor mu ch Le u'[2 0] ; v oi d i n i t ( ) {for (i n t i= l ii <= n ii ++ ) L [i] = i ; } void citi r e (} {int i=O ,x fy / c ; 0 ; wh ile (f x yc) {i ++; u t i ] . x =x ; uli] .y=y ; uliJ . c=c ; } f . close () ; 1:1=i ; } void sort a r e () tint i ,j ; mu c h i e aux ; for (i =l ;i.<m ;i ++ ) for (J=i+l ij< =;n;j++) if (u[i] . c > u [ j ] . c~ ( a u x- u [ i ]; u[i ]-u[j] ; u [j] - a u x ; } ) void ma in ( ) {int i=l, j ,k=O, x,y , c t =O; citi r e () ; sortare() ; i.n i t ( ) i cout" APH es te fo rmat din much.i i.Le : "<xeand L: while ( k -cn -e L) Ile at timp n u s -eu qe s .i t c e Le n -r L muchd i ale .4PM { i f ( L[ u[ i ] . x ] ! - L [ u[ i ] . y ] ) { k++i ct =ct +u[ iJ . c ; lise alege muchia i pentru aunifica doiarbor i cou t" [" u [ i ). x "," u [ i ] . y" ] "; x = L [u[i ] . y ]; lise un i f icacei do i arbcri p rinmuchia [ x , y ] y -L[c [i ] .x] ; for (j =l ;j< - n ;j++1 if (LIJ] - -x) L[j] y ; ) i++ ; } lise tre ce la muchia urmatoa re din l i s t a mu chi ilor coutendl" c o s t u l t o t a l "" " e t;}

Complexitatea algoritmului lui Kruska l Pasul 1 are ordinul de complexitate O(n ). Pasul 2 are ordinul de complexitate in functie de algoritmul de sortare ales . Algoritmii de sortare prin metoda selectiei directe sau metoda

288

Implementarea st ru ct n r ilo r de d ate

bulelor au ordinul de complexitate O(m '). Pasul 3 nu se poate preciza de cate ori S8 executa . in cazul eel mai defavorabil, S8 parcurg toate cete m muchii, deci S8 executa de m ori. in cazul pasului 3, pentru fiecare muchie aleasa, S8 parcurg toate cele n elemente ale listei L. Rezulta ca pasul 3 are ardinul de camplexitate O(n xm) . Ordinul de complexitate al algoritmului va fi: 2 O(n )+O(m )+O(nx m) = O(max(m 2 ,nxm)) . Daca graful are faarte multe muchii , atunci ordinul sau de complexitate este O(m'). Pentnu graful G 43(x,,3,Ud din figura 51, determinati APM executand algoritmul lui Kruskal. Verlflcati daca solutia obtmuta este corecta executand programul pentru graful G.,.

b) Algoritmul lui Prim


Algoritmul lui Prim S8 asearnana eu algor itmul lui Dijkstra pentru determinarea drumurilor de lungime minima in tr-un graf. In graful G=(X,U), subarbore le de la care se porneste Hini! este format dintr-un nod initial numit radacina (r - care S8 cornunica algoritm ului irnpreuna cu datele despre graf) si creste pana acopera toate nadurile din rnultirnea X. Daca arborele partial care se dezvolta este H=(A,V) . definim graful GA=(X-A ,0 ). Nodurile care fac parte din GA sunt memorate intr-o coada de prioritati Q. Coada de prioritati S8 deose beste de 0 coada simpla , prin aceea ca din ea nu se extrage primu l element introdus, ci elementul cu va!oarea cea mat mica (sau cea mai mare , in funct ie de prioritatea a.easa). In coada de prioritati Q se mernoreaza pentru fiecare nod i, eticheta nodul ui j EA cu care forrnea za muchia cu costul minim. La fiecare adauqa re a unui nou nod la arbore, acesta trebuie eliminat din coada de prioritati , iar coada trebuie reactualizata pentru toate nodurile rarnase , deoarece s-a modificat mu'tirnea A . iar un nod din coada de astep tare poate sa aiba muchia cu costul minim cu noul nod adauqat la arborele partial. Arbore le care se dezvo lta este memarat in lista H, astfel: pentru fiecare nod i care se adauqa la arbarele partial, se memoreaza nodul jE A cu care este legat prin muchie. Initial Hinit=({r),0) , GA=(X -{r ),0) , in lista H taate elementele au valaarea 0, iar in caada de prioritati Q, fiecarui nod i# i se va atribui valoarea r (Q(i)=r ). Muchia siqura trebuie sa i ndeplineasca urrnatoarele conditii: -7 sa alba costul minim ; -7 sa nu formeze cicluri cu much iile deja alese , adica sa uneasca un nod din H cu un nod izalat din GA - extrernitatile sale apartin celor doua rnultimi disjuncte A ~i X-A (muchia este [x;,Xj] cu XiEA si xjE X-A). St ructura de da te folosita pentru implementarea grafului este matricea costurilo r. Algo ritmul pentru determinarea APM este urrnatorul: PAS1 . Se initializeaza APM cu nodul radacina r . PAS2. Se initializeaza lista H. astfe l: pe nt ru fiecare nod i din graf execu ta: :H (i) <-0 . PAS3 . Se initializeaza caada de prioritati Q . astfel : Q (r) <- 0 si pentru fiecare nod i'" din graf executa: Q ( i ) e-c, PAS4 . c at timp nu s-au selectat cele n-l muchii executa: PASS . Se aleg e 0 muc hie siqura din multirn ea muchiilor nea lese - muchia [i,j] cu i EA ~ i j E X - A PAS6 . Se adau qa muchia la lista H: H (j) <-Q ( j) .

Informatic a PAS?

289

Se elirnina din coada de prio ritati nodul j adauqat la arbore, atribuindu-i va loarea 0: Q ( j) <.-0 . PASa . Se act ualizeaza co ad a de pno ritati pentru nodu rile ne a lese , astte l pentru fie care nod i din Q ex ecuta : cauta nodul j e A cu care forrneaza mu chia cu costuI minim. Co ada de prioritati Q este impl ernentata cu un vecl or cu n elemente. lnitial : odaca i = r Q(i) = { r daca , '" r in timpu l exacut iei algoritmului: o daca i E A Q(i) = r daca l a Asinu Bj e A a.i.[i,jJEU

{ j daca i ~ A ~i 3 j E A

a .i.]i. j] E U ~ i cosl( [i, j]) = min

La terminarea oxecutiei algoritmulu i: Q(i)=O, pentru orice i (1si Sn).

in tim pul exe c ut io i algori tmului:

Lista H este irnplernen tata cu un vecto r cu n elemen le. Ini tial: H(i) =O, pen tru orice i (1sisn). ' o daca i = r sa u i it A lI (i ) = { jdaca iEA, iar[i ,j ]E H

La terminarea ex ec uue i algoritmului:


daca i = r H( i)= j dacaie r si [i,jJEH Pentru ca muchia [i ,j] ca re se alege sa fie a muchie siqura trebuie sa l ndeplineasca conditi'e : -7 sa alba costul mini m - 58 cauta nodul j pentru care i n mat rice a costu rilor elementul a[Q OJlO] are valoarea minima; -7 extremitatile sale sa apartina la do i arbori partia li diferiti - Irebuie ca Q(i)",O si QU)=O. Dupa ce s-a gasit a muchie siqu ra, ea esle adauqata la arb ore prin TU)=QU). Pe nl ru g raful G 42 din figura 49, con siderand r=1. algoritmul se excuta as lfel :

o {

Arbo re le part ial (H) Nodul i H[i] Q[i] Costul muchiei [i,Q[i]]

da 1 coac.._
1 0 0 2 0 1 5

d -3 0 1

'0r - - - . . ---

4 0 1 VMA X

Q _ i n iti al ....... , " . 6 5


0 1 VMAX 0

A rborele init ial

1 VMAX

0 1 VMAX

Hinil=({1),0)
min=5

j=2

Muchia cu co stuI minim es to [QU11)= [0[21 21= [1,2]

H[2]=Q [2] Q[2]=0

Nodul i 1 2 1 H[i J 0 Q[i I 0 0 Costu l [i.Q[i]] Actual izare 0 0 Q[iI Q Costul [i,Q[i]] _ Arbo rele part ia l H=({12 H

4 5 6 7 3 0 0 0 0 0 1 1 1 1 1 8 VMAX VMAX VMAX VMAX it 1 1 1 1 8 J..Qt VMAX VMAX VMAX 1,2]}) 5i X-A={3,4,S,6,?} --> m=1

min=8

j=3

290

Im plementarca srructurilor d e dale

Muchia cu costul minim este [QUI ')= [Q[3] 3]= [ 1, 3j -,=,' 3 Nod ul i 1 2 4 6 5 7 0 1 1 0 0 0 0 H[3J=Q[3] Hli] 0 0 0 1 1 1 1 0 [3]= 0 Q[i ] Cos tu l [i,Q[i]] 10 VMA X VMAX VMAX Actuafzere Q[i] 1 1 0 0 0 2 Q 9 VMAX Costu l [i,Q[i]] 10 VMAX Arborele partia l H-({1,2, ~ , {[ 1 , 2 ], [1,3} i . 1X-A-{4 ,5,6,7} -> m - 2

<3

min=9

]=6

Much ia ell costul minim est e JQU],]= [Q(6),6)= [3, 6j Nod ul i 1 2 3

H[6]=Q[6] Q[6]=0

6 4 5 7 H[i] 0 1 1 0 0 3 0 Q[i] 0 0 0 2 1 0 1 Costul [i,Q[I)] 10 VMA X "'""'6'"'- 6 6 Act ualiza re O[i] 0 0 0 Q 12 10 7 Costul [I,Q[I)] Arbo rel e partia l H- ({1,23, 6j,{[1,2], [1,3], [3,6} i . 1X-A- {4,5,7} - > m-3

---0

Ivrtilx

min=? j=4

Much,. cu costul min im este [QUIj]= [Q[4] 4]= [6 , 4J 4 Nodu l i 1 2 3 6 7 , / 5 H[ i] 0 1 1 0 H[4]=Q[4] 6 0 3 0[4]=0 Q[i] 0 0 0 0 0 6 6 Co st ul [i,Q[I]] 10 12 min=2 '4 0 0 0 0 0 6 Actua lizare Q j=5 2 Costul [i,Q[I)] 12 - {5,7} - o m"" A rbore le partial H- ({1,2,3, 4 6),{[1,2), [1,3], [3,61, [4,6} i . ' X-A -

em

Muchia cu costul minim este [QUI 0- [Q[5] 5]- [4 , 51

H[5]=0[5] 0[5]=0

1 2 3 4 H[i] 0 1 1 6 Q[i] 0 0 0 0 Costul [i,Q[I]] Actualiza re Q[i] 0 0 0 0 Q Costul [i,Q[i]] Arborele partial H=({1,2,3,4, 5,6),{[ 1,2J, [1,3], [3,6), [4,5]
~,

Nodul i

5 4 0

6 3 0

7 0 6

min=4 ]=7 [4,6])) . , X-A-{7} -> m=5

"~ '5

Muchia cu costul min im este [QUI' j]= [Q[7] 7]= [5 , 7] 7 Nodul i 1 2 4 6 3 5 H[7]=0[7] H[i] 0 1 1 6 4 3 5 Q[i] 0 0 0[7J=0 0 0 0 0 0 Cost u l [i,Q[I]] X-A= 0 Actualizar e Q[i] ,~ 0 0 0 0 0 0 Costu l [1, Q[i]] Arborele partial H=({1,2 3,4,5,6, 7),{[1,2), [1,3], [3,6], [4,5], [4,6], [5,7} i - } m -6

Pentru implem entarea algoritmului S8 folosesc urrnatoarete variabile ~ i structuri de date: ~ var iabi lele n ~ i r pentru numarul de noduri, respecti v pentru nod ul radacina ; 7 matricea patranca A, cu dimeniunea n , pentru matricea cost urilor asociata grafului;
7 ve cto ru l Q, cu n elemente, pe ntru coada de priori tati;

-7 ve cto rul H, cu n ele mente , pe ntru lista much iilor d in A PM ; -7 variabila ct pe ntru a calcul a co st ul tota l a l arbo relu i:

In formaticii
~

291

varlab ila k pentru a numara muchii le adaugate la arborele partial : irntial are valoarea 0 - arborele nu co ntine nici 0 muchie - valoarea sa fina la este n-1 (nu rnarul de muchii ale unui arbore cu n noduri): -7 variabilele i si j pentru indicele cu care 58 parcurge coada de prioritati , respectiv pentr u nodul care se adauqa la arbore :

si subpro gramele: -7 functi a procedu rala ini t _ me initi alizeaza mat ric ea co sturilor: -7 func tia proced urala ci ti re_me actualizeaza matricea costu rilor cu da tele din fisie r; ~ functia procedurala i ni t _Q initializeaza caad a de prioritati Q ; -7 functia operand rnuchie cauta 0 much ie siqura in multi mea muchii lor nealese ; -7 functia procedurala actualizea za_ Q actualizea za coada de prioritati Q dupa ce a fast adauqata muchia la arbarele partial: -7 functia procedurala a f i s a.r e afiseaza APM .
#i nc l ude < fs t realn .h> fs tream f {"co s t a p m. Lx t " , i o s: :in ); i nt a[SOJ [ SOJ, Q [ SOJ, H[ 50l, n , r ; cons t int VM?~~5 0 0 0 ; void ini ( ~mc () (i nt i ,j : f n : for (i = l: i<=n :i+ +) f or ( J ~ 1; j < ~ n ; j + + ) i f ( l ! ~ j ) a li ] [j]=VMAX; ) void citi r e mel) lint i c ; while (f i j c) a j i.] [ jJ =c ; a [j J l i JC' c ; f.clos e {); I void i n i t -:,O Cl {for ( i n t i= l ;i <= n ; i ++ ) if ! = r J Q [i J=r : } i n t muchie() { i n t .i , j , mi n=Vi'1AX ; for (i= l; i <= n; i + + l i f i Q[ H !~O && a[Q [i) J lH<min) [ mi n =a [Q [ i J] [ 1 ] ; j = i ; ) return j : } void ac t ua l i zeazd_Q( i n t j) {for (int i=1; i <=n ; i H ) i f (Q [i ] ' ~ O && a l i] I o l tl l c-e LilLj l.) Q [ i ]= j ; ) vo id a f Ls a r e.l ) { c o u t " AH 1 este format di n niuc hii.Le : "<cend.l , for ( i n t i ~ l; a -e- n : .i ++) if (H [i]! =0) cou t-oc " [ " li[ i ] ", "<c t-cc " ] "; } voi d main {) ti nt i ,j ,K""'O ,ct=Q ; i n i t~m c ( ) ; citi re_Dic() ; cou t -oc vNo d u I .i n.L t i a l : "; cin r; init~Q(} ; wh i l e (k<n -l) //cat timp nU s -c:::.u gas itcele n -1 muc h i i a le APM { j =mu c h i e ( ) ; / / alege 0 muchie s i qu r a H[j) =Q[j) ; ct+=a [Q[ j J] [j) ; Iladau ga 1a arb ore nod u L s i. rnuc h.i a

Q[jJ=O ;
k+ + ; )

actual i zea za~Q( j) ;

/Ielimina din coada de prioritat;.i Dodul adau g at Ilactuali zea za coadade prio r i t at i

cou t.c-c't co s t u I t.o t a I> "<cc t -cc e ncn. , afisare() ; }


Complexitatea algoritmului lui Prim

Pasul 2 si pasu l 3 au ordinul de complexitate O(n) Pasul 4 se executa de n -1 ori, i n cazu l pasu lui 3, pentru fiecare much ie aleasa, S8 executa pasul 5 si pas ul 8 de n ori . Rez ulta ca 2) Pasul 3 are ordinul de com plexitate 0((n-1)x(n+n ))=0 (n . Ordinul de camp lexitate al 2) algoritmu lui va fi : 0(n)+0(n)+0(n =0 (n\

292

Implementarea st r uet nr ilnr de date


Pentru graful G43 din figura 51, deterrninaf APM executand alqoritrnul lui Prim, Verificati daca solutia obunuta este corecta executano programul pentru graful G43.

2.8.2.4. Aplicatii practice


1. Trebuie sa S 8 construiasca 0 retea de autostrazi care sa lege cele mai importante erase din tara . Fiecare tronson de aut ostrada care leag a doua erase are un cost de construire. Sa se determine reteaua de autostrazi astfel Incat toate orasele sa fie legate prin autostra zi :;;i cost ul construirii ei sa fie minim. 2. intr-o localitate trebu ie construita 0 retea de canalizare care sa lege n locuinte si sa comunice cu doua puncte de deversare. Fiecare tronson de retea are un cost de con struire . Sa S8 determine reteaua de cana J izare astfe l in cat toate locuintele sa alba
acces la ea
~i

co stuI co nstruirii ei

sa fie minim .

2.8.3. Arborclc

CII

radacina

2.8.3 .1. Definitia arborelui cu radacina


5e nurn esta arbore cu radacina un arbo re A in care exista un nod pri vil egiat numit no d radacina. Terminologie Multi dintre termenii folositi sunt preluati din terminologia arborilor

~. .A, genealog ici sau a arborilor din natura (ca exemp lu, arborele A, figura 52).

-7 Muchiile unui arbore se mai numese ramuri sau area. -7 Nodul radacina mai este 1 ----- - -- - --- niveluI O numit va rf sau tulpina . in nodul radaeina nu intra nici 3 ----~ - - - - nivelu l 1 un arc. -7 intr-un nod intra un singur -- -@---@-- nivelul 2 Inaltirnea 4 arc (exceptand radacina) care i l leaga de un alt nod , numit parinte sau prede~ : 8 cesar. \ -7 Dintr-un nod pot sa iasa ' , I niciunul, unul sau mai mul' ,'Subarbore Fi g. 52 te arce care i1 leaga de un alt nod numit fiu sau succesor. -7 Nodurile fara succesori (din care nu iese nici un arc) se numesc frunze sau nodur i terminate. Nodur ile care nu sunt termina le se mai numesc nodur i de ramificare. -7 Ooua naduri adiacente din arbare sunt in relatia tata-fiu sau p a rin te-fi u iar muchiile sunt legiituri de tip tata- f iu . intre rnai multe noduri se poate stabili 0 relatie de tipul fi ul fi ului ... fi ulu i sau tatii l tat iilui. .. tatalui, i n primul caz se poate spune ca nodul este descendent sau urrnas al unui alt nod , iar in al doil ea caz ca nodul este ascendent sau stramos al unui nod. -7 Ooua noduri care descind direct din acelasi nod tata se numesc noduri frate. -7 Ordinul unui nod este dat de nurnarul de descenden t! directi. -7 Nadurile sunt arganizate pe niveluri. Nurnerotand nivelurile nodurilor, radacina se gaseste pe nivelul 0, descendentii ei pe nivelul 1, descendenfii acestora pe nivelul 2 etc. Nivel ul unui nod este egaI cu nurnarul de noduri parcurse pe calea de la radacina la el. -7 Un arbore cu radacina este arbore vid (arbore nul) daca nu are nici un nod.

Informatica
(Iungimea celui mai lung lant care porneste din radacina).
----,.--...... 1. Pentru arborele cu radacina A 1 din figu ra 52 precizati:

293

-7 lnaltimea unu i arbore este data de maximul dintre nivelurile nodurilor terminate

-7 eticheta nodului radacina; -7 nurnarul de Irunze si etichetele lor; -7 etichetele nodurilor care se gasesc pe nivelul 2; -7 etichetele fiilor nodului 2; -7 etichetele fratilor nodului 5; -7 eticheta parintelui nodului 9; -7 nurnarul de Irati ai nodului 7. 2. Un arbore cu radacina A, (X. U) esle definit astlel: X;{1.2.3,4.5.6 .7.8.9.10) U;{[1 .2]. [1.3]. [1,4]. [2.6], [3.5]. [3.7], [3.9]. [4.8]. [8.10I} .
Precizatl:

A,

-7 daca eticheta nodu lui radacina este 1. cate Irunze are arborele si care sunt aceste
frunze;

-7 daca eticheta nodului radacina este 2. cati Irati are nodul cu eticheta 1 ~ i pe ce nivel se gase~te nodul cu eticheta 10; -7 daca eticheta nodului rad~3cina este 10, ce lnaltlrne are arborele , cine este parintele nod ului cu eticheta 1 si care sunt l iii nodulu i cu etic heta 3.
Caractnristic i : -7 Nod ul rad acina este un nod considerat privilegiat . EI nu are parinte (asce ndent). ci
numai fii (descendentl). Este nodul de la care se conside ra ca pornesc ramurile catre radac inile altar arbori. G rice nod al arborelui poate fj considerat nod radacina .

-7 Un arbore A este fievid, fie lormat dintr-un no d rada cin a R caruia Ii este atasat un
nurnar finit de arbor! Acesti arbori sunt subordonati radacimi si S8 numesc subarbori ai arboreJui A. Ori ce nod d intr-un ar bore este rada cin a unui suba rbo re .

-7 intre doi subarbori nu pot exista decat doua tipuri de relatii: a. relatia de incl uziune - unul dintre subarbori este subarborele celuilalt;
relatia de exclu ziun e - cei doi subarbori nu au nod uri comune, dar apartin aceluiasi arbore. 7 Accesul de la racacina unui arbore (subarbore) nevid la oricare nod, inseamna parcurgerea unui lant format din m arce, care tree prin n noduri (m =n+1) . n reprezentand nivelul pe care 58 gase~te nodul fata de radacina. b.

Definitii recu rsive :

-7 Definitla arbo re lui. Un arbore nevid este

0 rnultime finita A de noduri care au urrnatoa-

rele proprietati: a. Exista un nod care poate fi considerat nod radacina. b. Celelalte nodu ri pot Ii repartizate In i (i::O) rnultirnl disjuncte (A, . A2... ... Ai).
fiecare dintre aceste rnult .rni fiind considerate la randul lor arbori.

-7 Defin iti a Ina ltim ii. Inaltirnea unui arbore este eqala cu 1+maximul dintre i naltimlle subarborilor sai .
1. Daca nodul cu eticheta 2 are patru frati, iar nodul cu eticheta 1 este
parinte 'e lui, ce ordin are nadul cu eticheta 1?

2. Pentnu arborele cu radacina A, din figura 52 precizati:

-7

ca~i

subarbori are nadul rada cina - pentru fiecare subarbore precizati radacina;

294

Implementarea struetnrilor de date

-7 cali subarbori are nodul cu eticheta 2 - pentru fiecare subarbore precizati radacina; -7 d3~i subarbori are nodul cu eticheta 10- precizati cine este acest su barbo re; -7 in ce relatie sunt subarborele cu radacina In nodul cu eticheta 2 si subarborele cu radacina In nodul cu eticheta 4; -7 in ce relatie sunt subarb orele cu radacina in nodul cu eticheta 2 si suba rbore le cu radacina in nodul cu eticheta 9.
3. Pentru arborele cu radacina A 2 definit anteri or precizati: -7 daca eticheta nod ului radacina este 1, in ce relatie sunt subarb orele cu radacin a in nod ul cu etic heta 2 ~i subarb orele cu radacina in nodul cu eticheta 8;

-7 daca eticheta nodului radacina este 3, caji subarbori are nodul radacina - pentru fiecare
subarbore precizati rada cina :

-7 daca eticheta nodului radacina este 2, caji subarbori are nodul cu eticheta 9 - precizati
cine este acest suba rbo re;

-7 daca eticheta nodului radacina este 3, caf subarbori are nodul cu eticheta 2 - pentru
fieca re subarbore preciz ati radacina..

7 daca etieheta nodului radacina este 4, In ee relatie sunt subarborele cu radacina In nodul cu eticheta 1 ~i subarborele cu radacina In nodul cu eticheta 3. Se nurneste arbore ordonat un arbore eu radacina in care fiji fi ecarui nod sunt ordonati , Observatie. Intr-un arbore ordonat , daca un nod are k fii, atunci exista un prim fiu, un al doilea fiu, ... , un al k-Iea fiu. Se numeste arborescenta sau structura arborescenta un arbore eu radacina in care s -a stabilit nc dul r::idacina . Pentru a lnt eleqe deosebire a dintre tipur ile de arbori enumerate , vom considera pentru exe mplificare un arbore cu 3 noduri etiehetate cu A, 8 si C si vom pune In evidenta numarut de arbori diferiti care se pot form a eu aeeste nodur i. ~ Arbori liber. Se pot obtine 3 arbori liberi diferiti. in figura 53 sunt prezentaf acesf arbori. -7 Arbori eu radaci na, Se pot obtine 9 arbori eu radacina diferiti, Exista trei moduri de a alege radacina (nodul A, nodul B sau nodul C). Pentru un nod radacina ales. se pot obtine trei arbori A diferiti. De exemplu , daca se conside ra nodul A ca nod B C radacina. exista trei moduri diferite de a repartiza in arbore nodurile B ~i C: nodul A are doi fii (8 ~i C) sau un singur fiu: 8 sau C. obtina ndu-se trei arbori diferiti (cei prezentati In figura Fig . 54 54). In total se obtin 3x3=9 arbori cu radacina diferiti.

A
e

Fig . 53

-7 Arbo ri cu radac in a ordonati. Se pot obtine 12 arbori cu radacina ordonati cife riti, Ca ~j In eazul precedent, exista trei moduri de a alege radacina, Pentru un nod racacina ales, se pot obtine patru arbori diferiti, De exemplu, daca se considers nodul A ca nod radacina, exista patru moduri diferite de a repartiza in arbore nodurile B si C:

A l
B e B
Fig . 55

In 1'0 rma ti d

nodul A are doi fii (8 ~ i C sau C ~i 8 - in acest caz ordinea nodu rilor 8 sau un singur fiu: 8 sau C,.ob jinandu-se patru arbori diferiti (cei prez entati in figura 55 ). In total se obtin 3x4=12 arbo n cu 8 radaci na ordonati diferiti .

l
~i

295
C contea za),

-7 Structuri arborescente . Pentru un nod radacina ales (de exemplu nodul 8 ) se pot obnne 3 structuri arborescente dile rite deoarece exista trei moduri diferite de a repartiza i n arbo re nodurile A ~i C: nodul 8 are doi fii (A ~i C) sau un singur fiu: A sau C (figura 56).
Se nume!;iote arbo re pozitional un arb ore cu radacina i n c are es te precizata pozitia tiecarui flu Ob sorv at ie intr-un arbore pozitional , fiii fiecarui nod sunt etichetati cu numere intregi pozitive consecutive, iar daca lipseste fiul cu eticheta k, aceasta etiche ta nu se atribuie nici unui fiu (arborele A 3 din figura 57).

A C Fig , 56

. 14
~.

rofuilill die

lCBl?:

lipsesc fiii cu etic hetele 112 si 113

-------

lipseste fiul cu etichela 12

Fig. 57 A~ . .'

Seop : identificarea colectiil or de date care pot fi repreze ntate prin arbon cu radacma . Enu ntul problemei 1. 0 firma are mai multi anga}a!i. intre enqejet) existi: fie releti! de subordine, fie teleti! de colaborare. Directotui firmei da 0 dispozi!le pe care 0 transmite subordona!llor sei directi. Ace.tia primesc simuftan dispozne .i 0 transmit mai departe subordonal"or direct! s.e.m.d. Transmilerea dispozi(iei de la un nivel ierarhic la altul necesite ecetesi timp t Sa se determine in cat timp aj ung sa cunoasca dipozilia data toti anga}atii finnei (figura 58).

Director

1 21 r $ef
compartirnent 3 1

Sef com partiment 1

l?ef com partim ent

sel
subco mpartimenl 11

sel
subcompartiment 12

s el
subcomp artim enl

13

11

Fig . 58 Firma are 0 structura ierarhica, iar relatiile dint re anqaj ati pot Ii reprezentate cu ajut orul unei arborescent e, in care anqaj atii sunt noduri le, iar arce le rela tiile de subordonare . Rad acina arborelui este directoru!. in tre un angajat care are in subordine un alt angajat exista 0 legatura de tip tata -fiu . intre anqajatii subordonati aceluiasi angajat exista relat ii de colaborare . Acesti anqajati sunt nodu ri frate. Timpul T necesar ca c ispozitia sa ajunqa de la director la toti anqajatii este dat de produsul dint re tirnpul t necesar pentru transmiterea de la un nivella altul ~i inal\imea h a arborelui: T=txh . Enuntul problemei 2. Un produs este realizat din mai multe componente. Fiecare componente la rendu! sall este realizata prin asamb larea aftor componenle . Atat produsul cal componenlele sunt caracterizate prin tr-o tist de alribute (ptoptieteti): denumire,

.i

296

lmplementarea st r ucru r ilor dc datc

cod, pret, Iunctie reenzet, costul esembletii, firma care a produce etc. Sa se determine pretut produsului (figura 59).

Compooenta 1

Compon enta 2

c omponents 3

Componen ta 11

Componenta 12

Componenta 13

,---~I

,-I_-,

Fig. 59 Produsul are a structu re ierarhica , iar relatiile dintre compo nente pot fi repr ezentate cu ajutorul unei arborescente , in care componentele sunt nodurile, iar arcele relatii le de apartenenta a unei componente la a alta componenta . Radacina arborelui este produsul final. intre a cornponenta ~i componenta pe care a are in subordine exista a legatura de tip tate-flu . Componentele care fac parte din aceeas i cornponenta sunt frati. Pentru stabi lirea costului total al produsului trebuie parcurs arborele, ca sa se calcule ze costul fiecarei componente. Costul c al unei componente se obtine prin adunarea pretu lui de achizitie p la costu l asarnblarii a: c=p+a. Parcurgerea arborelui se face pornind de la ultirnul nivel catre radacina. Radacin a se prelucreaza ultima , dupa ce au fast prelucra ti toji subarborii subo rdonati ei. Observat ie . Pentru studierea proprietatilor unui obie ct, orice obiect poat e fi descompus la randul sau i n obiec te mai simple. Fiecare obiect, la randul sau, poate fi caracterizat printr-o lista de proprietati. Procesul de descompunere poate sa continue pe mai multe nivelur i. EI este finit si se terrnina dupa un nurnar de etape care este dependent de problema care trebuie rezolvata. Procesul de descompunere este un pra ces recur siv (un obiect este cam pus din alte obiecte). Prin proc esul de desco mpune re se ~ stabileste 0 ierarhie a obiecteJ or, iar reprez entarea acestei descompuneri se .....c:l :~ epoate face printr-o ar boresce nta . 1. Reprezentati sub forma unui arbore cu radacina. relatia de incluziune a rnultimilor prezentate in figura 60. 2. Doriti sa curnparati un calculator ~i cispuneti de un anumit buget. Pentnu a avea un calculator mai perforrnant, aleqeti varianta de a curnpara componentele si de a Ie asambla singur. Calculatonul este un produs format din mai multe componente (unitatea centrala, monitorul, tastatura, mouse-ul etc.) care la randullor pot . fi descompuse in aile componente (de exemplu, unitatea centrals Fi g. 60 este fermata din carcass , placa de baza, unitatea de hard-disc, unitatea de compact disc sau de DVD, etc.). Desenati arborele structurii de componente a calculatorului. 3. Desenati un arbore geneal ogic al familiei care sa prezinte filiatla (descendentii directi ai unei persoane). Se va lua ca nod radacina unul dintre stra-strabunici. ldentificati pe acest arbore relatii de rudenie de tip: fiu, nepot, frate si var.

Informatica

297

4. Cuprinsul unei carti are 0 structura arborescenta . Desenati structura arborescenta a capitolului .Implernentarea struc turilor de date" din acest manual. 5. Structura dosarelor cu fisie re de pe hard-disc . gestio nate de sistemu l de operare Windows , este 0 structura arborescenta. Desenati arborele dosarelor de pe hard-disc. Fisiere le vor fi nodurile terminale. 6. 0 matrice cu n Iinii ~i m coloane este 0 structura de date ierarhizata care poate f rep rezentata pe trei niveluri, ca 0 arborescenta, astfel : nodul radacina este matricea, fiii nodului matrice sunt liniile, iar fiii fiecarei linii , elementele de pe linia respectiva. Desenati arborele cu radacina al unei matrice cu patru Iinii ~i trei col oane. Precizati ce tip de arbore cu radacina este.

2.8.3.2. Implementarea arborelui cu radacina


Implementarea structu rilor de date de tip arbore cu radaci na se poate face prin: -7 matrice de adiacenta : -7 Iista de adiaconta : -7 roferinte descendente -Iegatura de ti p tata : -7 referintc ascendente -I egatura detip parinte nod terminal .
Observatie. Arborele, fiin d un graf neorientat cu anumite proprietati. pen tru implementarea sa stat ics se pot Iolosi aceleasi metode ca ~ i la grafuri, dar aceste irnpleme ntari sunt ineficiente. Arborilor Ie sunt spec ifice implementarea cu leg at u ra de tip tata si implementarea cu leg atura d e tip parinte nod terminal . i n urmatoarele implementari se considera ca arborele are n noduri si radacina are eticheta r.

a) Implementarea prin referinte descendente


Legatura de tip tata . Arborele este reprezentat sub forma unui vector t cu n componente in care se memoreaza , pentru fiecare nod, eticheta parintelu i sau. Algoritmul de construire a vectorului este urrn atorul: PAS1. Pentru tiecar e nod L din arbore executa : PAS2. 'l ac a nodul i~r , at u nc i t[il<-O ; altfe l , t[il <- j , und e j reprez inta , .d ul pari nte al nodul ui i.
Exem p lu . Vect or ul tata pentru arbore le A 4 din figura 61 este : Nod (indice i) Pari nte (t[i]) 1 3 2 3 3 0 4 3 5 1 6 2

A4

Observatie . Din vectorul tata puteti obtine ur matoa rele intormatii -7 eticheta nodului radacina - indicele i pentru care t[il ~O; -7 etichetele nodurilor terminale - nodurile j a carer eticheta nu exista in vectorul t ; -7 eticheta par inte lui unui nod j - t OJ ; -7 etichetele l iilor unui nod j - indicii i pentru care t[il~j ; -7 etichetele frati lor unui nod j - indicii i pentru care t[il~tO]'

.---0

..----...... ~ 1. Reprezentati sub forma vectonului tata arborele cu radac .na As din figura 62. 2. Scrie ti un program care sa citeasca dintr-un fisier informatii despre matricea de adice nta a unui arbore cu radacina (de pe prirnul rand - nurnar ul de noduri n ~ i eticheta radacinii r, iar de pe urrnatoarele n randuri - rnatrice a de adiacenta) ~i care sa scrie vectorul tata al arborelui intr-un al fisier.

298

Implemcntarcu st r uctu r ilor de dale

3. Scrieti un program care sa citeasca din fisierul creat anterior vectonul l ata al arborelui cu radacina ~i sa afi seze urrnatoarele inforrnafii: a. eticheta nodului radac ina; b. nurnaru l de nodu ri terminale ~i etichetele lor; c. pentru fiecare nod , eticheta par intelui, nurnarul de fii ~i etichetele lor , ~i nurnar ul de frati ~i etichetele lor. b) Implementaraa prin referinte ascendentc Leg al ur. de lip parinte nod terminal . Arborele este repr ezentat sub form a a doi vectori cu n -1 componente: vec torul t in ca re sunt memorate nodurile, in ardine, porn ind de la nod urile termin a te, si vectorul pt in ca re sunt memorate noduri le parinte ale nodur ilor terminate . Algori tmu l de construire a celor do; vec tori este urmatorul: PAS1. Pontru fiecare indice i de la 1 la n-1 ex ec uta : Se cauta nodu l termina l cu eticbeta cea mai micii . PAS3 . Se atribu ie aceasta eticheta lui I[i] . PAS4. Se atribuie lui pt[i] eticheta nodului parinte al nodu lui terminal t [i] . i PASS . Se elirnina din arbore nodul terminal t [i].

i PAS2.

Exemplu. Pentru arborele A., din figura 61. cei doi vectori se completeaza astfel (figura 63): -7 lnitial noduri le terminale au etichetele : 5, 8, 9 ~i 7. Se alege nodul terminal cu eticheta cea mai mica (5). Se scrie eticheta sa in primul element al vectonului I , iar eticheta parintelui sau (1) i n primul element al vectorului pt . Se inlatura nodul 5 din arbore . -7 Nodur ile terminale au etichetele: 8, 9 ~ i 7. Se alege nodul terminal cu elicheta cea mai mica (7). Se scrie eticheta sa i n al doilea element al vectorului I , iar etiche!a piirintelui sau (4) in al doilea element al vectorului pt. Se inliitu rii nodul 7 din arbore . -7 Nodurile terminale au etichetele : 8, 9 ~ i 4. Se alege nodul termina l cu eticheta cea mai mica (4). Se serie eticheta sa in al treilea element al vectorului I , iar eticheta piirintelui sau (3) in al treilea element al vectoru lui pt . Se inliiturii nodul4 din arbore . -7 Precedeul de adiiugare in vectorul I a nodu lui cu eticheta cea rnai mica si a parintelui sau in vectorul pt, urrnata de elirninarea din arbore a nodulu i ad aug at, cont inua pana cand in arbore nu mai rarnane decat nodul care are cea mai mare eticheta. Vectorii I si pt pentru arborele A., din figura 61 sunt: (indice vector i) r. 1:-r-: 2 , ,--,:. ..;;-r.:-,-7-r~~, Nod terminal (I [i]) 5 ~+--:'-+-':-+-:::-t~+--'o-t--::--l Parinle n od I erm ina I (pl [i]) L-' 1--L_ 4'--'---'--'---'---'---=--L-=--L-"---'--='--' 1. Rep rezentati arborele cu radacma As cu vectorii t ~i pt. 2. Scrieti un program care sa citeasca dintr-un fisier inforrnatii despre matricea de adicenta a unui arbore cu radacina (de pe primu l rand nurnarul de noduri n ~i etichet a radacinii r, iar de pe urmatoarele n randuri - matricea de adiacenta) ;Ii care sa scrie vectorii t si pt ai arbore lui intr-un alt fisier. Observatil : 1. Vectorii I 'Ii pt sunt aceiasi pentru un arbors. indiferen t de nodul radacina ales 2. La terminarea algoritmu lui, ultimul nod care mai rarnane in arbore este nodul cu eticheta cea mai mare - n . Cunoscandu-se aceast a eticbeta , in vect orul pt este sufic ient sa se memoreze numai primele n-2 elemente. ultimul element avand in totdeauna valoarea n .

In 1'0 rm alica

299

3. Este suficient sa S8 memoreze numai vectoru l pt , deoarece din acest vector S 8 poate cons trui vectorul t. Pentru a gasi algoritmul de construire a vectorului t , trebu ie observat ca eticheta j care S8 mernoreaza in t [i] corespunde unui nod ca re l ndeplin este urrnatoa refe co nditii: a. Nu a fast Inca elimina t din arbore - deci nu s e gasele printre etiche tele t[1) , t[2) , , 1[i-1) . b. Nu este par intele nici unui nod termina l care se va adauqa ulterior, deoarece va fi eliminat din arb ore - deci nu se q asesto printre el ichetele pt[i) , pt[i+1) , ... , pt[n-1 ]. c. Are cea mai mica etichet a dintre nodurile care indeplinesc conditiile (a) ~i (b). Din aceste cond itii rezult a ca, penlru orice i (t sisn-t ): t [i) = min(k k e( 1. 2. .. .. n} - ( t [1) , t[2) , ... . l[i-1). pt[i), pt[i+1), ... , p t [n -1) }} Teorema 23 Nurnarul total de arbori liberi care se pot forma cu n noduri este nn-2.
Derncnstrat le. Vectorul pt fiind acelast pentru un arbore cu radacina, indiferent de nodul radacina ales. el poate fi asociat ~i unui arbore liber. Vedorul pt are n-2 cle mente . Notarn cu A mul timea indicilor din vector ul pt ~ i cu B multi mea nodurilor arborelui Iiber. Fiecarui arbore li putem asocia a functie f:A-7B care asociaz a unui indice i din vectorul pt un nod j din arbore: f(i) =j . lnvers. unei fun c~i i f ii putem atasa un arbore . Notarn cu a=card(A)=n-2 f?i cu b=card(B )=n. Ncroarut de functii f:A-7B este a egal cu b = nn-2. Rezulta ca numarul total de arbori care se pot forma cu n noduri este egal cu nurnaru' de functii f, adica n" -2 _________../""'0. 1. Pen lru arborele

A. din figura 61 reconstituiti vect orul t cu ajulo rul vectorului pt. 2. Scrie ti un program care sa citeasca dinlr-un fisier vecl orul pt al unui arbore si care sa construia sca vectorul t. Salvati acest vector, i n acela si fisier, pe randu l urrnator.

2.8.3.3 . Algoritmi pentru parcurgerea unui arbore cu radacina


Parcurgerea unui arbore cu radaci na se po ate face prin: a) Algoritmu l de parcurgere in latirne : b) Algoritmul de parcurgere in adancirne a) Alqoritmul de parcurge re in latirne Meloda: se prelucreaza mai lntai informatia din nodu! radacina, dupa care sunt prelucrate, de la s ta n q a la dreapta , nodurile afla te pe primul nivel, apoi pe cel de al doilea etc . Stru clura de date folosita este coada (e) i n care se adauqa fiii nodului prelucrat. Algo r itm ul penlru parcurgerea arborel ui este urrnatorul: PAS1. Se initializeaza coada cu nodul radacin a r . PAS2. Cat timp coada nu este vida executa (p r i m< =u tl i m): PAS3. Este extras din coada primul nod si este prelucrat. PAS4. Sunt adauqati In coada fii nodu lui prelucrat.

1
3

Fig. 64 Exemplu. Coada de ateptare la parc urgerea arborelui A, din figura 64 ' 1 3 4 3 4 3 1 4 3 4 3 4 3 14 3 4 3 Pas Nod cu rent 1 4 7 2 3 I 5 6 i 8 Coada 1 - 23 3 3 4 4 1 456 5 6 5 6 6 6 7 8 78 17 8 8 8 Nodurile sunt parcurse i n ordinea : 1, 2, 3, 4, 5, 6, 7, 8.

A.

300

Implcmcn tarea structu rilor de date

Pentru implementarea algoritmu lui se folosesc subprogramele : -7 functia procedurala c i t i re creeaza vectorul t (vectorul tata) prin preJ uarea inforrnatiilo r din fisier: -7 funct ia operand rad deterrnina radacina r a arbore lui; -7 tunct ia proced urala i ni t initializeaza coada de astepta re cu radacina; -7 functia operand e s t e _ v i d a testeaza coada de asteptare daca este vida ; 7 funct ia procedurala ada u ga adauqa un nod la coad a de astep tare: 7 funcua procedu rala eli m ina elirnina nodul prelucrat din coada de aste ptare : -7 functia procedurala pre l u c r a re prelucreaza primul nod din coada : adauqa la coada de astepare tof fiii acestui nod $i apoi II elimina din coada de asteptare: -7 functia proc edurala a fi s a r e afiseaza noduri le arborelui in ord inea prelucrarii . #include <fstream .h> int t[ 2 0 }, n ,c l2 0 J , p r i m, u l L L m;
fstream f ( "a r b o r e . t xt " , i o s : : in ); void c i t i ret: { f n; for ( i n t i ""' l ;i< oo::n ;l H o) f t[ i ] ; f. c l o s e () ; } int r ad i i { f o r ( i n t i = l; i< =n ; i ++l if (t[ i J""==O ) return i ; re t urn a ; ) / / in ca z de eroare ... nu e x is t a nod r ad a c ina void init {i n t k ) {prim=u l -:i m= l ; c [ u l t i m)=k ; } int e s t e - v Ld a () {return u l t. im< p tim; } void ad e u q'( Ln t; i ) {ul t i m++; c[ul t i m] = i ; } void c l i .mt na t I {pr i m++ ;} void p r elu c .:-arc ( ) {int r r-c [p rim]; for (i n t i =l; i< =n ;i+ + ) i f (t[i ]== r ) adau g {i) ; e Li.man a.ty s } void e fLs a re f') {f or l i n t i =1;i<=n ;i+-t- } cou t cc c Lil c-c" " ; } void main() tint r ; c l r i r e t.j r =ra d {} ; r n t t fr ) , while {! e s t e jv Ld a ( )) p r e Luc ra r e t.f : afi s are () ; }

b) Algoritmul de parcurgere in adancime Metoda: porn ind de la nodul radacina se prelucreaza fiii unui nod de la stanqa la dreapta , iar trecerea, de la nodul curent la frate le din dreapta , se face numai dupa ce au fast vizitati toti descend entii nodului curent , deci ai 1ntregului subarbore dezvo ltat din acesta . In functie de ordinea relat ive de preluc rare a nodului radacina si, respectiv, a subarborilor, exista doi algoritmi: -7 Algoritmul de parcurgere in preordine . lnforrnatia din nodul radacina este prelucrata inaintea inforrnatiilo r din celelalte noduri ale subarborilor. Implementarea arborelui se face prin referinto desc en dente . 7 Algoritmul de parcurgere in postordine . lnforrnatia din nodul radacina este prelucrata dupa ce au fast prelucrate inforrnatiile din toate celelalte noduri ale subarborilor. Implementarea arborelui se face prin referinte ascendente . Algoritmul de parcurgere in preordine Structura de date folosita este stiva {s t} i n care informatia este torrnata din perechi (nod tata, urrnatorul fiu nepreluc rat al acestuia) . Initial, 5e considers ca nod ul prelucrat este nodul radacina. Notarn: NC = nod curent NP = nod prelucrat (nodul care s-a vizitat) PFNNC = primul fiu nepreluc ra! al nodului curent PFNNP = primul fiu neprelucrat at nodului prelucrat

Inform a tid
in varful stivei se va memora perechea (NP, PFNNP) .

301

Algorilmul pent ru parcu rgerea arborelu i este urmatorul: PAS1. Se initializeaza stiva cu perechea (nodul radacina, primul fiu al radacinii). PAS2 . Cal limp stiva nu este vida (mai exista noduri in stiva) axecuta: PAS3. Se exlra g inforrnatii din varful stivei despre: 7 Nodul prelucrat devine nod curent NC,-sl[vf] .NP (Ia prima parcurgere NC,- 1). 7 Primul fiu neprelucrat al nodului prelucrat devine primul fiu neprelucrat al nodului curent PFNNC~sl[vf].PFNNP (la prima parcurgere PF NNC ~3) . 7 Primul fiu neprelucral al nodului curent devine nod prelucrat NP ~PFNNC (Ia prima parcurgere NP ~2 ). 7 Primul fiu neprelucral al nodului prelucrat devine primul fiu neprelucrat al nodului prelucrat PFNNP~sl[vf] .PFNNP (Ia prima parcurgere PF N N P~ 4) . PAS4 . Oaca nodul curent mai are ~i alIi fii neprelucrati, alunci la stiva se adauqa perechea (NC, PFNNC). La prima parcurgere perechea este (1,3). PASS. Daca nodul prelucrat nu este nod terminal ~i mai are si alti fii neprelucrati, at unci la stiva se adauqa perechea (NP, PFNNP) . La prima parcurgere perechea este (2,4). Exemplu. Sliv a la parcurgerea arborelui Ao din figura 64: - - - - - ~._-PFNNP Sti va NC NP PFNNC PAS (1, L) 1 2 1 3 4 3 1 2 1 2 3 4 4 (1,3) 2 3 4 11 ,3); 12,41 1 5 --_ .._ .. __._3 (1,3) 2 4 2 4 4 (122 (1, 3) 2 4 5 5 -1 3 3 4 5 3 4 5 3 4 5 3 4

13, 5l

(3,6) (3,6); (5, 7) (3,6) /3,6);(5,8) /3,6); /5, 8\ (3,6) (3,6) 13, 6)

~3 4 5

1 1 3 3 3 5 5 5 5 5 5 3 3 3

3 3 5 5 5 7 7 7 8 8 8 6 6 6

6 6 6 8 8 8

5 5 7 7 7

Nodurile sunt parcurse Tn ordinea: 1, 2, 4, 3, 5, 7, 8, 6.

Pentru implementarea algoritmulu i se folos esc subprogramele : -7 functia procedurata c i t ire creeaza vectorul t (vectorul tata ) prin preluarea informatiilor din fisier: -7 functia operand rad dete rmine radacina r a arborelui;

302
-) -) -) -) -) -)

Irnplcmen ta rea st ruc rurilor dc datc


functia operand nodt verifica daca un nod este nod terminal ; functia procedurala ini t initializeaza stiva cu perechea (radacina , prirnulfiul al radacinii): functia operand este_vida testeaza stiva daca este vida ; . functia procedu rala adauga adauqa un nod la stiva : functia procedura la elimina elirnina nod ul din varful stivei ; functia procecurata prelucrare prelucreaza nodu rile din varfu l stivei astfel : nodul prelucrat devine nod curent, prirnul fiu neprelucrat al nodului curent devine nod prelucrat, afiseazEi nodu l prelucrat, etirnina perechea de noduli din varful stivei , daca nodu l curent mai are un fiu neprelucrat, adauqa la stiva perechea (NC, PFNNCj , iar daca nodul prelucrat nu este nod terminal ,?i mai are un fiu neprelucrat, adauqa la stiva perechea (NP, PFNNPj .

#include < fst ream .h>


struct s t iva tint NP , PFNNP ; } ; s t Lv c s t [2 0J ; int t [ 2 0 ], n , v f ; fstream f lva r co r e t x t vi Lo s : : i n );
i

int nodt( i n t x) {for ( i n t i ===l ; i< =n; i ++ ) if ( t U l == x ) return 0 ; return 1 ; }


voidinit (i n t r) {int i=1; v f=] ; while (i< =T1 && t liJ ! "'""r) i+ + ; st [vn .NP=r ; s t [vf) . PFNNP =i ; } int es te vi da() {return v f =-=:O ; } void adaug( i n t x , int y) {v f ++; s t [vfJ . /\,P =x; src(vf] .PFNNP= y ; } void e l im i n () { vf - -;} void pre lucrarc() (int NC"= st [vf] . NP , PFNN C=s~ [ v f ] . PFNN P, NP"" PFNNC, PYNNP , i = PFNNC+ l ; ccut.ccu r'<c" "; P FNt~ P = s t [ v f ) . PFNNP ; e lim in() ; while ( i <""D && t[i l j =NC) i + -r ; if ( i< =n} { P F NNC=i; aclaug {NC,P FNNC) ; } if ( ! noc t (NPl ) { i = PFNNP+ l; while (i<=n & & t [ i] ! =NP ) i+ + ;

if ( i <=rt) {PFNNP=i; adaug(NP ,PFNNP) ;}}}


void c i t i r e ( ) { t r,; for (i n t i =1; i <= n ; i + + ) f t [ i ]; f. c lo s e () ; } int r ad t ) {f o r (i n t i = l ;i<=rt ;i++) if (t [ i]==O) return i ; return O; } void main () {in t x. c.i t Lr e j j.: .c=rad() ; i nt t{ r ) ; cc-rtccv uodu r .t Ie v i zi t ate : " r " wh ile (!este_vid a( )) prelucrare () ; }

II .

':::>~ A . ~

~ . tcntic ~

Prin parcurgerea i n tat irn e a unu i arbore cu radacina, pre lucrarea face pe n iv el uri ier arhice, iar prin pa rc u rq er ea in adancime in p reordine a unu i arbore, prel ucra rea in fo rrnatiilo r din noduri se f ace dupa relatii le de s ubordonare.

.:s:- informatiilor din noduri se

Algoritmul de parcurgere in postordine


Nodu lui radac ina i se va atribui cea m ai ma re etic heta . Prelucrarea se face prin parcurgerea sirnultana a celor doi vectori ~i cautarea noduri lor care apart in aceluiasi subarbore Evidenta nodur ilor prelucrate este linuta prin intermediu l vectorulu i vizitat (care este definit la lei ca ,?i la algoritmii de parcurgere a gralurilor).

Inform atica
A lgoritmu l pentru parcurg erea arbo relui in postord ine este urma torul :
PAS1 . Se initlalizeaza cu 0 elementele vectorului v izi tat. PAS2. Cat tirnp mai sunt noduri nevizitate exec uta : PAS3 . Se caut a in vectorul t ind icele k al primului nod ter min al nev izitat. PAS4. Se prelucreaza nodul t [k] si se declara vizitat. PASS. Penlru toate nod uriIe t[i] Frate cu nodul t[k ] execut a . PA56 . Se preluc reaza nodul t [ i] ~i se decla ra vizitat, PAS? Se prelucreaza parintele nodului t [ k ] (pt (k ]) ~ i 5e declara vizitat.

303

Pentru imple men tarea algoritmului S8 folosesc subprogramele: -7 functia procedurala ci t ire creeaza vecto rii t ~i pt prin preluarea intormatiilor din fisier; -7 functia ope rand te rmina t verifica daca au fast prelucrate toate nodu rile arbore lui; -7 functia proced ura la pre l ucr are prelu creaza nodu rile unui suba rbore , pornind de la nodul term inal cu eea mai mica etic heta .
#i nc l u d e < fstream.h> in t t [20J , p t [ 201, v izi tat [ 2 0J , n; fstream I J "a t.bo r e . t xt " f .i. c s r : in) ; v o i d cit i re ( ) {int i ; f n ; f o r (i = 1; i< =n ; i + + ) f e e-t; l il.: f o r (i=l;i <=n. ;i+ +) f pt [ i } ; f.close ( );} i nt t.e rm Lne t. ( ) {fo r (i n t i = l ; i < rl; i ++ ) if ( ! v i z it at[ i}) re turn 0 ; r e t u rn 1; } void prelucrare ( ) {in t i, k; fo r ( i= l ;i<n && vizit a L [ t[iJJ ; i ++) ; I-:=i; vi.z i r a t j t Lk l l c-L , cou t -cc t Lk l c -c" " ; f o r (i=k+l ;i<h;i++) if (p t [ i]~~ p tlk Jl { c o u t-oc t Lj I c-c" H; v i z i t a t Lt.Lille L r j coc t-ccp t j k j c-c' ' "; v Lz i t.e t [,p t [ k J ) ~ l;} voi d ma in () { c i t i r e 0 ; ccwe-cc vrcoctu r .t .Ie v .i z i r at.c vso n t : " ; wh i l e ( Lt.e rm t n e t ( )) pr e l u cr a r e j j r I

Exemplu - in noduriie unui arbore se me rnoreaza eticheta nodului $i un nurnar. La numarul memora t in fiecare nod se aduna suma numerelor memorate In nodu rile descendente . Sa se afiseze noua va!oare rnernorata in fieca re nod. Pentru a putea ca lcula aeeste sume , pareurgerea arbore lui tre buie sa se faca In postordine , ell ajutoru l vecto riior t si pt . Numerele din fieeare nod vor fi memorate in vectorul c . lntormatiile neces ase se eitesc dintr-un fisier text, astfel: de pe primul rand numa rul de noduri n , iar de pe urrnatoarele trei rand uri, cele n valori memo rate In vector ii t, pt si c . Pe un rand, numerele sunt sep arate prin spatiu .

#inc lude < f s t r eam . h> in t t[ 2 0I,pt[20I, c[ 2 0 j,fl ; f s t r e a m f{ " a r b ore .L x t " , Lo s : : i n 1; voi d c i t i re t ) / /se c i t e sc d a t.e Le d .i.n f i s Le r t i nt i ; f n; for ( i ~ l; i<~n ;i++ ) f t [i ] ; fo r ( i = l ; i< ~ n ; i + +) f r t [~ ] ; f or (i=l ;i<=n ;i++) f c [i} ; f .close ( );} void prc Lucra.re tlIfior' (i n t lo=l ;i<=n ;i ++ ) c[pt[ ill==c[pt l i]] +c [t [ i J J ; } v o i d a f i s a re ( ) { fo r {i ==: l ; i <= r. ; ++) c out " No d u " i" a r e t.o t.a I u ; " c [ i lendl; } voi d me i.n () { c .i ire () ; prelucr ar e( ) ; a t i s a re {} ; }

304

Im p lementur ca st r uctn r ilo r de date

in nodurile unui arbore eu radacina sunt memorate numere naturale. lnformatiile des pre arbore se citesc dintr-un fisier text, astfel: de pe prirnul rand nurna rul de noduli ale arborelui, de pe randut al doilea vectorul tata , si de pe al treilea rand. in ordinea etichete lor, numerele memorate in noduri. Scri eti un prog ram care calculeze suma numerelor pare memorate in arbore.

sa

2,8.3.4. Aplicatii practice


1. Co nstruiti arborele ge nealogic al fam iliei, care sa prezinte fili atia (descendentii direct ! ai unei persoane). Se va lua ca nod radacin a unul dintre stra-strabun ici. in fiecare nod se va memora numele unei persoane. lnforrnatiile despre arbore S8 citesc dintr-un fisier text, astfel: de pe primul rand nurnarul de nod uri ale arbo relui, de pe randul urrnator vectoru l tata , ~i de pe al treilea rand , in ordinea etichetelor, numele memorate in noduri. Scr ieti un program care sa furnizeze urrnato are infor matii: a. Pentru un nume de persoana, citit de la tastatura, sa S8 afiseze descendentii directi ~i ca\i copii are fiecare. b. Pentru doua nume de persoana, clute de ta tastatu ra, sa se afiseze strarnosut comun. 2. 0 fabrics de confectn este fermata din rnai multe comp artimente. intr e compartimente exista fie relatii de subordonare , fie relatii de colaborare (relatiile de colaborare se stabilesc pe acelasi nive l ierarhic). in figura 65 este prezentata organigram a finm ei. Fiecare compartiment are urrnatoarele atribute: numele compartimentului , numele persoanei care cond uce acel compa rtimenl ~i numarul de anqajati.
Fabrica de co ntecur
mreeua gonerala
Con fce li! Ierne! Co mpartime nt marketing

~:n "i
Fi g. 65 a.
Afi~a\i

Z,O'3

i
~i

lisla angaja\i lor care au functii de con ducere (numel e comp artimentului numele persoanei ) in doua moduri: -7 punand in evidenta relatiile de subordonare: -7 gnupand persoanele de pe acelasi nivel ierarhic.

lista anqajatilo r care au functii de conducere ~i nurnarul totat de anqajati pe care ii are fiecare dintre ei in subordine (0 persoana cu functie de conducere are in subordine angajatii din compartimentul pe care iI conduce ~ i din l oate compa rtimenlele subor donate acestuia ). 3. a re~ ea de distributie a produselor unei firme are a organizare pirarnidala in care fiecare dintre aqentii cornerciali are in subordine al\i agenli comerciali. In functie de vanzari, fiecare agent comercial prirneste un punctaj . Un agent comerc ial care are i n subordine ~ i alti aqenti comerciali cumuleaza la punctajul propriu sl punctajele agen\ilor comer ciali din subordine. Scrieti un program care sa afiseze urrnatoarele informafii: a. punctajullotal al retelei: b. care este subordonatul direct al unui agent comercial (al carui nume se precizeaza de la tastatura) care are punctajul eel mai ma re ~ i care este acesl punclaj . b.

Afi~al i

111 fo rma ticii

305

4. Angajatii unei firme dispun de a suma pentru prime distribuita astlel: directorul general T~ i stabileste prima si restul sumei a distribuie i n mod egal subordonatilor lui directi. Orice subordonat care a primit a surna T~i stabileste singur prima (0 parte sau Tntreaga surna prim ita) restul sumei fiind distribuita in mod ega l subordonatilor sai directi, iar anqajatii care nu au subordonati retin intreaga suma pe care 0 primesc. $tiind ca orice subordonat are un singur sef , scrieti un program de distribuire a primelor si aflsati lista anqajatilor ~i primele primite . Pentru prima pe care a stabileste pentru sine un angajat, folositi gene ratorul de numere aleatoare, care va gene ra un nurnar intre 0 si suma prirnita pentru prime - pentru a a distribui. (Ses iunea august Bacalau reat 2003 - adap tata)
Arbori multicai . Sunt arbori cu radacina, la care nu exista limita pentru ordinul noduriJor.

Arbori cu radacina
criteriul de clasificare folosit este ord inul nodurilor

I)

1 \

Arbori binari Sunt arbori cu radaciml , la care ordinul fiecarui nod nu trebuie sa fie ma i mare de 2.

VIA. Arborclc binar


2.8.4 .1. Definitia arborelui binar
5 e nurneste arbore binar un arbore cu radi:1cina pozitlona! ca re are proprietat ea ca fiecare nod are eel mult do; descendent; directi (s u cceso ri).

Torrninoloqie:
-) Cei doi succesor i ai unui nod (daca exista) se numesc succesor stan q (s ubarbore stanq) ~i s ucce s or dre pt (s ubarbore dropt) - arborele A, din figura 66 . Caracteristici :
-) Deoarece , oricare ar fi un nod al arborelui , el nu

A,

Radacina

are mai mult de doi descendenti directi, ordinul unui nod dintr-un arbore binar poate fi 0 (nod termi nal), 1 (unul dintre subarbori este vid) sau 2. -) Definitia arborelui binar este 0 definitie recurs iva . Exista' un nod privilegiat - numit nod'radacina, iar celelalte nodur i (daca exists) sunt repartizate Tn doua grupuri disjuncte si, fiecare dintre aceste grupuri formeaza, la randul sau, un arbore binar.

Observatie- Arborele binar fiind un arbore cu radaci na pozitionat , se face diterenta Tntre succesorul Fi g. 66 stang ~ j succesorul drept, adica, daca un nod are un singur descendent, trebuie sa se precizeze care dintre descendenti este. in figura 67 sunt prezentaf doi arbori binari Ab1 si Ab2 care sunt diferiti, chiar daca au do ua noduri si ' radaclna in nodul cu eticheta A. T n arborele Ab1 succesorul stanq are un B B nod (B), iar succesorul drept este arborele vid, iar T n arbore le Ab2 Fig. 67 succesorul stang este arborele vid , iar succesorul drept are un nod (B).

I \

No durilc tcnninalc (frunze)

306

Implementarea struetnrilor de date

Cu 3 noduri, eticheta te cu A, B si C, se obtin 30 de arbori binari diteriti. Exista trei moduri de a alege radacina . Pentru un nod radacina ales, S8 pot obtme zece arbori binari diferlti - in total S8 vor obtine 3x10=30 arbor! binari diferiti, in figura 68 sunt prezentati 6 dintre arborii binari care au radacina in nodul A.
Se nurneste arboro binar stictun arbore care are proprietatea ca fi ecar e nod, cu exceptia no dnrilor te rmina le, are exact doi descendenti tsuccesori).

. As Exemp lu - Arborele binar As din figura 69


Propozitla 17 Un arbore binar strict, care are n noduri terminale, are in total 2xn-1 noduri.
Demonstratie - Notam cu k numarul de nivele din arbore, cu Xk , Xk.1 , ... , X2, X1 , nurnarul de noduri termina le de pe fiecare nivel , ~i cu Yk , Yk-1 , ... , Y2, Y1, nurnarul de noduri de pe fiecare nivel (cu exceptia nivelului 0 , pe care se qases te radacina) s! cu N - numarul total de noduri din arbore (N = Yk + Yk .1 + +Y2 +Y1 +1 ) , cu n - num arul total de noduri ter minale (n = Xk+ Xk .1 + ... + X2+X 1) . Nivelul k contine numai nod uri terminal e, ~i Yk = Xk . Pentru fiecare alt nive l exista relatia Yi = YH'1/2 + Xi Arborele fiind strict, Yi+1/2 este un nurnar intreg , deoarece pe fiecare nivel exista un numar par de nod uri. Adunand relatiile. obtinem : Yk = Xk 2 Yk-1 = Yk/2 + Xk_ 1 Yk-2 = Yk_1/2 + Xk_2
Y2

Y1

= Y3f2 + X2 = Y2/2 + X1

Fig .69

Rezulta ca: N:: 1+Yk+Yk_1 + ... +Y2+Y1+YO= 1 +2 X(Xk+ Xk.1 + . . +X2+X1) :: 2xn+1

Propozrtia 16.Un arbore binar strict are un nurnar impar de nod ur i.


Demcnstratle - Pe fiecare nivel k+1 , pentru fiecare nod de pe nivelu! k , exista cate doi descendenti sau nici un descendent. Rezulta ca pe tlecare nivel, cu exceptia nivelului 0, exista un nurnar par de noduri. Numarui total de noduri va f impar, deoarece la aceste noduri S8 adauqa s! nodul

radacina

4
Fig . 70

Se numeste arbore binar echilibratun arbore binar care are proprietatea ca diferenta dintre Inaltirnlle celor do i subarbori ai ori carui nod este cel mult 1.

A, Exemplu - Arbo rele A, din figura 70.


Se numeste arbore binarperfect echilibrat un arbore binar care are proprietatea ca diferenta dintre nurnarul nodurilor celor doi subarbori ai oricarui nod este cel mult 1. A 1Q Exemplu - Arborele A 10 din figura 71

3 8

6 Fig . 71 Proprietate. Un arbore binar cu n noduri este perfect echilibrat daca subarbo rele stanq are [nl2] noduri, iar subarborele drept are n-[n/2]-1 noduri.
Se nurneste arbore binar complet un arbore binar strict care are toate nodurile tenninale pe acelasi nivel.

A u Exemplu - Arborele A" din figura 72

Informatica Propozit la 19. Un arbore binar complet, care are n noduri terminale, are i n total 2 xn~1 noduri. Demon st ratie - Folosind principiul inductiei matematice, oemonstram k ca. Intr-un arbore binar complet, pe ruvelul k sunt 2 noduri (se noteaza cu Pi propozitia i). Po- Pe nivelul 0 exista un singur nod (nodul radacina), adica 2 =1 nod 1 P 1 - Pe nivelul 1 exista doua noduri, adica 2 = 2 noduri.

307

4
Fig , 72

....

Pk - Pe nivelul k exista Zk nod uri .. Pk+1 - Con siderand propozitia Pk adeva rata, trebuie sa dernonstrarn eel pe nivelul k+1 exista Zk+1 noduri, Daca niveluJ k+1 aparune arborelui, atunci pe acest nivel exista cate doi descendenti pentru k;;;2k 1 fiecare nod de pe nivelul k , in total 2xZ ' + noduri. Considerand ca arborele are k nivelun ~i ca numarul de noduri de pe nivelul k este n , numarul total de noduri din arbo re se obtine adunand nodurile de pe cele k ruvelun: 2 + 2 1 + 2 2 + ... + Zk = Zk+1_ 1;;; 2x(Zk) - 1:; 2xn -1

Se numeste arbore binar aproape c omplet un arbore binar complet pana la penultimul nivel, la care completarea cu noduri, pe ultimul nivel, se la ce de la stanqa la dreapta. Exemplu - Arborele A 12 din figura 73

4 8

7J A,2

[ SmdlillJl. de

ClllZ

Scop: identificarea colectti lor de date care pot Ii reprezentate prin arbori binari.
Enunt ul p ro bleme i 1. Trebuie sa S8 organizeze un campionat de meciuri de base /let oumince se organizeaza un me ci. Ech ipele care vor juca in prim a etepe se trag la sotti. Sa se realizeze pla nificarea meciurilor i sa se de termine numetut de duminici in care se va oestesure cempionetut (figLira 74). Fina l Campio natul are 0 structure ierarhica, iar relatiite dintre componente pot fi repreSe mifinala zentate cu ajutorul unu i arbore binar, In / care cele c oua echipe care joac a sunt nodur ile. Nodurile terminale sunt echipele liceelo r, iar celelalte noduri reprezinta cate 0 A Be 0 E F G H echipa care a castiqat in meciul etapei Fi g. 74 anterioare. Radacina arborelui este echipa care ca~ti ga finala. Deoa rece 0 echipa castiqa toare se desemneaza in urma unui rneci jucat , nodurile care nu sunt terminate reprezinta meciuri juca te, iar nodul radacina corespunde mec iului final. A rcele reprezinta relatia de participare a unei echipe la un meci. Arbore le meciurilor este un arboro binar strict (la un meci participa doua echipe). Daca arborele meciurilor este un arbore bin ar compt e! si la cam pionat participa n echipe , vor fi n nodur i term inale si arborele va avea 2 xn ~1 noduri. Nurnarul de meciuri care se vor juca este dat de diferenta dintre nurnarul total de noduri ale arbo relui si nurnarul de noduri terminale , adica n-t rneciu ri, iar campiona tul se va destas ura in n~1 duminici.

intte ech ipele mei multor licee . Nutne tul de echipe este n . in fiecare

~rti~ 2rti~ ~rti~ 2rti~

'"

Enuntul pro blemei 2. Sa se reprezinte modul in care se evalueaz8 0 expresie eritmetic .

exp resie aritrnetica este fermata din operanzi (constante si variabile), operatori aritrnetici (+, -, I, ~i A - pentru ridicar ea la putere ) si paranteze . in evaluarea expresiei aritme-

308

lmplcm cn tarca str ncturilor dc datc

lice S8 resp ecta prio ritatea operatorilor aritmetici. Op eratorii aritm etici sun t o perato ri b.inar i care nu su nt toti comutati vi (operatorii pentru scadere, l rnpartire si ridicare la putere nu sunt comutativi). Daca notam operanzii cu x ~i y ~i operatorul cu OP t atunci expresiei E = x op y putem sa-i asociem arborele binar din figura 75, in care radacina este operatorul o p , subarFi g. 75 bore Ie stanq este primul operand - x , iar subarborele drept este al doile a operand - y . Daca expresia coniine un singur operand , acestu ia i S8 poate asocia un arbore binar cu un singu r nod - nodul radacina - in care se memorea z8 ope randul. Pentru a putea reprezenta 0 expresie care este fer mata cu un operator unar (de exemplu, E=-x), vom transforma exp resia astfel ln cat sa contina un operator binar (in exemplu, E=O-x). Expresia are 0 structura ierarhica, iar relatiile dintre componente pot f reprezentate cu ajutorul unui arbore binar, in care operanzii si operatorii sunt nodurile. Nodurile terminale sunt operanzii, iar celelalte noduri reprezinta operatorii. Radacin a arborelui este operatorul care se evalueaza ultirnu l. Subarborele stanq ,i subarborele drept ai radacin ii reprezmta expresiile carora Ii se aplica ultirnul operand . Radacina fiecarui subarbore va reprezenta operatorul care se aplica pe cele doua expresi i reprezentate prin subarborii + Fi g. 76 stang , i drept ai sai, Arcele reprezinta relatia de participare a unei expresii la operatorul din nodul parinte: ca prim operand sau ca al doilea operand . Arborele expresiei este un arb ore bi nar strict (un operator leaqa doi operanzi ). Daca expresia contine n operan zi, arborele va avea n noduri terminale . Fiind un arbore binar strict. va avea 2xn -1 noduri . Nurnarul de operatori este dat de diferenta dintre numarul total de noduri y ale arborelui si nurnarut de noduri terminale, adica n-1 operatori. Arbore le expresiei nu este un arbo re ec hilibrat. Arborele binar din figura 76 este arborele expresiei aritmetice:

l'.. = :'!x

( _ ., 2+ 4 x y )

z +y

+y

-<3 ~ ~.1>-

~,

Oesenati 5 arbori binari cu trei noduri (etichetate cu A, B si C) diferiti, al\ii cecat cei din figura 69. 1. Desenati arb orele genealogic al st rarnosi lo r unei persoane pana la nivelul stra-strabunici. Radac ina este persoana pentru care se i ntocmeste arbo rele genealogic. Fiecare nod are doi descendenti : mama tata . Ce tip de arbore binar este? Cornparati acest arbore cu arborele genealogic al descendentilor (arborele filiatiei). 2. Desenati arborele campionatu lui de baschet pentru 7 echipe. Ce fel de arbore binar este?

,i

3. Desenati arborele binar al expresiei

;1

c- d

~ + h + 7 x (:1 _

b)

2.8.4 .2. Implementarea arborelui binar


Implementarea structurilor de date de tip arbore binar se poate face: a. static - folosind vectori ; b. dinamic - folosind pointeri.

a) Implementarea statica a arborelui binar


.A13. binar An din din figura 77).

Fi g. 77

Exista dou a metode de im plementare st at ic a a arborilo r binari (se folose ste arborele

Informati ca

309

1. Folosind doi vectori In care se mom o roaz a cei doi suc cesori ai unu i nod -7 vectorul st - In elementul i se mernoreaza eticheta nodului succesor stang al nodului i; -7 vectorul dr - in elementul i se memoreaza eticheta nodului succesor drept al nodului i . Daca nodu ! i nu are succesor stanq , respectiv drept, elementul din vectorul st , respectiv dr , va avea valoarea O.

Pentru arborele A ' 3 din figura 77 cei doi vectorl sunt: Nodul i . 1 2 3 4 5 6 2 31 14 1 6 0 'I 5 0 I 0 sl [i] dr[i] O 0 8

~If-'--'-

Observa t ie. Din cei doi vectori puteti obtine urrnatoarele inforrnatii: -7 eticheta nodului radacina r - nodul i pentru care, oricare ar f md ice le j , s l m",i si d rDl;t:i (nodul a ca rui eticheta nu ex ista nici In vectorul st, nici in vectorul dr); -7 etichetele nodurilor terminale - nod uriIe i pentru care sl [i] +dr[i] =O; -7 eticheta pa rinte lu i unu i nod i - ind icele j pentru care s l m =i sau d rm =i ; -7 etichetele liilor unui nod i - sl[i ] si dr[i] (daca sunt diteriti de 0) ; -7 eticheta Iratelu i unu i nod I - st jj ] pentru d rm =i sa u d r jj ] pentru slm =i .
2. Folosind dci vectori in care se rnernoreaza filiatia nod uri lo r -7 vectorul tata - in elementu l i se merno reaz a nu rnaru l de ordine al nodu lui predecesor (parinte) al nodului i ; -7 vectorul fi i (In elementul i se memoreaza ce lei de succesor al parintelui .este: daca fii [i]=-1 , atunci nodul i este succesorul stanq al parintelui sau , iar daca fii[i]= 1, atunci nodu! i este succesorul drept al parin telui sau. Daca nodul i este nodul racacina. elementul din vectorul tata , respectiv fii , va avea valoarea O.

Observatio. Din vectorul tata puteti obt ine urrnatoarele lnformatii: -7 etiche ta nodului rad acina r - Indicele i pentru care tal a[i]=O ; -7 etichetele nodurilor te rm inate - nod uri Ie i a carer eticheta nu exista in vectorul tata; -7 eticheta pari nte lui unu i nod i - ta la[i] ; -7 etichetele fiilor unui nod i - fiu l stanq: indicele j pentru care l alam=i si fiim=-1, iar liu l drept: indicele j pentru care l alam=i ~ i fiim =1; -7 eticheta Iratelui unui nod i - indicele j pentru care la ta [i] =ta ta m.
Ohservatie Datorita defin itiei arborilor binar i, algoritmii utilizati pentru pre lucrarea lor pot folosi tehnica recurs ivitatil (definitia recurs iva - a arborilor binari) ~i strate gia divide et impera (fiecare nod nu are decat doi descendenti - prelucrarea unui nod se descomp une In doua subprobleme: prelucrarea subarborelui stanq ~i pre lucrarea subarborelui drept, urrnata de compunerea celor doua solutii) .

Exe mple - daca pentru arborele binar se foloseste implementarea statica , pentru a construi algoritmi recursivi cu strategia divide et irnpera se utillzeaza vectorii st ~i dr .

310
lnaltlmea arborelui binar int max (i n t x , int y) {if (x>y) return X i else return y ; ) i n t h( i n t i) {if (st_[i] ~~O && dt[i] OI return 0; else return l~nax(h(st[iJ! , h (dr [ l] I !;) void main () {int r ; . .. cout-och (r) ; . .. }

Implementarea struct urilor de date


Nurnarul de "frunze u din arborele binar int f runza (i n t {return st [ i ] +d r' l i lO;}
int
nr~ . fr{ i n t

i)

(if {frun za( i)) return 1 ;


else

if

(st[i]~~OI

return nr_frunze (dr-[ll) ; e lse


if
( dr[ i] ~ OI

r-et.ur-n nr f

r-unz e t s t til) ;

else

return nr j dst[iJ )+nrjr(dr[i]) ; }


void main ( )

{int r;

.. . cout n r _fr (r) ;

... }

2. 3. 4. 5.

1. Scriet i un program care sa furnizeze urrnatoare le inforrnatii despre un arbore binar: nodul radacina, nodurile terminale , nodurile cu exact un fiu, nodurile cu exact doi fii, nodurile frati si ina l\imea . lnforrnatiile despre arbore (nurnarul de noduri ~i cei doi vectori) se vor citi dintr-un fisle r, Arbo rele este implementat: a. cu vectorii i n care 58 mernorea za cei doi succesori ai unui nod; b. cu vectorii i n care se rnernoreaza filiatia nodurilor. Scrieti un prog ram care citeste dintr-un fisier nurnarul de noduri si vectorii st sl dr ai unui arbore binar. Sa se reprezinte arborele priri vectorii tata si f ii. Scrieti un program care citeste dintr-un fisier nurnarul de noduri ~i vectorii tata ~i fii ai unui arbore binar. Sa se reprez inte arborele prin vectorii st si d r. Scrieti un program care citeste dintr-un fisier numaru l de noduri si vectorii st ~i dr ai unui arbore binar. Sa se verifice daca arborele binar este un arbore binar strict. Scrieti un program care citeste dintr-un fisier numarul de noduri ~i vecto rii st ~i dr ai unui arbore binar. Sa se verifice daca este un arbore binar perfect echilibrat sau un arbore binar echilibrat.

b) Implementarea dinarnica a arborelui binar


Se face prin definirea unui tip de data pentru un nod din arbore (tipul nod) ~i a adresei unui nod (un pointer catre tipul de data nod - nod' ). Tipul de data este definit ca 0 inregist rare care contine 3 categorii de carnpuri: -7 lnformatia utila - poate fi cornpusa din mai multe carnpuri tip> i n f o); -7 adresa subarborelui stanq - (nod * s .....-+ S este adresa radacmi! subarborelui stanq), -7 adresa subarborelui drept - (nod *d .....-+ d este adresa radacinii subarborelui drept).
struct

nod {<t i p > i n f o : i nod *si* d;}; nod *r ; / /r=adre sa radacin ii

Trebu ie precizate in fieca re m ome nt pozi ti ile a trei co mponente : radactna (*r) !}i cei do ; subarbori ('s i ' d).

Regula. fntotdeauna este reprezentat subarborele stanq si apoi subarborele drept.


Daca un nod nu are un succesor , succesorul va fi considerat arborele vid.

Se numoste arbore vid un arbore care are adresa NULL

I II fo rmaticii

311

ExempluJ 1 - Pentru un arbore binar pe care-l construim pentru campionatul de meciuri de baschet intre echipe le rna; multor licee , informatia utila poate fi fermata din mai multe carnpuri: numele echipei (n_ e), numele liceului (n_ 1) ~ i eticheta nodului (n r):
s tru c t n od {char n _ e [ 1 5 J, n_ l [1 5] i in t n .r : nod e , * d i } * r i

Exemplul 2 - Pentru exem plele urrnatoare, inforrnatia utila va fi fermata numai din eticheta ~ 9? 1..( nodului: struct n od t i n t nr ; , ~ _T:I l-, -.-TI=" '- r t ::"11
nod *s , *d ; } ;

4 INULL I.

nod *r;
in figura 78 este pre zentata implementa rea dinamica a arborelui A 13 din figura 77 .

3 INU L L INUL~5 INULLI NULL


1

-----

7 I N U L L I N U ~8..J-. I N U LL I

Fig . 78

9 INULL INULL I

Algoritmul pentru crearea unui arbore binar Agoritmu l pentru cr ear ea un ui arbore bin ar implementat dinamic foloseste strategia di vide et impera prin descompunerea problemei in trei subprobleme: 1. crearea nodului radacina (cazu l de baza) ; 2. crearea subarborelui sta nq: 3. crearea subarboret ui drept.
Descompunerea problemei co ntinua pana can e subarborele care S8 cre eaza este arborele vid. Combin are a so lutiilo r se face prin legarea nodulu i radacina de cei doi subar bori.

Daca datele S8 citesc de la tastatura. pentru a evidentia eel nodul care se cree aza este radac l na unui arbore vid , in carnpul pen tru etic heta se introduce v aloa rea 0 (care marcheaza lipsa de informatii pentru acel nod). De exernplu, pentru a crea arborele din figura 79. se introduc in ordine. de la tastatura. etichetele: 1 2 3 0 0 6 7 0 0 8 9 0 0 0 4 0 S 0 O . Algoritmul pentru crearea arborelui binar este: PAS1. Se citest e informatia utila din nod. PAS2 . Daca nodul nu contine inforrnatie utila, at unci se creeaza arborele vid; alttel : PAS3 . Se creeaza un nod radacina prin alocarea unei zone de mernorie. PAS4. Se atribuie , carnp ului cu informatie din nod. info rmat ia citita . PASS. Se creeaza subarborele stan q. PAS6. Se creeaza subarborele drept. Subprogramul care creeaza un arbore binar poate fi implementat ca functie procedurala sau ca functle operand .
Functia proc adurala voi d c rea r e (nod *& r) {i n t n ; c ou t " E:: i c h e 1: a nod : " ; cin r:. ; if (n~~O) r~NULL ; else {r = new nod ; r ->nr=n ; c reare (r ->s) ; c r ea re{r ->d) ; )

Functie operand nod * cr-ee r e () ( i nt n ; nod *r;


cou ti-oC'E t. L c h e t a nod : "; cin n;

if

(n==O) re t urn NULL; el se {r = new nod i r ->nr=n i

r - >s =c r e a r e ( ) ; r - >d=cre a r e ( } ;
r e t ur n r ; }}

312
vo id main ()

I mplementarea st ru eturil or de date


v o i d ma in ( )
;

{c r ear c t r'j

{r e cree rer j,
cout " Ra d a ci n a "" " r - >n r ; . .. }

cou t .c-C'R e d a c Ln a> " <c r -c-n r , . . . }

Exempl e - Functii, implemen tate recursiv tolosind strategia di vide et impera , prin care S 8 prelucre aza arbori binari. Inattimea arborelui binar Nurnarul de "frunze" ale arborelui binar
int max( i n t X, i n t y } {if (z>yl return X;
e1 sa r e t u r n y ; } in t h ( n o d e r ) int fru nz a (n od * r }

(return r ->s==NULL

&&

r ->d==NULL; }

(if

(r ~ =NOLL) return 0 ; els e return 1+max(h(r ->s) ,h(r ->d)) ; } Copierea unui arbore binar

int nr:...}r(nod *r) {if Cr==NULL) retu rn 0 ; els e if ( f r unza(r)) re tu rn 1 ; else return nr.:...fr(r->s) +nr~fr(r ->d) ;

Compararea a doi arbori binari int eqe Lj nod * r l , n e d * .1 2 ) ( if (r l ==NULL) retu r n r 2"='= NULL;
else if (r 2 = = NUL L ) retu r n 0 ;

nod *c ornb {int 11 ,110d *s, n od *d ) {n o d * C i C = n ew n o d ; c ->nr=n ;


c -c- a-s s , c -c-de d : re t u r n c r} nod *c o p i e (n o d *c ) {i f (c= =NULL ) r etu rn NULL; else r eturn com b tc-c-nr rc opie f c;->s ), cop.Ie (c - :>d ) } ; }
v o i d main( )

el se retu rn
rl - > n r "=' ~ r 2 ~ > n r

&& ega l( r l ->s , r2-> s) && egal(rl-> d ,r2->d) ; }

{r l =c r e a r e ( ); r 2=cop i e {r l ); ... } Afisarea etichetelor de pe un nivel precizat

void main( ) l. . . i f (eg31(d ,r2)) . .. ) Verificarea existentel unui nod cu eticheta precizata
int caut(nod *r , i n t k) {if {r==NULL) return 0 ; else if (r ->nr==k ) re t urn 1 ; e lse return caut(r->s ,k) 1lcau t (r - >d, k );} v oid main () {int k ; r =creare() ; cout" Nod ul: PI ; c in k; if (caut (r , k l )

v o i d ni ve l(no d * r,int i , i n t k) ( if (r! =NULL) ( i f (i ==k) cout r- >n :r" " .


n i.ve.L ( r - > s , Lr.L , k) ;

n ivel( r ->d , i +l , K) ; } }
void main () {in t k ; r' <c r ea r e U ;

cout" Ni v e l u l : "; cin k ;


n .ive L (r , 0 , k ); }

cout "A fast gasit " ;


else ccut.cc vtfu a r o st. gas it " ; }

2.8.4.3. Algoritmi pentru parcurgerea unui arbore binar


Parcurgerea unui arbore binar se poate face prin: -7 algorilmu l de parcurgere in lalime (Ia tel ca la graturi); -7 algorilm i de parcurgere in adancirne (specifici arborilor binari): -7 algorilmul RSD (t raversarea in preordinc) ; -7 algorilmul SRD (traversarea i n inordine), -7 algorilmul SDR (traversarea in postordin e) Observatls Algoritmii pentru parcurgerea unui arbore binar pot fi folositi pentru a prelucra info rrnatiile din noduri.

I II for ma tica
Algoritmul RSD

313

Meto da: se prelucreaza radacina, subarborele stanq, subarborele dre pt (pentru arborele A' 3 din figura 77 - 1 2 3 67 8 9 4 5).
Implem enta rea stati ca
v oid rsd ( i n t i) {cou t.c-c i -cc '' " ; i f {s t I i. ] '~ O ) s rd t s t l i j j if ( d r[ ij ! ~C) s r d(d r[ i j) ; } v oi d ma i n () { ... r s d(r); coutendl; . . .

Implemen ta re a dinarnlca
voi d rsd (nod {i f ( r ! =NULL)

*r )

{c out r- >n r " ".

rsd ( r - > s) ; r sd ( r - >d) ; ) ) voi d ma i n () ( . . . r sd(r) ; coutendl;

. . .}

Algoritmul SRD Metoda : se prelucreaza subarborele stang , radacina , subarborele drept (pentru arborele A ' 3 din figura 77 - 3 2 769 8 1 4 5). Impl em entar ea st atica Implemcntarea d ina rnica v o i d srd ( i n t i ) voi d srd (n o d * r l {if (r ! = NUL L) {if Ls ul L ] !=O) s r d t s t ll ll , {s r d j r - c- s ) ; cou t-c-c i -oc " " ;
if
(d r [ i J' ~O )

srd(dr[i] ) ; ) . . .}

cou t r';" >n r " ".


s r d (r->d ) ; } } v oi d main () ( .. . s r -d t r-j , cout e n d l;

v o id main ()
{ . . . s r d (r) ; c o u tend l;

.. . }

Algoritmul S D R Metoda : se prelucreaza subarborele stanq, subarborele drept, radacina (pentru arborele A 13 din figura 77 - 3 7 9 862 54 1): Implem entarca dtnarnica Implementarea statics void sdr ( i n t i) vo id sdr (no d * r )
{i f if

( st[ iJ ! = O) srdlst[i]) ; (d r Li j ' ~ O ) s rd(dr[ij) ;

{if

( r ! ~ NULL)

{ s d r ( r - > s) ;

cout i " "; }


void main ( ) ( . . . sdr ( r ); c ou t e n dl ;
.. . }

sdr {r -e-d} ;

c ou t r - >n r " n; }}
v o i d mai n () ( ... sdr( r);

c ou t endl ;

. .. }

Obscrvatie . lnforrnatiile din nodurile arborelui binar, dupa prelucrare, pot f salvate intr-un fisier text. La 0 noua execute a programului ere permit restaurarea arborelui pentru a noua prelucrare . Exemplu - pentru arborele creat anterior, etichetele nodurilor sunt salvate intr-un fisier text (sunt scrise pe un rand , despartite prin spatiu ) ~ i la 0 noua executie a programului sunt readuse in memoria interna : Restaurarea arborelui din fisierul text Salvarea arborelui in fisierul text
fstream ( " a rbore . txt ", ios: : o u t ) ; void salva r e(nod * r ) {if (r != NULL)
( f r- > ~r"
11.

fstream g { " a r b o r e. txt " , i o s : :in ) ; nod * r e s t a u r a r e {)

r s d (:::- ->s ) ;
r sd (:::- ->d ) ; }

t int n ; ned * r; g n ; i f ( ~~=O~ r eturn NULL; els e { r = n ew ~ od ; r - >n r =n;

e lse :'0 " ";}

r - >s =r e s t a urare {};

314
void ma i n () { . .. sa l v a r e ( r ) i
. . }

Implcm enta rcu st r uctu rilor de date


r- >d =re s t aurare ( ) ;
r e t urn r ; } }

vo id ma in() { .. _r = restua rare ( r ) ;

_. _ }

1. Scrieti cate un subprogram pentru urmatoarele metode de parcurgere a arborilor binari: RDS (radacina, subarbore crept. subarbore stang) , DRS (subarbore drept, radacina, suba rbore stanq) ~ i DSR (suba rbore drept, subarbore stanq , radacina). 2. Scrieti un program care citeste succesiunea nodu rilor afisa te prin parcurgerea SDR si prin parcurgerea RSD ~ i afiseaza etichetele nodurilor prin parcurgerea RSD . 3. Scrieti 0 functie iterativa pentru metoda de parcurgere RSD a arborilor bina ri. 4. Scrieti 0 functie care afisea za numa rut nivelului cu cele mai multe frunze . 5. Scrieti 0 functie care

sa verifice daca un arbore binar este perfect echilibrat.

6. Scrieti un program care sa furnizeze urrnatoarele informafii desp re un arbore binar: nodul radac ina, nodurile terminale, noduri le cu exact un fiu, nodurile cu exact doi fii, nodu rile frati ~ i Ina ltirnea. Arborele binar este implementat dinam ic ~i creare a lui se face prin introducerea informati ilor din noduri de la tastatura . 7. Scrieti un program care creea za un arbore binar irnplementat dinarn ic prin citirea etichetelor dintr-un fisier text (etichetele sunt scrise pe un rand , despartite prin spatiu , i n ordinea in care ar fi fost introduse de la tastatura ) si care verifica daca arborele binar este un arbore binar strict. 8. in nodurile unui arbore binar sunt memorate numere i ntregi care nu sunt distincte. Scrieti un program care creeaza un arbore binar implementat dinarnic pnn citirea numere lor dintr-un fisier text (numerele sunt scrise pe un rand. despartite prin spatiu , in ordinea i n care ar f fost introduse de la tastatura) :;;i care creeaza 0 tista dublu inla ntuita care sa cantina numai numerele distincte si, pentru fiecare nurnar, de cate on apare i n arbore, 9. in nodurile unui arbore binar sunt mem arate numere int regi care nu sunt distincte. Scrieti un program care creeaza un arbore binar implementat dinamic prin citirea numere lor din tr-un fisie r text l?i care creeaza 0 lista simpla, ordonata desc rescator, care sa cantina numai nume rele distincte . 10.f n nodurile unui arbo re binar sunt memorate numere naturale . Scrieti un program care sa realizeze urmatoarele: a. Creeaza arborele binar (implementat dinam ic) prin introducerea numerelor de la tastatura . b. Catculeaza suma numerelor pare din nodurile term inale. c. Calculeaza suma nume relor poz itive din noduril e care au exac t doi succesori . d. Determina nurnarul cu valoarea cea mai mare ~i de cate on apare in nadurile arborelui. e. Creeaza 0 lista sirnplu inl antuita cu numerele din nodurile arborelui care au ultima citra 5 sau 3. f . Afise aza pe ecran nume rele de pe un nivel k (k se citeste de la tastatura). g. Salveaza. intr-un fisier text , nume rele de pe fiecare nivel (numerele de pe acelasi nivel vor fi sense pe un rand, separate prin spatiu), h. Creeaza un arbo re cu aceeasi structura arborescen ta ca eel creat la punctul (a) dar care difera de eJ prin informatia din nodu ri: daca in prirnul arbo re nurnarul este par , i n al doilea arbore este inlocuit cu suma cifrelor sale, iar cac a in primul arbo re nurnarul este impar, in a! doilea arbore este in locuit cu inversul lui.

Informatica

315

2.8.4.4. Ap licat ii practice


1. Construiti arborele genealogic al stramosilor familiei pima la nivelul stra-strabunici (parintii directi ai fieca rei persoane). Se va lua ca nod radacina persoa na pentru care S8 i ntocmeste arborele. in fiecare nod S8 va memora nume le unei persoane (mama sau tat al persoanei din nodul parinte). lnformatiile despre arbore se citesc dintr-un fisier text, astfel: de pe prirnul rand, nurnarul de noduri ale arborelui, de pe urm atoa rele doua randuri vecl orii st ~i dr, ~i de pe al patrulea rand , i n ord inea etichelelor, nume le memorate in noduri. Scrieti un program care, pentru un nume citil de la tas tatura, sa afiseze numele parintilor ;;i num ele bun icilor persoanei respective. 2. Construni arborele campi onatulu i de meciur i de baschet. i n fiecare nod se vor pastra urrnatoarel e inforrnatii : eticheta nodului, numele celor doua echipe, scorul fiecarei echipe si data la care s-a jucat meciul. in nodurile terminale vor fi pastrate numai num ele echipelor. Scrieti un program care sa asigure urrnatoarea functie: oupa fiecare meci, se va cop leta inforrnatia i n fiecare nod : data la care s-a jucat meci ul ~i scorul; pe baza scorului , i n nodu l parinte va fi scris numele echipei castiqatoare. Dup a fiecare exec utie a prog ramului, arborele trebuie salvat intr-un fisier, de unde trebuie read us la urmatoarea executie.

2.8.5. Arborele binar de cautare


2.8.5.1. Def init ia arborelui binar de cautare
Terminologie:
~

Se nurnes te cheie un camp din inforrnatia utila a nodului care poate fi folosit pentru a identifica unic noduriJ e arborelui. ~ Se nurneste arbore binar de cautare un arbore binar care are proprietatea ca . pentr u fiecare n od , che ia din succesorul stang este m ai mica decal ch eia din nod , iar cheia din succesorul drept este mai mare dec at c heia din nod .

Ex emplu - Arbo rele binar A ' 4 din figura 79.

Fig. 79

At 4

.,

Caracteristici :
-7 Pentru orice nod , subarborele stanq contin e noduri cu valor i mai rnici ale cheii, iar
subarbo rele drept coniine noduri cu valori rnai mari ale cheii.

-7 int r-un arbore binar de cautare nu exista doua nod uri cu aceeasi valoare a cheii .
Pentru rnultirnea de chei {2, 5, 7, 10, 12, 15, 23} des enati arbor ii binari de caut are cu in altimea 2, 3, 4, 5 ~ i 6.

2.8.5.2 . Algoritmi pentru prelucrarea unui arbore binar de cautare


Pentru prelucrarea unui arbore binar de cautare se pot folosi urmatorii algoritm i: ~ Algoritmul pentru creare, ~ Algoritmii pentru parcurgere , ~ Algoritmii pentru actuallzare.

316

Imp lcmclltarca struerurllor de dare

Algoritmul pentru crearea unui arbore binar de cautare


Crearea unui arbore binar de cautare S8 face prin adauqarea fiecaru i nod ca nod terminal, in

pozitia corespunzatoa re, astfel incat arborele (stanq sau drept)


S8

sa

nu-si piarda proprietatea din deflnitie.


S8

Cau tarea nodului la care S8 va adauqa ca succesor nodul termina l ~i ce fel de succesor va fi

face cu ajutorul unui pointer care va indica nodul curent care

analizeaza. Nodul de la care se porneste este radacina arborelui. Cu ajutorul acestui pointer S8 avanseaza pe nivelurile arborelui prin succesorul stanq sau succesorul drept al nodului curent, In functie de rezultatul cornparatiei dintr e valoarea citita pentru cheie ~i valoarea cheii din nodul curent. Avansarea continua pana cand succesorul nodului curent la care a ajuns pointerul este arborele vid. Algoritmu l pentru crearea arborelui binar de cautare este :

PAS1 . Se irutia lizeaza arborele cu arborele vid, atribuind radacinii adresa NULL. PAS2. Se citeste informatia uti la, cu valoarea v pentru cheie. PAS3 Ca t tim p ex ista lnformatle utila exec uta PAS4. Se inltializeaza nodul eurent cu nodul radacina . PASS . ti ac a 'nodul curent nu este un arbore vid, atu nc i se trece la Pasul 9 . PAS6. Se creeaza un nod prin aloearea unei zone de memorie. PAS? Se atribuie, carnp ului eu informatie din nod , informatia citita . PAS8. Se atribuie , succe sorilor nodului, arborele vid. Se trece la Pasu l 11. PAS9 . Dac a v (cheia din informatie) , este mai mica dedit cheia nodului curent, at unc i nodul curent devine succesorul stanq si se revine la Pasu! 5 . PAS10. Daca v (che ia din inforrnatie) este rnai m are decal che ia nodului curent, atunc i nodul curent devine succesorul drept :?i se revi ne la Pasul 5; altle l , se afiseaza mesajul "Cnete existe deja" . PAS11. Se citeste informatia utila cu valoarea v pentru cheie .
!mp lementarea subprogramului prin care se adauqa un nod la arb ore s-a facut recursiv. Observatie Daca se prelucreaza 0 multirne de valori numerics care nu sunt diferite i ntre ele, se poate folosi arborele binar de cautare, adauqand la structura nodului un camp i n care se nurnara frecventa de aparitie a numarului in sirul de valori (f r e c v) : struct n od {int n r, f r e c v; nod < e , +d ,' } ; in acest mod , este respectata conditia de che ie unica impusa de definitia arborelui binar de cautare . in nodurile lui fiind memorate numai valorile unice ale cheii. Programu l de creare a unu i arbore binar de cautare , in cele coua variante, este: Valoarea pentru chcie este unica Valoarea pentru cheie nu este unica

void c r e a r e (n od *&r,
{i f
( r ! = NULL)

int n )

void creare(nod * &r , in t TI )


{if (r '=NU L L)

if ( n <r ->nr) creare(r ->s ,n) ; else if (n>r->nr) c r eare(r->d,n) ; else cout<<" Numa.ru.l cex.i.sua' <<endl;
else { r = new nod ; r - >n r =n ; r- > s =NULL ;
r-->d "'" NULL ; }}

i f (n<r->n r ) c r ea r e ( r- >s , n.) ; e lse if (n>r ->nr) creure( r - >d , n) ; else r - > f r e c v ++; else {r = new nod ; r->n r=n ; r - > f r e c v =l ; r->s=NULL ;
r ->d~NULL ;

} )

void main () {int n : r = NULL ; cout " Nu ma :.-: " . cin n;

void mai n () {int n ; r =NULL ; cout" Nu:na r: ". cin n;

l n form uticii
whi le (n !=O) {c r ea ze {r I n ; ; c out " Nuna r : "; c i n n ;}

317
wh ile (r. ! =O) ( c r e a r: e (r , r:. ) ; cout" Numa r :

It ;

c i n n ; }

...

...

Observatie. inal1imea arborelui binar de cautare dep in de de ordi nea in ca re se introduc valo rile ch eil .
-------- r-..

1. Pentru fiecare dintre arborii binari de cautare desena ti ta tema anterica ra, precizati in ce ordine au fast citite cheile, la crearea arborelui. 2. Desenati arborii binari de cautare care se creeaza atunc i cane introduceti pe ntru cheie, i n ordine, urrnatoarele valori:

a . 3, 6, 2,7, 8,1 , 5,4 , 0;


b. 7, 3, 1, 2, 8, 5, 4, 6, 0;

c.

1, 2, 3, 4, 5, 6, 7, 8, O.
folosesc algoritmii de parcurgere a unui

Algoritmi pentru parcurgerea unui arbore binar de cautare Pentru parcurgerea arborilor binari de cautare arbore binar.
S8

Obscrvatii 1. Prin parcurqerea arbore!ui cu al goritm ul SROcheile sunt afisate i n ordine crescatoa re 2. Prin parcurgerea arborelui eu algoritmul DRScheile sunt afisate in ordine dcscrcscatoare 3. Cheia cu vatoaroa maxima se gase;;te i n nodul eel mai din stanqa, iar cautarea sa se face parcurqand arbore le numa i pe leqatura cu succesoru l stanq, pom ind din radacina. 4. Cheia cu valoarca minima se gase~te i n nodul eel mai din dreapta, iar cautarea sa se face parcu rqanc arbore le numai pe leqatura cu succesorul drep t, pornind din radacina. Valoarea minima Valoarea maxima Implemen tare recu rs iva in t min (n o d * r ) i n t max ( nod * r ) {i f (r -> s ! =NUL L) {i f (r -> d' ~ NULLJ retu r n min (r- >s j ; return ma x(r ->d ) ; else r e t urn r - >nr ; } e l se r e tu r n r ->n r ; } v oid mai n () v oi d main ()
{

...

.. .

couti-ocend.l-o c't bti .n'i m :

" < x mi.n (r) ;

... }

coutendl "r"':a x im: "<e;rrex (r) ; . . . }

in t min (nod * r )

{whi l e

( r ->s != NULL) r= ;:- >s ;

r eturn r - >nr ; } v oid main()


(

Im pl em enta re iterative i n t max (:-10d * r ) {whi le (r ->d !) r =r->c : r eturn r - .: .o n r ; } v oi d main ()


(
, ... }

. ..
c Qu t endl"Mi n.im : "<on.ir.t rj

.. .

cou t<.<.e ndl<.<. "1'I;a x i m: "<cma x j rI , .. . }

5. Oeoa rece in tre nad urile arborelui binar de cautare este stabilita a relatie de ordine. cautareauns! anumite ehei S8 face rapid prin meca nismul cautarii binare (se cauta i n una din cele doua submultirni de valori - subarborele stanq sau subarborele drept). Cautarea nodu lui se face cu ajutorul unui pointer, care porneste din nodul radacina si care va indica nadul curent care se analizeaza. Painterul va avansa prin succesarul stanq sau suceesarul drept al nodul ui curent, i n functie de rezultatul comp aratiei dintre

318

ImplcllIcllla rca struct u ri lur dc date

PA51 . PA52.

5 5e citeste cheia k care se cauta. 5e initializeaza pointerul cu adresa radaFig . 80 cinii. PA53. Cat limp nu s-a gasit cheia cautata si nu s-a ajuns la arbore vid executa : I PAS4. Daca nodu l curent are chela mai mica dedit k , atunci pointerul avanseaza la subarbore le stanq: altfel . pointerul avanseaza la subarborele drept. Implementare recursiva Implementare ite rativa

valoarea citita pen tru che ie ~i valoarea cheii din nod ul curent. Avansarea continua pana cand se gas8l?te un nod care contine chela cantata sau pana S8 ajunge la un arbore vid (cazul i n care nu exis ta cheia cantata i n arbore) - figura 80.

min

..

nod *c a u t a (no d *r ,i n t k)
{if (r=NULL
J

nod
r e t u rn c ;

* ca u ~ a ( n o d

*r ,int k )
r ->nr ! ""k )

1 r ->nr=k)

{while

(r !=NULL &&

else
i f (r-c-nrc-k) return C3uta( r ->s , k) ;

i f (r- >n r > k ) r= r.-> s i


i ~

else r e t urn cau t.a {r -e-d , k) void ma i n{)


t int

el se r e r -od , r eturn r ; } vo i d ma i n ( )
t int k ;

k;

' "

.. .

cout "Che i a cautata : " ; c i n k ; if (cnuta(r , k) ! ~NULL) oou cocv.s-a gasit " ; else c cutx-cvtcu s -a gasit " ; .. . }

c ou t-oc '< Ch e .i.a cautata : "; c i n k ;

if (cauta{r ,k) !=NULL}


cccccc vs - e gasit " ; else cou'coc '' Nu s -a gasit " ; . .. }

Algoritmi pentru actualizarea unui arbore bin ar de c a u t are in arborii binari de cautare se pot executa urrnatoarele operatii de actualizare: -j. inserarea unu i nod ; ~ sterqerea unni nod

~~ ~
~

..

in urma acestor operatii de actualizare, arborele trebuie sa -si pastreze ca litatea de arbo re binar de ca utare.

Algo ritmul pentru inscrarea unui nod


Cautarea pozit iei in care se insereaza nodul se face cu ajutorul unu i pointe r, care porneste din nodul radacina si care va indica nodu l curent care se ananzeaza. Point erul va avansa prin succesoru l stanq sau succesorul drept al nod ului curent, i n fun ctie de rezu ltatul cornparatiei dintre valoar ea citita pentru chela care se insereaza si valoarea che ii din nodul curent. Avansarea continua pima cane se g ase~te un nod care contin e a cheie egal a cu cheia care se inser eaza (cazul in care nodul nu se poate insera, deoarece mai exista a cheie cu acee asi valoare in arbore) sau pima cand, i n nodul curent, succesorul pe care avan seaza pointerul este un arbore vid. Daca s-a ajuns la arborele vid, inseamn a ca valoarea chei i care se insereaza nu mai exista i n arbare - ~ i cheia se adau qa ca succ esor al nodului curent , drept sau stanq , in functie de valoarea cheii care se insereaza !?i de valoarea cheii din nodul curent. Variabila r este pointerul catre nodul care se insereaza. in varianta iterativa, variab ila c este pointeru l catre nodul curent, iar variabila logica x se foloseste pent ru a sti daca in arbore s-a gasit cheia care se insereaza (este initializata cu valoarea 1, presupunandu-se ca nu mai exista chela in arbore).

I n f ormat i ca

319

PAS1. Se citeste cheia k a nodului care S8 insereaza . PAS2 . Se lnitializea za pointerul r cu adresa radac inii. PAS3 . cat timp nu s-a ajuns la arbore vid si nu s-a gasit cheia care S8 insereaza executa: PAS4 . Dac a nodu l curent are cheia egala cu k , atunci se afisea za mesa jul "Cheia existe ", S8 atribuie lui x valoarea 0 si S8 trece la Pas ul 6. PASS. Dad ; nod ul curent are cheia mai mica decal k , at u nc i poin terul avanseaza la subarborele stanq : alttel , pointerul avanseaza la subarbo rele drept si S8 revine la Pasul 3. PAS6. Dac a nu s-a gasit In arbore cheia care S8 insereaza (x<>O), at unc i: PAS? Se creeaza un nod prin alocarea unei zone de memorie. PAS8 . Se atribuie , carnpului cu inforrnatie din nod, informatia care S8 insereaza . PAS9 . Se atribuie , succesori lor nodului , arborele vid. PAS10.Dac a nodul curent c are chei a mai mica decat k , at un c i nodul care S 8 insereaza este succesorul drept; altfel, nodul care S8 insereaza este succesorul stanq .

Valoarea pentru cheie este unica Valoarea pentru cheie nu este unica Implementare recursi va void i n s e ra r e (n o d *&r, i nt k) void inserarelnod * &r , i n t k)
{if
(r'~NULL)

{if

( r!~NULL)

if (r'->nr==k)
o ou t-c-C'Ch e La e x i s t a " < c e n d L:

if (r ->nr ==k)r->frecv++ ; else if (r ->nr>k)


inserare(r';">s ,k) ; e ls e inserare(I: - >d ,k) ;

e lse if ( r ->nr>k)

inserar e(r->s ,k) ;


e lse inserare (r->d ,k) ; e l se { r = new nod ; r->nr=k ; r'->s~NULL ; r->d=NULL ; }} v o i d ma i n () {in t k , . . . cou't-oc''Che La care se msereaae : 11; c in k; i n s e r a r e (r, k) ; . . . }

e l s e {r ='n ew nod ; r,->nr= k ;


r'->s~NULL ; r~ > d~NULL;}}

vo i d ma i n( } {int k : cout "Chei a care s e inserea za : cin k; inserare(r , k) ; . . . }

11 .

Implementare it erativ a void Lnsc rcr-etnod e r , int k ) void i h s era r e (h o d * r,int k ) {int %=1; nod *c ; tin t x =l ; nod * c; while (r !=NULL && x ) while (r!=NULL && x ) i f ( r - >n r ="" k ) i f {r-'>nr="""k) {r - >f r e c v+ + ; x ~O ; } ( c o ut " Ch e i a exista " e n d l ; else x ~O ; ) if (x-c-n.r> k) {c = r ; r=r->s ; } else else {c =r; r =r - >d;) if (r:->nr>k) Lc e r , r =r'->s ; } if (x ) else {c = r ; r=r ->d; } { r ~new nod ; r->n r ~k ; if (x ) r ->s =NULL ; r->d= NUL L ; {r =new nod ; r->nr=k ; if (p->nr>k) c ->s=r; r->s =NULL ; r ->d ~ NULL ; else c-c-d-er r j j if (c->nr>k) c ->s=r ; void main () else c ~>d=r ; } } voi d main () t int k : ccccccvcne t e car-e se i n se r e aza: "; { i n t k ; . .. cin k; mserare tr , k} ; . .. } cout" Ch e i a care se .irrse.r'eaza : 11 . c in k; inserare( r , k) ; ... }

320
Algoritmul pentru sterqerea unui nod

Implementarea strncturilor de date

La sterqerea unu i nod din arbore le binar pot sa apara trei cazu ri:
1. Nodul care se sterqo nu are fli , in nodul parinte , adresa lui este l nlocuita cu adresa arborelui vid - figura 81.

l;>tergere nod terminal k=1. P ->S= NULLi del ete ql ;

p---. 5

q,---. l'

~
1

l;>tergere nod terminat k=7. p ->d=NULL; de lete cr2 i

' 7

-q,

Fig. 81

Fig. 82 l;>tergere nod eu liu stang k=S. p ->s=p ->s ->s ; delete ql; 3. Nodul care se sterqe are doi fii . Se cauta, i n suba rborele drept al nodului care trebu ie sters, primul nod care nu are succesor cr ept. Acest nod are cea mai mare cheie din subarborele drept ~i . implicit. cea mai mare cheie din subarborii subordonati nodului care se sterqe. lnforrnatia utila din acest nod este copiata in nodul care trebuie sters , dupa care este sters nodul qasit ca nod cu un singu r fiu - succesorul stanq (cazul 2). Prin copierea informatiei din nodul cu chela cea mai mare , arborele i~ i pastreaza prop rietatea de arbore binar de cauta re - figura 83.

10

10

2
1 3

l;>tergere nod eu dol Iii: k-7. q-> i n f o = r - > in f o ; p - > s =p- > s - >d ; d e l ete r ' Fig. 83

PAS1 . Se cite ste chela k a nodului care se sterqe. PAS2. Se initializeaza pointerul r cu adre sa radacinii, PAS3 . Cat timp nu s-a sters nodul ~ i nu s-a ajuns la arborele vid exec uta : PAS4. Dad ; nodul eurent are cheia egala eu k , atun ei se trece la Pasul 5. pentru a se analiza ee tip de nod este; altfe l, se trece la Pasul 9. PASS . Dae ii nodul curent este nod term inal . atunei , i n nodul parinte , adresa lui este inlocuita cu arborele vid, S8 eliberea za zona de memorie ocupata de nodul curent - ~i se revine la Pasul 3. PAS6 . Dac a nodul curent are numai succe sor drept, atunc i, in nodul parinte , adresa lui este lnl c cuita cu adresa succesorului sau drept, se elibereaz a zona de memorie ocupa ta de nodul curent - si se revine la Pasul 3.

Informatica
PAS?

321

Daca nodul curent are numai succesor stanq , atu nci , in nodul parinte. adresa lui este tnlocuita eu adresa sueeesorul ui sau stanq, se eltbereaza zona de memori e ocupata de nodul curent - si se revine la Pasul 3. PAsa. Se cauta, In subarborele drept al nodului curent, primul nod care nu are sueeesor drept, se copiaza inforrnatia utila din aeest nod in nodul eurent, se elibereaza zona de rnernorie ocupata de nodul gaslt - ~i se revine la Pasul 3. PAS9. Daca nodul curent are cheia mal mica decat k , atunc i se cauta nodul care trebu le sters in succesorul crept: alttel , se cauta nodul care trebuie sters In succesorul stanq. Se revlne la Pasul 3. PAS10 . Daca s-a ajuns la arborele vid, atunci se afiseaza mesajul "Cheie nu existe" , Observatie. Transmiterea adresei de la nodul curent (care se sterqe) la parintele sau, se face prin transmiterea prin referinta a parametrului eu adresa nodului.
void s t e r qe._n o d( n od *&r, no d *&c ) / *58 ca uta in subarborele dr ept; & 1 n odului c u ren t{ r ) p r i mu I. n od care nu are sucCe s o r d rept (cl ~/ {nod *Pi
if (c - > d ! ~NULL ) s t e r g e _ n o d J r, c - > d )i

else

t r -c-nr v c- on r.

lise ccp i a za .i.nf o r mat i a Ilg'as it i n n ociu Lccu r e n t

u ti li.

di n

rrodu L

p~c - > s; delete c ; c =p ; } } /Is e $ t erge Dodu1 gas i t ca nod ca r e a r e numai s ucc es o r dr ept

void s t erge r e (no d *&r, irit k ) {nod 'kC ; if ( r! =NULL) if (r ..; >n r = =k) Iidacas "': ag a si t nodulc a r e t c e bu.L e s t e r s if (r"':>s=~NULL && r ->s"N'""NULL) I idaca est e nod t ermin a l (delete r ; r =NULL ; } else if { r~> s~ =;NULLr / / oe ca e s te nod ca re a re nlillla i 's ucce soz- drept {c=r- >d; delete r ; r = c ; } else i f (r -e-d NULL ) //daca. c s t c nod care a r e r usne f euccesor s tang { c ~ r - > s; de lete r ; r ~ c ; } else sterge n od(r r r -> s) ; I /daca a re ambii succes ori else I idacami s - ag a sitpodlllcare t .reb u i.e s t.e r s if (r->tu<k) s t e rqer e (r - >d , k) i / /caut5. in s u c ce s c ru .I d rept else sterg e re( r ->s , K) ; IlcaU t a in succeso rul stang else cout" Ch e i a n u ex ista" ; } void main () {int k ; ... cout"Che i a c a r e se s t e r c e : "; cin k; ster ger e( T , k} ; . . . } Complexitatea algoritmilor de prelucrare a arborilor binari de cautare Cautarea unei informatii identificata printr-o cheie eu valoarea k incepe de la nodul rad,"kina si se termina , in eel mai rau caz, intr-unul dintre nodurile term inale ale arborelui. Gasirea nodului presupune executarea operatiei de comparare dintre cheia eu valoarea k si cheia nodu!ui curent. Tirnpul mediu de executie al algoritmulu i se calculeaza la fel ca la algoritmul de cautare secventia la lntr-o structura liniara de n chei (reprezentate sub forma de vector sau lista lnlantuita), unde:

Tmclt -_ 11 _+1 .... 2

322

Im plcm enta r ca structurilor de date

In caz ul arborel ui binar de cauta re, dimensiunea datelor nu este n , ci nurnarul de niveluri ale arborelui de cautare (sau lnaltirnea lui). lnal\imea fiind cu 1 mai mica decat nurnarul de nive!u ri parcurse (S8 considera :;;i nivelu l radacinii), In cazul arborelui bina r de cautare: h+2
Tlll~d = -2-

Ordinul de complexitate al algoritmului este Oth) Rezulta ca timpul consumat pentru operatiile de prelucrare a arborilo r binari de cautare este direct proportional cu i nalfim ea arbore lui h .
Propozitia 20

inal\imea unui arbore binar cu n noduri poate lua valori i nt re 1092(n)-1 ~i n-1.
Demcnstratle. Notam cu h Inaltimea arbcrelui binar cu n noduri. Arbor ele binar are cea mai mare tna'time (h_ m a x ) atunei cand este degenerat (nodurile sunt distribuite cate unul pe fiecare nive! cu exceptia nodului terminal, ordinul fiecarui nod este 1). Rezulta ca h_max =n-1 ~i hs n-t Arborele binar are cea mai mica Inaltime (h_ min) atunc i cand este comp let (toate noduri le termin ate se qasesc pe acelasi nivel-:- ~ i ordinul fiecarui nod, cu exceptia nodurilor term inale, este 2). In acest caz, pe fiecare nivel i vor fi t noduri, iar nurnaru ! n de noduri va f ega! cu Z h_ mm +1_ 1. Rezulta ca n+1 =

2h_mio+l . i h_m in+1 = lo g2(n+1). Din ultima eqalitate rezulta ca h ~ 1092(n)-1 .

Eficienta algoritmului de prelucrare a arborilor binari depinde de modul in care a fost creat arborele. Daca el are Inaltirnea maxima (arborele binar degenerat, in care fiecare nod nu are decat un succesor), ordinul de complexitate al algoritmului va fi O(n) si este egal cu cel al algoritmului de cautare secventia'a intr-o structura de date liniara. Daca el are Inaltim ea minima (arborele complet sau aproape complet), ordinul de complexitate al algoritmului va fi 0(1092n). 1. Cornparati, din punct de vedere al eficientei, algoritmii recursivi si iterativi pentru determinarea minimului, respectiv a maximului, intr-un arbore binar de cautare. Care dintre variante este mai eflcienta? Pentru arbo rele binar A '4 din figura 79, cate operatii de deplasare in structura de date se executa pentru a determina minimul? Daca valorile din arbore ar fi fost memorate intr-o structura liniara, cate operatii de deplasare s-ar fi executat pentru a determina minimul? Care dintre structurile de date este mai eficienta? Scrieti 0 functie care sa creeze un arbore binar de cautare perfect echilibrat. Scrieti 0 functie care sa verifice daca un arbore binar este un arbore binar de cautare. In nodurile unui arbore binar sunt memorate numaratorul si numitoru l unor fractii distincte. Sa se simplifice fractiile din arbore, iar daca in urma sirnplifica rii rezulta un nurnar int reg, sa se elimine din arbore. in nodurile unui arbore binar sunt memorate numere intregi . Se citeste de la tastatura un numar intreg x. Sa se caute in arbore nodul cheia x si daca se qaseste , sa se afiseze fratele sau - precizandu -se daca este fratele stanq sau fratele drept. Sa se afiseze un mesa] de informare daca nu se gase$te cheia x in arbore sau daca nodul nu are Frate.

2.

3. 4. 5.

6.

2.8.5,3. Aplicatii practice


1. Un text contine cuvinte care se pot repeta. Textul este memorat intr-un fisler text. Scrieti un program care sa citeasca textul din fisier ~i care sa afiseze cuvinte le din text, ordonate alfabetic , ~ i frecventa lor de aparitie in text. 2. Realizati 0 agenda de telefon cu ajutorul unui arbore binar de cautare. in fiecare nod se vor pastra urrnatoarele inforrnatii; numele $i prenumele persoanei, nurnarul (numerele de telefon) si adresa de e-mail. Scrieti un program care sa permits adauqa rea de noi persoane in agenda , eliminarea unor persoane si cautarea unei persoane pentru a afla numarul de telefon si adresa de e-mail,

Inform a tica

323

2.8.6. Ansamblul Heap


2.8.6.1. Definitia ansamblului Heap
Se numeste ansamblu Heap un arbors bi nar care indeplineste urrnatoarote conditl i: (1) es te un arbore aproape complet; (2) i n orice pe reche de nod uri tata-fiu cheil e sunt intr-o relatie de ordine prestabilita . Exemplu . i n figura 84 este prezent at ansamblul Hea p A 15 i n nodurile caruia sunt me morate numere natura le, relatia de ordine fiind : daca in nodu l tata este un nurnar impar, in nodul fiu nu poate fi decat tot un nurna r impar Numerele sense in exteriorul nodurilor, reprezlnta indici pentru numerotarea nodurilor. Fig, 84 Terminologie: -7 An samblul Hea p se mai nurneste si arbore de selectie sau arbore partial ordona!. -7 Un ansamb lu Heap maxim est e un ansamb lu Heap in care chela parintelui este ma i mare sau egala cu cheia fiului (arborel e binar A 16 din figura 85) . -7 Un ansamblu Heap minim este un ansambl u Heap In care chela parinte lui este mai mica sau eqala cu cheia fiului (arborele binar A 17 din figura 86). 5 Fig. 85 Caracteristici:

Ats

:J.;>

Ats

"'j jii'

Au

-7 i ntr-un ansamblu Heap cu n noduri, lna ltirnea arborelui h este egala cu [log2n]-1 . -7 i ntr-un ansamblu Heap (de exemplu , l nlr-un ansamblu
Heap minim sau Heap maxi m) pot exista chei cu aceeasl valoare. 5 7 intr-un ansamblu Heap min im cheia din orice nod este 1 mai mica sau eqala cu chei le tuturor nodurilor din eei doi subarbori ai ~a ': iar i n nodul radacina se gase'?te cheia (18: Fig. 86 cea mal mica din arbore . -7 lntr-un ansamblu Heap maxim cheia din orice nod este mai mare sau ega la cu cheile
tuturor nodurilor din eel doi suba rbori a! sal, iar in nodul radacina se gase ~t e cheia cea mai mare din arbore .

-7 Un ansamblu Heap poate fi folosil pentru a implement a 0 coada de prioritati (de aici ii vine ~i de numire a de arbore de selocti e). deoarece - prin extrag erea cheilor prin nodul radac ina - se extrag datele i n conformitate cu relatia de ordine prestabilita . Pentru ans amblul Heap A15 din figura 85 , ordinea de extragere a datelor esle : mai l ntai num erele pare 'Ii apoi numerel e impare . in ansambl ul Heap A t 6 din figura 86 extragerea nodurilor se face in ordi nea descrescatoare a etiche telor, iar in ansam blul Heap A 17 din figura 86 extragerea nodurilor se face In ordinea crescatoa re a etichetelor.
Proprictate : Ansamblul Heap are 0 proprietate foa rte irnportanta (pe care 0 rnosteneste de la arb orii binari cornp leti): daca nodurile arbore lui se numeroteaza cu indici, in ordinea parcurgerii In la\ime (ca In figura 84), intre indicii parintelui, al subarborelui stang 'Ii al subarb orelui drept - exista urrnatoare le relatii:

-7 Parintele nodu lui cu indicele i are indicele [~] .

324

Implcmcnta rca st ru ct ur ilor dc datc


-7 Fiul stanq al parln telui cu indicele i are indicele 2xi. -7 Fiul drept al parinte lui cu indicele 1are indice le 2x i+ I .

Aceasta proprietate a arbor ilor cornp leti si aproape cornplet i ne perm ite sa irnplementam static ansamblul Heap , cu ajutorul unui vector v. -7 Radaclna arborelui are eticheta v [1]. -7 Fiul stanq al nodulu i cu eticheta v[i] este nodul cu eticheta v[2 'i] . -7 Fiul drept al nodu lui cu eticheta v [i] este nodul cu eticheta v[2 'i+1] vectorul Ind ic e A 16 1 2 2 25 2 10

3
18 5 18

4
20 10 11

6
5 15 9

7
9 11 10

v
pentru
Observatii :

An A"

3
20

3 9
15

8 11 18 5

9 15 20

10 25 25 2

1. i ntr-un vector care implementeaza un ansamblu Heap Maxim : v[iJ 2v[2 xi] si V[i]2V[2xi+1J pent ru \t i E{1, 2, 3, " ' , [n/2]} si daca 2xi ~n , respecliv 2xi+ 1 ~n . 2, intr-un vecto r care impleme nteaza un ansamb lu Heap Minim : v[i J~v[2xi ] "i v[iJ $v[2x i+1J pentru \t iE {1, 2,3 , "' , [n/2]} " i daca 2xi~n, respect iv 2xi+1$n. Invers, un vector v - poate fi reprezentat ca un arbore binar aproape comple!. Pentru un Indice i E{1, 2, 3, " ', [n/2]}:

I V [ill
Fig. 87

-7 daca 2x i>n ,

S8 poate construi un subansamblu Heap care este format numai ~[ iJ din nodul parinte v[iJ (figura 87); -7 daca 2x i=n , S8 poate construi un subansa mblu Heap care este format din nodul parinte vIii " i fiul stanq v[2xiJ (figura 88); V [21 -7 daca 2xi<n sl 2xi+1$n , se poate const rui un subansamblu Heap care este F' 88 format din nodul parinte v[iJ, fiul stanq v[2xiJ "i fiul drept v[2xi+1 J (figu ra 89). Ig .

Pentru rnultimea de chei (2, 5, 7, 10, 12, 15, 23, 25, 28) ........../ scrieti vectorul corespunzator ansamblul ui Heap maxim si ------'" vectorul corespunzator ansamblulu i Heap minim . Desenati ansamb lurile Heap pornind de la vector i.

2.8.6.2. Algoritmi pentru prelucrarea unui ansamblu Heap


Pentru prelucrarea unui ansamblu Heap se pot folosi urmatorii algoritm i: -7 Algoritmu l pentru crearea ansamb lului Heap, -7 Algoritmul pentru inserarea unui nod , -7 Algoritmul pent ru extragerea unui nod . in urma acestor operat ii de prelucrare, arborele trebui e s a-s! p ast reze c alitate a de ansa mb lu Heap. i n algoritmi i pentru prelucra rea unui ansamblu Heap S8 va folos i implementarea statica a ansamb lului cu ajutorul vectorulu i. Daca lungimea fizica a vecto rului este NMAX , nurna rut de noduri n ale ansamblului Heap nu trebu ie sa fie mai mare decat NMAX -1. Deoarece vectoru l Heap 58 con struieste pe baza mecani smului de leqatura parinte-fii Intre indici, etichetele ansam blului Heap 58 vor memora in vector lnce pa nd eu indicele 1.

In forma tica
Algoritmul pentru crearea unui ansamb lu Heap

325

Crearea unui ansamblu Heap presupune adauqarea elementelor in vector , pomind de la primul element, astfel l ncat aceasta reprezentare sa respecte proprietatile unui ansamblu Heap: (1) Sa fie un arbo re apro ape compl e!. Deoa rece in arbore nodu l trebu ie ad auqat pe ultimul nivel, imediat la dreapta nodu lui existent, tnsearnna ca in vecto r S8 va adauqa noua cheie imediat dupa ultimul elemen!. (2) in orice pereche de noduri tala -fl u , cheile trebu ie sa fie i n relati a de ordine prestabilita. Daca in arbore se adauqa un nod in pozitia prec izata , este pos ibil ca el sa nu fie cu pari nte le sau i n relatia de ordine prestabiita . Solutia este de a propaga inforrnatia din aeest nod catre radacina, pEm a cane este lndeplinita relatia de ordine intre nodu l in care a ajuns lnforrnatia sl parintel e SEIU. in algoritmu l pentru crearea ansamblului Heap se foloseste variabila j pentru lungimea loqica a vectorului (reprez inta nurna rul de elemente care au fast adauqate in vecto r) ~ i variabila i pent ru indicele nodului curent. Algoritmul urrnator se poate lo losi pentr u crearea unui Heap Maxim : PAS1. Se citeste prima cheie ~i se rnernoreaza in radacina arbo relui (elementul v j i j). PA S2. Penlru nodul j de la al doilea nod , pana la ultimul nod din arbore , oxocuta : ! PAS3 . Se scrie cheia in elementu! cu indicele j . PAS4 . Se initializeaza indicele elementu lui curent i cu lungimea loqica a vectorulu i j . ! PASS. Cal l im p nodu l curent este dilerit de nodul radacina exec ut a: PAS6. Daca che la mernorata in nodul curent (elementul cu indicele i) este mai mare dedit chela rnernorata in nodul parinte al nodului curent (elementul cu indicele i/2), alunci se interschirnba cheia din nodu l curent cu cheia din noduJparinte, iar nodul parinte dev ine nod curent; altfel , radacina devine nod curent.

fst ream f( "heap .txt " , i o s : :in ); int const N11'AX=100 ; int \' [NMAX ] , n : void c r e a re~h eap() {i n t i , j , a u x ; f n ;
i f (:o<=NMAX -l) {f v [ l ] ;

//c h e i le s e c i t e ec dinLL$ier

fo r ( j=2 ;j<=n ;j++) ( f v [j ] ; i=j ; wh i le (i>l) if (v [iJ>=v [i / 2 J ) {a uxev Li ] , v [ i ] = v [ i/ 2 ]; v[i!2] =au x ; i = i ! 2 ; ) else i=l ; } ) els e cout" Nu se p oa t e c.re a - arborele a r e rnai rnu.Lt e n c du ri decat l u n gi me a f i zic a a vect o r u l~ i r ' e n d l ; ) void e f i.s a r et ) {for l i n t i =Li <=tl ;i ++ ) cou t-oc v I i j c-c" ";} vo id ma in () {cr e n r e _ h e a p ( ) () ; a f i s a r e (} ; }

A l g o r it m ul p e n t r u inserarea unui nod ill ansa m b l u l Heap Prin adauqarea unu i nou nod, lungimea loqica a vectoru lui creste cu 1 $i trebuie sa se verifice sa nu depaseasca lungimea fizica a vectorului. Prin inserarea unui nod , arbore le trebuie sa-si pastreze cal itatea de ansamblu Heap, adica sa alba proprietatile : (1) Sa fie un arb ore aproape com plet. In arbore, nodu! S8 va adauqa pe ultimul nivel, imediat la dreapta nodului existent Daca ultimul nivel este cornplet, nodul se va adauqa

326

Im plementa rea st ructurllo r de date


pe urrnatorul nivel, ca succesor sti ng al nodului din extremitatea stanqa de pe nivelul
ante rior. lnsearnna ca i n vector S8 va adauq a noua cheie imediat dupa ultimul element

(2) in orice pereche de noduri tata-fiu cheile trebuie sa fie In relatla de ord ine prestabllita: Daca in arbore S8 adauqa un nod in poz itia precizata, este pos ibil ca el sa nu fie
cu parintele sau in relatia de ordin e prestabilita - si inforrnat.a trebui e s a S8 propag e din ace st no d catre radacina, la fel ca la algoritm ul de creare . lnsearnna ca , in vector,

ultimul element va fi considerat element curent - si cheia mernorata in ele S8 va campara cu chela rnernorata in parinte. Daca nu respecta relatia de ordine, S8 interschirnba cheia nodului curent cu cheia parintelui, iar parintele devine nod curent. Propagarea cheii continua pana cand intre elementul curent !?i parintele sau este respectata relatla de ardine, sau pana cand radacina ajunge sa fie element curent.
voi d ada uga () //pent ru a n s amb Lu I Heap M ax i m
ccu t c-cv n u

t int x , i ; i f (n ==NKlI.X-l)

cse

mai poa t.e a d e uqe n o clu l " e n d l ;

e l se

{c out "c h e i a = " ; cin x ; n+ + ; v [n)= x ; i =n ;


while if (i >l )
i v [ iJ > ~v[i/2 1 1

v o i d ma i n ()

t c r ear e

{x e v j aj , v [ ij ~ v [ i/2 J e lse i = l ; } } () ; . . . adauga ( ) ; . . . }

v [i !2 ] ~x ;

i ~ i!2 ; }

Algorilmul pentru exlragerea unui nod din ansamblul Heap Ansamblul Heap, fiind a coada de prioritati, prima intormatie care se prelucrea ., j este cea din nodul radacina . Extragerea unui nod din ansamblul Heap inseamna de fapt prelucrarea informatiei din nodul radacina si eliminarea acestui nod din arbore. Pentru ca arborele sa-si pastreze calitatea de ansamb lu Heap, dupa eliminarea nodului radacina trebuie sa alba pro prietatil e: (1) Sa fie un arbore aproa pe com pl et. in searnna ca trebuie sa dispara din arbore nodul eel mai din dreapta de pe ultimul nivel. Daca din arbore dis pare nodul din dreapta de pe ultirnul nivel, nu trebuie sa dispara din arbore si informatia din acest nod - din arbor e trebui e sa dispara intorrnatia din nodul radaci na. De aceea, in nodul radacin a este adusa inforrnatia din ultimul nod. in vecto r, cheia din ultimul element va fi salvata in primu l elemen t. dupa care , este eliminat ultimu l element prin decrementarea lung imii logice a vectorului . (2) in arice pereche de noduri tara -flu cheile trebuie sa fie in relatia de o rdine prestabilita. Daca in nodul radacina este adusa inforrnatia din ultimul nod, este foarte probabil sa nu mai fie respectata relatia de ordine lntre nodul radacina si fiii sai. Solutia este de a propaga inforrnatia adusa in radacina, catre nivelurile inferioare, pan a cand este Indeplinita relatia de ordine intre nodul in care a ajuns inforrnatia si fiii sai in algoritmul pentru eliminarea nodului din ansamb lul Heap se foloseste variabila ; pentru indicele nodului curent , iar variabi!a j - pentru indicele nodului fiu al ncdului curent. PAS1 . Se oreiucreaza cheia din radacina (elementul v [l ]) . PAS2 . Se copiaza In radacina cheia din ultimul nod (elementul v (n] ) si se micsoreaza cu 1 lungimea lcqica a vectorului. PAS3. Se initializeaza nc dul curent cu nodul radacina (indice!e i are valoarea 1). PAS4. Cal lim p nodul curent face parte din arbore (elementul cu indicele i face parte din vector ) exec uta :

I nformatica

327

PAS5. Daca nodul curent are succesor stanq , atunci fiul sau va fi succesorul stang (indicele j este egal cu 2'i); alttel, nodul curent este scos i n afara arborelui , atribuind indiceJ ui i 0 valoare mai mare decat lung imea loqica a vectorului si se revine la Pas ul 4. PAS6. Daca nodul curent are ~I succesor drept , ~ i che ia din succesoru l stanq este mal mica cecat cheia din succesorul drept , atunci fiul nodului curent va fi succesorul dre pl (indlcele j este egal cu 2' i+1). PAS? Daca chela rnernorata i n nod ul curent (elementul cu Indicele i) este mai mica decat cheia memorata i n nodul fiu al nodu lui curent (elementul cu indicele j) , atunc i S 8 interschirnba chela din nodul curent cu cheia din nodul fiu, iar nodul flu devine nod curent : altfel , nodul curent este seas in afara arbore lui. Se revine la Pasul 4.

in t elimi na ( )
li nt
{i f

//pen t r e a n samb l ul Heap Maxim


\" [1 ] = v [nJ; n - - ; i= l;

i, j ,z = v r l J,a'J:~ ; {i <=n~

whi le

(2 " i <=n)
{ j ~2 ' i ;

if if

( j + l<=n s s v[ j+ l 1>=v [ j J) j ++ ; (v U.':<=v[jJ ) {e ux e v j Ll r v I r J v v l i l . v j j l e a u x : i = j ; } e l s e i=n + l ; }

e l s e i=n +l ; } re turn x r }
void ma in {)

{c r e a re

(~

; . . . o ou t-c -C' Cne i a c e a mai me re e s t c " <c e l i m.ina L) endl ; _ . . }

Observatie. Daca S8 extrag din arbore toate nodurile si se afiseaza cheile nodurilor extrase, cheile vor fi afisate i n relatia de ordine prestabiiita pentru ansamblul Heap . Complexitatea algoritmilor de prelucrare a ansamb luri lor Heap

in algoritm ul de creare a unui ansamblu Heap, se parcurge secvential vectorul pentru adaugarea celor n elemente. Complexi tatea parcurgeril secventiate este O(n) . Pentru fiecare element adauqa t la vector, cheia nodului trebuie adusa i n pozitia corespunz atoare din ansamblul Heap. Cazul cel mal defavorabil este atunci cand chela se propaqa de pe nivelul pe care a fast adauqata, pana la nivelul radacinii, nurnarul de cornparatii executate fiind egaI cu inaltirnea h a arborelui la acel moment (care ia valori de la 0 pana la Ig2n), iar cornplexitatea algoritmului de propagare a unui nod de pe nivelul cu Inaltirnea h pima in radacina va fi 0 (lg2n) . Rezulta ca, in algoritmul de creare, complexltatea este O(n) x 0(lg2n) ; 0(n xlg2n). Algo ritmul de inserare a unui nod are complexita tea 0 (lg2n) - cazul cel mal defavorabil fiind atuncl cand cheia se propaqa de pe ultimul nivel pana in radacina. Algoritm ul de ad auqa re a unui nod are complexitatea 0(lg2n) - cazul cel mai defavorabil fiind atunci cane cheia se propaqa din radacina pana la uttimul nivel.
2.8.6.3. Aigoritmul HeapSort
Oaca un vector este organizat ca ansamblu Heap , nodu rile vor fi extrase in ordinea precizata prin relatia de ordine asoclata arborelui. Acea sta caracteristica a ans ambluri lor Hea p, sta la baza algoritmu lui de sortare HeapS ort . Daca fiecare element eliminat este adus dupa ultimul element din vect orul rarnas dupa extragerea lui, in vectorul obtinut, chelle vor fi ordonate invers dec at prin relatia de ord ine prestabilita i n ansamblul Heap. Astfel:

328
~

I mplem en ta r ea structurilo r de date

-7 Daca vectorul era organizat ca un ansamblu Heap Maxim , va fi ordon at descrescator.


Daca vecto rul era organi zat ca un ansamblu He ap Minim , va fi ordonat crescator,

n-l

Cheia maxima din n noduri 1 2 3 4

n-2

n -l

=~
Ch eia ma xim a din n-1 noduri

n- 2

n -l

Ch eia maxim a din 2 nod uri Algor itmu l este: PAS1 . Se creeaza vectoru l care urrneaza sa fie soriat ca un vector care irnplernenteaza un ansamblu Heap . PAS2. Se salvea za lungimea logica a vector ului. PAS3. Se inltializeaza nodul curent cu ultimul nod (indicele i are valoarea n) . PAS4. Cat timp mai exista nod uri de extras din ansamblul Heap executa PASS. Se elirnina nodul din arbore ~i se salveaza in nodul curent. ] PAS6. Nodul curent dev ine ultimul nod din ansamblul ramas dupa eliminare (se decrementeaza cu 1 indicele nodului cure nt) ~i se revine la Pasu l 4 .

. . . / / d ate l e $i s truc t ur i l e de date d e clar a t e g lob a l


v o i d crea r e_ he ap () { . . . } vo id afi~ ."are ( ) { } i nt e Li.m i .na () { } void HeapSbr t() ( in t i t j=n ; fo r (.1=n ;i>1;i - -) v li l ee Li mdna tl:

n =j ; ) voi d main( ) {c r e a r e _ h e a p ( }; HeapSort() ; a f i s a r e( ) ; coutendl;} Complexitatea a lgo ri tm ului de s o rta re In algoritmul de so rta re a unui ansamblu Heap se parcurge secvential vectorul pentru a elimina cete n elemente. Complexitatea parcurgeni secventiale este O(n) Pentru fiecare nod se executa algoritmul de eliminare - care are complexitatea 0 (lg 2n). Rezulta ca, in algoritmul de sortare a unui vector organizat ca ansamblu Heap, complexitatea este 0 (n )xO(lg2n) = 0 (n xlg2n)
A lg oritm ul de s ortare a unui vector folosind metoda HeapSort presupune organizarea

vecto-

rului ca un ansamblu Heap - complexitatea 0(nxlg2n), urmata de sortarea ansamblu lui Heap complexitatea 0 (nxlg2n). Rezutta ca in algoritmul de sortare prin metoda HeapSort , complexitatea este 0 (n xlg2n)+0(nxlg2n) = 0(n xlg2n+n xlg2n) = 0 (2xn xlg 2n)= 0(nxlg2n) Se citesc din fisierul BAC .TXT mai multe sirurl de numere naturale nenu le, starsitul fiecarui sir fiind marcat de 0 valo a re 0 (ca re nu S8 considera CEI face parte din vreun sir). :;3tiind ca fiecare dintre sirur i este un sir strict

I nform a fic a

329

crescator si ca i n total sunt eel mult 5000 de numer e, scrieti un program care sa realizeze afisare a tuturor numerelor nenule distincte din fisier, in odinea crescatoare a valorilor lor. a. Descrieti doua metode de rezoivare, una dintre metode fiind eficien ta ca timp de executare. b. Scrieti un program coresp unzator metodei eficiente descrise. (Bacalaureat - Simular e 2004)

2.8.6.4. Aplicatii practice


1. Mai multe vehic ule parcurg acetasi traseu. Fiecare vehicul este caracteriz at de un identificator , timpul de pornire, timpu l de sosire ~i timpul de parcurgere a traseului (care se calculeaza din diferen ta celor doi timpi). Scrieti un program care sa mem oreze aceste inforrnatii intr-un ansamblu heap ~i care sa asigure urrn atoarele functii; ada uqarea unui nod (un vehicul care a sosit) si afisarea inforrnatiilor despre vehicule , in ordinea cresca tc are a timpului de parcurs.
2. Produsul realizat de 0 sectie a unei fabrici este cerut de mai multi clien ti. Fiecare client este caracterizat de nume , nu ma r de telefon, data la care trebuie Iivrat produsul l?i cantitatea corn andata. Ce rerile sunt onorate in ordinea cale ndaristica a datelor de livrare
~i

i n functie de cantitatea dispcn ibila in stoc. Scrieti un prog ram care sa perrnita i ntre-

tine rea z ilnica a acest ei structuri de date, prin urrna toarele operatii: a. adauq area de noi comenzi; b. afis area listei de comenzi care trebuie onorate In ziua respectiv e ~ i salvarea ei Int r-un

fisier text (data calendaristica si stoeul de produse la i neeputul zilei se citesc de la


c. tas tatura); stocul la sfarsit ul zilei , dupa ce au fast onorate come nzile.

[ JE"V'S1]:\Ulaur-<e )
Adevarat sau Fals:
1. 2. 3. 4. Arborele este un graf fara cicluri , minimal cu aceast a prop rietate . Arborele partial de cost minim deterrnina drumuri le de lungime minima dintre oricare doua noduri dintr-un graf conex. in algoritmul lui Kruska l pentru const ruirea APM , se porneste de la un arbore partia l care cont ine nodul radacina. intr-un arbore cu rad acina , implementarea cu referi nte ascend ente Ioloseste doi vectori: unul pentru a me mora nodurile terminale ~ i altul pentru a memora parintii nodurilor terminate . Algoritmul de parcurge re in latime a unui arbore cu radaci na prelucreaza into rmat ia
in functie de rela tiile de subordonare dintre noduri. Arborele binar este un arbore cu radacina, in care fiecare nod are eel mult doi succesori.

5. 6.

7.
8. 9.

Un arbore binar strict este un arbore echi libral.


Un arbore vid este un arbore in care nodul radaci na nu are succesori. intr-un arbore binar de ca utare , cheia or icarui nod este mai mare deca l chelle succesorilor lui.

10. Pentru a sorta crescato r un vecto r cu algoritmul HeapSort , vectorul trebuie sa implementeze un arbore binar in care , pentru fiecare nod, cheia din succesorul stang este

330

Im plcrncntarca structurilor de da te

mai mica decat cheia din nod . iar chela din succesorul drept este rnai mare deca t cheia din nod. 11. Tntr-un ansamblu Heap , cheile nodurilor trebuie sa fie distincte.

Alcqeti :
1. Grice graf neorientat cu n nod uri ~ i n-1 rnuchii: a. este aciclic si neconex b. este conex daca si numai daca este aciclic c. este un arbo re d . este conex si conf ine un ciclu (Bacalaureat - Simulare 2003 ) 2. Nurnarul de muchii ale unui arbo re cu 9 noduri este: a. 9 b. 7 c. 8 d . 10

3. Nurnarul maxim de noduri terminale ale unui arbore liber cu 15 noduri este : a.15 b. 14 c.12 d.10
4. Numarul maxim de nodu ri terminale ale unui arbore cu radacina cu 15 noduri este: a.15 b.1 4 c.12 d.10 5. Nurnarul maxim de no duri terminale ale unui arbore binar cu 15 noduri este:

a. 6

b. 7

c. 5

d. 4

6. Se considers un arbore cu urrnatoarele propr ietati : radacina este nodul 1 (considerat de nivel 1) ~i fiecare nod i (cu hi$3) allat pe nive lul j are ca descendenti nodurile i+j si i+2 ' j . Nodu rile i (cu i>3) sunt nodur i terminate (frunze). Stabiliti care dintre vectorii urrnatori este vectorul de tali (sau de predecesori) corespun zator arbo relu i: a. 0 1 2 2 1 3 3 b. 0 -1 1 -1 -1 1 1 c. 0 1 1 2 3 2 3 d. 0 1 1 2 2 3 3 (Bacalaureat - Simu lare 2003) 7. Se cons idera arborele din ligura alaturata . Care dintre noduri tr~b.ui: ales ca radacina astfel lncat lnaltirnea arborelui sa fie ~ 2 3 4 minima. a. 7 b. 3 c. 5 d. 6 5 6 7 (Bacalaureat - Sesiunea specials 2003) 8. Un arbare are 14 naduri. Atat radacina . cat 9i fiecare dintre nadurile neterm inale au ce l mu lt 3 descendenti directi. Inal~jmea maxima a arbarelu i (nurnarul maxim de much ii ce leaqa radacina de 0 trunza ) este: a. 4 b. 13 c. 5 d. 3 (Bacalaureat - Ses iunea specia la 2003) 9. Memararea unui arbore cu ajutarul matr icei de adiacenta a grafului este 0 metoda : a. eficie nta

b . nee ficienta

c. incorecta d . recornandabila (Bacalaureat - Sesiunea specia la 2003 )

10.5e conside ra arborele din figura A2B. Definim i naltimea arbo relui ca fiind nurnarul maxim de muchii care torrneaz a un lant care une ste radacina de un nod termin al. Care este l naltimea maxima a arborelui cu radacina ce se poate obtine aleqand ca radacin unu l dintre nodu ri? a. 5 b. 3 c. 6 d. 7 (Bacalaureat - Sesiunea iunie-iulie 2003 ) 11.5e cons idera un arbore cu radacina in care arice nod care nu este term inal are exact 3 descende nti directi. Atu nci, nurna rul de noduri term inale (frunze) poate fi:

Inf o r m atica

331
b. 24

a. 15

c. 2 d. 14 (Bacalaureat - Sesiunea iunie-iulie 2003)

12 .5e considera un arbore in care rad acina este considerate de nivelul 1 :;;i orice nod de

pe nivelul i are exac t i+ 1 descend ent! directi, cu exceptia noduril or de pe nivel ul 4 care sunt noduri term inale. Numarul de noduri terminale (frunze) sunt: a. 24 b. 120 c. 6 d. 30 (Bacalaureat - Sesiunea august 2003 ) 13.Se considera un arbore. Despr e un lant care uneste doua noduri distincte n, si nz se poate afirma: a . e ste unic oricare ar fi "1~i " 1 b. este unic daca ~i numai daca n- sau n2e ste terminal d. este unie daca ~i numai daca n, sau "2 este radacin a C. nu este unic oricare ar fi "1~ i "2 (Bacalaureat - Sesiunea august 2003) 14. Stabili\i care dintre grafurile ataturate ~ ~ este arbore : a. b. (Bacalaureat - Simul are 2004) c. -..d

---.)t:r%
. d. 34 3 34 1 1 0
d. 3

Urrnatorii 4 item i se refers la arborele cu radacina cu 8 noduri, cu much iile [1.7], [1,8]. [3,1J, [3,4], [3,5], [4,2], [4 ,6] si cu radacina in nodul cu eticheta 3.

15.Vectorul tata al arborelui este: a. 340 334 1 2 b. 330 43 4 1 1

c. 3 40334 1 1

16.Numarul de noduri terminale ale arborelui este: a. 6 b. 4 c. 5

17 .inal\imea ma xima pe care 0 poate a vea , schirnbandu-se nodul , radacina este :

a. 6 a. 5

b. 5 b. 2
S8

c. 4 c. 4
obtin daca
S8

d. 3 d. 3
elirnina muchiile care au
0

18 .Daca S8 ia ca radacina nodul cu eticheta 2, Inaltirnea arborelui este:

ts. Nurnaru' de componente conexe care extremitate in nodul cu etiche ta 3 este :

a. 3

b. 4

c. 2

d. 1

Urmato rii 5 itemi 58 retera Ia arborele cu radacina cu 8 noduri care are vect orul tata: 2 0 2 1 1 1 3 3. 20.Numarul de noduri terminale ale arborelu i este: a. 3 b. 4 c. 5 21.Numarul de lanturi de lungime 3 este : a. 3 b. 4
d. 2

c. 5

d. 6 d. 5
d. 5

22.Numarul de lanturi de lungime 2 care pornesc din radaci na este : a. 2 b. 4 c. 3 23.Numarul de nivele ale arbore lui este: a. 2 b. 3 24.Fiii nodulu i 3 sunt: a. 4, 5 6 b. 1. 2

c. 4
c. 7, 8

d . 2. 7.8 d . 10 noduri

25.Un arbore binar strict cu 4 ncdu ri terminate are in total a. 5 noduri b. 7 noduri c. 9 noduri 26.Un arbore binar strict are:

332
a . un numar par de nod uri c. un numar par de muchii

Irnplemc nta r ea structnrilo r de date


b. un numar impar de noduri d. un numar impar de muchii

27.Se considera arborele din figura alaturata . Stabiliti ce fel de arbore nu este:
a. arbore binar c . ansamblu Heap b . arbore de cautere d. arbore strict

28.Se considera arborele din figura de la problma anterioara. Stabilit i ce fer de arbore nu este:
a . arbore echilibrat c . arbo re aproape complet b . arbore comp let d . arbore strict

3
10

29. Un arbore binar strict cu 4 noduri termina te are in total : a. 4 muchii b. muchii c. 8 muchii d. 9 muchii Urrnatorii 5 itemi S 8 refera la arborele binar din fjgura alatur ata: r este un pointer catre radacina, iar p si q . doi pointeri catre un nod oarecare : 30.Alege1i varianta corecta pentru a afisa cheia 15: a. cout r- >d - >d >- > i n f o; b. c. p = r -> s ->d ; cout p- >d - > i n f o; d.

cout r - >s - >s >- >i n r o ; p =r ->s->d ; c o u t p->info ;

31.Daca se executa instructiunea: p =r - >s ->d ->d ; pointe rul p va indica che ia: a. 21 b. 20 c. 18 d . 25 sz .u rmatoarea secventa de instructiuni :
per -c-d -c-d , p""V-> s; q'"'"new nod ; q ->info=5 ; q ->s""'NULI. ; q ->s=NULL ; p - >s:=:q ;

realizeaza : a. adauqa b. adauqa c. adauqa d. adauqa

nodul nodul nodul nodul

cu cu cu cu

cheia cheia cheia cheia

5 ca 5 ca 5 ca 5 ca

succesor stanq al nodului cu cheia 30; succeso r drept al nodului cu chela 30; succesor stanq al nodului cu cheia 19; succesor crept al nodului cu cheia 19;

33.Urrnatoarea secventa de instructiuni: for {p= r ; p - >s !=NULL i P=P- >S) ; q~n ew nod ; q-> i nfo=20 ; q->s =NULL; q->s o=NULL; p->s=q ; realizeaz a: a. adauqa nodul cu cheia 20 ca succesor stanq al nodului cu cheia 25; b. adauqa nodul cu cheia 20 ca succesor drept al nodului cu cheia 25; c. acauqa nodul cu cheia 20 ca succesor stanq al nodului cu cheia 21; d . adauqa nodul cu cheia 20 ca succesor drept al nodului cu che ia 21; 34.Urmatoarea secventa de instructiuni :
for
(p~ L; p ->d- >j! ~NULL ;p=p->j) ;

q - p -od . p - >d 'NULL;

dispose q ;

realizeaza: a. elimina nodul cu cheia 21; c. elirnina nodul cu cheia 25;

b. elimina nodul cu chela 18;


d.

elirnina nodu l cu cheia 30;

Miniproiecte:
1. Pentru evidenta elevilor din clasa, se pastreaza urrnatoarele inforrnatii: nurnarul de ordine din catalog. numele si prenumele, mediile semestriale ~i media anuala la disciplina informatica. Reallzati a aplicatie care sa asigure urmatoarele functii: a. adauqarea unui nou elev;

Informatica

333

b. elirninare a unui elev; c. modificarea mediei unui elev: d. afisarea elevi lor eu med iile (semestriale, respectiv anuale), in ordinea descrescatoare a
rnediilor ,

e. afisarea elevilor eu mediile (semestriale, respectiv anuale) cuprinse intre doua valori care se citesc de la tastatura .
2. lntr-o biblioteca, pentru fiecare carte se pastreaza urmatoarele lntormatii: codu l cartli, titlul, autorul, numarul total de exemplare ,i nurnarul de exemplare disponibi le la un moment dat. Realiza~i a aplicatie care sa asigure urmatoarele functii: a. reqasirea unei carti, du pa autor, pentru a afisa nurnarul de exemplare disponibile; b. adauqare a unui nou titlu: c. ad auqa rea de noi exemplare, pentru titlurile existente; d. modificarea nurnarului total de exemplare (In cazul distrugerii unora dintre ele): e. modificarea nurnarului de exemplare disponibile, in cazul in care 0 carte este imprumu tata sau tnapoiata: t. afisarea cartilor pentru care nu mai exists exemplars disponibile; g. afisarea In ordine afabetica a autorilor.

3. Pentru fi ecare articol dintr-o magazie, S8 pastreaza urmatoarele informafii: codul articolului (este unic pentru fiecare articol), denumirea articclului, unitatea de rnasura si cantitatea din stoc. Realizati a aplicatie pentru gestianarea magaziei - care sa asigure urrnatoarele fu nctii: a. adauqarea unui nou articol; b. sterqerea unui articol; c. introducerea de la tasta tura a can titatii intrate, dintr-un articol precizat prin cod , ~ i actualizarea stocului; d. introducerea de la tastura a cantitatii iesite, dintr-un articol preeizat prin cod , si cu aetualizarea stoeului; e. afisarea articolelor care au stoeul pe 0; f. afisarea stocului unui articol al carui cod se introduce de la tastatura ; g. afisarea . In ordinea codurilor, a stoeurilor din fieeare artico l.

Cup rins
I. Tchnici de proprnnuu-c ..... ... ... .... ...... ... ..................................... ............. 3 1.1. Analiza algoritmilor 3 1.2. Metode de construire a algoritmilor 5 .. 6 1.3. Metoda backtracking .. 1.3.1. Descrierea metodei backtracking 6 1.3.2. Implementarea metode i backt racking 10 .. 14 1.3.3. Probleme rezolvabile prin metoda backt racking. 1.3.3.1. Generarea perrnuta rilor . .. 15 1.3.3.2. Generarea produsu lui cartezian 17 1.3.3.3. Generarea ara njamente lor .. 20 1.3.3.4. Generarea combinarilor .. 22 1.3.3.5. Ge nera rea tuturor partitiilor unui nurnar natura l 24 1.3.3.6. Generarea tuturo r partitillor une i rnultirni 27 1.3.3.7 . Generarea tuturo r functiilor surject ive 28 .. 30 1.3.3.8. Problema celor n dame . 1.3.3 .9. Pa rcurgerea tablei de sah cu un cal., . 31 1.3.3.10. Generarea tuturo r posibilitatior de iesire din labirint .. 34 .4 0 1.4. Metoda " Divide ot Impera" 1.4.1 . Descrierea metode i "Divide et Impera" .4 0 1.4.2. Implementarea metode i "Divide et Impe ra".. .. .. 41 .. .4 8 1.4.3. Cautarea binara , 1.4.4. Sortarea rapida (QuickSort) .. 50 1.4.5. Sortarea prin interclasare (MergeSort) . .. 53 1.4.6. Prob lema turnurilor din Hano i 54 1.4.7. Generarea mode le!or fracta le 56 1.5. Metoda greedy 59 1.5.1. Desc rierea metode i greedy .. . 59 1.5.2. Implementarea metode i greedy. . 61 1.6. Metoda proqramarii dinamice . . 70 1.6.1. Descrierea metodei proqrarna rii dinamice 70 1.6.2. Impleme ntarea metodei proqrarnarii dinamice ..73 1.7. Compararea metodclor de construire a algoritmilor 83 Evaluare .. 85 2 . Irnplcmcntarca structurilor de dale 90 2.1. Tipuri de date specifice pentru adrcsarea memoriei 90 2.2. Tipul de data pointer 91 2.2.1. Declarararea va ribilelei de tip point er 92 .. 92 2.2.2 . Constante de tip adresa ., 2.2.3. Ope rator i pentru variabile de tp pointe r 94 2.2.3 .1. Operatorii specifici.. . 94 2.2.3 .2. Ope ratorul de atribuire 97 2.2.3 .3. Operatorii aritmetici 100 2.2.3.4. Operatorii relation ali .. 101 2.3. Tipul de data referinta 102 2.4 . Alocarea dinamica a memorici 106 2.5 . Clasificarca structurilor de date 109 2.6. Lista liniara 113 .. 115 2.6.1. Implem entarea dina rnica a listelor in limba jul C++ . 2.62 . Clasificarea listelor 117 2.6.3. Algoritmi pentru prelucrarea liste!or simplu i nlantuite 118 2.6 .3.1. lnitia lizarea listei 118 2.6.3.2. Crearea liste i 118

2.6.3.3. Adauqarea primului nod la lista . . 118 2.6.3.4. Adauq area unui nod la tista 119 2.6.3.5. Parcurgerea listei . 121 121 2.6.3.6. Cautarea unui nod in lista 2.6.3.7. Eliminarea unui nod din lista 122 2 6.3.8. Eliberarea spatiutul de memo rie ocupat de lista 123 2.6.3.9. Liste ordonate 124 2.6.3.10. Preluc rarea listelor simplu Inlantuite .. 127 2 6.4. Algoritmi pentru prelucra rea listelor circula re simplu lnlantuite. . 137 2 .6A .1. Crearea listei ... 137 2.6A .2 . Parcurgerea listei .. . 138 2.6A .3. Elimi narea unui nod din lista 138 2.6.5. Algor itmi pentru prelucrarea listelor dublu lnlantuite 140 2.6.5.1. Adauqarea primului nod la lista 140 2.6.5.2. Adauq area unui nod la Iista ....... . 140 2.6.5.3. Parcurgerea listei 141 2 .6 .5A . Eliminarea unui nod din lista 14 1 2.6.6. Algoritmi pentru prelucrarea stivelor 145 2.6.6.1. lnitializarea stivei ... 145 2.6.6 2. Adauqarea unui nod la stiva ., .. 146 2.6.6 .3. Extragerea unui nod din stiva .. . ... 146 2.6 .6A . Prelucra rea stivei .... .... .. 146 2.6.7. Algoritmi pen tru prelucrare a cozilor 148 2.6.7.1. lnitiafizarea cozii 149 2.6.7.2 . Adauqarea unui nod la coaca 149 2.6.7.3. Extragerea unui nod din cc ada . 149 2 .6 .7 A . Prelucrarea cozii 149 2.6.8. Aplicatli practice 151 Evalu ar e .. 152 2.7. Graful 159 2.7.1. Defin itia matematica a grafului .. . 159 2.7.2. Graful neorientat .. 160 2.7. 2.1. Terminologie .... . 160 2.7.2.2. Gradul unui nod al grafului neorientat 162 2.7.2.3. $ irul grafic 164 2.7.3. Graful orient at 165 2.7.3.1. Termi nologie .. 165 2.7.3.2. Grade le unui nod al grafului orientat .. 167 2.7A . Reprezentarea si implementarea grafu lui 169 2 .7 A .1 . Reprezentarea prin matricea de adiacenta . 169 2.7 A .2 . Rep rezentarea prin matricea de incidenta . .. 175 2.7 A. 3. Reprezentarea prin lista muchiilor (arcelor) . . . 182 2.7 AA . Reprezentarea prin lista de adiacenta (Iistele vecini lor) 187 2.7 A .5. Aplicatii practice . .. 197 2.7.5. Gra furi spec iale. .. 20 1 2.7.5.1. Graful nuL 20 1 2.7 .5.2. Graful comple!.. ........ . 20 1 2.7.6. Grafu ri derivat e dintr-u n graf 203 2.7.6 .1. Graful parjial........... . 203 2.7.6.2. Subgraful 207 2.7.6.3. Graful complementar 211

eV-((Vll.
2.7.7. Conexitatea grafurilor. 2.7 .7.1. Lantu l . 2.7.7.2. Ciclul ........ 2.7.7.3 . Drumu!.... 2.7.7.4. Circuitu l . 2.7.7.5 Graful conex ...... . 2.7.7.6. Graful tare conex 2.7.4 .7. Aplicatii practice . 2.7.8. Parcurgerea grafului 2.7.8.1. Parcurgerea in latirne - Breadth First 2.7.8.2. Parcurgere a in adanc ime - Depth First 2.7.8 .3. Aplica\ii practice . 2.7.9. Gra ful pond erat.. .. .. . 2.7.9.1. Definitia grafului pon derat .. 2.7.9.2. Matricea costurilor .. . 2.7.9.3. Algo ritmi pentru determinarea costulu i minim (maxim) 2.7.9.4. Aplicatii practice 2.7.10. Grafuri spectate 2.7 .10.1. Grafu l bipartit 2.7 .10.2. Graful hamiltonian 2.7.10.3. Graful eulerian. .... . 2.7.10.4. Graful turneu 2.7.10.5. Apticati i practice Evaluare . 2.8. Arborele 2.8.1. Arborele liber . 2.8.1.1. Definitia arbore lui liber . 2.8.1.2. Proprietatile arbori lor liberi . 2.8.2. Arbo rele partial . 2.8.2 .1. Deli ni;ia arborelui partial, 2.8.2 .2. Defi nitia arbore lui partial de cost minim 2.8.2.3. Algoritmi de determinare a arbore lui partial de cost minim 2.8.2.4. Aplicatii pract ice 2.8.3. Arborele cu radacina .................................. . 2.8.3.1. Defin itia arborelui cu radacina 2.8.3.2. Impleme ntarea arborelui cu radacin a 2.8.3.3. Algorit mi pent ru parcurgere a unui arbore cu radacina 2.8.3.4. Aplicatii practice 2.8.4. Arborel e binar . 2.8.4.1. Defin itia arborelu i binar 2.8.4 .2. Implementarea arborelui binar 2.8.4.3. Algoritmi pentru parcurgerea unui arbore binar 2.8.4.4 . Aplicatii practice 2.8.5. Arbo rele binar de cautare . 2.8.5. 1. Definit ia arbor elui binar de cautare . 2.8.5.2. Algoritmi pentru prelucrarea unui arbore binar de cauta re 2.8.5.3. Aplicatii practice . 2.86. Ansa mblul Heap ................................................ . 2.8.6.1. Definitia ansambului Heap . 2.86 .2. Algoritmi pentru prelucrarea unui ansamblu Heap 2.8 .6.3. Algori tmul HeapSort 2.8.5.4. Aplicatii practice Evalu are 213 213 ..21 8 ..220 . 223 225 228 235 235 236 240 246 246 . 246 247 249 255 256 256 . 260 263 268 . 27 1 272 281 281 28 1 28 1 . 283 ...283 283 285 292 292 292 297 299 304 305 305 305 312 315 315 315 315 322 323 323 324 327 329 . 329

I: - 19S1 - 01: - 1: 6 ' 86 NaSI 6 - 19S1 - or - 1:6 NaSI

-:

"

-,
0,

'

You might also like