Documente Academic
Documente Profesional
Documente Cultură
Mariana Mllosescu
norma lea
In enslv
I
c++
Filiera teoretica ,
profilul real,
specializarea
matematica informatica,
intensiv informatica
Manual penlru clasa a XI-a
Man ualul a fos t apro bat prin Ord inu l ministru lui Educ atic i si Cerceta rii nr. 4742 d in
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,
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
~i
Eficienta unui algoritm este evaluate prin timpul necesar pentru executa rea
algoritmului.
Pentru a compara - din punct de vede re al eficientei - doi algoritmi ca re rezolva ace easi
problema, S8 foloseste aceeasi dimensiune a dat elor de intrare - n (acelasi nurna r de
De exemp lu, daca - pentru algoritmul de sortare, prin metoda selectiei directe - timpul de
1
n X(~ - I) = n -~ '
in functie de ordinul de comp lex itate, exista urrnatoarele tipuri de algo ritmi:
Ordin de
complexita te
O(n)
O{n
O{k")
O(logn)
Otnloqn)
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.
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
b.
c.
d.
e.
f.
g.
h.
Tipul
algoritmul ui
Liniar
Loqar itrnic
Logarilmic
Polinomial
patratic
Polinomial
patrat ic
Infurm aticii
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 precizate intr-un sir de numere este 0 problema de decizie, iar qasirea modahtatii
de plata a unei sume s cu un numar minim de bancnote de valori date este 0 problema de
optimizare.
Pentru rezolvarea aceleiasi probleme S8 pot folosi mai multe metode de construire a
algoritmilor. Ali invata t deja ca - pentru rezolvarea aceleiasi probleme - puteti lolosi un:
-7 algo ritm iterativ ;
~ algoritm recursiv .
Solutiile recursive sunt mult mai clare, mai scurte ~i mal user de urmarit. Alegerea
algoritmului recursiv in locul celui iterativ este mai avantajoasa in cazul in care solutiile
problemei sunt definite recursiv sau daca cerintele problemei sunt formulate recursiv.
Timpul de executie a unui algoritm recursiv este dat de 0
0(1) pentru n- O
formula recursiva. De exemplu, pentru algoritmul de
T(n) =
calculare a sumei primeior n numere naturale. functia
0 (1)+T (n.1) pentru n,.O
pentru timpul de executie este prezentata alaturat, unde
8( 1) reprezinta tirnpul de executie a unei ope ratii elementare de atribuire a unei valori
sumei . Rezulta ca T(n)=(n+1) x0 (1), iar ordin ul de complexitate a algor itmulu i este O(n) la
l ei ca si cel al algo ritmulu i iterativ, i n cazul irnplernen tarf recu rsive , lieca re apel al unui
subprogram recurent tnseamna inca 0 zona de memorie rezervat a pentru e xec utia 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 algoritmului.
Tehnici de programare
Seop : identificarea prob lemelor pentru care trebuie enumera te to at e s ol utii le, fiecare
solut ie fiind forrnata din n eleme nte Xi, care apa rtin fiec are unor rnultimi fin.te Ai ~ i care
trebuie sa resp ecte anu mite c onditii interne .
Enuntul prob lemei 1: Sa se ge ne rez e toate p etm utettte m ultimii {1, 2, 3}.
Cer inta este de a enume ra toate posibilitatile de gen erare a 3 nu mere naturale din
rnultirnea {1, 2, 3}, astfel i ncat numerele gen erate sa fie distincte (c on d itia in tern a a 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)}
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}
1~23
. , 1 2 ~ 3 J,
_1. r
3
-1
~
3
2
~'
2 3 .!. ffi
3 0 .!.
2
W
,
W3 @~
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
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 -1ea 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
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
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
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 coo rdonatele 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
sau
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}}:
12
~ 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 ~ +
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 - + )
c o utendl ;}
cout s L [ i } "
" .
13
Info rmatica
Num aru l de o rdi ne al
ele mentelor s olut ie;
an1
I
Xn
an 2
8i1
a i2
8ij
I I
....
X;
k=k+1
k= k-1
a21
a22
a 2j
82m
X2
a11
a12
a 1j
atm
x,
m/
Stiva - s t [k]
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.
{ 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
14
.. . bt(l) ;
'"
15
Inform atica
1.3.3.1. Generarea pormutarilor
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;
If;
ev = O;
while (a s && ! e v )
( a s =s u c c e s 0 r ( ) ;
i f {a s ) e v =val id() ; }
i f ( a s)
if (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 .
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.
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
d. sa fie desp artita - de vecinii pe care i-a avut in sirul initia l - de una sau eel mult p
persoa ne ; valoarea pentr u p se cites te de la tastatura .
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.
t5tiva st ;
v o id .i n.i t t )
( S L [ " ~ G;
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 ; )
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 "
i n t succ eso r{ i n t
(i f
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)
b r. , ; }
.1
".
{/ 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
k)
(s t[ i:]<rc.[k])
Ls r l k l c.s t I kl-e l r return I ; }
else return 0 ; )
i. " " ;
c r rc->: ] i i .:
;}
be
1) ; )
~i
18
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)
{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,) ; }
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 ;)
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 ; }
{ / / p a r c. e a
~ixa
v oi d main l)
{cout" n =";
a algor i tmelui }
c i n n ; bt. r Lj r }
Ob s e r va t i e. Caracterul escape
' \ b ' es~e c a ract0rul Backspace
($ terae u ltimul caracte r di~ $~r\
19
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).
"
' !
n}.
Implementarea iterative
#include < i o s t r e a rn. h ~
t yp e d e f i n t
stivu[lO O] ;
vo id .i n i t {I
{s t [}: 1= 0 ; }
int s i cee so r ()
{ ~f
'..
S t1 ',3
S :: ;
., r v : . ,
t s : 1-:
-+ 1; r eturn =- ; }
el s e r e t u r n o ; }
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 () ; }
{ .'
I ,: =,0 ::'
k)
.--1 ; r e t urn
; }
e l se return O ; }
k)
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~
vo i d !1",in
{c ou t" = " .
c o u t " m= ";
a:go~i
ffiJl_: }
cin r. ;
ci n rn; b t (1) ; )
21
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
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 ++ )
3.
4.
5.
6.
7.
8.
12
Afisarea
~
f{x)
13
~
f{x)
21
12
13
~
f {x)
23
12
2 1
-ilH+
f{ x)
23
31
1 12
31
32
12
32
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 ; }
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= ";
2.
Solu~ia
c i. n>'>: ;
c in n; b t:. ( ) ; }
Tc hnici de programarc
22
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.
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
{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 }
( 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:
Imnlemcntarca recursiva
#include < i 0SL ~ e am . h >
{fo r (int
i =l ; ~<:m ; ~ + +)
It.
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 ~,~
~~~~
23
Informutica
i }
24
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.
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
25
Implementarea recursiva
void init ()
{if ik ~ ~ll st
else st
void .i.n i. t; (i n t k)
(if ( k ~~ l ) st [ kl ~ D ;
else st [k l~s t[ k - l
l kJ ~O ;
[ kl~s,_ [k - 1 J - l; )
int su c c e s c r ()
{if
s ~ [ k lendl;
s -~ s t [ k j; )
( 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 ! ; }
void bt : i n t
void bt ()
{/ / pa r t e a
fi x~
al goritmul ui }
void ma i.n ()
{cc u t.c".n> ";
l -l ; )
i nt succe s c r (i n t k )
{if ( s t Lk l c nv s )
c i. noc- n :
bt() r I
( / Ipar t ea
k)
fix~
void rna i n ( )
(cout" n =!l i
a al g o ritmul u i )
c i. ncc- n ,
bt (l j ; }
A!go ritmul de generare a tuturo r partiti ilor unui nurnar natural poa te fi folosit 'Ii in alte
probleme. De exemplu , gc nerarea t utu ror post bitl ta ti lor de p lata a unei sume cu
ba nc no te de va lori date.
Problema se reduce la gene rarea tuturo r partitiilor unui nu- 25 = 5+5+5+5+5 (01=5)
mar natural nenul s u m a, a partitie fiind 0 descompunere a 25 = 5+5+5+10 (01=4)
numarului suma in surna de m numere naturale, nenule , cu 25 = 5+10 +10 (01=3)
valari apartinand rnultim ii A={a1,a2, _.., an}. Alaturat, sunt
prezenta te toate partitiile sume i 25 pentru bancnate cu valori apartinand rnultimii A={5, 1OJ.
Fala de problema anterioara , apar urrnatoarele modificari:
-7 Deoarece suma suma se descompune in valori precizate , apartinand rnultimii A ,
aces te valori se memoreaza in vectorul a, care are lungimea loqica n (numarul de
valori ale banenotelor) .
-7 Un elem ent al solutiei este indicele valori i bancnotei din vectorul a, adica un element
din multimea {1 ,2, , n} .
-7 0 solutie a problemei va fi fermata din m elemente , alese astfel l ncat suma valorilor
bancnotelor corespunzatoare lor sa fie eqala cu nurnarul suma. Altfel spus: solutia se
obtine atunei cane surna s=a[st[1]] +a[st[2]]+ .-. + a[st[k-1]]+ a[st[k]] are valoarea suma .
26
Tehnici de progra ma r e
Co n dit ia de co ntinuare este ca suma valorilor termenilor qenerati, 5 , sa fie mai mica
sau eqa la cu surna (sss u rna). 0 sclutie cornpleta obtinandu -se atunci cane s=suma .
Atun ci cand S8 urea In stiva , S 8 adu na la surna valoarea bancnotei cLJ indicele k :
s t e e Est [k ) ] , iar cand S8 coboara i n stiva, 58 scade din surna valo area bancnote i
cu indicele k : s - =a [s t [ k] ] si valoarea bancnotei cu indicele k-1 : 5+ = a [s t [ k -1] ] .
-7 Deoarece este pos ibil ca - pentru anumite valori ale sumei suma ~i ale valorilor
bancnot elor 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
.---- -.../."0
27
Informat icii
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.
~i
";
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
1
12
(1,2}{3)
exemplu, nu exista solutia 1 3 3 deoa rece aceste valori nu apartin
(1,3}{2)
1
2
1
unei multirni de numere consecutive (nu se poate ca un element din
. {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
e lse re tu rn Oi l
r eturn :. ; }
[ k. l ~ O ; }
{ s ~ [ k l ~ sL [ k ] + l; r etur n
el s e re t ur n O; }
I ; }
28
Te hnic i de progrumare
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
. j
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: ) ; )
Solutia
Aflsarea
112
x j1 23
f(x ) 1 1 2
121
. x _-' 1 2 3
f(X)]1
122
211
221
21 2
221
21
1 23
f(x)
122
x 11 23
f(X)1211
x_J~
f(X)l221
~(~)- 11~;x /1 23
f(x) 2 2 1
29
Informatica
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
- -----_.-'----_.~-------- --...-,
" ;
ci n n; bt ( 1) ; )
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
parantezeJor - (=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
7
6
5
4
3
2
1
1 2 3 4
5 6 7
,................. ..
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\' ; }
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
1
4 ,3
3,5
4 ,5
3,3
2,3
5,5
1,4
2,4
2,1
1,5
16
21
10
25
2 20
11
24
15
22
3 17
19
12
23
14
18
13
4
5
4
i+2 , i-l
5
i+1, j-2
.....
;,
........... ................-- ..
........... ......
6
i-l , j-2
r..
3
i+2, i+l
2
i+ 1, ;+2
i,J
1:::::::::::::::::::: .........
1
i-1, j+2
,
7
i-2, ;-1
......
~a h
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.
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
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 .
33
lnfurmat icii
-) SUbprogra mul succesor () . Se cons idera ca mai exists 0 pos ibilitate de continuare a
cons truirii soluti ei pe niveJul 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
Te h nici d e p rog ra ma re
i f (.:i s )
i f (solutie ())
t i pa r () ;
else ( .: - T; initr) ; }
el se k - - ; } }
void main ( )
lint i ,j ; cout " n = " ; c in n ;
cout " l i .,i a de : o r n i r e "; c i n i ; s [::'j . x =i ;
cout " c o l o a na de parnire "; cin j ; st[l] . y=1; bt(l ;
if ( !es~e) cout " Nu e x is t a solucii " ; }
Observatie. Daca se dore ste numai afisarea primei solutii, cautarea solutie: se face
pana cand variabila es te trece de la valoarea 0 (nu s-a gasit solutie) la valoarea 1 (s-a
gasit solutie), rnoditicandu-se in subprogra mul btO conditia de terminare a cautarii tuturor
solutiilor trn loc de wru Le (k>1 1 sevascrie whi l e ( k > l && ! e stel ) .
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.
..., Xu
10-10---1
...
Illr(1!:!!m!ic"ii
35
a patrl cifra: 0
Est :
Vest :
cale ribera:......
prima citra: 1
crrra : 1
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
prima
~ J \ :~tra
a doua cifra
1010
1100
0101
0011
1100
1011
1010
1100
0111
0011
1110
0011
1010
1010
afra
a treia citra
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
--
Subp ro gram el e
7 Su bprogra mul i ni t
I
I
Ie
() .
Se initiatizeaza varianta
11 12 13 14
cu care se trece din patratul k-1 in patra tul k , adica elementul k din vectonul p : p [ k] =0.
37
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"
".
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
'
r-',--, ....
"' 1 -
~C
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
_ _
1
I' " "" 0 1
J 0 1
cl- .... I 0 1
"" ~ "" ~
f- -
-~
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..-!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
1--' -I .. ~ '-'
qa seste pe Ji nia 1 $i
'hHI+t
"b"b'H t t t~ +t+ *
o
,..
58
0
0
0
0
0
0
38
Tehnici de programare
2,2
2,3
5,4
6, 8
9 ,10
12 ,10
14,13
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
0
0
0
0
0
0
0
0
0
1
1
0
1
1
1
1
1
1
o1
ll- 1
o1
o1
o1
o0
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
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
#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: ;
return I ; }
int s o l u t Le I )
{return s t j k ]
. F~ l
I I s t[k ]
. x~~n
I t st [ k ]
.y~~ l
II
t j
k]
. y ~ ~ lll;}
void tipar ( )
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 ] ;
ca i n exemplul an terio r }
".
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,
------- ".-.....
40
Tehnici dc programarc
[ Sm.dJJiu de caz I
Seop: identificarea probleme lor care pot fidescompuse in subprobleme s imil are care
folo sesc rnultimi de date d e intrare d is juncte.
Enuntul problcmei 1: Sa se caJculeze suma elemente/o r dintr-un vector v cafe
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.
*.
41
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 . Lt.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.}
if
de vari abi le
!a c~le
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
-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
43
(v[s ]% 2 :; =;:O)
zev
l s l , e lse z .:;;.O ;
else
{d i v i z e a z a ( s, d, m) ; d e i(s, m,xl); ;d e i (m+l ,d, x2); cOmbina (xl , K2, z ) ;} }
vo id ma i n()
{i n t i,z ; cout c cvne ";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
..------""
s=l l-
1: - - 1
m=(l +2 )/2= 1
z12= zl+ z2=2+6= 8
;t
s=d=l l
1
1
zl -1 x2-2
"s=d=3
z3=3 x4=12
":
m=( 4+5)/2=4
;t
~
r--'--::-----,
5
s=d=4
z4=4 x5=20
s=d=5
z5= 5x6=30
1---~
2---l s=d=2
z2-2 x3- 6
44
Tchnici de p rogramarc
__ /
[l(~}] \
f 2 =1
1 1(3)
[Il~LJ
z=1+1=2 '-",. O ULJ =1
z=2+1=3 '-",. 0 (2) 1=1
1/
z=3+2=5
c::::illD
.........
z= 1+1=2 '-",.
0z=5+63=8
/
----..... LJillJ
z=2+1=3 '-",.
12
=1
1(1 ) 1=1
C 1(3)
- -j
1f [2['] =1
z=1+1=2
I 2 =1
D GLJ= l
II
n==2i
z=l;
Informaticii
45
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 " ;
l : e l s e if ( i = = 2) oou c c cvxv,
} }
47
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"
";
( 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
48
Teh nici de
pro ~ramarc
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,
~i
a irnplernentarii ei.
-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.
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
49
g ase ~ te
tint m:
if (d >s) {d ivizeaza(s,d,m) ;
z) ; } }
v oid main { }
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:
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 ;
1. Sa
X,
x,
x,
X;.,
X;
I X;. , I
I X, ., I
X,
Vectorul lnitial
Pivotul
-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"
51
I n fo rm at icii
PAS3.
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
a~b;
b~aux; }
1/ pivotu l fiind pe p o z i t ia
whi l e ( i <j)
{if
(x [ i ] > x [jj I
5 ,
parcurgerea i n e e p e eu indice le j
{ s c h i rnb (x [ i ] ,x[j]l;
scb i mb tp i
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
Tc h u ici d e programarc
i
Cn=3~ 1T
J
4
s=J 4
4
I 2 I 3 I 1 I 5 I 4 I
ij
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 ; )
j
1
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
53
k
k-1
k 1
k-1
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)
{v {k ] = x [ j l;
s, i n t
j++ ;
x [ i l ~ v l k j; }
d)
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); } }
k ++ ; }
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 ) ;
k 1
k1
k-1
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.
55
~
c:L~_-J
6
A
c>
3
...... :
,~
~
~ I
. _._ _Mi'
cI
r-L
-3=J
ir~ q~ ~
II
\ - 1-
la ell edo .
diseurij>(lij5' .
.....di>!!!lnalie
,~
~~
...
I
-L
56
in descrierea
57
Informatidi
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:
generator
(n=1)
initiator
(n= O)
nucleu
L ,X
2,Y2
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
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 Tn patru subprobleme, astfel (subprogramul Koc h ( ):
PAS1. Se genereaza prirnul segment, care este un segment cu lungimea L/3 si eu aceeasi
orientare cu a initiatorului. El devine initiatcrul curbei lui Koch de ordinul n-t .
PAS2. Se qenereaza al 'doilea segment, prin rotirea segmentului obtinut cu 60 spre 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
Pentru desenarea pol igonului, se construieste nucleu l (se genereaza cele trei laturi ale
triunghiului echitateral de lung ime L) si pentru fiecare latura se construieste curba lui
Koch de ordinul n (subprogramul n u cle u _ Ko c h () .
# inc l ude <.i o s Lr e a m. h >
# inc lude <mut h.h>
# include< gruphi c s. h>
int x, y;
fl o a t a lf a ;
v o id s r.e n o e ( f l o a t u nq h i )
{a l [<:1-1 <uraqh i. -J.: t,CP I I 18 0 . ; }
58
Tehnici de programare
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;
initiator
(n=O)
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)
4.
Sa
<:
generator
(n =1)
u- D
curba de
ordinul n= 2
nucleu
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 .
60
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) ,
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:
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 .
62
~ Subprogramul citest e () - pentru citirea date lor din fisierul text. in fisierul text, pe
~
~
~
primul rand este scris nurnarul de activitati n , iar pe urrnatoarel e n randuri - perechi de
numere intregi , separate prin spatiu, care reprezinta ora de i nceput ~i ora de sfarsit ale
unei activitati. Fiecarei activitati i S8 atribuie ca identificator nurnarut de ordine de la 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.
Or a de incepere
12
10
16
14
20
19
Ora de te rminare
11
13
10
12
18
16
22
21
~-
Ora de incepe re
10
12
14
16
10
11
12
13
16
18
21
19 ~
22
So lu tia problemei
3
Ora de in cepere
10
12
14
16
19
Ora de terminare
10
12
13
16
18
21
Ac tivitatea
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
63
void greedy ( )
l i n t i, j ; 3 [ 1] = 1 ;
L:
for {i =2 ; i< =n ; i+ +}
if
m=j ; )
la [ i].x> =a [s [ j] ] .y)
( j ++;
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( )
------.--..
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
void a Li s ea z a ()
{for ( i n t i=l;i< =m;i ++)
Iufurrnat icu
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
.IJI14
66
Tchnici de programarc
a,
181
r..
151
a,
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=
";
if
l i.L
'a
Ic[i)<OJ
wh i l e (k<n)
lj l : i
++ ;
j ++ ; }
mai
III furmatica
{ k+ + ;
67
c out
" )+";
e xp e e c l i ] *a [ j J;
else
{i =P i j = r ;
while (k<n)
{k + + ;
j - -; } }
3.
4.
5.
6.
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
68
-7 Subprogramul
Iso[ I s
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.
cite ste ()
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 :
(
t . e
t I nl
: gre e d y ( ); }
69
Informatica
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 .
-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
,i
distantele dintre ele . Automobilistul doreste sa opreasca la cat mai putine statii pentru
alimenta rea autoturismului. Scrieti un program care
sa
Nord
2
2
,jl. .
3
1
1
0
1
1
2
4
Suo
.r,
2
3
70
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)
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.
M u l~ i me a
datelor de intrare a reprezinta rnultirnea fermata din elementele sirului: A={a1, a2,
.. ., an} . Val oarea asocia ta unei solutii este lungimea subslrulul cres cat or. Valoarea
solutiei optime este valoarea maxima (Iun gim ca su bsiru tui tre buie sa fie ma xim a).
Solut ia prob lemei este data de un v ector S = {X1 , X2, .. ., xm}, unde XiEA . Prob lema poate
fi descornpu sa in subprobleme: subprob lema i este de a gasi subsirul crescator de lungime
maxima care i ncepe cu elementul ar. Restrictia impusa pentru solutie este ca elementul aj
cu care incepe subslrul sa alba valoarea rnai mica sau eel mult eqala cu cea a 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
72
Tc h nici d e p r ogramarc
!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).
73
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
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
rezo lva 0 subproblems de dimensiunea i folo sind solutiile obtinute in subproble mete cu dimensiune mai mica decat i.
T ch nici de programarc
74
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,
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)
={
: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 .
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
20
0
0
15
3
4
11
10
.s,
.z,
Matricea d irectiei de
doplasaro - p
void c.i t e s t e ()
{int i , j ;
f n;
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 }
76
rioare care in cep cu numarut aj, cu ar ::; aj
lungimea max ima.
kj , altfel
S8
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 eJementul 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
{
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 .
PAS2. Pentru urmiit oarele ele mente i ale vect oa
41~ -2 3
rulu i, Jungimi 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
-_.
6
~- -".-
4
2
....1-
77
I nfo rmaticii
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 );
f a [ i ]; f . c l a s e () ; }
v o i d ini t()
{ L [ n l ~l;
p[ nl ~ n ; )
void p _d i n a mi c a ()
tint L j ;
f or
(i = n - l ; i >= l ; i - - )
{ c [ i ] ~ 1;
for
if
p [i J~l ;
( j ~ i t l; j < = n; j + + )
(a [ i J<~a[ i J
{ L [ i]~ L [ j ] + l;
&&
L[i] < ~ L[ j J)
p [iJ ~ i ; } ) }
for
( i ~ l ; i< = n ;i+ - t)
78
-1
T(i,j )=
caca 1=0
{
.. 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 .
79
Info r m atica
UIiliIiliJ
al i)
in itial
10
-1
a{1)
-1
a(2)
-1
a(3)
-1
a(4)
-1
10
a(5)
-1
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 ).
to
( T [ O ] ~-l;
ma x e Oj }
80
vo i d
p ~dinamica()
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 ;
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
Ob ioc tu l
n =4 G=10
Greutatea
Profitul
Obi ect
10
20
20
20
20
20
20
20
20
20
20
40
20
40
40
60
60
60
60
60
60
50
20
40
60
60
60
60
70
90
90
45
20
40
45
60
65
85
85 105 105
Matricea C
Greutatca di sponibil a
-3 -
- --~ - -
- -
Mat ricea p
G re uta tea di s p o nlblla
Obiec t
1 2
r-r-r-r-r
5 6
Solutia
9 10
Obi ect ul
Gr eutate a
Profitut
45
40
20
2 4
T otal
115
82
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)
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.
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
{Odaca
L(i,j) =
... 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:
'I
c ij =
La;" x h"j
k=d
Timpul necesar pentru calculul mat ricei produs este determ inat de nurnarul de Inrnultiri
scalare : 3ikXbkj . De exemplu , pentru produsul A1 XA 2 XA 3, in care rnatricele au 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
84
85
In formaticii
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 .
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.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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.
Aleqeti:
1. Algoritmu l care implementeaza metoda backt rack ing este :
a. polinomia l
b. logaritrnic
c. expon ential
d. linia r logaritmic
2.
3.
4.
5.
6.
7.
d. liniar logaritmic
In fo r m a t ira
87
a.
88
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
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 ;
,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
-.
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 rnanipulata de prog ram prin inte rmediul unei varia bile de memorie e ste carac teri za ta
de mai multe at rib ute - pe ca re Ie prirneste in momentul in care este declarata in program :
-7 Nurnele- Este identificatorul folosit pen tru referirea da tei in cadrul prog ramului (in
exemplu - a).
-7 Adres a- E ste ad resa de memorie interna la care se aloca spatiu da tei res pe ctive , pe ntru
a stoca va loarea datei (in exemplu , da tei i se aloca ad resa adr in stiva siste mu lui).
Informatica
91
2 octeti
..
/
~
valoarea date;
lint
a ~ 100 ;
.. .}
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).
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
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.
t i p_ d a t a
II
*n u rne va r iabila ;
.,.
Exernp lu :
*p ;
in t *q ;
f l oa t *r ;
cha 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
adresa a une i 10ca\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 :
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}.
.--.
2 octet i
+V[O]~
adr
adr+2
adr+4
adr+6
adr+8
Exem plul 2:
04
.>:OI
a[O][
adr
linia 0
a[0][ 1] 1
adr+2
a[ 1][0]
adr+4
adreste
linia 2
linia 1
I a[1][1]
adr+6
4 0cteti
. ',.
linia 3
t~
z octeu
04~
I a[2][1] I
....
a12][0]
..
a[3][0]
d +12
a r
~I
a[ 3][11
adr+14
coloana 0 coloana 1
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
I
nume variabila de
memorie
(continut)
...
adresa variabila de
memorie
(pointer)
Exemplul1
int a =1 0, *p =&a ;
cou t p e nd l a e n d l ;
cout pendl \ u e n dl;
95
In forma tica
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
:1
2 octe\i
~ --adC=
2 Geteti
10
~0
Memoria interna
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 ccut-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
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 ;
/ / a fi$e aza 3
/I a ::i.'?eaza 3
Observatii
1.
,nt a ~10 ,b ~ 2 0 ,
*q= *p;
* p~ & a , * q= & b ;
II
II
( 1)
(2)
4
4
96
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
/~
v~riaDilei
~a~ 10 I
"p
adr_3
~~
20
q
b adr b
q
I
>
~~ 1O
*p
ad r_3 : *q=*p
,.~ tb
v
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 :
Ope ratorii
si & sunt operatori unar i si au prioritate mai mare deca t operatorii
aritmetici, relationa li, logici ;;i de atribuire.
I\:
4.
j/af':;;caz,'j 1 1
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 ;
r.emo r e t a in p,
cout a ;
5.
eo f cs
a *1
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:
97
._- _ ._ - - - <-> b-* +10;
<-> * p~ b ;
,-> ( *p )++ ;
<-> *:e-*~
<-> b ~ ( *I' ) * (~LL
<-> *p L 5 ;
a *-5 ;
memorie (in exemplu a);
-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).
----.... ......-.....
98
p== ( i nt*) q ;
afi~are
in~ern
in
20cteti
adr
20cteti
adr
...I i
.>
)'
: :e\y
:::et~L
..
2 octet i
reprezentat in vi rqula
1
a_/_'_ad_r_4~
.1 4
q
Exernpl ul 1:
c ha r c = 'A ' , *p;
p=&c;
:*\ar~abilei
~e
99
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 * /
1 -
Exe m pl ul 6:
.i n t; * q ;
q=O;
II pointerului q i
=out*q endl ;
/~nu
afi~eaza
ni~ic ,
q= NULL;
~ toru l C++ ca
100
a=b; a=p ;
;;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:
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
tip_ baz a . De exernp lu , incrementarea unui pointer catre tipul int va considera unitatea
~i
noua adresa se
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
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-
10 1
ln furmatic ii
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 }
102
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++)
" X i
e lse cou t " va l oa r e a " x " apare i nain tea valorii " y;
2.
3.
4.
5.
tipul
datel ~lcare se
retera vanabila de
memorie defi nita
j -\
&n u me v a r iab il a
Exemplu:
n u me v a r i a bi l a re fer ita i
numele vana:ei de
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:
103
In fo rmati ca
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.
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
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 "
1.
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
Refe rin ta tr ebuie lnit iallza ta c hiar i n m om entu l dec la rari i ei.
~ ExemPlu:
i nt
a , &~ ;
II Eroare : va r i a b il a
re erin~a
nu a f cst
ini~ i a:izata
104
2.
Dupa ce a fost lnitializata, referinta nu mai poate fi rnodificata (nu S8 mai poate
schimba adresa de mem orie la care S8 refera).
Exem plu :
int a=lO ,b= 100 ,&x =a ;
c ou ti-oc a-oc "
" Y. e nd l;
! faf i$eaza 10
10
x 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 ;
x=b ;
c ou ti-c-ca-c-c"
3.
Nu
S8
/ /afi$e a za 100
100
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.
Exemplu :
int
in t
fcre
in t
20 20
oou t.c-c a c -c"
I/afi~eaza 30
30
x-30 ;
p~r.z ;
"<x x-cc"
b~2QO ;
co u t c-ca -c-c"
/ln fi ~eaz 5
5.
20 2 0
" <c vp c -c''
30 30
"<c vqc-c"
"<c z-c-ce n c .l ,
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
105
Inform aticii
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 ,
65
13
13
A
B
&3""' temp ;
t e mp o r-a ra
&il )
{int
coc t.ccc-ccendr r i j
s b( a ) ; cout a; }
{ Q= 0 + 2;
a~ 2 ;
// 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 )
/ / a f .i$ e a za 4
//af.i:;; eaza 2
106
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.
//a fi$eaza 4
/ /afi -? e a za I;
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> ;
Informaticii
3.
107
in
[ 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
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
lI se c i t e s c de 1a
tasta t u ~ a va lo r i le v a ~ i ab il el c r dip.amic~
/ /folo s i te pen t ru coo r done t.e Le punc t e Lo .r a s i, b
CQut " c oc r d o flil Le l e puncct:! ui a - x : " ; cin -3 - >y.i
cout"
- y:
cin a ->y ;
cou t " c oc !"d o na t e l e pUrlc -c.:llui b - Yo : " - cin b - >x i
co o cc-c"
- 'J : ". c.i.noc-b - c-y :
/ /:::::::: ca Lcu LcazS va Loz u-e a va r i.ab.i.Lc.; di nam i c e fo Los.i t;e pont ru d.i st.e.nt.a
*.j =- sqrt (pow {a- > x - b - > x , 2 ) +pow (a- > y - b - > y, 2 ) );
! / 51? a ~i$ e a z a. va Loa rea va r Lab iL e L di. nami.c e 010 3 i t.e pent r u d t s uant a
c out" d i s t a n t a d i n t re punc te le a 3i beste " *d ;
I I s e c Li b e r ec zu z cria d e memor Le n Ioc a t a v e r i ab iLeLc r d i.n um.L c c (3)
d el ete i:J ; del ete b ; delete d ; }
Enuntul p roblem ei 3: So citesc de la Insta/ura n numero intrcgi cam sa mem oreaza intr-uo
vee/or. Sa se iovorsozo voctor ut in el insus! i sa so etiseze vectotul dupa inversare.
Se totoseste alocarea dinarnic a a s tructurii de date de tip vec to r. Pentru refer irea 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. ~ >
l i se
fo r
c ite~c
e lemen~ele
ve ctorulu~
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.
109
I II for m a ti cii
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.
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)
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 .
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~
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
o[O J
40
a[l ]
50
0[21
30
1 20
0[3]
0[4 ]
40
1---::5-:
0-
a[5]
a[6J
40
30
40
of7 ]
0[8 J
a[9J
Daca se doreste pastrarea datelor memo rate (capac itatile de transport ale rnasinilor din
parcul auto ) pentru prelucrarea Jor ulterior, S8 vor salva intr-un fisier text, de unde vor fi
restaurate in memoria interna intr-un vector, la fiecare prelucrare (executie a programului).
Observatie i n structur a de date folosita (vectorul), i ntre elem entele structurii exista 0
~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
...
30
Pre nume
Maria
Not a 1
Nota 2
Nota 3
Nota 4
...
...
10
...
...
10
Vlad
Miha i
...
...
Nota 5
...
Med ia
9,5
...
7
-7 La nivel logic - implementarea permisa de limbajul C++ a unei colectii de date omagene
este vectarul , fieca re lista de atribute ale unui elev fiind un element a l structurii. Pentru
implement area listei de atribute (care este fermata din date nea magene : nume le ~ i
prenumele sunt siruri de caractere , notele sunt numere intregi, iar media este un nurnar
real) se va folosi structura de date de tip inregistrare , fieca re atribut fiind me morat intr-un
camp. Pentru rezolvarea problernei se vor folosi urmatorii algoritmi: aigoritmul pentru
parcurgerea vec torului la memor area listei de atribute a fiecarui elev si la aflsarea med iilor,
algontmul pentru calcularea rnediei antmetice ,?i algoritmul de sortare a elementelor
vectorului in functie de valoarea unui atribut din Iista de atribute.
struct e 2-ev
111
Inform atica
7
La nivel fizi c - listele de atribute ale fiecarui elev vor fi memorate int r-o zona continua de
memorie inte rna, fiecarei liste de atribute alocandu-i-se acelas i spatiu pentru memorare.
Identificarea unei liste de atribute I n cadrul structurii se face prin nurnarul sau de ordine
(indicele), iar identificarea unui atribut din lista se lace prin numele carnpului.
:?i i n cazul
acestui exemp lu, daca se doreste pastrarea datelo r memorate (Iista de atribute
a fiecarui elev din ciasa), pentru prelucrarea lor ulterior, se vor salva intr-u n fisie r text, de
unde vor fi restaurate In mem oria interna lntr-un vector de i nreqistrari, la fiecare prelucrare
(executie a prog ramului).
~::;@9
nota[O]
I mL l
clasa[i } .n u me
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 .
L...::F--J
G:;J
Nive lul 1
...
Nive lul 2
Nivelul3
Nivelu l4
intr-o structure de date ierarh izata. datele pot fi grupate pe mai multe nive luri. Eleme ntul
a1 se gase ~te pe nivelul 1. El nu are predecesor, dar are trei succesori: 311, a12!iii an
care se qasesc pe nivelul 2. Elementul a12 are un singur predecesor (a- ) si trei succeso ri:
am . a122,i a123 Elementele a111 . a112, a121, a123,i a131 de pe nivelul 3,i elementele
a1221 si a1222 de pe nivelul 4 nu au succesori.
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
---
l ini a 0
'l
Matricca
Iinia 1
I a[O][O] I a[0][1J 1
L
lin ia 2
linie, care S8
Nivelul 1
linia 3
Nivelul 2
~
~I
\. I a[3][OJ 1a[3][1]
..
I a[1][0] I a[1][1]
N ive IuI 3
;---'a[=2]:7[0::::]'I-a"'[2"']["'
1]:0\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
r----;c~--,---------"i
Liniare
""
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 .
Retea
I II formuticii
113
...
...
Structuri implicite
Structuri explicite
Structura creata la ni vel conceptual nu este
lrnplernentata la ni velullimbajului de
compone ntelor .
.-
...
Structuri dispersate
Structuri contigue
.-
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
Vecto r i
Lis te
Implementarea
..
114
Criteri ul
Dispunerea
elementelo r
in me mo rie
Al ocarea
rnemoriei
Liste
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.
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.
Enunt uri le problem elo r pentru care trebuie aleasa structura de date si eoneeput elgoritmul pentru prelu crarea lor:
1. lntr-o bibliateea exist a colectie de eaf1i arganizale in ardinea alfabe tiea a autari/or. Un
canor paate imp rumuta 0 carte (se extrage 0 carte din co/eerie) sau poate inepoie 0 carte
(se inseteeze 0 carte in co/eerie). Toate aeeste operaNitrebuie exeeulate astfel ineat sa se
pestreze organizarea in ordine alfabetiea a au/orilor.
2. La 0 benzinerie s-a forma / 0 coeoe de esteptere. Ma inile sunl servil e in ordinea
venirii: prima 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.
115
I n formaticii
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).
.... W?,.e-
S8
S8
in functie de modul in care sun! aranjate eleme ntele i n lisla, S8 pot folosi metodele:
y.
.t.
nu m ai statica
i
statica
stati ca secventialii
- at ati ca inlantulta
nu
nu
otnamtca inlantuita
da
y.
dinamica
Ava ntaj ul alg o ritrni lor
de prelucrare
nu
da
da
116
Implcmcntarca st r u ct u r i lo r de date
Memoria
mterna
nodul 2
la adresa adr2
l--.----"zeta"
[jjfL1
nodul 3
la adresa adr3
nodul5
(ult im )
'
nodul 1 ( prim
la adresa adr1
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 este 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
Infor~atia
propnu~zlsa
.
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:! - '""
'b-e-ta-''-- 1'a"",
-- dr-'31
i " ama" l~dr4
1-'--,''-'a-:-,t:-a",,''---''a,d-:-r-::"
21
adr2
.......................:::::::::::::::::::::::
dr3
"zeta" !NULL
adrS
adr1
i..
"teta"
adr4
L ~
+.
;
[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
, <i n f o In > ;
, < i n f o 2n > ;
117
< 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.
- I
' --:L-;is-:te
- :7
1in-:ia-re-
."
."
."
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 circulara
Este 0 flsta in lantuita in
care elementul ult im se
leaga de elementul prim .
118
prim
info
ultim
I urm ~ I
II.
I
. f
In 0
I lI rm- 1
r.:::
info
urm
"--_---''-----J
info
INULL~
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
Informatica
119
prim
ultlrn
inf o
p
ij
info
@rnJ
G;3--+ info
] NULL ~
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)
p rim
ultim
info
urm ~
.......................................... ,
p ..
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
I,I!
, nl o
q->urm
q
p
ultim
I NULL,I
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.
r:.od
*& ul t i m)
q-c- u rur-p ,
i f
(1)
prim
I'_ _v 1_--'-_u_rm_ + +_
p
II
q- xurm
I NULLII
..
v2
ultim
I urm
(2)
p rim
I NULUI
121
In furmatica
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 }
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
122
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 ;
r etu rn p i }
u ltim
".
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
123
Informatica
Elim in area u lt im u lui nod
p rim
--
.....
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 ; }
124
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 ; }
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 ,
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 >
125
In fo r illa t icii
voi d
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)
{for ( nod * p =p r i m;
void main ()
p ! =NUL L ;
{n o d *p r i m,* q;
vn u m a
";
while (n ! =0 )
i. ncc-n
/ /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);
I/S~ caut ~
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
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
Informa tica
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 )
(ql ~O)
wh i l e
e lse
wh i l e
(q !=OJ
128
2.
3.
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.
[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 ( ) .
129
Info rmatic a
~ Se parcurge lista de la primul nod pana la sfarsitul ei si se afis eaz a inforrnatia din
fieca re no d - sub prog ram ul afi s are ( ) .
#inc lude < f s t r e am . h >
struct n o d t int i nfo ;
n o d * u r m;) ;
{nod
* F ~new
in t
fo r
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
cout-ocendf , }
{ d
L n c
.c -c
v z
n t
i . s
n c
t e v
c n
afisare(pr im ) ; }
numere: 1234321
12345.
Se vor crea doua liste: una cu cifrele nurnarului citite din fisier. prin adauqa re dup a uJtimul
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
~ 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 ( ) .
{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. Problema se descompune i n urrnatoarele
subprobleme, iar algoritmii pentru rezolvarea subproblemelor sunt irnplementati cu ajutorul
subproqrarnelor:
[i>] Se citeste
~ 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
131
* cauta {nod
ult~r.l ->urm=p ;
ult.i.m=p ; }
~p )
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
nod
f s t r e am
* u rm ; } ;
int n ;
delete q; }
{n=p->i n f o; q =P i
whi l e
{i f
(q! =NULL)
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:
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 () .
133
Inform at icii
~ Se citesc din fisier n2 ~i coeficientu l si gradul primului termen din al doilea polinom.
v oid
ultiffi~pr:n ;
pr i ~- > c = c ;
prim- >g=g ; }
*& u l t i ~ )
if
{p ! ~ NUL L )
whi le (p ! =NULL )
else
134
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 } ,
;
* & ~ l t im )
135
~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 ;
'*"
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.
o
Tenui
---
136
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.)
137
I II forma tid
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.
prim
info
-,-
I urm
I,
info
I urm~ r:
info
I urm
I'.
info
I urI"l
I
138
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:
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 ( ) .
139
Infor matica
p r i m- > u r m ~ NULL;
u l t i m=p r 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 Jistele se creeaza
asttel lncat ordinea de acces sa fie cea in care sunt citite numerele din fisier.
1. Sa se insereze , dupa fiecare nurnar divizibil cu cea mai mare citra a sa, valoarea cifrei,
~ i sa se elim ine numerele care au ultime le doua cifre consecu tive .
2. Sa se verifice daca num erele sunt in progres ie geometr ica si sa se afiseze primul
termen al progre siei geometriee. (Observat ie. Daca numerele sunt i n progresie 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
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
struct nod
lint .info ;
nod * a n t , *u r m; } ;
nod " p r i m, - u l t j-n , *p;
//irlforma~ia
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
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 ; }
141
lufnrm aticii
Adauqarc a in in tc rio ru l liste i
[ p rim
I- . . -f~-{~J-+B ..- 1 I
ultim
{n o d
i f
p -> in f o= x ;
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 ; }
*p~ n e w
nod ;
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 ; }
142
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
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;
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 ;
vo i d ada uga_dupa(n od *p )
{ ~ od
adauga_ult L~{ultim) ; }
{for
c o ut
p~ > i n [ o "
" ; c ou t end l ; }
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
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
while (p ! ~NU LL )
if ( 5) {r +=-p- > i n f o;
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.0 .
nitial izarea s ti ve i
in acest
146
varf
S8
var.f~p ; }
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
147
Informatica
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.
..
oes c arc a
consulta
1
stiva
....
Inca rc a
varl r
stiva de rezerva
- 3
W
- W
stiva
Iv arl
[~_3:Jva rl
3
2
varl r
stiva de rezerva
varl_r= NULL
stiva
stiva de rezerva
Problema se de seomp une i n urrnatoarele subprobleme , iar algoritmul de rezol vare a unei
subprobleme este imple me ntat cu ajuto rul unui subprogram:
rP1l
Se creeaza stiva cu numere le citite din fisier (nodul ve r -f) - subprogram ul c rea re ( ) )
Se descarca stiv a Intr-o alta stiva (nc dul va rf r ) pan a la penu ltimu l nod (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 () .
s t r u c t nod {i nt info ;
nod * u rm ;} ;
148
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.
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 .
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
para~
150
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
2---l.--,,----,---=---,---,,--,---=nSUl~~
~
cap
coada
baza
ocscarca
eap =NULL
cap \ aza
desca rc a
coada de rezerva
coada de rezerva
C1IU
c aPJ
Problema se des com pune i n urmatoarele subprobleme, iar algo ritmul de rezo lvare a unei
subprobleme este imp lementat cu ajutorul unui subprogram:
[E1J Se creeaza coa da cu numerele citite din fis ier (nodurile cap :;;i baza) - subproq rarnul
creare () .
~ Se descarca coada in tr-o alta coad a (nodurile c ap _ r sl ba z a_ r) pana la nodu rile care
trebuie elimin ate - subproqra rnul de scarca 1 () .
Se ex trage nodul sau se extrag nodu rile din mijlocul eozii - sub prog ramul extrage () .
lE1l Se descarca res tul nodurilor din coada (nodul c ap ) in eoa da de rez erva (nodul
ba z a r ) - sub proqrarnul de s c arca 2 () .
~ Se seriu numerele din eoada de rezerva (nodul c ap r ) i n fisi erul text - subprogram ul
s a l v eaza ( ) .
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 ++ ;
151
I II forill a tiea
while
( f l x)
{ a d a u g a (baz a) ;
n ++ i } }
(n%2==O)
~ , " " ~
Tem
_152
_ _ __ _ _ _ _______ _ _ _ --'-Ir:.:.:
" I'l cl11 ellta fea Sl f llet IIfilllf de dal e
sa
S8
* 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.
co u t
p - > i~f o ;
3.
0 lista simp lu in lantuita contine, i n ordine . urmatoa rete nodu ri: 1 - ) 2 - ) 3 - ) 4 --t 5
- 6 -o 7 ~) 8. Ce se va afisa i n urma executie i urrnato arei sec vent e de program?
for {k =O,p::.:;prim;p->urm !::.;;NULL ; p~p->u rrn) if (p -> i n f o%2) k += p->i nf o ;
cout k;
4. Ce se va afisa i n urma executiei urrnatoarei secvente de program , daca lista sirnplu
inlantulta conf ine. in ardine , urrnatoar ele noduri: 1 - ) 2 - ) 3 - ) 4 - ) 5? Dar dac a
naduri le ei sunt, i n ord ine: 1 - ) 0 - ) 3 - ) 0 - 5?
f or (p =p r i m; p-> i~f o!= O ;p=p -> u rm : ; c out p - >i n r o;
5.
Ce se va afisa in urma exec utiei urrnatoarei secv ente de progra m, dac a lista sirnplu
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?
inlan~uita
f or ( ~ = O , p = p r i m ; p - > i n f o ! = O ; p = p - > u rm )
Informatica
153
k++;
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:
1.
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.
r -c- urrn-iq .
p ->unn=r ;
a.
7.
154
8.
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 ;
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
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 )
q;. ; p-
c.
v f - c-u r me e Nu L l,
d.
vf ~ ~O
Informati d
157
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
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
~i
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, XJ 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 .
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.
Irnplernentarea strueturilor de da te
160
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 .
~.
~. 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
-j-
n-rri-nt:
srminoloqre
161
In fo rmatica
-7 Numim noduri adiac ent e orice pereche de nodu ri care forrneaza
0 muchie - {Xi,Xj} EU .
Fiecare dintre cele doua noduri (x, ~ i Xj) este nod inc ident cu muchia Uk = [x;,Xj] .
-7 Nodurile vec in e unui nod Xi sunt toate nodurile Xj care sunt adiacente eu el.
-7 Se nurneste nod ext rem al unei muchii oricare dintre cele doua nod uri care S8 gasesc
la capatul muchiei . Nodurile Xi ~ i Xj sunt extrernitatile much iei [Xi . Xj].
-7 Se numesc rnuchi i i nc iden te do ua muchii U j 9i Uj care au 0 extremitate comuns nadul Xk.
Un graf neari entat G este definit de 0 pereche de rnultirnl:
rn ult irnea nodurilor sale - X ~i rn u lti rnea muchi ilor sal e - U. EI poa te fi con siderat ca
o rnultirne de noduri din care unele pot fi unite doua cate doua printr-o muchie.
0"
Nodul xi al grafulu i G
~
~
Teorema 1
Daca graful neorientat G are n noduri (x " X2, ..., xo) , atunci nu m arul total de grafuri
neorientate care sepot forma cu aceste nod uri esteg:
(J= 2c~
162
[1,3],
[2,3].
[1,4],
[2,4].
[1,n]
0- 1 sub mulpm i
[2,n]
0-2 submulturu
[0-1,0]
1 sub rnuhirne
n x( n - I)
2
C'
"
1' da ca [x.y]
f( { x.y l)=
unde b=2:;;i a=
{ O. caca [x ,yJ e. U
C~
4.
Go 5.
6.
7.
~
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
8.
C;'~J'
/\
Fig. 3
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) .
163
Exemplul1 :
G4,
Exe mplul2 :
Fie graful G5=(X S.Us), unde X s={1 ,2.3,4,5,6.7,8} si Us={[1 ,2J, [1,5], [2,3], [2,5J, [3,4], [3,5J, [4,5], G, .,,",,"
[4,6], [4,7J). Din lista much iilor unu i graf neorientat , putef preciza urmatoarele inforrnatii:
-7 Determinati gr adul unu i nod - nurnarand de cate on apare eticheta nodului i n lista de 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).
Xk ,
-------------- .-----.. 1. in g raful G 4 : precizali gradul nodu lui 3 ~ i identificati nodu l cu gradul cel
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
i: d( 'J ~ 2 m
;,- 1
Dem on stratie. Fiecare muchie Uk = [xj, Xi] coresounde unei unitati din gradul nodului Xi ~i unei unita\i
din gradul nodului Xj . Rezulta ca fiecare muchie contribute cu 2 unitati la sum a gradelor.
Exemplu . in gratul G 4 : d(1) + d(2) + d(3) + d(4) + d(5) + d(6) + d(7) + d(8) + d(9) + d(10) +
d(l l ) = 2+2+3+2+4+1+2+ 1+1+0+0 = 18 = 2x9 = 2xm
... Propozltla 1. Pentru orice graf G , nurnaru l nodu rilor de grad impar es te par.
Demon st ratie. Suma gradeJor nodurilor fiind un numar par, aceast a surna trebuie sa contina un
numar par de termeni care sunt numere impare.
164
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]
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.
,}
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 .
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.1OJ. [6,7J , [6,8J, [6 ,9], [6,10).
[7,8J, [7,9J, [7,10), [8,10J, [9,10]}.
~
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
-7 Se numesc n oduri adia ccntc in graful G oricare din perechile de noduri care tormeaza
un arc - (X"X,) EU sau (xj,x,)e U. Fiecare dintre cele doua noduri (x, si xi) este nod
inc ide nt cu arcul U k =
[ Xii Xj]
sau cu arcul U k
=[ Xj , X i].
Xj sunt ex trem itati le arcului [ Xi, Xj]. Nodul X i este extrcrnitatea initial a a
arcului, iar nodul Xj este extremitatea finala a arcului .
Se numesc arce incidcnte co ua arce u, ~i Uj care au 0 extremitate com uns - nodul Xk.
Se num este suc cesor al nodului Xi orice nod la care ajunge un arc care iese din nodul
Xi. MUI~ime a succcsorilor nodului Xi este fermata din rnultirne a nodurilor la care ajung
arcele care ies din nodul Xi. Se noteaza cu S ( Xj) si se defineste ca multirnea:
S(x) = {Xi EX (X;, xj)e U}
-7 Nodurile Xi si
~
~
e,
166
Xj)
Xi S8
IUEU} .
noteaz a
S8
CU
U+(X i) ~j
noteaza cu
U -(X i)
S8
!?i
-7 Nodul sursa a l grafului este nodul care are rnultimea succesorilo r fermata din toate
celelalte noduri, mai putin el, jar mu ltimea predecesorilor sai este mul timea vida.
-7 Nodul destinatie al gralu lui este nodul care are multimea predeceso rilor fermata din
toate celelalte noduri, mai putin el, iar rnultimea succesorilor sai este rnultirne a vida.
Observatii
1. card(S(x))=card(U+( x)) ~i card(P (x ))=card(U"(x))
2. Pentru nodul sursa al qrafului card(S (x))=c ard(X).1 ~i card( P(x ))=O.
3. Pentru nodul destinatie al gralului card( P(x))=ca rd (X)- 1 ~i car d (S( x))=O.
4.
Daca un graf are un nod sursa , atunei nu poate ave a un nod destinatie, ~i inve rs.
Un g raf o rientat G es te d efinit de 0 per eche de rnulti m i : rnultim ea nodurilor sal e - X
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 .
~j
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.
~
' - Nodu l
Xj
Arc ul uk=[xi,X j] al g ra ru l u i G
al grafului G
Exemplu :
:;>
-7
-7
-7
~
2
5
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.
4
-7 Multim ea s uccesori lo r nodu lui 1 este fermata din noduri le 2 si 4. Nodul 2 este no d
s uccosor al nodului 1, dar si al nodului 5. Nodul 1 este nod succesor al nodu lui 4, dar ~i
-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 .
167
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:
g ='"
.~~I':'U
2
f(l x.Y I) =
U ~ i [y,x]
2, daca [x,y)
{ 1, oaca [y,x) E U
0, daca [x,y] e U ~ i [y.xj e U
1.
2.
(JF-
Fig. 6
~i
gra du l ex te rn .
Gradul intern al unui nod Xi al grafului G este egal eu nurnarul arcelor care intra in nodul
x, (arce de forma [x" x,)) ~i se noteaza cu d(x).
Gradul extern al unui nod Xi al grafului G este ega I cu nurna rul arcelor care ies din nod ul
x, (arce de forma
[ Xi, Xj))
Tcrrninologie :
-7 Se nurneste nod terminal un nod care are surna gradelo r eqala cu 1 (gradul intern sau
gradul extern ega l cu 1 ~i gradul extern , respectiv gradul intern, ega l eu 0 - d+(x,) = 1 ~i
d'( x,) = 0 sau d"(x,) = 1 si d+(x,j = 0). Nodul terminal este incident cu un singu r arc.
-7 Se nurneste nod izolat un nod care are surna gradelor eqala eu 0 (gradul intern si
gradul extern egal e eu 0 - d+(x,) = d'( x,) = 0). Nodul izolat nu este adiacent cu niei un
alt nod al grafului, adica nu se g as e ~t e la extremitatea niciunui arc.
Observ atii:
+ '
.
1. d (x)=ea rd( S(x)) ~ I d (x) =c ard( P{x)).
2. Daca graful are n noduri , pentru un nod sursa al grafului d+(x)=n-1 ~i d"{x)=O, iar
pentru un nod destinatie al grafului d-(x)=n -1 ~i d+(x) =O.
168
Exemplul 1:
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
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.
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
2
1
2
3
5
6
7
.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
0
.z, .,Jl._ 0
0 0 -~ 1
0 0 0 1
-,-::,-
7
0
0
0
0
0
8
0
0
0
0
0
--~-
0
0
- 1,-.s,
G ra fu l oriental Gg
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
0
0
1
1
1
6
0
0
0
0
1
0
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
171
Inform aticii
Exemplu
Se considera graful din FIgura alaturata . ldentificati matricea de adiace nta a
gratului
a)
0
1
1
1
1
0
1
0
1
1
0
1
1
0
1
0
b)
0
1
1
1
1
1
1
0
1
1
0
1
1
0
1
0
c)
0
1
1
1
1
0
1
0
1
1
0
1
1
0
0
0
dI
0
1
0
1
1
0
1
0
0
1
0
1
1
0
1
0
2.
3.
4.
5.
6.
7.
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
adiacenta in fisier. Deoarece matricea de adiacenta a lost dectarata ca va riabila ql oba la,
elerne nte le ei sunl initlatlzate cu valoarea O. Pentru testarea programelor se lolosesc
gralul neorienlat G, ;;i gralu l orientat G, .
Gralul neorienlat Functia grad () se 10105e;;te pentru a determina gradul unui nod.
#include <= s L r e a m . ~ >
II.
c in r1;
f o r \ ~ = l; % < =m ; k T T )
" ; c i n i ;
c ou t e nd l " Nod u r i l e t e r mi n a l e su nt : It ;
f or {i = l; i <=n ; i ++ ) if (grad(il==l) cout i "
II .
sc rie{) ; }
Graful orlontat Functia g rad_ i n t () se foloseste pentru a determi na gradul intern al unui
nod, iar functia grad_ e xt () S8 foloseste pentru a determina gradul extern al unui nod.
# i nc l ude <f s t r-cer-. . h>
i n t a [101 [10 ] , n ,!n ;
fs t r e a m f ( " g :,- u f 2 . L: t", i o s : :ou t ) i
serie () ; }
";
173
[II fo rm aticii
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 + + )
: a [=- ; l i l .
f . c l o s e () ; }
for { i = ~ ; i < = n ; i + + )
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 ;
2.,]
q re fu l n ecr Len t a t. }
f or ( i = ! ; i < = n ; i ~ )
return v ; }
174
3.
{ j ~ l; j < = n; j + + )
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.
4.
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++ ; ) ) )
175
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 () ; .. .
}
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).
~i
_ { L JaCfI 1i. .i JE lJ
O. Jac" li. .i I ~ U
.I ' , J -
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
2
3
4
6
Proprletatile matricci de lncidonta a 7
grafului neorientat:
34
1
1
0
0
0
1
0
1
0
0
0
0
0
1
0
0
1
0
0
0
1
0
0
1
0
0
0
0
0
1
1
0
0
0
0
0
0
1
0
1
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
1
~
0
0
.s,
0
0
1
1
0
0
0
0
0
.s,
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.
176
2. Matrieea de incidenta are 2xm etement e egale eu 1, deoareee fieeare muehie este
incidenta cu doua nodur i.
i, J
a [ < ~ >]
S8
[ <m> ] ;
Gralnl orientat G,
Gralnl G,
2
3
4
5
Fig.10
1
r-'1
-1
0
0
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
Graf orientat
>[i][ k]
= 1 ~ i ' O][ k] = 1.
177
Informatica
.
..
~.
Grafneorientat
Graforientat
Nodurile adiacente nodu lui i sunt date de
=1 ~ i aO][k ] =1,
~i
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.
f e ndl ; )
178
int g r a ct (i n t
i)
lint g=O , k;
f or ( k= l; k< =m; k ++ ) g +=a {i ] [k] ;
return g ; }
v oid main ()
l i n t i ,j ,p , r.;
c out.cc vn uma r de n oduri " ; cin n ; couexc vn umar de rau ch .ii. " . cin m;
for ( k = l; k < ~~; k + + )
io t serie ()
if ( a[ i] [k j
ee
L} g++ ;
return g ; }
int grad_e xt (i n t i)
(int
g~O ,
k,
for ( k ~ l ; k < ~ m ; k ++ )
if (a[ i]
[ k} ~~ - l)
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 + + )
It ;
cin i;
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 ( )
void succ( i n t i)
{for (int k=l ik<=m ik++)
fo r (i n t j ~l; j < = n ;j ++)
if ( j ! = i && a[ j] ( k J = = l ) s lj J= ] ; )
if l a [ i] ( k]=.= - l)
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
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
&&
( s[j]= ~ l
cin z ; c i t e s t e () ;
sunt nodurile " ; vecini (x ) i }
" X"
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;
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 ++ )
{ 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 .
end l ;
Graful orientat
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 ;
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 ++ ,
~t
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 ()
181
Informatica
Graful neorientat
for
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+)
f 2 e n d l ; }
f2 . clos e () ; )
void main ()
Graful orientat
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+ + )
if (b[ i] [ k] ==l I I b [ i ]
[ k ] ~ - l)
x=l ;
x~i;
if
(b[i] [ k ] == l) y=i ; }
.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
-7
183
I n fo r m at i ca
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
2
3
1
1
1
2
2
3
3
Graful neorientat G 1
3
4
4
- -- - - - - - ---"------ - - - - - -
lmplementarea cu matrice
o
1
......!.... 2
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
Graful orientat G,
Im pJeme nta rea cu vector de inregistrari
Arcole
~
Exemple :
Daca implementarea se face folosind matricea, atunci pentru oriee muchie (arc) i, u [i ] ( 0 ]
":f:. u [i] [1] . Oaca implementarea se face folosind vectorul de 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
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 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
185
Informatica
[ lJ~~i)
g++ ;
return g ; }
void sc r i e ()
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 : " ;
If;
186
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 ;
. y ! ~p )
kH ;
187
Infor m a tica
vo i d main ()
{ 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 .
l.ista de adiacenta
2,3,4
1,3,5
1,2 ,4,5
1,3
2, 3
1
2
3
4
5
6
7, 8
7
8
6
6
188
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
...
L4
L3
L2
L1
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
L1
1 2 3 4 5 6 2
7 8 11 12 14 16 0
1 2 3 4 5 6 7
--
L2
,--L, ~
1
9
8
L3
L4
Ls
L,
3 4 5 2 5 3 6 8
10 0 0 20 0 22 0 0
9 10 11 12 13 14 15 16
-.,..--
----
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
lntorrnutic a
189
L3
Graful orientat G,
cap
234
2
S
C-1 J
>
1=U
J /
[JQ
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
S
8
5_U TIT iJ
Ls I
S8
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
_I
.~1 41fj
5
~s ic1
-t--f:II~--ITJI.O
5
Gr aful orientat G,
190
1
1
2
3
4
5
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.
Graf oriental
191
. - .
Info rm a tica
Graf neorientat
Graf orientat
(U Ollil EL,)
aradul nodului,
Din lista de adiacenta imptomontata static eu doi vectori puteti obtine urrnatoarele intormatii:
Graf ncorientat
Graf oriontat
(l Ol =;, 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.
(L01EL,)
(l !ilE L,).
Din lista de adiacenta irnp lernentata d inamic putet i obtine urrnatoarele inforrnatii;
Graf n eori entat
Graf o rio n ta t
192
Graf orientat
qradul nodului.
Muchia Ii.Il a grafului reprezinta nodul i ~ i un nodj
din lista ce are adresa nodului prim eQala cu L[i]
2.
3.
4.
6.
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?
,4.
193
Informatica
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, .
~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()
(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() ; }
".
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;
orientat
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
195
Inform atica
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,
~i
gralul oriental G9 .
n ,m ,L[ 3 ] [ 5 0 J, a [ l OJ [lO J ;
/Ipe nt r u gr a f u l neorientat
fs t r e am f l( " g raf 15 " , i o s : : i n ) , f 2 ( " g r a f 1 7 . t x t " , i o s : : o u t ) ;
//pentru gr a ful orie nta t
Il f s t r e a m f 1 ( "grafI6 _t xt " , i o s : : in ) , 2 ( "graf I8 . tx t " , i o s : : o ut ) ;
v o i d c i, t este ()
{int L j ; 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 + + )
Graful ncorientat
~i
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 + ~ }
{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)
c c v v e c Ln
i i.
nodc Lu
i.
" ;
g++ ;
r e t urn g ; }
It .
I nformati cii
19 7
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
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
201
Informa tica
(1) @
0)
Fig. 14
CD:0
~
Fig. 15
Teorema 6
Nurnarul m de rnu c hii ale unui grat neo rientat ca mplet , e ll n noduri (Kn), es te:
11 -1
111 = I1X -
202
ncmon st rat!e . Nurnarul de muchii cstc cat de numa rul de subrnultimi de 2 clemente care se pot
forma dintr-o rnultirne cu n clemen te, aoica m =
C/~
2. Se pot construi mai multe grafuri orientate com plete, cu n noduri , deoa rece dOU3
noduri x ~ i y pot fi adiacente In trei situatii: exista arcul [x,V], exista arcul [Y,x] sau exista
arcele [x,Y] si [y,x] .
Teorema 7
Nurnarul de grafuri orientate complete care
S8
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 .
~M~~
~~~~
Fig . 16
Obsorvatii
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.
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.
voi d c.l t e s t e t )
void main ()
{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]
[J J ~~O
&&
a[j ]
[ .l J ~ ~ O I
m++ ;
203
lnformatica
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:
111 - 1
mma\ =nl x -
SIIl
Numa rul de nod uri nl este partea intreaqa din radacina pozitiva a ecutiei de gradul II:
III = 1+ " I + Mx m ]
[
2
Pentru diterenta de muchii rarnase (m-mma x ) mai este necesar un nod, pentru a lega aceste
rnuchii de nodurile grafulu; complet care s-a fonmat. Numarul de noduri izolate este: n - nl - l,
#inc lude < i o s t r e am. h >
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.
~i
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
G,
!Ec:> ~
~~
Fig. 17
~'@
Graful partial
G, p
GI (I
204
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
Grafu i
partial
G 10P
Fig . 18
Teorcma 8
m
Numarul de grafuri partiale al e unui gra f c u m m u chii (a rce) este eg a1cu 2 .
Dcmc nstratle. Grafurile partiale se pot obtine: tara eliminarea une! much ii (arc) - obtinandu-se
gratul initial; prin elim inarea unei muchii (unui arc) - obpna ndu-se grafurile partiale cu rn-1 muchii) ;
..: prin elimi narea a m- 1 muchii (arce) - cbtinandu-se grafurile partial e cu 0 muchie (un arc): ~i a
tuturor muchiilor (arcelor ) - obtinandu-s u un graf partial numai cu nod uri ~ i rara rnuchi i (arce), adica
gratu l vid:
Numarul de grafuri partiale care se pot obtine cu m mucnu (arce):
em,"
cm - l
'"
'"
(,m -~
Nurn arul de gra fur i parti ale care se pot obtine cu 0 muchie (un arc ):
cl
rara
+ .. + C~l1 +
C:
1
'"
2'''.
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
partial, Deoare ce grafu l partial poate avea p much ii (O,;p,;m), se va apela repetat
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~ . ~ >
205
III fo r ma ticii
t int L j
1nx ;
for (i= ; < =n ; i + '~ )
; j < = n ; j + + } { f l a [ i ] [jJ ; i f
f or { =
m=~ / 2 ;
void
.c l os e () ; }
~ra n s fo ~mare(j
tint i, j , k = l;
f or
(i = l ; i < = n ; i ~ +)
for ( j ~ l ;
v o i d i n i t l)
j < i ; j ++ i
if
(a[ l ]
[j ] ~ ~l i
{b [ i ]
I k ] ~l;
b[j]
I k]~ l;
b+ ; II
{ 3 t [ k ] ~ 0;}
{if
{ s t [ k ] = s :: [ k ] 1-1;
i n t va li d i l
{i f
fo r
( k>:
(i n t
&&
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
i=l ;
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
f or l l = l; i < = p; i ~ + )
{for ( j ~ l ; j < ~ n; j ++ )
cou t c c'" ,
c o ut endl;}
v oid b t I )
if
"; }
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 + ~ )
206
";
else cout" n u c ste gra f p artia l " ; J
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 ) ;
207
lnfurm utica
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 '@
cifiJ
(; "
Subgratul
G ts
Fig . 19
2. Pentru graful arientat G lO =(X lO, U lO) . definit anterior, gratul GlOS= (YlO ,VlO) definit astfel: G
~ multimea nodurilor este Y1O={1,2,3,6,7,9,1OJ.
-7 multlmoa arcclor este V lO=([ 1,2], [2,1], [2,3], [2,6], [2,7], [7,2]}.
este subgrat al gratului GlO - figura 20.
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
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.
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 >
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 :
M u c h
" ;
fo r ( j = j + l; j < = Pi j + ~ ,
c c u
II
c-c
vA
c e
L e
"
f or { j = : ; j < = p ; ~ + ~ ,
pe ~ ~ ru
L c n
gra f ul o rie nt a t
I II form a tid
if (a l st [L ] ]
coutendl;}
209
[ s t li ] ]~ ~1 i
" .
210
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 ()
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
(alfstfi]] l s t l j l l e
if
{a2{i]
l I b[iJ [jJ=l ;
for ( i = l; i <=p; i ++ )
for l ; - I ; : < = p ; j ~ + )
else
(for
(j~
:=b[':'] [j.)
return
a; }
if (a2 s t I i
for ( i - : ; i < - p; i T ~ )
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
211
I II fo rmuticii
f2 p ;
for ( i = l ; i <=p ; i l t
'
f2 a 2[i ] [ j ] ; f2 . c l o s e () ;
{m=n; n=p ; n=H\ ; x=l ; }
for ( j ~ l; j < ~ p ; j ++ )
if
(p >n)
else x -=- O;
b t () ;
if (gasit)
if
~i
graful G,
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,
~
~
~
6
rl
L....(
G, c
~GrafUIcompleme ntar
0
c.,
(.;\
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
Gratul
G,o
Fig . 22
Scrieti un program care citeste din doua flsiere text graCi c.txt si
graf_2c.txt inforrnatli despre doua grafuri neorientate - si varian ta orientate
- (de pe prima linie. numaru: de noduri, apoi matricea de adiacenta) $i care
verifies daca unul dintre graturi este grat complementar al celuilalt graf. (Indlc at ie. Oaca
cele doua grafuri au acelasi nurnar de nod uri, S8 determine graful inter sectie, care va trebui
sa fie gratul vid).
213
Info rm atica
S8
X2 ,
12
S8
parcurg aces te muchii: [1, ,12], [1 2,13] , [13 ,14 ] , ... , [l k k ] . Fiecare pe reche de noduri succesive din
"l
Ian! reprezin ta pa rcur ge rea une i much ii. Daca exista L( x;,xj) , se spune ca nodul Xj es te
Xi .
Graful orientat
Daca multirnea nodurilo r unui gra f orien tat este X={X" X2,
x o}. un lant de la nodul 1, la
nodu l Ik - L(I, .lk) - va fi definit prin rnultimea L(I"I,) =[I 12, , I; , ... , Ik] , unde I;EX , pent ru
"
ca , oricare ar fi doua arce
orice i (1s isk). Arcele [1 , ,1 2 ] , [12,1,], [1 3 ,1 4 J, ..., [lk ] au proprietatea
"I,
succesive, ele au 0 extremitate comuns. La
defi nirea unui lant, nu S8 line cont de
oric ntarea arc el or , ci numai de faptul ca doua nod uri sun t legate de un arc .
Terminologie :
~ Lungimea unui lant reprezinta nurnarul de parcurgeri ale muchiilor, respectiv arceJor.
De exemplu , lungimea lantului L(I ,) este k-1. Daca a muchie (un arc) este parcursa de
"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
terrnina lantu l (1, ~ i Ik ) .
~ Sublantu l este fo rmat dintr-u n sir continuu de nod ur i din lant. De exemplu , pen tru
lantul L(I" Ik)= {I 12 , ... , I" ..., I" " ', Id , L, (I" I,), definit astfel : L, (I;, 1,)= [1" 10+1, ..., 1" " I,l este
un sublant allan"tului l.
Exemple:
G 19.
1. Pentru graful neori entat G19= (X 19 ,U , definit astfel:
'9)
~ rnuttirn ea nodurilor este X , 9={1 ,2,3A ,5,6 ,7,8}.
~ rnultirnea m uc hiilo r este U 19 =([1 ,2], [1,5], [1,6], [2,3J,
[2,5], [2 ,6], [3,4], [3,6], [3,7), [3,8], [4,8], [5,6], [6,7J, [7,8]}.
L , (1,7)= (1, 2 , 3 , 8 , 4, 3, 6, 5, 2, 3, 7} este un lant lntre nodul cu elicheta 1 i nodu l cu 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.
214
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.
Muchii (arce)
Simple
Toate muchiile (arcele) din lant su nt
Neelementare
Compuse
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, 11, 12..... Ik, YI . oa ca tantul nu este elementar, el confine
eel putin un nod z care se repeta - exista i ~ i j , astfe l inca! I;; IJ; z: L(x,y)= {x, 1" 12, ..., lr. ..., 11_ "', Ik V}.
Nodul z apartinand lantului L(x,y), tnseerrma ca el este acces ibil din nodu l x, iar nodul y este accesibi l
din nodul z. l nseamna ca din tant se poate elimina sublantul care leaga nodul z de el Insus i: L(x ,y)= ~x .
11. 12, ..., Ii, Ij+1. "', Ik, y } in ace tas! mod , se pot elimina din lant , tcate sublantunle care leaqa un nod de
el tnsusi, obtinandu-se i n final un lent in care fiecare nod nu apa re decal 0 sinqura data , adica un lant
elementar.
Exemplu :
i n graful neorien tal G '9, lantul L ,(1 ,7) este un lant neelementar. Prin eliminarea din acest lanl
a sublantului {B, 4 ,3}, se obtine lantul {1, 2, 3, 6, 5, 2, 3, 7}, care esle un Ian! neelemenlar.
Prin eliminarea din acest lant a sublantului {6, 5, 2, 3}, se obtine lantul {1 , 2, 3, 7}, care este
un lant elemen tar.
215
Informatica
Tcorcma 11
Afi ~a rea
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 ()
216
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
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 >
3.
e Ier-enc a r ev r }
Ver ifi carea u nu i sir de et ichete de noduri daca Iorrnoaza un Ian! simp lu.
\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; };
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
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, ,13 ); [1,,1,) '" [13,I, J; ...; [I" I,l " [I,." I,J; ...; [I,." I,.,J " [1,., ,1 ,)),
in ca re extremitatile coincid : 1,=lk_
Un graf far a cicluri se nurne sts graf ac iclic .
Daca toate nod uriIe unui ciclu sunt distincte doua cate doua , cu excepti a extrernitatilor,
ciclul S8 nurnes te cic lu clcme nta r.
Exem pl e:
1. Pentru graful neo rientat G 19 :
~ Lantul L, (1,l ) ={1, 2, 3, 6, 2, 1) nu este un ciclu deoarece in Ian! se repeta muchia [1,2).
~ Lantul L s(1 ,l ) = {1, 2, 6, 3, 7, 6, l)=C, este un ciclu neelementar deoar ece se repeta
nodul cu eticheta 6.
~ l.ant ul Lo(l ,l ) = {1, 2, 3, 7, 6, 1)=C 2 este un ciclu eleme ntar deoarece nu se repeta
niciun nod .
l.antul L4 ( 1,1) ={1, 2, 4, 5, 2, 1} nu este un ciclu deoarece i n lant se repeta arcul [l ,2J .
l.an tul L5(1,1) = ( 1, 2, 5, 6, 3, 2, 4, l }=C, este un ciclu neelementar deoarece se
repet a nodul cu etic heta 2.
~ t.ant ut L6 (1,1) = {1, 2, 3, 6,5,4 , 1} este un ciclu eleme ntar deoarece nu se repe ta
niciun nod.
. G~
.. 3. Un circuit elec tric poate fi reprezentat cu ajuto rul unui graf orientat G 21 , i n care nodu rile
rete lei sunt nodurile grafu lui, iar sens ul arce lor este dat de sensu I ales pentru curentul
electric - figura 25.
~
"
R,
--.
11 I 12
R,
+' I,
E,
R,
R,
2
~ I,
E,
R,
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.
219
l nfo r rn a tica
Pentru fieca re nod din grat , se aplica teorema lntal a lui Kirc hhoff:
I'
2:1, = 0
k= l
unde peste suma dintre gradul intern si gradul extern ale nodului.
Pentru fi ecare cic lu din grat, se aplica l eor ema a doua a lui Kirchhoff:
"
2:E,
1;", 1
q
2:1,
x R,
1;= 1
Doua lantu ri - L 1={ 11, 12, ." Ij, ... , Ik.1, I k, Ii } ~ i L'1={I'1 ' 1'2, ..., ( i l " " I'k_1, I'k t I'd care au aceeas i l ungime k, formeaza acetasi ciclu daca ex is ta un nu rna r i ntreg
j , astfel incat li= I' (i+j) mod k+1, pentru orice i=1, 2, 3,... , k.
Exemp lu :
in gratul neorientat G' 9 lanturi L,= :I" I" 13 , I" 1, 1 = { 1, 2, 6, 5, 1} ~i L ,={ I " 12, 13 , 14 , I', ) = {2,
6,5, 1, 2 ) care au lungimea 4 , forrneaza acelasi ciclu. Se observa 1,=1 ~i 1,=1. Din (1+j)
mod 4 + 1 = 4, rezulta ca j=2. Verificam daca pentru acest j si pentru orice i= 2, 3, 4, exista
doua noduri cu aceeas i eticheta in ambele lanturi:
;=2 <> (2+2) mod 4 + 1 = 1; dar: 1, =2 si 1.,=2 => 1,= .1, .
i=3 => (3+2) mod 4 + 1 = 2; dar: 13=6 si 1,2=6 c> 13 =1.2.
i=4 c> (4+2) mod 4 + 1 = 3; dar: 14= 5 ~ i 13 =5 => 1, =13 .
In gratul neorientat G ' 9 lanturi L,= {I" 12 , 13 , 14 , I, ) = : 1,2, 6, 5, 11 ~i L ,=:;" I" 1.3 , 14 , I , ) = { 2,
5,6 ,1 , 2 } care au lungimea 4, nu forrneaza acelasi ciclu . Se obse rva 1,=1 si 14 =1. Din (1+j)
mod 4 + 1 = 4, rezulta ca j=2. Veriflcarn daca pentru acest j ~ i pentru orice ;= 2, 3, 4, exista
doua noduri eu aceeasi eticheta in ambele lanturi:
,
i=2 <> (2+2) mod 4 + 1 = 1; dar: 12=2 ~i 1,=2 => 12= I , .
i=3 => (3+2) mod 4 + 1 = 2; dar: 13=6 ~i ;'2=5 => 13" ;'"
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
void citeste()
void .i n i t Cl
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
221
Infonnaticii
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 ult imea nevida de drum uri D(di,dJ} .
-7 Subdrumul este format dintr-un sir cantin uu de nod uri din drum. De exem plu, pent ru
lantu l D(d d k)= {d d" ..., d, ..., dj , ... , dk:, 0, (d" dj ) definil astfe l: D, (d" dj) = :d" d,., , _
"
"
dj_1 , dJ ) - este
un subdrum
al drum ului D.
Drumul elementar este drum ul in care nodurile sunt distincte doua cate doua , Dru mul
simplu este drumu l i n care arcele sunt distincte dou a cate doua.
Exe m ple - Pen tru graful arientat Gzo.
-7 l.antul L,( 1,6) = (1, 2, 5, 6) nu este un drum dea arec e parcurgerea nu se face i n
sens ul saqetilor,
-7 l.antul L 8(1,6) = (1 , 2, 3, 6, 3, 6) = 0 , este un drum neelementar, deoarece se repeta
eli cheta nadurilar 3 si 6 - si campu s, deaarece prin arcul [3 ,6] s-a trecut de doua ori.
-7 l.antul L,( 1,6) = (1 , 2, 3, 7, 6) = 0 , este un drum elementar, deaarec e nu se repeta
nici un nod .
-7 t.antul L9 (1,6) = (1, 2, 4, 5, 2, 3, 6}= D, este un drum sirnplu , deoa rece nici un arc nu
a fost parcu rs de doua ori. dar este un drum neelemen tar, deoarece se repeta nod ul
cu etich ela 2.
Teorema 13
Daca un grat neorientat confine un drum intre doua noduri, x i
atunci, contine i un drum elementar, Intre nodu rile x i y.
y,
stiva [~OC] ;
222
void ini.t ()
{)
II.
cout xendl;}
( s t [ l l ~x ;
bt. () ; }
k=1
1
2
3
4
5
0
0
1
0
0
k=2
2345
1
0
0
0
1
0
0
0
1
0
1
0
0
0
0
1
0
0
1
0
1
2
3
4
0
0
1
0
0
2
1
0
1
0
0
k=3
345
1
0
0
0
1
0
1
1
0
1
0
0
0
1
0
k=4
2
1
2
3
~
1
1
0
0
1
1
1
0
0
1
1
1
1
1
2
1
0
0
4
1
1
1
0
1
5
0
0
0
1
1
1
2
3
4
1
1
0
0
2
1
1
1
0
0
-- - -
5
3---- - 1
1
1
0
0
1
1
1
1
1
1
1
1
1
1
1
0
0
~ - ~-
k=5
3
1
1
5
1
1
1
1
1
~ - - _ .
1
0
0
1
0
CeQ1 IQ
"
223
I n f orm al ica
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" .
{l i se
c i tc~ te
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
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.
224
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
~i
graf orienta t, cu deosebirea ca se tine cont de orienta rea arcului care lea qa dou a nod uri.
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 .
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.
Altfel spus, un graf este conex daca , pentru orice pereche de noduri {x, Xj}, care au
proprietatea XjTXj exista un lant de la Xi la 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}.
' - - "
I
6 \ _ ...
-7 rnult imea muchiil or este U23 ={[1 ,2J , [1,4J, [2,3J, I 1
"2 \
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
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.
,i
Teorema 15
Numarul minim de muchii
mmin
necesar e pentru c a un
cortex este n..... 1 .
g ra f
eu n
n o du r i . s a f l e
ca
ca
2x( n -2 ) +2 x l
2
n- t
227
Informatica
~
Un nod este legat de celela lte n-1 noduri. Exista un nod cu gradul n-1
IX( I1 - I) +(I1 -I)xl
Ill",;"
~i
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) - Gra ful G neor ientat, cu n noduri, este conex ~ i are n-1 muchi i.
(2) - Gra ful G neo rientat , cu n noduri, este aciclic si maxima l cu aceas ta prop rietate
Trebuie sa dernonstram ca (1)::::>(2).
1) Este acieli c - prin reducere la absurd . Presupunem ca acest graf confine eel putin un ciclu.
C= lX l , X2 , X3 , ..., Xi, x, f. Insearnna ca, daca vom lnlat ura din graf muchia [x - . X2], se obtine un graf
conex - nodul va fi legat de toate celelalte nodu ri din ciclu prin lantul L :;; ~X2 , X3, ..., Xi, x- } - ceea ce
cont razice teo rema anterioa ra. CEl un graf cu n noduri ~i n-1 muehii este eonex si minimal eu
acees ta proprietate .
2) Este maximal eu acea st a pr opriet ate (daca S8 adauqa 0 noca mue hie, grafu l nu mai este
aciclic) - prin reducere la absu rd. Pres upu nem
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 , pentru a obtine un graf partial eoncx aciclic , este egal cu m-n+1 .
n emon stratr e. Din Prop ozitia 6, rezutta CEl - i nlaturand din graf m-n+1 muchii - se obtine un graf
partia l conex , iar din Teo rema 16 rezulta ca acest graf este acidic. Graful fiind eonex , lnseamna ca
Intre oricare do ua noduri. Xi ~ i Xj , exista un lant elementar ~ i numai unu \ (Propozitia 5). Orice noua
muehi e [ Xi, Xj] adauqata va forma eu acest lant un ciclu elemen tar.
Propozitia 8 . Daca un graf are n noduri, m muchii si p compo nente conexe, nurnarul de
much ii care trebu ie eliminate, pentru a obtine un graf partial aeie lic , este egal cu m -n+p.
Demonstratie. Fiecare cornponenta con exa i
(1:s:i ~
p) va avea nj noduri
~i
m, muchii, iar:
228
;"'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'
II
I(m,- n + I) = I
i
j ", 1
II
Ill , -
In, + P = m- 11 + "
i=]
j "' l
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\
Dernon strati e - prin reducere la absu rd. Numarul maxim de rnuchii corespunde unor p-1
com ponente cone xe forma te din naduri izolate s! a cc mponenta conexa ferma ta cu n-p+1 nod uri.
Pentru ca sa se ab!ina nurnarul maxim de rnucttii. ultima componenta trebuie sa fie un graf comp let
K n_p care are nurr-arul de much ii m:
+,
(n -p ) x (n -p +l )
III
:::0
"--'-"-7'---'--"-
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,
+'.
229
Informatid
Exemple :
1.
Graful orientat G20 = (X 20,U 20 ) , detinit anterior, este un graf tare conex, deoarece exista
un circ uit elementar care trece prin toate nodu rile grafulu i: (1,2,3,7,6,5,4 ,1): altfel spus ,
oricare ar fi doua noduri din multimea X 20 , ele pot fi legate pri ntr-un drum .
2.
G'4
- -, -,
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
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
Fi g. 30
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"
n ,
fo r ( y ~ l; y < = n ; Y + - 1
{ v [ y } ""l; cout-ccy-;c"
" ;}}
coutendl ;}}
void main() t c Lce s t e t j componente () ;}
. .
,4
1
2
3
5
Impl cmentarca algoritmului. Se citeste din fisierul graf20.txt
1
1
1
1
1
1
matricea de adiacenta a unui graf orientat lii se determina
2
1
1
1
1
1
daca graful este conex. Oaca nu este, se afiseaza compo1
1
1
1
1
nentele conexe. in vectorul v S8 rnemoreaza nodurile care au 3
0
0
1
1
0
fast deja Inregistrate Intr-o components conexa. Functia 4
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
(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" .
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.
233
Lpe r ()
{e s t e = 1;)
// d a c3 ex ista
fo r ( i = li i <= n; i + + )
if
( v[ iJ ~~O)
voi d ma i n ()
II.
c s t.c l. ee s t e :
e ste2=este ;
c -cj c-; " " ; }}
{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
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
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
1
1
1
1
0
0
Matricea
1
1
1
2
1
3
4
1
1
1
2
1
1
1
0
0
3
1
1
1
0
0
4
1
1
1
1
1
5
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
0
1
1
0
0
0
1
1
1
2
3
4
1
1
e-!1
0
0
~
Fig. 31
1
2
3
4
5
2
1
1
1
0
0
3
1
1
1
0
0
45
0
0
0
0
0
0
1
1
1 I 1
G22t '~
234
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
I j ) ~a [ i ]
l le]* a [ k ] [j ] ; ]
t ran s fo ~ma ~ ( )
void cornp'onerrt e ()
{for (int i = l ; i<= n ; i+ +)
if
(v[i] ~=O)
[j ]~ ~l
&&
i != j l
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
236
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, 5, 3, 6, 8, 9, 7, 4
. it a t "1
{ 1, da ca no dul i a fast v izita t
I =
\'I ZI
inca
237
In f orma tiea
0
2
0
3
0
4
0
6
a~t e p tare
0
7
0
8
0
9
10
' ~~'"l-~"""""'''''---''
C
L...:..
1 -'-_ .,....,J_ _.l......~..L...--,-...L_--c.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
10
1
C
v iz itat
'
10
C
vi zi t a t
'
...
...
10
C
pri m= 3
e> ul t i rn= 7 .
238
viz i ta t
'--'--'--::--.J'---:--'--'--'-O--'--:--'_,O--'--:--'---'o----'
10
c
Prelucrarea nodului: prim=5
viz i ta t
ul tim=B .
'--'--'--::--.J'--:---'---'--'-o--'--:--'_,o--'--:--'_,,:-,
10
c
Pr elu c rarea nodului : prim= 6 e> ul t i m= 9.
v iz i ta t L--'---'----'----.JL--'-----'-----'-----'_-'----'-----=---'_,-'----L----=---'- '------'
c
10
c
viz i ta t '--'--'--::-~'---:---'---'--'-o--'--:--'_,o--'--:--'_,':-'
10
10
prirn-1 0 ::::::) ul tim-9 . Tcnninarc : pr irn> ul tim
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.
239
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:
"; c in k;
i n i t ( k) ;
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.
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
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 ~~
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
a u q
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:
Inform aticii
241
IT 1
1
0
2
1 1
0
3
0
4
0
5
0
6
0
7
o=J~-r-T'~T.-r===T
l nitializa rea stivei cu primul nod : vf-l.
1 1
1
1
0
8
0
9
10
1= = r_ :::J
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 0
9
1
1 0
9
1
2
1 0
1 -1 -0~5i
1 1
5
0
6
1 0
7
~C-=:J
0
8
10
J
10
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
1
1
1
st
vi zita t I
v i z ita t I
st
viz ita t
1
2
st
1
3
1
3
5
3
0
1
6
8
vizit at
C1 I
3
5
I
I
I 1 I 1 I 1 I
I
1
st
1
1
st
I 8 I
2
2
1
2
I
I
I
st
1
3
5
I
I
1
2
2
I
I
1t~1
I
1
st
v i zitat
LlJ
3
5
1
5
1
6
1
st
1
3
5
I
I
0 I 1
4
5
3 r--7
1
3
5
1
5
1 I 1 I 1
4
3
5
5D~
1
3
5
1
5
1
2
I
I
I
10
1
8
0
9
10
10
10
10
I
1
7
I
I
10
I~
e> vf=5 .
I
I
1
9
~ v f = 4.
I 0
I
::::::>
1
6
4
v f =6.
10
II~
10
::::::> vf=S .
1
6
I
I
1
3
5
1
4
I 3 I
1
5
I
I
1
3
5
1
4
I
I
I
I
2 I
I
Prelucra rea nodului: vf::::: 3
I
I
0
9
10
C1 I
st
v izitat
1
6
Prelucrarea nodului: v f _4
vi zi tat
10
6
5
7
3 ! 6 I 9 I
I 2 I
I
Prelucrarea nodului: v f = 6 c> vf= 5 .
0
7
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 .
1
5
0
9
st
5 I 3 I 6 I
I
Prel ucrarea nodu lui: vf=S c> vf=6 .
st
st
I 1 I 1 I 1 I
1
vizita t
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 .
::::::>
10
v f- 3 .
I
I
1
7
I
I
c> vf=2 .
10
243
vi zi t a t
1
1
1
1
4
1
9
10
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
st
I 2 1
st
whil e
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 ;
~
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 .
244
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. Jdentificarea 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 . }}
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
b.
c.
2.
in nodurile
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, Tn 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.
= {X,Uj pent ru
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.
247
In forma tica
3.
4.
1l'tJ$
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
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;
'{C' dac,aex. ista a muchie (un'.a.rc) T.,u. costul c ~i Ojntr~ nodurile i~i j, cu i *j
ai,j
.
'
.t:
.' ~ . '
.
"', daca nu exista a muchie (un arc) lntre nodurile i si j, cu i " j
= 0, daca 1= J
.. . .
.'
-- . ~
. "
..
>,-,.
. '.-.
.-
";,,
248
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
0
00
00
00
00
tipul de data asociat costului.
4
0
00
00
00
Exem pl u. Pentru gralu l ponderat G 27 din figura 32 matri- 4
5
2
2
0
00
00
cea costurilor minime este prezentata alatura t.
b) Matri cea costurilor maxime . Elementele
a i,j
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.
C.
249
a [ l OOJ ( 100 ] , n ;
if
( i ~ ~j)
a[iJ [jJ=O ;
els e ali] [j]=:'JAZ ; )
actuali zea z a ~atricea costurilor eu date:e d i n
fi~ier
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
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=2
34
co
0
5
co
'"8
2
3
'"7
1
0
co
'"
'"0
3
4
5
'"
'"
co
co
eo
co
0
2
2
4
3
3
0
5
eo
co
4
5
11 12
7 I 8
12 13
0 1 ",
2 I 0
k=4
2
2
3
4
5
co
0
5
9
'"
'"2
co
3
4
'"
co
4
0
5
9
k=3
345
3
'"0
4
5
11
7
12
0
2
12
8
13
17
0
k=5
3
3
11
0
4
11
7
12
5
12
8
13
17
1
2
3
4
5
1
0
10
15
19
2
2
4
0
5
9
6
3
11
0
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.
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 ,
Informa tica
25 1
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 :
functia procedu rala citire actuali zea za matricea costurilor cu datele din fisier:
~i
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
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.
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.
PAS1,
i
i
253
Info r ma tic a
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 :
.2
Vectorii
s
d
1
0
0
-3
4
~
.5
I co
1 I 0
co
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
""0
p
0
1
0
1
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
1
0
0
1
3
1
1
11
2
0
12
2
.2
.3
.5
1
3
1
1
11
2
1
12
2
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
Final:
Vectorii
s
d
1
0
254
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 =MAX; j<=n ; j++)
i f (s [jJ==O && d[jJ<m in!
s l y l ~ l;
{mi n =d [j J ; y~j ; )
for ( j ~ l; j <~ n; j + + )
if
[il!
{ d [ j l ~d [ Y J + a [ 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)
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
255
In forma tic a
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).
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
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.
Example:
,
,
,
,
,
B care sa Indeplineasca conditiile din definitie : A = {1, 3, ,
mult irnile A ~ i
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:
,
,
,
,
,
,
,
I
,,
,
1
,
' ,@
,
' @O' , ,
\
Obs erv ati e. Nodurile izolate pot face parte din oricare dintre cele doua
rnultirn i.
Fig .3 5
257
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 ~
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
258
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 >
l j ~ n;
wh ile
if
I j~~O I
e lse
a [ j] ~ ~ l)
{ a [ j J ~ O;
j-- ;}
po sibi l ~ O ;
{ a [ j ] ~ l ; k + +;
if
(k < ~ p ow (2 , n l - 2 1
tI
".
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 )
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).
fi ~i e r }
Informatica
259
{m=n;
while (m>O && x [ m ] ~ ~ l
i f (m==OI posib i l~O ;
(x[rn] =O; m- - ; )
e lse
{ x l m ] ~ l; k ++ ;
i f ( k <~p ow ! 2 , nl - 21
fo r ( i=l ,gas i t=l ;i <=n && gasit ; i ++)
for (j=l ;j<=n && gasi t ; j ++ )
i f (a[i]
[j]~~l)
rn~m! 2 ; )
260
{ c i t e s t e {) ;
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 CLIIJOate eostul deplasarii intre localitati.
Trebuie sa se stabileasea un traseu prin care sa se ajun ga in toate loealitatile, astfel incat
261
Informatica
costuf deplasarii sa fie minim. voieiorut va trece 0 singura data prin fiecare focalitate si
va tntoerce in locafitatea de pornire.
se
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)~
d ( y)~
d(y) ~ n/ 2 ,
ceea ce contrazice
262
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
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:
~
2
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
de
8
.
Fig.40
[ 1tuMjlju
GJi
cez l
Scop : exempl ificare a aplica tiei In care solutia problemei este un graf eulerian.
. .
Pro blema pod urilor d in o rasu l Konigsberg . ~
in acesl ores exist septe poduri peste della
.
teului Pregel care !oaga cele palru sectoare ale
'-.
00"'";''' ,"M,
s,
~," ~
...
~~~
. ~
.
~,
a\
,
"
~_
F' 42
Ig.
264
Tcorema 19
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
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-
G"
"i
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.
265
Inform atica
6. Verificat i daca graful necon ex G36=(X36,U36) cu X 36={1 ,2,3,4,5,6.7,8,9,10, 11) ~i U 36={[ 1,2], ~
[2,4], [3,4], [4,5] , [4,6], [5,61, [5,7], [6,7], [8,9], [8, 11], [9,10], [9,11], [10, 111 } poate fi facut
eulerian 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 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.rni n t ) {v t':"'_;}
267
p r .eLuc r-a re t)
k ~ st I v fl .
i~l ;
vizitat[iJ ~ ~l )))
i ++ ;
if
(p==n) ; }
v o id g r a d ( )
(k- l<m)
(for ( i = l, q ~ O; ~ <=k- l
&& q ==O; i
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
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 .
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 .
269
Informatica
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
1=1
i~ 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
"
i", )
1= 1
Dernon st ratie . d' (x,)' + d-(Xi)xd' (x,) = (n-1)xd' (x,) s! d-(x,)' + d' (x,)xd-(x,) = (n-1)xd-(x,) Scazand
cele doua identitati, obtinem d +( x/ - d- (x/ = (n-1)x(d+(Xj) - d- (xj)). Acunand aceasta identitate
pentru loate nod urile Xi obunern:
n
i- I
i- I
= ( II - I) x (L d' (\ , ) i -I
L d- ( \ ,
I- I
1. Derno nstrati ca un graf turneu este tare conex, daca si numai daca
contine un ciclu elementar care trece prin toate nodurile grafului.
2. Scrie ti un program care citeste din fisierul text grafJtxt matricea de
adiacenta a unui gra! orientat , i care verifica daca gra!ul este un gra! turneu.
3. Dernonstrati ca nurnarul de grafuri turneu care se pot eonstrui cu n noduri este
2c~ .
I SWWlLlL de CaLZ I
Scop: exemplificarea unei aplicatii in care soluua problemei este un gra! tumeu.
Enuntul problem ei. Pentru un concurs hipic s-au montat n obstaco/e. Pentru a parcu rge
traseu l concursutui, catarelii pot incepe cu orice obstacol. trebuie sa treaca peste toate
obstaeolele, iet de 18 un obsta col la altul pot citcute intr-un singu r se ns, stabilit inain tea
concursului. Sa se precizeze ce trasee poate urm8 un cetsret.
Obstacolele forrneaza nodurile unui graf orientat, in care fiecare doua noduri sunt legate de
un arc. Deoarece drumul dintre doua obstacote nu poate fi parcurs decat intr-un singur
sens, insearrma ca graful concursului este un graf turneu. A determina un traseu
pentru parcurgerea obstacolelor , tnsearnna a determina in gra!ul turneu un dr um -e ~ 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
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.
271
Informatica
2.7.10.5. Aplicatii practice
1. Graful miqratiei pas arilor cala toare este un graf bipart it, cele doua mul tirni fiind forma te
din locatiile din zona rece , i locat iile din zona calda . Verificati daca aces t graf este un
graf bipartit complet in caz afirmativ , ce conc luzie traqeti despre rniqratia specie i de
pasa ri studiate?
2. Consid erati ca graful din figura 39 reprezin ta graful oraselor prin care tre buie sa treac a
voiajoru l come rcia l. Adauqati fiecare i muchii distanta in kilometr i i ntre erase . Scriet i un
program care sa rezolve problema voiajorului comercial - care sa gaseasca traseul cu
costu l min im. lndicatie. Fiecare ciclu hami ltonian gas il (nodurile depuse in stiva ), va fi
memor at intr-o matrice cu n coloane, num arul de linii fiind egal cu nurnarul de cicluri
gasite. Alege\i din ciclurile gasite pe cel cu costul minim .
3. Jocul icosian a tost inventat de William Hamilton in anul 1857. Era un dodecaed ru 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 sa treaca tras eul; c) S8
Fig . 44
Fig . 45
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
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.
Infurmat ica
273
24.
25.
26.
27.
~i
Alaqeti:
1. Deterrninati nurnarul total de grafuri neorientate distincte cu 3 nodu ri. DOUEl grafuri S8
considera distincte daca matricea lor de adiacenta difera .
a. 4
b. 7
c. 64
d. 8
(Bacalaureat - Sesiunea special a 2003 )
2. Nurnarul de grafuri orientate care S8 pot construi cu 3 noduri este:
a. 8
b. 9
c . 64
d . 16
3. Numarul maxim de aree intr-un graf orientat cu 5 noduri este:
a. 5
b. 10
c. 20
d. 25
Urrnatorii 12 item i se refera la graful neorientat cu 8 ncdu ri si avand much iile [1 ,2], [1,3],
[1,4], [1,5], [2,3], [3,4] , [3 ,7J, [4,7] . [4 ,5).
4. Numarul de noduri care au gradul maxim este :
a. 1
b. 2
c. 4
d. 3
c. 0
d. 3
a. 1
b. 2
a. 8
b. 4
c. 2
d. 46
d . 54
d. 6
a. 4
b. 3
c. 6
a. 6
b. 3
c. 4
d. 5
d . 22
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
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
c. 3
b. 4
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
c. 4
b. 2
d. 3
d . 24
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
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).
a. 1
b. 2
c. 3
0
o1
1 010
0 1 0 1
1 o 1 0
d. 4
a. 3
b. 1
c. 0
d. 2
0 1
1 0
Inform atic a
275
TI
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.
a. 1
c. 3
d.4
(Bacalaureat - Sesiunea augus t 2005)
33.Se considera graful din figura alaturata , Deterrninati matricea de
adiacenta corespu nzatoare:
a)
b. 2
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
1
0
0
1
0
0
0
1
1
1
1
0
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
0
0
1 1 0 1
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
42.Care este matricea de adiacenta a unui graf neorientat cu 4 noduri, 2 muchii si eel
putin un nod izolat?
a)
1
1
0
1
0
0
0
1
0
1
0
b)
0
0
0
0
0
0
1
1
0
0
c)
1
0
0
0
0
0
0
0
0
d)
1
0
0
0
0
0
0
0
0
0
1
1
1
1
a. 4
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 :
a)
to
b. 3
0
0
0
0
0
0
0
0
0
b)
1
1
c)
1
1
0
0
1
1
d)
0
0
1
1
1
1
10
277
Infor matica
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 Figura alaturata astfel incat acesta sa devina neconex este:
.~.J\
a. 2
c. 3
b. 4
d. 1
S8
pot obtine
CU
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
0
1
0
1
0
a. 0
59. Stabiliti
a)
0 0
b. 2
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
I0 I I I I
1
1
0
IOl1TOl
I~ I -~T~-l
I I I I I
d. 5
278
a. 1
c. 4
b. 2
d. 5
63. Numarul de cicluri ham ilton ien e dint r-un graf compl et cu 4 noduri este:
a. 1
c. 4
b. 3
d. 6
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
putin un element
a. 7
c. 4
b. 8
d. 2
(Bacalaureat - Ses iunea august 2003)
65.Care dintre urrnatoarele fiqur i reprezinta un graf neorientat conex?
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
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
toate nodurile ;
un graf eule rian este un graf ca re contine un ciclu simplu care trece prin toate
muchiile:
c.
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
279
Informatica
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
1 0 0 1
1 0
o1
o1
1 1
1
0
1
1
1
1
0
1
1
1
1
0
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
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.
281
Informatica
-----------
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
c=)
6
Fig, 47
(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
<h. "",,"'c-
G ,~ .;:
w,
,c,'!.';:
,.
282
~i
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
ipoteza , rezu lta ca once muchie am ada uq a Ja graf, e l va contine un ciclu . R ezu lta ca prin
~i
~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 .
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
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
283
Inform nrica
lantului si prin adauqarea acestei muchii la lan t
definitia arborelui (graf aciclic).
S8
-------- -----.. 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] }.
0 40,: 0 "
, Jr
c.
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.
sa
sa
, W'
c::=)
Graful G 41
Teorema 22
Fig. 48
284
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
[ mdllll.ll. de caz )
Scop: ide ntificarea aplicatiilor in care se Iolose ste arborele partial de cost minim.
Enuntul probleme i . a retee de cetcutetoero este formata din 7 cetcutotoero server conoetate
intre ete si calculatoare cliont conectate ta servere. Unele servere pot fi tegate direct, enete
nu. Pentru ca reteaua sa tunctionezo trebuie sa se esiqure transportul date /or intre oricete
aou cetcutetoere server (daua servere trebuie sa comunice fie prin /egatura directa, fie prin
intermetiiut altor servere). Fiecare legatura onect dintre doua
2 10 4 2
setvere are asociat un cost de constructie. Legaturife care se pot
5
face intre servere i costume asociate acestor legaturi sunt 1 1 1
prezentate in figura 49. Sa se gaseasca a sotutie de construire a
8 3 }-- n--{
reteiei de calculatoare (de a lega setvetete intre ele) astfel incet
g
costul de realizare a retelei sa fie minim.
Fig . 4 9
0 0 retea de servere este un gral neorientat G" cu n noduri (i n exemp lu, n=7) , in care
nodurile sunt serverele, iar leaqaturile directe dintre doua servere, much iile galului. Gralul
este conex (oricare ar fi doua serve re din rete a, i ntre ele tre buie sa existe un lant care sa
Ie perrnita sa comunice intre ele). Gasirea solutiei optime de conectare a serverelor,
astfel tncat costul finan ciar sa fie minim , in seamna determina rea unui graf conex de co st
minim , adica gas irea arborelui partial de co st minim al grafu lui.
Observatie. Orice retea de transport (de calculatoa re, rutiera , de cale terat a, aeriana. de
teteco muni cat ii, de ca nalizare etc .) este un graf neorientat con ex. Construirea cu
costu ri fina ncia re min ime a unei asUel de reteIe se rezolva prin gasire a arbor eJui
partial de cost minim al grafului asociat retelei.
~
-<I*"t>-
285
S8
. 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
286
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-
se obtine arbo rel e partial de cost minim din figura 50 . Alg oritmul se
excuta as tfe l:
Ll st a muchiiJ or
Arborii pa rtia li
H;=({i},0 ) cu l $i$n
L[ i]
287
Infor ma tica
f4\-
~i
subprogram ele:
-7 functia procedurala c i tire creeaza lista muchiilor u prin preluarea datelor din
fi~ i e r
288
289
Informatic a
PAS?
{ j daca i ~ A ~i 3 j E A
o daca i = r sa u i it A
lI (i ) = { jdaca iEA, iar[i ,j ]E H
o
{
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 :
da
1 coac.._
1
0
0
2
0
1
d--
3
0
1
r - - - . . - -' 0---
4
0
1
VMA X
1
VMAX
0
1
VMAX
Hinil=({1),0)
min=5
j=2
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
H[2]=Q [2]
Q[2]=0
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
<3
---0
5
0
1
]=6
7
H[i]
0
1
1
3
0
Q[i]
0
0
0
0
1
Costul [i,Q[I)]
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
H[6]=Q[6]
Q[6]=0
4
0
2
10
min=9
Ivrtilx
min=?
j=4
2
Costul [i,Q[I)]
12
A rbore le partial H- ({1,2,3, 4 6),{[1,2), [1,3], [3,61, [4,6} i . ' X-A -- {5,7} - o m""
em
H[5]=0[5]
0[5]=0
1
0
0
2
1
0
3
1
0
4
6
0
H[i]
Q[i]
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]
5
4
0
6
3
0
7
0
6
"~
'5
min=4
]=7
[4,6])) . , X-A-{7} -> m=5
0
291
In formaticii
~
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+ + ; )
292
~i
co stuI co nstruirii ei
2.8.3. Arborclc
CII
sa fie minim .
radacina
293
Informatica
-7 lnaltimea unu i arbore este data de maximul dintre nivelurile nodurilor terminate
(Iungimea celui mai lung lant care porneste din radacina).
----,.--...... 1. Pentru arborele cu radacina A 1 din figu ra 52 precizati:
-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 .
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.
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?
-7
ca~i
subarbori are nadul rada cina - pentru fiecare subarbore precizati radacina;
A,
294
-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 l
B
Fig . 55
Fig . 53
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 .
rofuilill die
lCBl?:
~i
295
C contea za),
A
C
Fig , 56
.14
~.
-------
lipseste fiul
cu etichela 12
lipsesc fiii
cu etic hetele
112 si 113
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
sel
sel
s el
subco mpartimenl
11
subcompartiment
12
21 r $ef
compartirnent 3 1
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
cod, pret, Iunctie reenzet, costul esembletii, firma care a produce etc. Sa se determine
pretut produsului (figura 59).
Componenta 11
Compooenta 1
Componenta 2
Componenta 12
Componenta 13
,---~I
c omponents 3
,-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.
297
Informatica
1
3
2
3
3
0
4
3
5
1
6
2
.---0
A4
298
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.
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
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 1456 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
301
Inform a tid
in varful stivei se va memora perechea (NP, PFNNP) .
302
-)
-)
-)
-)
-)
-)
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+ + ;
II .
':::>~
A
.
~
~ . tcntic
~
Inform atica
303
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.
304
sa
~:n "i
Z,O'3
Fi g. 65
a.
Afi~a\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.
Afi~al i
~i
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 cu radacina
criteriul de clasificare folosit este
ord inul nodurilor
I)
1\
Arbori multicai .
Sunt arbori cu radacina, la care nu exista
limita pentru ordinul noduriJor.
Arbori binari
Sunt arbori cu radaciml , la care ordinul
fiecarui nod nu trebuie sa fie ma i mare de 2.
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 :
A,
Radacina
No durilc
tcnninalc
(frunze)
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. Tn arborele Ab1 succesorul stanq are un B
B
nod (B), iar succesorul drept este arborele vid, iar Tn arbore le Ab2
Fig. 67
succesorul stang este arborele vid , iar succesorul drept are un nod (B).
I \
306
Y1
= Y3f2 + X2
= Y2/2 + X1
Rezulta ca: N:: 1+Yk+Yk_1 + ... +Y2+Y1+YO= 1 +2 X(Xk+ Xk.1 + . . +X2+X1) :: 2xn+1
Fig .69
radacina
Fig . 70
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.
3
8
307
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.
....
7
Fig , 72
[ SmdlillJl. de
ClllZ
7J A,2
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
'"
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
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
+-
~,
-<3 ~~.1>-
,i
;1
~ + h + 7 x (:1 _
c- d
b)
Fi g. 77
Exista dou a metode de im plementare st at ic a a arborilo r binari (se folose ste arborele
309
Informati ca
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.
~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 lui unu i nod i - ind icele j pentru care s l m =i sau d rm =i ;
-7 etichetele liilor unui nod i - sl[i ] si dr[i] (daca sunt diteriti de 0) ;
-7 eticheta Iratelu i unu i nod I - st jj ] pentru d rm =i sa u d r jj ] pentru slm =i .
2. Folosind dci vectori in care se rnernoreaza filiatia nod uri lo r
-7 vectorul tata - in elementu l i se merno reaz a nu rnaru l de ordine al nodu lui 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.
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
. ..
nr~ . fr{ i n t
i)
if
(st[i]~~OI
if
( dr[ i] ~ OI
r-et.ur-n nr f
r-unz e t s t til) ;
else
{int r;
2.
3.
4.
5.
... }
struct
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).
311
I II fo rmaticii
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=" '- rt ::"11
4 INULL I.
nod *s , *d ; } ;
nod *r;
-----
Fig . 78
7 I N U L L I N U ~8..J-. I N U LL I
9 INULL INULL I
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 :
if
"; cin n;
r - >s =c r e a r e ( ) ;
r - >d=cre a r e ( } ;
r e t ur n r ; }}
312
vo id main ()
v o i d ma in ( )
{c r ear c t r'j
{r e cree rer j,
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;
int fru nz a (n od * r }
e1 sa r e t u r n y ; }
in t h ( n o d e r )
(if
(r ~ =NOLL) return 0 ;
els e
return 1+max(h(r ->s) ,h(r ->d)) ; }
Copierea unui arbore binar
{r l =c r e a r e ( ); r 2=cop i e {r l ); ... }
Afisarea etichetelor de pe un nivel
precizat
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 ;
(return r ->s==NULL
&&
r ->d==NULL; }
(r 2 = = NUL L ) retu r n 0 ;
el se retu rn
&&
ega l( r l ->s , r2-> s) &&
egal(rl-> d ,r2->d) ; }
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 )
313
I II for ma tica
Algoritmul RSD
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
Implemen ta re a dinarnlca
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; . . .
*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] ) ; )
v o id main ()
{ . . . s r d (r) ; c o u tend l;
. . .}
s r d (r->d ) ; } }
v oi d main ()
( .. . s r -d t r-j , cout e n d 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) ;
sdr {r -e-d} ;
void main ( )
( . . . sdr ( r ); c ou t e n dl ;
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
( f
r- > ~r"
11.
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;
314
void ma i n ()
{ . .. sa l v a r e ( r ) i
r e t urn r ; } }
vo id ma in()
{ .. _r = restua rare ( r ) ;
_. _ }
315
Informatica
Se nurnes te cheie un camp din inforrnatia utila a nodului care poate fi folosit pentru a
identifica unic noduriJe 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 .
Fig. 79
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.
At 4
.,
316
sa
Cau tarea nodului la care S8 va adauqa ca succesor nodul termina l ~i ce fel de succesor va fi
S8
S8
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
int n )
( r ! = 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;
317
l n form uticii
wh ile (r. ! =O)
( c r e a r: e (r , r:. ) ;
cout" Numa r :
whi le (n !=O)
{c r ea ze {r I n ; ;
c out " Nuna r : "; c i n n ;}
...
...
It ;
c i n n ; }
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:
-------- r-..
c.
1, 2, 3, 4, 5, 6, 7, 8, O.
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 ()
{
...
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
(
,
... }
.. .
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
min
..
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
PA51 .
PA52.
nod *c a u t a (no d *r ,i n t k)
{if (r=NULL
1 r ->nr=k)
nod
r e t u rn c ;
else
else r e t urn cau t.a {r -e-d , k)
void ma i n{)
k;
*r ,int k )
(r !=NULL &&
r ->nr ! ""k )
t int
* ca u ~ a ( n o d
{while
i ~
el se r e r -od ,
r eturn r ; }
vo i d ma i n ( )
t int k ;
' "
.. .
~~ ~
~
..
in urma acestor operatii de actualizare, arborele trebuie sa -si pastreze ca litatea de arbo re binar de ca utare.
319
I n f ormat i ca
(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:
e lse if ( r ->nr>k)
{if
( r!~NULL)
if (r ->nr ==k)r->frecv++ ;
else if (r ->nr>k)
inserare(r';">s ,k) ;
e ls e inserare(I: - >d ,k) ;
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
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.
p---. 5
q,---. l'
' 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
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.
321
Informatica
PAS?
Daca nodul curent are numai succesor stanq , atu nci , in nodul parinte.
adresa lui este tnlocuita eu adresa sueeesorul ui sau stanq, se eltbereaza
zona de memori e ocupata de nodul curent - si se revine la Pasul 3.
PAsa. Se cauta, In subarborele drept al nodului curent, primul nod care nu are
sueeesor drept, se copiaza inforrnatia utila din aeest nod in nodul eurent, se
elibereaza zona de rnernorie ocupata de nodul gaslt - ~i se revine la Pasul 3.
PAS9. Daca nodul curent are cheia mal mica decat k , atunc i se cauta nodul
care trebu le sters in succesorul crept: alttel , se cauta nodul care trebuie
sters In succesorul stanq. Se revlne la Pasul 3.
PAS10 . Daca s-a ajuns la arborele vid, atunci se afiseaza mesajul "Cheie nu existe" ,
Observatie. Transmiterea adresei de la nodul curent (care se sterqe) la parintele sau, se
face prin transmiterea prin referinta a parametrului eu adresa nodului.
void s t e r qe._n o d( n od *&r, no d *&c )
/ *58 ca uta in subarborele dr ept; &1 n odului c u ren t{ r ) p r i mu I. n od care
nu are sucCe s o r d rept (cl ~/
{nod *Pi
if
(c - > d ! ~NULL )
else
s t e r g e _ n o d J r, c - > d )i
t r -c-nr v c- on r.
u ti li.
di n
rrodu L
Tmclt -_ 11 _+1
....
2
322
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 =
2.
3.
4.
5.
6.
323
Inform a tica
:J.;>'
Ats
"'j'
jii'
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:
-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
-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:
Ats
Au
324
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
v
pentru
An
A"
1
2
2
25
2
10
3
20
18
5
18
20
10
11
3
9
5
15
9
9
11
10
15
8
11
18
5
9
15
20
10
25
25
2
Observatii :
1. i ntr-un vector care implementeaza un ansamblu Heap Maxim : v[iJ2v[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
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 .
-7 daca 2x i>n ,
S8
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.
325
In forma tica
Algoritmul pentru crearea unui ansamb lu Heap
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.
//c h e i le s e c i t e ec dinLL$ier
i f (:o<=NMAX -l)
{f v [ l ] ;
326
(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,
t int x , i ;
i f (n ==NKlI.X-l)
ccu t c-cv n u
cse
e l se
v o i d ma i n ()
(i >l )
i v [ iJ > ~v[i/2 1 1
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 ; }
327
I nformatica
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 indiceJui 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, j ,z = v r l J,a'J:~ ;
whi le
{i <=n~
{i f
(2 -" i <=n)
\" [1 ] = v [nJ; n - - ; i= l;
{ 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
(~
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.
328
Daca vecto rul era organi zat ca un ansamblu He ap Minim , va fi ordonat crescator,
n-2
n-l
n -l
=~
Ch eia ma xim a din n-1 noduri
n- 2
n -l
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
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)
In algoritmul
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)
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
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.
5.
6.
7.
8.
9.
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
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:
331
Inf o r m atica
a. 15
b. 24
c. 2
d. 14
(Bacalaureat - Sesiunea iunie-iulie 2003)
12 .5e considera un arbore in care rad acina este considerate de nivelul 1 :;;i orice nod de
---.)t:rc. -..-
c. 3 40334 1 1
d. 34 3 34 1 1 0
d. 3
a. 6
c. 4
b. 5
d. 3
a. 5
c. 4
b. 2
a. 3
S8
d. 3
obtin daca
S8
c. 2
b. 4
d. 1
Urmato rii 5 itemi 58 retera Ia arborele cu radacina cu 8 noduri care are vect orul tata: 2 0 2
1 1 1 3 3.
20.Numarul de noduri terminale ale arborelu i este:
a. 3
b. 4
c. 5
d. 2
d. 6
c. 5
d. 5
d. 5
b. 1. 2
c. 4
c. 7, 8
d . 2. 7.8
d . 10 noduri
332
b . arbore de cautere
d. arbore strict
10
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. ;
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
q ->s=NULL ; p - >s:=:q ;
realizeaza:
a. elimina nodul cu cheia 21;
c. elirnina nodul cu cheia 25;
dispose q ;
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
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
...
eV-((Vll.
2.7.7. Conexi tatea 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
-:
"
-,
0,
'