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) ; } 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
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 () .
IE] Se citesc din fisler E?]
133
Inform at icii
~ Se citesc din fisier n2 ~i coeficientu l si gradul primului termen din al doilea polinom.
Se adauqa primul nod la lista L2 (nodul prim2) - subprogramul adau ga nod ( ) . ~ Pentru urrnatoarele n2-1 perec hi de numere din fisier, exec uta : S8 dtesc din fisier coef icientul ~ i gradul unui termen al celui de al doilea polinam ~ i se adauqa un nod cu informatia respective dupa ultirnul nod din lista L2 - subprogramul adaug a _ u l tim ( ) . ~ Se adauqa primul nod (prim 3) la lista L3 cu urrnatoarea inforrnatie: daca gradul din primul nod din lista L1 este egal cu gradul prirnului nod din lista L2, at unci gradul este egal cu gradul nodulu i din Lista 1, iar coeficientul este egal cu suma coeficientil or din nodurile celor doua liste ~ i in ambele liste se trece la nodul urrnator : allfel , daca gradul din primul nod din lista L1 este mai mare decat gradul primului nod din lista L2, atu nc i gradul este egal cu gradul nodului din Lista 1, iar coeficientul este egal cu coeficientul nodului din Lista 1 ~i in Lista 1 se trece la urrnatorul nod; altfe l, gradul este egal cu gradul nodul ui din Lista 2, iar coeficientul este egal cu coeficientul nodului din Lista 2 ~i in Lista 2 S8 trece la urmatorul nod - subprogramul adauga n od () . ~ Cat tim p nu s-a ajuns la sfarsitul Listei 1 si al Listei 2, exec ut a: se adauqa un nod la lista L3 dupa ult imul nod, cu urrnatoarea inforrnatie : daca gradul din nodul cure nt din lista L1 este egal cu gradul nodului curent din lista L2, at unci gradul este egal cu gradul nodulu i din U sta 1, iar coeficientul este egal eu suma ccefi cientilor din noduril e celor doua liste ~i in ambele liste se trece la nodul urrnator : allfel, daca gradul din nodul curent din lista L1 este mai mare decat gradul din nodul curen t din lista L2, at unci gradul este egal cu gradul nodului din Lista 1, iar coeficientul este egaI cu coeficientul nodului din Lista 1 >;i in Lista 1 se trece la urrnatorul nod; allfel, gradul este egal cu gradul nodului din Lista 2, iar coeficientul este egal cu coeficientul nodului din Lista 2 ~i in Lista 2 S8 trece la urmatorul nod - subprogramul adaug a _ u l tim () . #i nclude < f s t r e a m . r.> f stream f1 ( " l ista5 . t xt " , ios: : in ) , f2 t vp o Lj nom. r x t ", ios : : o u t } ; struct n od lint e ,g ; nod e u r rrr j , int e ,g ,:1 ; voi d a d a ug a nod { no d *&p r i.."TI, n o d *& u l t i m) { p r : ~=new ~od ;
v oid
ultiffi~pr:n ;
adaug2 _ul~im {ncd
prim ->u=m~ NULL ;
pr i ~- > c = c ;
prim- >g=g ; }
*& u l t i ~ )
{ ~ od *p =n e w n od ; p- >u r m=NULL; ultL~ ->urm=p ; u ltin~? ; p - >c =c ; P ->9=9 ; } void c r ea r e (nod *&p d .:n, nod *&u l t i ml {f l » c » g; a da uga _ n o d lp r i m,ultim ) ; f or ( i n t i '-".2 ; t c-n , i -'- t ) { £ l » c» gi a dzru q a ul t i m {u l t i rn) ; } } void a d u n a r e (noel - p r irn I. nod *p r i m2 , n o d * &pr im3 , I1 C'Jd * &u 1 t irr,3 .1 { no d *p = p r i ml , *q =p r i r:12; if lp - >g ==q - >g) {g =p - >g ; c =p- >c +q - >c ; p =p->u r m; q=q -> u r m; } else i f (p ->g>q- >g) {g =p - >g ; c=p ->c ; p=p - >ur m; } else {g =q- >g; c = q - >c ; q=q ->urm ; } adauga no d( prim3 ,u ltim3 ) ; while (q l =NULL && p != NULL ) { i f ( p - > ~ = = q - > g) { g ~ p - > g ; c=p ->c+q ->c ; p =p ->Jrrn ; q=q ->u r~ ; } else if (p - > g > q - > g) { g =p- > g; cep ->c • p =p - >u r rn; } e lse { g ~ q - > g; c=q ->c ; q=q -> urm ; } adau qa u l t i m (u l t i m3 ) ; }
if
{p ! ~ NUL L )
whi le (p ! =NULL ) else
( g =p - >g; c=p->c ; ad aug a ulti m (u l t i m3 ) ; }
Implcmentarea structurilor de date
134
while (q !=NULL) ( g=q- > g; c v q -c-c r edeuqe \J1tim(ultim3) ; } ) void afisare{nod *p r i ml (for (nod *p =p r i m; p !=NULL; p =p - >u r rn) c ou t « p - >c« " "« p - >g«endl; cou t« e n d l; ) voi d salvare(nod *p r i m) {f or (no d *p =p r i f:l ; p ! =NULL; p =p - >u rm ) f2 «p->C« " "« p - >g«endl;} v oid main () ( n o c *p r i ml ,* u l t i rnl ,* p r i m2 ,* u l t i m2 ,* p r i m3 ,* u l t i m3 ; int l"11 ,n2 ; f l oc-n L: n=n l; creare {priml ,ultiml ) ; afisare (prim l) ; fl »~2 ; n=n2 ; creare (prim2 ,ultim2) ; af i s ar e {prim2 ) ; a dunare (priml ,prim2 ,prim3 ,ult im3 ) ; afisare lprim3 ) ; salvare {prim3 ) ; ~l . c l o se ( l ; f 2 .c l o s e() ; }
Enuntul problem ei 6. Reuniunea !ji intersectie a doua muttimt. Se citesc dintr-un fi~ier text do pe prima linie un numar n1, care reprezintfJ numeru! de elemente ale ptimei tnuttimi. apoi de pe urmatoa rea tinie elementele muuimit, de pe linia urmetoere un numer n2 numerut de elemente ale celei de a doua muttim), epoi de pe urmatoa rea tinie elemen tele muttnni'. Sa se determine reuniunea §i intetsectie celor doua multimi. Pentru testarea programului se vor folosi doua seturi de date de introte: mu/rimile A ={1,2,3,4,5} §i B={4,5,6,7} §i multitnite A ={1,2,3} §i B={4,5}.
Se vor crea doua liste in care se vor memora cele doua rnultirni. Ambele liste se creeaza prin citirea datelor din fisier ~i adauqare dupa ultimul nod. in a treia lista se va memora reuniunea celor doua multirni, iar in a patra lista - intersectia. Cele patru liste se identifica prin adresa primului nod (prim1, prim 2, prim3 "i respectiv prim4 ) "i prin adresa ultimului nod (ultim1, ull im 2, ullim3 " i respectiv ultim4). Pentru determinarea reuniunii se vor executa urmatorii pasi: Pas 1. Se adauqa primul nod la Lista 3 (nodul prim 3) care contine numarul din primu l nod al Listei 1 (p ri m 1). Pas2 . Se parcurge Lista 1 de la succesorul primului nod pana la sfars itul ei " i se adauqa un nod cu num arul respectiv dupa ultimul nod din Lista 3. Pas3 . Pentru liecare nod din Lista 2, exec uta : se parcurg e Lista 1 si daca nurnarul din nodul curent din t.ista 2 nu S8 gas8iite in Usta 1, atunei se adauqa un nod cu nurnarul respectiv dupa ultimul nod din Lista 3. Pentru determinarea int ersecti ei se vor executa urrnatorii pasi: Pas1 . Se initializeaz a Lista 4 ca lista vida (prim 4=NULL si ult im 4=NULL ). Pas2 . Pentru fiecar e nod din t.ista 1, executa : se parcurge Lista 2 si daca nurnarul din nodul curen t din Lista 2 se gase" te in Lisla 1, at unci se adauqa un nod cu numarul respectiv ca prim nod in Lista 4 (nodul prim4 ). Pas3 . Daca s-a adauqat primul nod la Lisla 4, atu nci pentru un nod din Lista 1 de la succesorul nodului curent pana la ultimul nod , executa : se parcu rge t.ista 2 ~i dac a numarul din nodul curent din Lisl a 1 se gase"te i n Lista 2, at unci se adauqa in Lista 4, un nod cu nurnarul respectiv, dupa ultimul nod . #include < : s t r e a ~ . h >
struct nod t i nt i n :o ; nod - u rn. r } ,
fstream f( "lista 6 .: ~ : t " , i o s : : i n) i nt x ; voi d adau ga_ nod( nod * & p r i ~ , n o d
; * & ~ l t im )
III fnrill a ticii
135
{p r i rnvn e w n od i pri rn -c- Ln f oe x r pr irn - >u r m=NULL ; u LtImep r i.mr I void a d a u g a_ultim( nod *&u l t i m) {no d - pe new nod ; p- c- Ln f c -cx, p ->unn=NUL L ; u l t i m- >u r m=p ; u l t i m=p ; } voi d c r e a r e {no d * &p r i m, n o d * &u l t i m)
l i n t n ; f »n»x ; ada uga_flod (p rim, ultim) ; fo r (i n t i =2 ; i <=rl ; i +i ' ) {f» x; a dauga_ulti rn( u l t im) ; } } v oid r eun i u n e (n o d *p r i ml , nod *p r i m2 ,
~o d
* &p r i m3 , no d * &u l t i m3 )
{no d *p ,* q ; int g a 5 it ; xep r i.mL'- o i.n f o r adauga ~.nod (p r im.J , ul tim3) ; f o r (p =prim l ->unn ip !=NULL i p-p->urm) l x=p->info i a dauga u ltim{ul tim3) ; } f o r (p = p r i m2 ; p ~ ~ NULL ;p = p ~ >u r~) (for (q =p r i ml, g a s i t =O; q !=NULL && !gas ~t ; q=q- > u r ~ ) i f ( p - > i n f o = = q - > i ~ f o ) ga3it=l ; if ( ! g a s i t i { x e p -c-Ln f o , adauga_ult.i:ntultim3) ; } } } voi d .i n t e r s cc t Le Lnod e p r i.rnL, nod * p r i m2 , nod * &p r i m4 , nod * &L:. l t i m4 } ( n o d *p ,* q ; int gasit ; ?r im ~=NULL ; ultim4=NULL ; f o r (g a s i t= O, p ""'p r i m1; p ! =NULL && i qas i t , p =p ->urm) fo r (q=prim2 ; q != NULL && ~ g as i t ; q=-q->u r m) i f (p - >info==-q->info) {g a s i t = l ; x ~p - > info ; } if (g a s i ':) ( a d a u ga n on (p r i m1 , u l : i m4 ) ; f or ( ; p ! ~ O ; p=p - >u ern) {for (ga s i t =O, q =-p r i m2 ; q! =- NULL && !gasit ; q=q- >u r m) if (p ->info=- =q->info) gasit= l; i f (g a s i t } {x =p - >i n f o ; adauga_ultim(ultimt;) ; } } }} void a :i s a re(nod * p r i m) {for {nod * p = p r i m; p!:-:"NULL ; p =p- >u r m} c out« p - > i n f o «" cou t « e n d l ; } v o i d mai n () II
{ ~ od
.
* p r i m l ,* u l t i m l ,* p r i m 2 ,* u l ~ i m 2 ,* p r i m 3 , * u l t i m 3 ,* p r i m 4 , * ~ I t im 4 ;
c cee ce (p r .iml , ul timl) ; c r ee r e (prim2 , ul tim2} ; f _close ( ) ; r cuni.une (priml , prim2 , pr im.S, u l t i m3 ) ; ccuccc vne cnt u ne e - " ; afisa re (prim3) ; Ln t c r sec t i e (p r im l , p r i.mz , p r i.mq , u Ltim-1) ; c o u t-cc" Intersectia= " ; if {prim4l=NULL) afiSar~(p r ~~j.:) ; ~ else cout«" Mu l t l :ne 2. vida " ; }
'*"
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
0
---
136
1m ilcm cntarca st r ucturilor de date
3. Se cree aza 0 lista ~i S8 afise aza in ordinea inve rsa citirii din fisier num ai numerele pare . 4. Se creeaza 0 lista in care ordinea de acees este cea in care sunt citite nurnerele din fisier. Se mai citeste un nurnar n de la tastatura. Se afiseaza elementul cu nurnaru! de ordine n din lista . Oaca nu exi sta, S8 afiseaza un mes aj de informare. 5. Se creeaza 0 lista in care ordinea de acees este cea in care sunt citite numerele din fisier . Se insereaza inaintea fiecarui nurna r facto rii sai primi. 6. Se creeaza 0 lista in care ardinea de acees este cea in care sunt citite numerele din fisier . Se insereaza i ntre fie care pereche de nod uri eel rnai mare divi zor com un al celor doua num ere. 7. Se creeaza doua lisle in care ordinea de acces este cea in care sunt citite numerele din fisiere. Se creeaza a treia lista prin concatenarea llstei care are cele mai putine elemente la lista care are cele mai multe elemente. Daca listele au acelasi numar de elemente , se va adauqa lista a doua la prima lista. 8. Se creeaza doua liste in care ordine a de acces este cea in care sunt citite numerele din fisiere. Se creeaza a treia lista prin concatenarea celei de a doua liste la prima lista. Se elirnina din a treia lista numerele care S8 repeta. 9. Se creeaza 0 lista in care ordinea de acces este cea in care sunt citite numerele din fisier. Se divizeaza lista in doua liste: una care coniine numere care sunt palindrom si una care contine numerele care nu sunt palindrom. Se salveaza lista cu numere palindrom intr-un alt fi~ie r. Daca nu au existat numere palindrom, in fisier se va sene un mesaj de informare. in lista care nu confine numere palindrom se insereaza cupa fiecare numar inversul sau. 10. Se creeaza 0 lista in care ordinea de acces este cea in care sunt citite numerele din fisier. Se afiseaza numerele care au ultimele trei cifre identice, se elimina din lista numerele care au ultimele trei cifre consecutive si se insereaza valoarea 10 inaintea numerelor care au suma ultimelor trei cifre eqala cu 10. 11.8e creeaza 0 lista in care ordinea de acces este cea in care sunt citite numerele din fisier. Se afiseaza numerele care au mai mult de doi divizori primi, se insereaza divizorii proprii in tata numerelor care au mai mult de trei divizori proprii si se elirnina din lista numerele care au eel putin doua cifre identice. 12. Se creeaza 0 lista numai cu numerele prime din fisier. Se afiseaza eel mai mare numar prim ;;i eel mai mic nurnar prim. Se verifica daca lista contine numai numere distincte ;;i se afiseaza un mesaj de informare . Daca lista nu contine numai numere distincte , se elirnina numere din lista astfel tncat sa contina numai numere distincte. Se salveaza lista creata intr-un alt fisier. Daca nu au existat numere prime in fisier, se va scrie un mesaj de informare . (lndicatie. Se va crea 0 lista ordonata crescator ~i se vor afisa numerele prime din prirnul nod ~i din ultirnul nod) . 13.Se creeaza coua liste cu numerele citite din fisiere. in primul fisier numerele sunt ordonate crescatcr, iar in al doilea fisier numerele sunt ordonate descresca tor. Se creeaza a treia lista prin interclasarea primelor coua. 14.Se creeaza 0 lista in care ordinea de acces este cea in care sunt citite numerele din fisier. Sa S 8 inverseze ordinea de acces in lista, astfel incat parcurgerea sa se taca de la ultimul nurnar catre primul nurnar. (lndicatie. Se rnuta ultimul nod la inceputul listei ;;i apoi, pana se ajunge la numarul memorat la adresa care a fost a primului nod se insereaza nodul ulti m dupa ultimul nod inserat.) 15.Se creeaza 0 lista in care ordinea de acces este cea in care sunt citite numerele din fisier. Sa se afiseze in ordine inversa numerele din lista. (Indlcatle. Se implernenteaza un algoritm recursiv de parcurgere a listei.)
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.
2.6.4. Algol'itmi pcntru prelucrarca listclor circulare simplu inlan!lIite Algoritmii de ad au qare a primului n od la tista vida si de ada uqare d u pa ullimul nod sunt la fel ca si cei de la listele simplu l nlantuite: Lista circulara simplu ln tantuua u ltim
prim
I
info
-,-
I urm
I,
info
I urm~ r:
info
I urm
I
I'.
info
I urI"l I
2.6.4. 1. C rcarc a list c i Deoareee in algoritmii de preluerare trebuie sa se cunoasca adresa prirnului nod, este importanta adauqarea primul ui n od la lista vida. Pasii algo ritnl ului de croaro a unei liste sunt: PAS 1. Se adauq a primul nod la lista (nodul prim ) PAS2 . Cat limp mai exists inforrnatie exec uta : se adauqa un nod la lista dupa ultimul nod. PAS3. Se leag a ultim ul nod de primul nod. Impl cm cntarea algori tmu lu i. Se folose ste functia procedurala c rea re ( ) at carei parametru este prim de tip no d : care se transrnite prin reterin ta deoa rece este parametru de intrare-ieslre. 8e foloseste variabila globala n pentru citirea inforrnatiei din nod. Se considera ca nu mai exista into rmatie atunci cand valoarea citita pentru n are valoarea O. vo i d c rea re (n od *&p : i o ) ( n o d *u l t i m; cin» n; adau ga _n o d , p r im , u l ~ iffi ) ; wh i le ( n ! ~ O ) (cin» n; a d a ~ g a_ u l t i ~ ( u l tire ) ; } ul t.i m-c-u r-mop r-a m }
138
Im plcmenta r ca strudurilor de date
2.6.4 .2. Pa rcurgerea listei Deoa rece lista circu lara nu contine un ultim nod care sa fie conside rat ca terminator al listei, S8 va con sidera ca nod care terrnina lista nodul prim . Pasi i algoritmului de prelucrare a unei liste circu lare sunt: PAS1 . Se prelucreaza primu l nod din lista (nod ul prim ). PAS2. Pentru l iecare nod din lista ln cepan d de la succesoru l nodulu i prim pan a la prim ul nod, executa: S8 prelucreaza nodul curent. Implementarea algoritmului. Se foloseste functia procedurala parc urge (J al carei parametr u p rim de tip nod S8 transmite prin valoa re deoa rece este pa rametru de intra re.
v o id p a r cug e (no d *p r i ffi ) { l i s e prel ucreaza prim->info ; f or (nod * p~prim- >urm ; p r =pri m; p =p- >urm) I /s e prelucreaza p->info; }
2.6.4.3 . Eliminarea unui nod din listii Daca S8 elirnina din lista nodul care urmsa za dupa nodul curen t p tre buie sa S8 ve rifice daca aces t nod nu este nodul prim , ca sa nu S8 piarda adresa prim ului elemen t din lista. Pasii algoritmului de eliminare a nodului urrnator nodului curent sunt: PAS1. Se salveaza adresa succesorului nodului p i n pointerul q. PAS2. Se leaqa nodul p de succesorul succesorului lui. PAS3 . Daca succesorul nodulu i p era nodul prim , atunci succesorul nodului pr im devin e nodul prim . PAS4 . Se cere eliberarea zonei de memorie de la adresa mernorata in pointerul q . Implementarea algoritmului. Se foloseste functia procedurala elirnina_urm() ai carei parametri de tip nod sunt: p (pentru adresa nodului precedent nodului ce S8 elirnina), care se transmite prin valoare deoarece este parametru de intrare si prim, care se transmite prin referinta. deoarece este parametru de intrare-iesire.
v o i d elimina._urm(nod *p, n od *& p r i m) {n o d *q =p-> u rm; p->urm= p->urm->urm i if (q===prirn) pr im==pr im ~>urIll i delete q ; }
I Swmu de CBlZ I Sco p: exemplificarea modului in care, pentru rezolvarea problemei , foloslti algoritmii de prelucrare a listelor circulate simplu Inlantuite si implementarea lor cu ajutorul subprogramelor. Enunt ul probl emei. Sa ciuiste dintr-un fi§ier text un sir de numere separate prin spti tiu cu ctue S8 creeaza a lisla circutare simplu inl antuila in ordinea in care sunt citite numerete din fi§ier. Sa se §tearga numerele p are din lista §i sa S8 etiseze numetoio din iiste. Pentru leslarea proqrtnnutu) se vor tolosi doua seiut! de nutnere: (2. 2, 3, 4, 4) si (2. 2, 2, 4, 4). Problema se descompune in urrnatoarele subprobleme, iar algoritmii pentru rezolvarea subproblemelor sunt implernentati cu ajutorul subprogramelor:
f1l Se creeaza lista circulara simplu Inlantuita -
subprcqramul creare ( ) .
~ Se parcurge lista de la succesorul primului nod pana la primu l nod si daca nurnar ul din succesorul nodului curent este par, at unei se elimina succesorul nodului curent subprogramu l eLa mi n a u r m ( ) ; altfel se trece la succesorul nodului curent. ~ Daca nurnarul din nodul prim este par. atunei se elirnina nodul prim si lista este vida subprogramu l e Li.mi.n a_ p r i m ( ) .
139
Infor matica
~ Dac a lista nu este vida (subprogramul es te vida () }, atunci S8 afiseaza numerele din fiecare nod (subprogramul afisare ()) . #inc lude
void a da u ga nod (n od *&p r i m, nod *&u l t i :nl {p r i :n=new no d ; pr im-> i n fo =x ;
p r i m- > u r m ~ NULL;
u l t i m=p r i m; }
void a cla ug a _u l t i m(nod * &u l t i m ) {n o d " p e new n od ; p- c- Lnf oe x , p ->unn=NUL L ; u l t i m- >urm=p ; u L t..inr- p , } void c reare(nod *&p r i m) {n o d *u 1 tim ; I c->x , a d a u ga.. ..n od rpr im , u lt im ) ; while (f »x ) adauga~)1 1 t im(u ltim) ; u l t Lm- c-u rme-p rLm , } ' v o i d e Li.m.ina __urm( n o d *p, n o d *&p r i m) {rio d *q =p - >u r :n; p -c-u rmcp -c-urm- o u rm ,
if (q ==p r i m) p r im=prim- >u rm ; delete q ; } vo i d e Ld.m.i.na p i .im t n o d * &p r i m) {n o d *q = p r i m; pr irn=NULL ; delete q ; } a.n t; e s t .e vLda ( n o o ep r-Lrn ) {return pr i m= =NULL ; } v oid 2-fisar e( n od *p r i m) Lcou t.c-cp r i.m -o Ln Fo -cc " ", for {nod *p "" p- >u rm; p >=p rim;p =p->u rm ) coutxc c - c- Lnfcoc'' "; cout«endl ;} void ma i n () { no d e p r i.m, *p; c r ee.r-e.Ip r i .m j , afi s ar e (p r i m);
for (p =p r i m- >u r m; p ! =p r i lll;) if (p - >u r m->i n f o% 2=-"'O) e l i rn i n u.....urm(p ,prim) ; else p=p- >u rm ; i f (p r i m-c -I u Co %2== O)elimina ,:-,"prim (p rim} ; i f (! este_v .i.da (p r im ) ) a f L s a r e (pr i m) ; }
_
--
-----.--.... Scrieti cate un program care sa rezolve cerintele fiecarei probleme. Fiecare problema se va descompune i n subprobleme ~i algoritmul pentru rezolvarea unei subprobleme se va implementa cu un subprogram. Datele se transmit intre subprograme eu ajutorul parametrilor de cornunicatie ~i nu al variabilelor globale. Se creeaza liste ci rcu lare sim plu ln lan tu tte in noduriIe carora se rnernoreaza numere intregi. Sirul de numere se citeste dintr-un flsier text in care sunt memorate pe acelasi rand, separate prin spatiu. Dupa executarea unei operatii de prelucrare a listei, S8 vor afisa numerele din noduri pentru a verifica daca operatia s-a executat coreet. Se vor alege seturi de date de intrare astfel l ncat sa se verifice algoritmul pe toate traseele lui. Pentru urmatorii 4 itemi Jistele se creeaza asttel lncat ordinea de acces sa fie cea in care sunt citite numerele din fisier. 1. Sa se insereze , dupa fiecare nurnar divizibil cu cea mai mare citra a sa, valoarea cifrei, ~ i sa se elim ine numerele care au ultime le doua cifre consecu tive . 2. Sa se verifice daca num erele sunt in progres ie geometr ica si sa se afiseze primul termen al progre siei geometriee. (Observat ie. Daca numerele sunt i n progresie geometrica, nu este ob ligatoriu ca sirul de numere citit din fisier sa lnc eapa cu primul termen al progresiei geom etrice.) 3. Sa S8 insereze in tre doua numere pare din llsta media lor aritrnetica pana can d nu mai exista perechi de numere pare .
140
Implcm cn ta r ca structuril or de d ate
4. Din lists circul ara creata sa se creeze alte dOU8 liste circulate simplu inlant uite - una cu numerele divizibite cu cea mai mare citra, iar alta cu numerele divizibi le cu cea rnai mica cifra - ~i S8 verifice daca cele doua liste cont in numere comune. 5. Se creea za 0 lista ordonata crescat or si S8 creea za apoi din ace asta lista 0 lisla cu numerele care sunt patrate perfecte.
sa
2.6.5. Algoritmi pcntru prclucrarea listclor dublu iulantuitc in cazu l listelor dubl u Inlantuite intorrnatia de legatura trebuie sa contin a ~ i adresa succes oru lui nodului (pointerul wa n t catre tipul nod):
struct nod lint .info ; nod * a n t , *u r m; } ; nod " p r i m, - u l t j-n , *p;
//inforrna\:ia propriu -zisa pentru leg5 tur~
//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
•I
an t
2.6.5.1. Adauqarca primului nod la lista Impl emen tarea alqoritrnului . Se foloseste functia procedurala adauga_nod O ai carei parametri prim ~ i u l tim de tip nod se transm it prin re ferin ta deoarece sunt parametri de lesire. void adaug_nod (nod *&p r i m, nod *&u l t i m) {p r 'im = new nod , pr im-> .i n foe x r pr.l.m->an t =-NULL; p r i rn- >u rm =NULL; ultim=pri:n ; }
2.6.5 .2. Adau qar oa unui no d la lista Ad5ugare in Ia ta prirnului nod
Implementarea algoritmul ui . Se foloseste functia procedurala adaugayrimO al carei parametru prim de tip nod. se transmite prin referinta deoarece este parametru de intrare-iesre v oid adauga_prim (:1oa *&p =i m) {n od *p =new nod ; p -c-Ln foex , o »an =NULL; p ->urm =p r i rn; p.r i.mvp i } Adflllga re dupa ultimul nod
Im plementarea algoritm ului. Se foloseste functia procedurata adauga_ul tim () al carei parametru u l tim de tip nod se transmite prin refennta deoarece este parametru de intrare-iesire. void adauga_ultim(~od * &u l t i m) {n od ~ p =new ~od ; p -> i~ fo = x ; =u l t i rn; =NULL; u.l t i.m-c-u rmvp , ultim=p ; }
141
lufnrm aticii Adauqarc a in in tc rio ru l liste i [ p rim
I- . . -f~-{~J-+B ..- 1 I ultim
a) dupa nodul cu adresa q Nodul p care se adauqa se insereaza lntre nodul q ~i nodul q-surm. Succesorul sau este nodul q-surrn, iar predecesorul sau nodul q . Nodul p va fi succesorul nodului q ~i predecesorul nodului q -surm . Implementarea alg oritmului. Se foloseste functia procedurala adauga_ dup a ( ) ai carei parametri sunt de tip nod: q (adresa nodului dupa care S8 face ada uqare a), care S8 transmite prin valoare deoarece este parametru de intrare ~i u l t i m (adresa ultimului nod), care S8 transmite prin referinta deoarece este para metru de intrare-iesire. v o i d ada ug a~dupa (nod *q , n6d -* &ul tim)
{n o d i f
p -> in f o= x ;
PT<9~ m=q ~ > u rm ;
p~>a~t= q ;
(q ==u l ti m) u ltirri.=p; e l s e
q;;j>j.lriTL~>ant= p ;
q->.urxn= p ; }
*p~ n e w
nod ;
b) l nai n te de nodu l de adrcsa q Nodul p care S 8 adauqa S8 insereaza intre nodul q-sant si noduJ q. Succesorul sau este nodul q. iar predecesorul sau nodul q-sant. Nodul p va f succesorul nodului q-e-ant ~i predecesorul nodului q. Implementarea algoritmului. Se foloseste functia procedurata adauga_in_ fa t a () ai carei parametri sunt de tip nod: q (adresa nodului inaintea caruia se face adauq area), care se transmite prin valoare deoarece este parametru de intrare.
v o i d adau g a~ in _ fa t a(nG d *q ) {ne d kp=n e w nod ; p ~> i nf o= x ; p -c-u r m- q ,
p-ec-an
t e q- c
-an
L,
q-c-an c-c-u.rm-e p ,
q·;.>ant= p ; }
2.6.5.3 . Parcurgerea listei Viz itarea fiecaru i no d al listei se poa te face In doua moduri: -7 pom ind de la primul nod, pima la ultimul nod, In ord inea de i nla ntuire a nodurilor furn izata de adres a urm din nodu l vizita t; -7 pornind de la ultimul nod, pima la primul nod, in ord inea de inlantuire a nodu rilor fu rnizata de adresa ant din nodul vizitat Implementarea algoritmulu i. Se toloseste functa procs durala parcurge-inainte (), respectiv parcurge-inapoi () , al carei parametru prim, respec tiv ul ti m, de tip nod , se transm ite prin valoare deoa rece este parametru de intrare. v oid pa r cuqe .i na i.n t e.Lri od e pr i m) {for (no d * p =pr i m; p !=NULL; p=p- > u r m) lise prelucre Dza p->i nfo}
vo i d p a r cuge _in apoi( n o d *ll l t i m} {for (nod * p =u l t i m;-p ! >=NULL ; p=p ->ant ) l i s e p r el.uc r ea za p->info}
2.6.5.4. Eliminarea unui nod din lista Eliminarca primului nod Implementarea algo ritm u lu i. Se Ioloseste functia procedurala eliminayrim() al carei parametru p r i m de tip nod se- transmite prin referinta deoarece este parametru de intrare-iesire void el i mi na__ pr im( n o d *&p r i m) {n o d *q =p r i m; prim->urm- >a n t =NULL ; prirn=p rim->u rm; dele te q ; }
142
I mplem enta rea strn ctnrilor de date
El iminarea ultimului nod Implementarea algoribnului. Se toloseste functia procedurala e limina_ ultim () al carei parametru ul t i m de tip n od S8 transmi te prin referinta deoarece este param etru de lntrare-iesire . v o id e L i mi n a u L t Lm t rrod. * &u l t i m) {n od * q=u l t i~; ultim~>ant->urm~NULL; u l tim=ultim->ant ; d elete q;}
Eliminarea unu! nod din interiorul listei Pen tr n a eli mi na nodul p al lat in interiorul listei, treb uie sa legam pr edeee sor ul nodului p (p-s ant) de sueeesorul lui (p -s urm ). Sueeesorul nodului p-e-ant va fi nodul p-x urm , iar predecesorul nodului p- o-urm va fi nodul p -sa nt. Implementa rea algoritm ulu i . Se foloseste functia procedurala ed.imi.na () al care i paramet ru este de tip nod: p (adresa nodului care S8 elimina) , ca re S8 transm ite prin valoare deoarece este parametru de intrare. v oid el i min a (nod * p ) {nod *q=:=p ; p:-c->a nt - >u r m:=p - >u rm ; p -ourm - c-a n ue p - c- en t , de lete q ; }
Seop: exe mplificarea modului in care, pentru rezolvar ea pro blemei, folositi algoritmii de prelu crare a listelor dublu Inlantuite ,;;i implementarea lor cu ajuto rul subpro gramelor.
Enunt ul p rob lem ei 1. Sa citeste dintr-un fi§iBr text un sir de numere separate prin spetiu cu care se ereeaza 0 !ista dublu inlanfuita in ordinea in care sunt citiie numerele din tisier. Sa se adauge va/oarea 1 dupa fiecare numer par §i sa se §tearga apoi numerele pare din lista. Sa se etisoze numerele din lista dupa fiecare operatic de prelucrare, in ambele moduri (de fa primulla ullimul, si de la ullimul fa primu/). Penlru les/area programufui se va folosi $irul de numere: (2, 2, 5, 3, 4, 4). In prelucrarea tistelo r dublu inlantuite trebuie lnt retin ute atat adre sa primulu i nod , cat si adresa ult imu lui nod . Pro blem a se de sco mp une in urrn atoarele subp rob leme, iar algoritm ii pentru rez olvare a subproblernelor sunt implementati eu aju torul subprogra melor:
lP11
Se creeaza lista du blu inlantuita - sub programu l creare () . ~ Se adauqa un no d eu valoarea 1 dupa l iee are nurna r p ar, a stlel (s ubp rogramu l pr e l u c r a re 1 (» ): 1 -7 Se p areurge lista de la primul nod pana la pe nul timu l nod si, da ca nurn arul din nodul eure nt es te par, se adauqa dupa el un no d eu valoa rea 1 - subp rogramu l ada u g a ~d u p a ( ) . -7 Dac a nurn arul din nodu l ul tim este par , atu nc i se ad auq a dupa el un nod ca re con : tine valoa rea 1 si aeest nod devin e no dul u ltim - sub program ul a d auga ul tim () . ~ Se elirnina nodurile cu numere pare, astfel (su bpro gramu l p r e l u c r a r e _ 2 0): -7 Se pa reurge lista de la sueeesorul pr imului nod pa na la penu ltim ul nod si , da c a nu rna ru l din nodul eurent este par, at u ne i se elim ina di n lista (su bp ro gra mul el imi na ~ urrn (») ; altfe l , se trece la sueee sorul n odului eurent. -7 Oac a nurna rul din nodul pri m este par, atunci se elimin a din lista si suecesorul sau devine nodul prim - subprogramul e li mina _ pr i m ( ) . # i n c lude < f s tr e a m . h > st ruc t n od ( i nt i n f o;
nod *a n t , *u r rn ; ) ; f stream f ( " l i s t a8 . tx t " , i o s : : in ) ;
i n t X;
143 .:....:...::.
InliJrm :l!k.a'--voi d adauga nod (no d *&p r i mr n o d * &u l U .m) {p r i m=- n e w n od i p r im ->i nfo = x ; p r i m- >u r m=NULL i pr i m->a n t =NULL ; ul tim=p r i rn; }
vo id a d a u ga u l t im(nod *&u l t i m) {n o d *p ; p=n e w n od ; p -> info= x ;
p ->unn=NULL; p-> ant =ult im ; ultim - >urm=p; ultim=p ; }
vo i d ada uga_dupa(n od *p ) { ~ od
*q=n e w n od ; q -> inf o = x ; q - >u rm =p - >u rm ; q - >a n t =p ; p ->urm- >an t=q ; p ->urm=q ; } v o i d elim i n a p r i m {n o d *&p r i m) {n o d *q =p r i m; prim->urm- >a n t =NULL ; p r i m=prim-> urID ; de lete q ; } void elim i n a( nod *&p ) {n o d *q =p; p ->ant->ur~=p-> ~ rm ; p ->urrn->ant =p ->ant ; p =p - >u rm ; de lete q ; } void crea rc{nod * &p r i m, l1oc * &u l t i m)
{f» x ; adauga noc(prirn ,ultirnl ; whi le ( f » x)
adauga_ult L~{ultim) ; }
void pr e lucrar e _ l ( n o d *p r i m, n o d *&u l t i ml
{fo r (nod *p =-p r i mi p - >u rJn! +=NULL ; p =p - >u r ml i f { p - > i n fo% 2=~O} ad a u g a~d u p a ( p) ; if (ultim- >i nf o %2 =- =- O) a d a u g a u l tim ( u l t i m) i }
v o i d p xe l u c r-are vz (n od *&p r.i m) {fo r ( n o d *p =p r i m- > u r m; p - > u r m ! =NULL i ) if ( p - > i n f o % 2 ~ = O ) c l i mi n a( p) ; e lse p =-p->urm; i f (p rim- >i n fo%2==O) e l ~mi n a~rim(pr i m) ; } v oid a f i s a r e~urm(nod * p r i ~ }
{for
(nod *p =p r i m; p !:=cNULL; p =p - >u rm)
c o ut«
p~ > i n [ o «"
" ; c ou t «end l ; }
v oid a fi s a r e ant {nod * u l t i rn) {f or (no d *p =u l t i mi p > NULLi p =p- >a n t l c out-ccp - c- Ln Coc c " "; cou t « e ndl; } void maine ) {n o d *p r i m,* u l t i m,* p ; creare (p r i.rn, ultim) ; a f i s a r e j u rm (prim) ; a f i.s a rejen t (ul tim) ; :-:=1; p re Lu crar e 1 (prir:-: ,t;lt im) ; a r Lsare urm tp r im) i afisa re a n t (ult i m) i p re Luc r e r e _ 2 (p r im) i a fisa re_'1rJn (pr .irn j r e f i s ar e _ an t. (ul t. Lm) ; }
Enuntul problem ei 2 - Calcularea rezistentai ec hlv alente Sa se cotcuteze rezisiente echiv etente in tre pun cteie A $i B pentru citc uiiut electric din figura.
n,
s,
u,
R il l
:~-ER" Pentru calcularea rezistentei echivalente se porneste de la ultimele rezistente - Rn ~i Rn-1 care sunt legate in serie. 5 e calculeaza rezistenta lor echivalenta Re1, care va fi legata i n paralel cu rezistenta Rn·2. Prin calcularea rezistentei echivalente a celor coua rezistente legate i n paralel, R cl o;i R n-2, se va obtine 0 noua rezistenta echivalenta R c2 care este leqata in serie cu rezistenta Rn-3. Calcularea rezistentei echivalente a circuituiui electric este un proces repetitiv i n care alterneaza calcularea unei rezistente echivalente a doua rezistente legate i n serie eu calcularea unei rezistente eehivalente a doua rezistente legate in paralel. Pentru a ~ti care dintre variantele de calcul se alege, se foloseste variabila 5 care are valoarea 1 daca rezistentele sunt legate in serie, ~ i valoarea 0 daca sunt legate i n paralel.
144
Implem entarea st ructu r ilor de da te
Va lorile pentru rezistente S8 citesc dintr-un fisier text in care sunt memorate pe acela si rand, separate prin spatiu , Se creeaza a lista dublu Inlantuita in care ordinea de aeces este cea in care sunt citite nurnerele din fisier. Lista S8 parcurge de la ultimul nod pana la primul nod . #inc l ud e
void a da uga nod (nod *&prim, nc d *&u l t i m) { p r ~=new nod ; pr i m-> i nf o=x; prirn- >urm=NULL; prim- >an t =NULL; ultimzprim ; } vo id adauga (no d * &u l t i m) {n o d *p ; p e n e w nod ; p- c- Lnf o e x , p- >u r m=NULL ; p - >ant= ul t i m; u l t i m - > u rm~~; u l tim=p ; } voi d c rea r e (n od *&p r i m nod * &u l t i m} ( f» x; a d a u g a nod(p ri m ,~] .ti m ) ; whi le ( f »x) adauga(u l t i rn) ; } float R {n o d * u l t i m) {int 5= 1 ; float r=ul t im->info ; nod * p = u l t i m - > a ~ t ; l
while (p ! ~NU LL ) if ( 5) {r +=-p- > i n f o;
p=p - >a n t ; s=O; } else {r = (r *p - >i n f o ) j {r +p - > i n f o ) ; p =p ->ant ; s=l ; } return r ; } void main(} {n o d e p r irn , *u l t i m; c r ea r-e {p r i m, u Lt.Lml ; f. c l o s e () ;. ccc e-ccv nez t s t ent.a e c h iva Leri t .a> "« R ( u l t i m);} ~
*
Rcco mandare. Listele dublu l nlantuite se folosesc i n prob lemele in ca re , pentru prelucrarea lnformatiilor: -7 se executa frecevent operatii de inserare ~i de eliminare de noduri; -7 lista trebuie parcurs a i n am bele sensuri. Exe m plu. i n problemele i n care trebuie prelucrate numere foarte ma ri (pentru memorarea carora nu pot fi folosite tipur ile de date implementate) se folosesc listele dubl u l nlantuite : -) pentru operatiile aritmetice (adunare, scadere , lnrnultire) Iistele in care sunt memorate cele doua numere vor fi parcurse de la ultimul nod , pima la primul nod ; -) pentru compararea a doua numere sau determinarea nu rnarulu i de cifre ale nurn arulu i, listele i n care sunt m em orate numere le vor fi parcurse de la primul pima la ultimu l nod. Scrieti cate un program care sa rezolve cerintele fiec arei probleme. Fiecare prob lema se va descompune in subprobleme si algorilmul pentru rezolvarea unei subprob leme se va implementa cu un subprogram . Datele se transmit intre subprogra me cu ajutorul param etrilor de com unicate si nu al variabilelor globa le. Se creeaza liste d ublu I nlant uite in nod urile carora se rnerno reaza numere i ntregi. Sirul de numere se citeste di ntr-un fisier text in care sunt m emorate pe acelasi rand , separate prin spatiu. Dupa execut area unei operatii de prelucrare a listei, se vor afisa numerele din nodu ri pentru a verifica daca opera tia s-a execut at core ct. Se vor aleg e seturi de date de intrare astfel incat sa se verifice algoritmul pe toate traseel e lui. Listele se creeaz a astfel ln cat ordinea de acc es sa fie cea in care sunt citite numerele din fisier. 1. Sa se elimine numerele prime $i sa se insereze intre fiecare pereche de num ere rarnase cel mai mare divizor eomu n al lor. 2. Sa se calc uleze eifra de cont rol a fiec arui nurna r ~i , da ca numarul este diviz ibil cu cifra de cont rol , citra este ada uqata du pa nurnar; alttel, numarul este elim inat din lista . Citra
Inform aticii
145
de control a unui numar este suma repetata a cifrelor numarulu i pana cane S8 obtine 0 suma mai mica decat 10. 3. Sa S8 mo difice adresele din nodurile Iistei astrel inca t sa S8 obtina doua liste !iniare dub lu inlantuite care sa cantina numerele din pozitiile pare, respectiv din poz itiile impa re. 4. Se citese dintr-un fisier doua numere foarte marioSa S8 scrie urrnatoare le subprog rame pentru prelucrare a nume relor: a. calcu larea sume i, a diferentei §i produsu lui nume relor; b. com para rea a doua numere (subprogramul trebuie verifice daca cele doua nume re sunt egale , iar daca nu sunt egale, sa precizeze care nurnar este mai mare) ; c. ver ificar ea nurn arului daca are un nurnar par sau un numar irnpa r de cif re , fara sa se numere cifrele nurnarului: d. determina rea nurna rului de cifre ale unui nurnar: e. verific area nurnarutui daca este palindrorn.
sa
2.6.6. Algoritm i pcntrn prelucrarca stivclor Cele coua ext rernitat i ale stivei se numesc varf ~ i baz a , Accesul la nodurile stive i (adauqarea. extragerea sau con sultarea unui nod) este permis numai printr-o sinqura extrem itate nurnita varf si ultirnul nod inserat este primu l nod extras (se extrage cea mai noua inforrnatie adauqa ta ). La 0 operatie de adauq are a un ui nod , varful stivei stivei urea, iar la 0 oper atie de extragere a unui nod , varfu l stivei coboara . Implementa rea dinamica a stivei se face la fer ca a unei liste Iiniare, cu deosebirea ca : -7 varful stivei va fi indicat de pointe rul va r f catre tipul nod ; -7 pentru adauqarea unui nod, se poale Iolosi numai algoritmul de adauqaro in fata primului nod ; -7 pentru extragerea unui nod se poate folosi numai algoritmul pentru eliminarea primului nod . Altfe l spus , prelu cr are a unei stive se face de la varf spre baza si se prelucr eaza Intotdeauna nodul din varful stive i . Acces ul la informatia din acest nod se face cUva r f - >i nf o . st.va vida este stiva care nu contine nici un nod ~ i adresa nodu lui vart are valoarea NULL (v a r f ~ NULL; ) . i n sliva vida nu se mai pot exec ula operatii de extragere de nodu ri. Stiva poate sa ajunqa sa fie vida In doua cazuri: la inltializare sau dupa extragerea ultimului nod . Pentru testa rea unei stive daca este vida , S8 poate imple menta functia operand es te _v ida ( ) care va furniza valoa rea 1 ("adevarat") , daca stiva este vida , si valoarea 0 ("fals ") daca stiva nu esle vida. int 8s t c_v i da (no cl *v a r f ) {return var f=~ NUL L ; }
Penl ru prelucrari cu autorul sl ivei putet i folosi urrnatorii algoritmi: -7 lniti alizarea s tive i: -7 ada uqa rea u nu i n od la stiva : -) ex trage rea unui n o d d in s tiv a: -) co ns u lta re a n odului din v a rfu l stive i.
2.6.0 .
nitial izarea s ti ve i
Prin acest algoritm so c roo aza st iva vida. varf are valoa rea NULL.
in acest
caz . nodul v arf nu ex ista si poin terul
Im pl em entarea algorit m uJui. Se foloseste functia procedura la ini t () al carei parametru varf se transm ite prin referinta, deoarece este para metru de iesire.
146
Implementarea strue t u r ilor de date vo id i n it{ no d * &v a r f ) {va r f = NULL;)
2.6.6.2. Adauqaraa unui nod la stiva Nodul se adauqa la stiva ca predec esar al varfului. Pasii algoritmului sunt: PAS 1. Se cere alocarea de memorie pentru nodul p . PAS 2. Se scrie informatia i n nodul p . PAS 3. Nodul p se leaqa de nodul varf. PA S4. Nodul p a da uqat devine nod ul var f . Impleme ntare a algoritm ului . Se foloseste functia procedu rala ada uga () al carei parametru
varf
S8
tra nsmite prin reterinta, deoarece este parametru de intrare-iesire.
voi d adau g a( nod * &va r f ) {no d *p =n e w no d i p ->in f o ~ x ; p - >u r m=va r fi
var.f~p ; }
2.6.6.3. Extrag erea unui nod din stiva Nodurite se extrag din stiva pentru a putea consulta informalia care e xi sta in nodur ile urmatoare. Un nod S8 poate extrage numa i in cazul in care stiva nu este vida. Se poate extra ge numai nod ul din varful stivei (se elibereaza spatiul care a fost ocu pat de nod ). i n varfu l stivei va aju nge succesorul nodului extra s, Pasi i algoritmu lui sunt: PAS1 . Se salvea za adresa nodului v a r f i n pointerul p . PAS 2. Succesorul nodu lui varf devine nodul varf . PAS 3. Se cer e elibera rea zonei de memorie de la adresa mernorata in po interul p . Im plementa rca alq oritmu lui , Se foloseste functia procedurala extrage ( ) al care: parametru var f se transmite prin referinta, deoarece este parametru de intrare-iesire. vo id e xtr a g e (nod *&v a r f ) {n o d *p =v a r f ; va r f =va rf - >u rm ; d e l ete p ; }
2.6.6.4. Prclucrarea stivei Prin acest algoritm se consulta informatia din fiecare nod al stive i. Deoarece nu poate fi co nsultata de dit inform alia di n vartut st ivei , pentru a ajunge la un nod trebuie sa se extraga toale nod urile p;ma la et. Imp lementarea alg oritm ului. Se foloseste functia procedurala prelucrare() al carei parametru varf de tip nod se transmite prin referinta, deoarece este parametru de intrare-iesire. v oid prelucrare{nod * &va r f ) {whi l e (va rf! =NULL) { l i s e p r e lu creaz5 v arf->inf o e xtr a ge (va rf ) ; ) }
Seop exempliticarea modului i n care, pentru rezolvarea problemei , folositi algoritmii de prelucrare a stive lor ~i implementare a lor cu ajutorul subprogramelar .
Enunt ul pro bl em ei. Se citesie dintr-un tisier text uri sir de numere separate prin speiiu care se depun intr-o stive in ordinea in care sunt ciiite numerete din tisier. Sa se etimine nunuuut de la baza sitvei §i numerele ttimese in stiv» sa so scrie intr-un tisier text. Pentru testarea programului se va lolosi §irul de numere: {t , 2. 5. 3. 4). in prelucrarea stivelor, pentru a putea ajunge la inforrnatia care treb uie prelucrat a, trebuie extrase toate nodurile, pan a la nodul care confine acea informatie, deoarece nu poate fi prelucrata decat inforrnatia din varful stivei. Pentru a nu se pierde informatia din nodur ile
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.
..
Con su lta rea nodului care c ont ine n um aru! 3 '
5
4
_
oes c arc a
consulta
•
1 stiva
....
(
5
Inca rc a
W
W
varl r
W
stiva de rezerva
- 3 W
- W
W
stiva
Iv arl
4
[~_3:Jva rl
3 2
_
varl r
-
stiva de rezerva
2
1
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 () .
~
# i n c l ude < f s t r e &~ . h >
s t r u c t nod {i nt info ; nod * u rm ;} ;
fst ream f1 ( "stival .t xt " , i o s : : i n ) , £2 ( " stiva2 .txt " , i o s : : o u t ) ; i nt x; vo i d in it (no d * &v a r f l { v a r f = NULL; } voi d a d a ug a (n od *&va r f ) {nod *p= n e w nod ; p-> i n f o =x; p->urm=varf; va rf~~ ; } i n t este vida(nod * va r f ) {retu r n varf==NULL ; } v o i d extrage (nod * &v a r f ) {n o d *p = v a r f ; var f =varf->u rm ; d e lete p i } void crcare{nod * &va r f ) {i n i t (va r f ); wh i le (fl »x) adauga(varf) ; } voi d d~sca rca(nod * &v a r f , n o d * &v a r f _ r ) { Ln i t I va r f vr ) ; while (va r f -c-u rm! =-NULL) {x=va r £- >i n f o ; ext raqe (varf) ; adauga (var f rl ; } } void inca rca (nod *&v a r f , n o d * &v d r f r) {wh 1 l e (le s te_vi6a(varf_T )) ( x =v a r f _ r - > i n f o ; extrage(varf~r ) ; adauga(varf ) ; } } vo i d salveaza(nod *&v a r f ) ( wh i l e ( !este vida {v a r f l ) { f zccv a r f -o i.n fo -cc" "; ex t.r aqe (varf) ; } ) void ma i n () ( ne d " v e r f , " va r f r ; c rea r e (va r f) ; fl . cl o s e () ; _ descarca (v a r f va r f r) ; e xtrage(varf) ; -<:I - t> incarca{varf ,var[_r} ; salveaza(varf); f2 . c l o s e {) ; } j
Fieeare problema se va deseompune in subproblerne ~i algorilm ul pentru rezolvarea unei subprobleme se va impleme nta cu un subprogram. Datele se transmit i ntre subproqrarne cu ajutorul pararnetrilor de cornunicatie ;;i nu al varlabilelor globale. Se creeaza stiv e in nodurile carora se merno reaza inforrnatia (numere sau caracte re). lnforrnatia se citeste dintr-un fisier text i n care , nume rele sau caracterele, sunt memora te pe acelasi rand, separate prin spatiu. Se vor alege seturi de date de intrare astfel tncat sa se verifiee algoritmul pe toate traseele lui.
148
lmplcm cntarcu s t r uct u r ilo r de date
1. intr-o stiva sunt memorate numere din intervalul [1,10J, ordonal e crescator, iar i ntr-o alta stiva, numere din intervalul [20,30]. ordonate crescator. Sa S8 concateneze cere dOUE! de numere, pastrand ordonarea crescatca re. (Ind icatio. Se rastoarna a doua stiva intr-o a treia stiva , S8 rasto arna si prima suva in a treia , peste numerele din prima stiva , !?i S8 extrag numerele din a treia stiva.) Se cornp ara doua stive fara a pierde conti nutullor i n urma extragerii de noduri. 5e elirni na din stiva numerele pa re. Se rnernoreaza intr-o suva un ~i r de litere mici. Se citeste de la tastatura 0 litera mica a alfabetului - lit. Sa se creeze doua stive: una va contine literele din stiva initiala care preced in alfabet litera lit ~ i alta va conune literele din stiva ini!iala care succed in alfabet litera lit Sa se afiseze in ordine inversa num ere !e dintr-o lista linlara sim plu l nla ntuita. (Ind icat ie . Se incarca nume rele din lista lntr-o stiva, i n ordinea de parcurgere a listei, !?i apoi S8 extra g ~i se afiseaza numerele din stiva.) Se ordoneaza crescator un ~ir de numere, cu ajutorul a doua stive . Determinati complexitatea algoritmului. (Indicat ie. Se folosesc doua stive. Se serie un nurnar in Stiva 1. Se citeste un numar. Daca nurnarul din varful Stivei 1 este mai mare decal numarul citit, atunci noul nurnar se adauqa la Sliva 1; altfel , se descarca din Stiva 1 in Sliva 2 numere pima cand in varful Stivei 1 ajunge un nurnar rnai mare decal nu rnarul citit, S8 adauqa la Sliva 1 numarul citit , si S8 lncarca in Sliva 1 numerele din Stiva 2.) Sa S8 verifice daca 0 expr esie aritrnetica ce contine paranteze este balansata. adica daca fiecare parante za deschisa este i nchisa coree! De exemplu, exp resia (a+b+(cI[d-e]})+ (dis) este balansata, iar exp resia (a+b+{cI[d -e}])+(d/s) nu este balansata , (lnd icatie. Se codifica paranlezele 1-(; 2- [; 3-{; 4-); 5-J; 6-)). Daca stiva nu esle vida ~; daca difere nta dintre codul dintre paranteza citita ~i codul parantezei din varful stivei este 3, atunci se elimin a nodu! din varful stivei: aittel , S8 adauqa la stiva codul parantez ei citite . Daca stiva este vida la term inarea evaluarii expre siei, inseamna ca expr esia este balansata .) ~i ruri
2. 3. 4.
5.
6.
7.
~() rit 1II DC
irn
Cele doua extr ernitati ale coz ii S8 nu mesc ca p ~i baz a . Ada uqarea de noduri la coada se face pri n nod ul baza , iar extragerea ~ i consultarea unui nod est e perrn isa nu mai prin extremitatea cap (se extrage cea rnai veche intormatie adauqata). Imp lementarea dina mica a cozii se face la tel ca a unei liste liniare , cu deosebirea ca: -) primul nod al cozii va fi indicat de pointerul catre tipul nod . iar ult imul nod at co zii va fi indicat de pointerul ,i. catre tipul nod : -7 pentru adauqarea unui nod . se poate folosi numai algoritm u l de adauqa re dupa ul timu l no d ; -7 pen tru extrager ea unui nod se poate folosi num ai algoritm u l pent ru elimina rea prirnului n od . Altle l spus , prelu cr area unei cozi se face d e la ca p s p re baza ~ i se prelucreaza intotdeaun a nodul d in ca p ul cozii. Accesul la inforrnati a din acest nod se face cu c.ap-c-Lnfo r"'
iaa es te coada care nu confine nici un no d si ad resa no d ului cap are va loarea NULL (ca p ~ N UL L ; ) . in coada vid a nu se mai pol execut a ope ratii de ex tragere de noduri. Coada poate sa ajunqa sa fie vida in doua cazuri : la in itlaliza re sau dupa ext rage re a ultimul u i n od . Pentru testarea unei cozi daca este vida se po ate implem enta functia operand este_ v i d a () ca re va furniza val oarea 1 ("adevaran. dad! este vida , :;;i valo area ("fa ls") daca nu este vida .
°
III fo rill 'I tid
149
int e ste_v ida(nod *c a p ) {return c a p == NULL ; } Pentru preluc rari cu ajuto rul coz ii puteti folosi urrnatorli algorit mi: -7 lnitlallzar ea cazii ; -7 adauqa roa unui nod la coada: -7 ex t rage re a unui nod din coa d a: -7 con su lta rea nodului di n cap ul co zii.
2.6.7.1.lnitializarca cozii Prin acest algoritm se creeaza co ada car e con tlne un nod . in acest caz , nodurile cap
~i
baza vor avea aceeasi ad resa . Implem entarea algori tmului. Se foloseste functia procedura la i ni t {} ai carei parametri cap si ba za S8transmit prin referinta, deoarece sunt parametri de iesire. v o id init{nod *&c a p, nod *&b a za )
{ca p =n ew nod ; cap->info=x ; cap->llrl11=NULL ; baza=-cdp ; }
2.6.7.2. Adiiugarca unui nod la coada Nodul se ada uqa la coada ca succesor al bazei. Pasii algo ritmului sunt: PAS1. Se cere aloca rea de memorie pent ru nodul p . PAS2. Se scrie intorm atia in nodu l p PAS3. Nodul p se leaga de nodu! baza PAS4. Nodu l p adauqat devine nodul b aza . hnp lcm entarea alg oritmului. Se foloseste functia procedu rala adauga () al carei parametru baza S8 transmite prin referinta deoarece este parametru de intrare -iesire. void ada~ ga(nod * &b a z a ) {no d *p =n ew no~ ; p->in:o=x ; p ->urm~ NUL L ; Da=~->urm~p ; ba z3 =9 ; }
2.6.7.3. Extraqcroa unui nod din coada Nodurile S8 extrag din ccada pe ntru a putea consu lta inforrnatia care exista in nodurile urrnatoare . Un nod S8 poate extrage numa i in cazul in care coada nu este vida . Se poate extraqe num ai nodul din capul cozii (se eliberea za spatiul care a fast ocupal de nod). i n capul coz ii va ajunge succesorul nodulu i extras . Pasii algoritmu lui sunt: PAS1. Se salveaza adresa nodului cap in pointeru l p . PAS2. Succ esor ul nodului cap devine nod ul cap. PAS3. Se cere elibera rea zone ! de memorie de la adresa rnernora ta i n pointerul p .
lmplernentaroa alg oritmului . Se foloseste functia procecurala extrage () a! carei metru cap S8 transmite prin referinta, deoa rece este parametru de intrare-iesire. voi d extraq e (Ilo d * &c a p ) {n o d *p
para~
2.6.7.4. Prclucrarea cozii Prin acest algoritm S8 consults informatia din fieca re nod al cozii . Deoarece nu poate fi con s ulta ta decat i nfo rrnatia din ca pul cozii , pentru a ajunge la un nod trebuie se extraqa toale nodurile pan a la el. Implementarea algo ritrnului. Se foloseste functia procedurala prelucrareO al carei parametru cap de tip nod se transmite prin referinta, deoarece este parametru de lntrare-iesire. void preluc~are{nod *&c a p ) {wh i le (cap!=NULL) { l i s e prclucreaza c a p- >i n f o ext rage(cap ) i )}
Implem enta rca str uct u r ilor de date
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 fi§ier text un §ir de numere separate prin speiiu care S8 depun tntr-o coeoe in ordinea in care sunt citite din tisier. Sa S8 a/imine numiuut din mijloeul eozii, daea numerul de noduri este impar, §i eele oou« numere din mijloe, daea numetut de noduri este par, iar num erele (amase in cooos sa se sctie lnlr-un tisier text. Pentru testarea prog ramufui se vor folosi doua seturi de numere: fl , 2, 5, 3, 4) §i fl , 2, 5, 4) . in prelucrarea cozilor, pentru a putea ajunge la intormatia care trebu ie prelucrata, trebuie extrase toate nodurile pima la nodul care contine acea informatie, deoarece nu poate fi 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 ( ) .
§
#1 nclude < f s t r e o rn . h > str uct nod t i nt info ; n od *u r rn; }; fs t r e a m fl( " c oadal .tx t " , 1 o s : : i n ) , f 2 ( " c o a d a 2 . t x t", ios : :ou t );
i n t x s n , i,j ; v oid in it {no d *&c a p , no d *&ba z a ) {c a p =n e w nod ; cap ->in £o ~ x ; ca p ->u ~m= NULL ; baza=cap ; } int este vi d a{nod *c a p ) {r e tu r n cap==NULL; } v o id adauga(nod *&b a z a ) {no d *p =new nod ; p ->in fo =x ; p ->u rm =NULL ; baza ->u rm=p ; baza=p ; } v 01d ext rage(nod -& c a p ) {no d *p =c a p ; cap=cap->u rm ; del ete p ; } v oid crea re{ nod * &c a p , n o d *&b a z a ) {f l» x; i nit( cap ,baza) ; n ++ ;
151
I II forill a tiea while
( f l » x)
{ a d a u g a (baz a) ;
n ++ i } }
void desc a rca_l(nod *&c a p , no d *&c a p_ r, nod *&b a Za _ L) {x v c e p - o i n f o , ext ra g e(cap) ; ini t ( ca p _r , ba z a _~r) ; i + +; while (i
(nod *c a p ,* ba z a ,* c ap r, *ba za r ; crea r e (cap,ba za ); f l . c los e ( ) ; if
(n%2==O)
j=n/Z -l ;-e l s e j=~/2 ; e xtrage(cap) ;
descarca_l(cap ,cap_~ ,baza_r) ; if (n %2==0) e x t r a qe (cap) ;
~
~ , " " ~
descarca_2(cap ,baza_T) ; salveaza{cap_r) ; f2 . c l o s e ( } ; J ~
Fiecare problema se va descompune in subp robleme ~i algoritmul unei subproblems S8 va implementa cu un subpro- , -f gram . Datele se transmit in tre subprograme cu ajutorul parametrilor de cornunic atie si nu al varia bilelor glo bale. Se creea za cozi in nodur ile caro ra se memoreaza numere intregi . Sirul de numere S8 citeste dintr-un fisier text i n care sunt memorate pe acelasi rand, separate prin spatiu. Se vor alege seturi de date de intrare astfe l i ncat sa se veri fice alg oritmul pe toate traseele lui. 1. Se elirnina din coada nume rele pare. 2. Se verifica caca numerele dintr-o coada sunt ordonat e (cresca tor sau descrescator). 3. Se concateneaza doua cozi, adauqano a doua coada la sfar§iitul primei coz i. 4. Se formeaza din doua cozi 0 a treia coada care contine rnai intai numerele pare din pozitHle impare din prima coada si apo i numerele impare din pozitiile pare din a doua coada. 5. Se inverse aza ordinea numerel or dintr-a coada cu ajutorul unei stive .
Tem«
'>::::J pentru rezolva rea
2.6.8. Aplicatii practice 1. Ana liza lexi cal a a unui text. Sa se afiseze. i n ordine alfabetica, cuvintele dintr -un text ~i frecventa lor de aparitie i n text. 2. Exista co ua automate care elibe reaza bonuri de ordin e pen tru 0 coada de aste ptare. Pe fiecare bon de ordine este trecut nurnarul bonului ~ i momentul la care a fost eliberat (exprimat in ora , minut si secunda). Bonur ile au numere unice . Deservirea persoanelor S8 face in ordinea momentului de eliberare a bonurilor. Sa S8 organi zeze 0 coada de asteptare pe baza bonur ilor emise de cere dou a automate. 3. Jocul lui Josephus . i ntr-un grup de n copii, acestia sunt aranja ti in cerc ~i sunt nurnarati ince pand cu primul copi l pana la nurnaru: k . Cop ilul care are numa rul k iese din joe. iar nurnaratoarea ince pe din nou de la 1 cu urrnatorul copi l. Sa S8 afisez e ordinea de iesire din joc a copiilor. Se vor implementa doua solutii, folosind 0 structure de date de tip: a) cca da: b) lista circulara simplu lnlantuita.
4. Sa S8 simuleze , cu ajutorul unei stive, 0 rnasina de adunat si muJtiplicat. Numerele S8 introduc i ntr-o stiva - si operatia S8 inche ie atunei cand S8 citest e de la tastat ura operatorul n +" (pentru adunarea numerelor) sau operatorul n *" (pentru l nrnuttirea numerelor). Se ma i folosesc : caracterul .A", pentru a anula ultimul nurnar introdus, ~ i caracterul n C~, pentru a anula toate numerele introduse.
_152 _ _ __ _ _ _ _______ _ _ _ --'-Ir:.:.: " I'l cl11 ellta fea Sl f llet IIfilllf de dal e
sa
5. Un automo bil trebu ie parcurqa un traseu care forrneaza un poligon, cu intoarcere la statia de pom ire. Pe trase u exista n statii de alimentare cu carburant care formeaza varfurile poligonului. Fiecare statie de alimentare i este caracterizata de coordonatele (x;,y;). Automobilul consurna 1 litru de carburant la fiecare 20 km ~i nu exista restricne pentru capaeitatea rezervorului. Se citesc dintr-un fisier text urrnatoarele informaui: de pe prirnul rand nurn arul de statii n , de pe urmatorul rand un sir de n numere Cj care reprezinta cantitatea de comb ustibil cu care este alimentat la statia i, iar de pe urrnatorul rand n perechi de num ere X j ~ i Yi care reprezinta eoordonatele statiei i. Din ee punet trebuie sa piece automobilul astfel incat sa parcurga traseul cu intoarcere in punctul de pornire ~i sa nu n3mana tara combu stibil.
Pent ru exercitiile urrnatoa re, daca nu lolosese urrnatoarele dat e:
S8
struct no d tint inf o ; n od * u r m;} ; r. o d * p r i m ,* u l ~ i m /* p ,* q/* r /* u / int x , k ;
specifica sernnificatia variabilelor de mem orie, se
* v :: /* c a p ,* b a z a ;
Raspundoti : 1,
Analizati din punet de vedere al cornplexitatii algoritmii pent ru prel uerarea listelor. Se va folosi i n determinarea cornplexitatii timpul maxim de exec utie Pentru compararea algoritmilor com pletat i urrnatorul tabel: Lista sim p!u i n l a n~ Li sla dublu inf an!uita Neordon ata Ord onata Neordonata Ordonata Cau t a (L ,k) Ad a ~g ~hL ,~)L _____
Elimina L,x ~u cce s o r u l
(h><)
PredecesorullL,Xl MinimJ l 1 Ma xim (L ) 2.
-
0 lista simp lu in lantuita ccntine , in ard ine, urrnatoarele naduri: 2 - ) 4 - ) 6 - ) 8 - ) 10 - ) 12 - ) 14 - ) 16 - ) 18 _.) 20 . Ce se va afisa in urma executiei urma toarei sec vente de prog ram? for { p ~ p ~ i re , k = 1 ; k < 5 ; k ~ ~ , p = p- > u r m );
co u t «
p - > i~f o ;
3.
0 lista simp lu in lantuita contine, i n ordine . urmatoa rete nodu ri: 1 - ) 2 - ) 3 - ) 4 --t 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
i f f p -c-urm -'> 'i n f o r p -' > .i n.f o e -eL ) cou t cc k ,
k++;
Adevarat sau Fals: 1. 2. 3.
Daca p este prim ul nod al listci, pentru a afisa informatia din al doil ea nod se executa secventa de instructiuni; p e p - c- u r m, cou t -cc p- c- Ln fo • Daca peste pr im ul nod al listei, pentru a afisa infcrrnatia din al doilea nod se executa instructiunea: cou t-cc p- c- u rm- >info; Dac a p est e primul nod al Iiste i, pentru a afisa inforrnatia din al treilea nod S8 executa instructiunea: c ou t.c -cp - »u r m- c- u rm- >i nfc :
Aleqeti: 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'urm ; C. p=q->urm ; d . p -c-u rm e q : 2. Care din tre urmatoarele variante realizeaza corec t leqaturile in cazu l inserarii unui nod nou in tr-o lista simplu lnlantuita, daca nodul nou are adresa p, iar nodul dupa care se tnsereaza are adresa q? a. o -c-u rme o : q ->urm=p ->urm ; b . p ->urrn=q -> urm ; q ->urm=p ; C. q -c-u rme p -c- u rm : d . p->urm=q->urm ; p->urm=q ; 3. Daca p este primul nod al listei, ce instructiune trebuie executata pe ntru a afis a intorrnati a mernorata in al treilea nod? a . c ou t « p - >u r m- >u rm- >i n f o - >i n f o ; b. c o u t« p - > u :::- m - > i n f o ~ > u r m ~ > i n f o ; c. cout« p - > u .rrn- > u r :n- >i n f o; d . cout« p ->u rm ->u rm->u rm ->info ; 4. Daca p , q si r sunt trei nod uri co nsecutive ale listei , pentru a intersch imba nodul q cu nodul r , care dintre sec ventele de instructiuni este corecta ? a . r ->unn=q ; q ->urrn=r ->urm ; p -c-urrno r : b . p - >u r m= r ; r->unn=q ; q-c-urrrr-r'-c-u rrru c.
q -c- u .rme r -c-u rm .
r -c- urrn-iq .
p ->unn=r ;
d. .r-c-u r me -q , p-c-urme r : q -c-urrn-ir -c-urm . 5. Daca p este un nod al listei " i q un pointer catre tipu l nod, care dintre secventele de instructiuni urrnatoa re realizeaza corect leqaturile astfel i ncat sa se elimine din lista cele doua nod uri care urrneaza dupa nodu l p? a . p ~>u rm=p->urrn->unr,->urm ->urm ; b. p- c- u rm- p- ou rm- c -u rm . C. p->unn->urm=p->urm-> urm ->urm ; d . q =p->unn ; p -c-u rme q -c-u.rm-c-u.rrn: 6. Daca L1 este 0 lista orqanizata ca stiva . stab iliti care este adresa corecta de extragere din stiva:
a.
7.
de lete p ; p=p ->urm ; b. r =p ->urm ; p=r ; delete p ; c . r =p ; p e p-c-u rm : delete p ; d . r e -p - c- u r m: p=r ; delete r ; Ca re dintre urmatoarele secvente de progr am ca lculeaza , in variabila k , suma elementelor din lista simp lu inlantuita: a. for {k= O, p=p r i m; p !=NULL; p = p ->urrn) k+ = p-c-i n f o : b. fo r ( k= O, p""p r i m; p->urm ~ =NULL ;p = p -c-u rm I k+=p-> info ; c. k =O ; p=pri:n ; while (p! =NULL) { k + = p->info ; p = p -c-u rrr u } d . p=pr im ; k = p ->in fo ; do { p = p-c-u rm, k+= p ->info ; } while (p ->unn! =NULL ) ;
i n urrnator!i 7 iterni , variabilele p si q mernore aza adresele de i nceput ale listeJor liniar e simplu lnlantuite nevide L1 si respectiv L2. Elem entele listelor sunt de tipul no d. (Baca taureat - 5e siunea iunie-iu lie 2003)
154 8.
Implernentarcu struct urilor de datc
Trebuie mutat primu l element al listei L1 imediat dup a primul elem ent al listei L2, in rest listele ramanand neschi mbate. Car e dintre urrnatoarele atribuiri sunl nec esare ~ i in ce ordine se etectueaza? 1) r eq- ourm . 2) r-ep - ourm , 3) q-c-urmep , 4) p=r ;
5) p- >urm=r ; 6) p- >urm =q- >urm; a. 1 6 3 4 b. 1 3 5 c. 2 6 3 4 d. 2 3 6 4 9. Trebuie mulat primul element al listei L1 imediat dupa primu l elem ent al Iistei L2, i n rest listele rarnanand nesch imba te. Care dintre urrnatoarele atribu iri sunt necesare ~i in ce ord ine se ete ctuea za? 1) r =q- >urm; 2) r =p->urm; 3) q- c-urm-p , 4) p e r r
5) p->urm=r ; 6) p- >urm =q- >urm, a. 1 6 3 4
b. 1 3 5
c. 2634
d. 236 4
i
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
in urmatorii 6 itemi, variabilele p ~i u rnernoreaza adresa primului, resp ectiv a ultimului element al lisle i Iiniare simplu ln lantu ite nevide L. Elementele listelor sunt de tipul nod. (Bacalaureat - Sesiune a august 2003) 15. $t iind ca L este fermata din 4 elemente, atunc i adresa penultim ului elem ent este : a . p-c- u rm- c- u.rm- > b . p -c-urrn- o u r m C. p- >u r m d . p - >u rm->urm-> urm 16. Elerne nte le din lista L aflate la adre sele q si r sunt vecine (consecutive) i n lista c aca si num ai daca: a . q - >u rm r-c-u rrn b . r- >u r m == q && q ->u nm = = r C. q->u rm d . q == r r I I r - >unn q
Intorm atica
155
17. Stiind ca este cefl nita 0 functie cnf astfel incat cnt(a1,a2) returnea za nurnaru l de elemente situate i n lista i ntre elementele de la adresa a1 si a2 (fara a nurnara elementele de la adrese le respective), care dintre urmatoarele ex presii arata al cate lea este elementul memo rat la adresa q in lista L? a . c n t (p ,q ) +2 b . c nt (q ,u) +2 c . cnt (q ,u)+ l d . cnt (p , q) + l 18. Este defini te 0 fun ctie min astfe l tncat min(a 1,a2) returneaza valoarea 1 daca 'Ii numai daca eel putin unul dintre elementele memorate la adrese le a1 ~ i a2 S8 afla in lista L ~i returneaza valo area a in caz contrar. Care dintre urrnatoa rele expresii are valoa rea 1 daca ~j numai daca elementul de la adresa q S8 afla in lista L? a . min{p , q)
b. min(q ,u}
c . min (p ,u )
d. mi n (q ,q )
19. Un element aflat la adresa q face parte din lista L daca la starsi tul executarii secve ntei alaturate va riabila r are valoarea : a. 1 b. p e. q d. NUL L ! 0 20. Lista L are exac t doua elemente daca: a . p-> unn= =u b. u ->urm==NUL L / ! u->u rm c . P'''' U d. p ->u rm==NUL L / ! p ->urm 21. Daca in variabila p este rnernorata initial adresa primului nod a l unei liste simplu Inlantuite cu eel putin 10 elemente, pentru a obtine in variabila p adresa pen ultimului nod al listei S8 executa secven ta: b. while (! p- >unn) p ->u rrn; a. while ( ! p ) p->urm ; C. wh ile (p- >urm->urm ) p - c-u rm, d . while (p - >u rm) p - >u rm ; (Baealaureat - Sesiunea speciala 2003) 22. Stiind ca intr-o lista circular a simpl u inlanluita cu eel putin doua elemente. adresele p si q reprezinta adresele a do ua elemente distincte din lista, atunci elementul memo rat la adresa p este succesorul elementului memorat !a adresa q in lista daca si numai daca: b . q ->u rm =:::., p a . p-> u nn == q ; C. p ->urm == q -c-urrn , d. q - c -urm-o u rrn == p (Bacalau reat - Sesi unea speciala 2004) 23. Daca lntr-o lista circulara simplu inlantuita . cu eel putin 4 elemente, se cunoaste adresa p a unui element din nsta, atunei este accesibila adresa element ului din lista precedent celui aflat la ad resa p ? a. Nu. b . Da, in orice situatie . c. Da, numai daca p este adresa prirnului element al listei. d . Da, numai daca p este adresa ultimului element al listei . (Bacalaureat - Sesiunea iunie-iulie 2004) 24. intr-a lista liniara simplu i nlantuita nevida , pentru eliminarea elementului ee urmeaza dupa elementul aflat la ad resa p (elementul de la adresa p nu este nici primul, niei ultirnul) un elev utilizeaza trei instructiuni simple (nestructurate). Care dintre instructiunile urrnatoa re poate fi una dintre cele trei? a . p ->unn-> urm = p ; b . d i s po s e (p ) c. p ->urm = p->urm- >u rm ; d . p- c-urm = p (Bacalaureat - Sesiunea iunie-iulie 2004) 25. Noduri!e unei liste dubl u inlantuite retin in carnpurile info, adp si ad u 0 inforrnatie numerica, adresa noduJui precedent si respectiv adresa nodului urmator. Stiind ca lista este eoreet construita si ca doua noduri p ~ i q ale acesteia se lnvecineaza, atunci: a . p- >adp==q - >ad u b . p ->adu ==q ->adu C. p -c-e du we q d . p - >a d p ==q ->adp (Bacalaureat - Simulare 2006)
156 _ _ _______ _ _ _ _ _ _ ---'I=1llplclI1 C II ta rca st.-nctn rHo.- dc da te ___ 26. Daca intr-o lista liniara simplu inlantuita adresa de inceput a listei este p , iar adresa de sfarsit este u , atunci transfonna rea llstei in lista circulara S8 realizeaz8 prin instructiunea : a. p -c-u rm -.u b . p cu- o-u rm C. u - c-u r rnvp d . ue p - c- u r m (Bacalaureat - Ses iunea iunie-iulie 2004 ) 27. Se considera 0 lista simplu Inlantuita ale carei noduri retin in carnpul urm adresa nodului urmator allistei sau NULL daca nu exista un nod urmato r. Pentru inserarea unui nod aflat la adresa p irnediat dupa un nod al listei aflat la adresa q, 58 utilizeaza unele dintre urmatoarele atribuiri: 1) p -c-ur me q , 2) q->u rm =p ; 3) p=q- >urm; 4) q=p -> urm ; 5) p- >unn = q - >u r m; 6) q - >urm= p - >u r m; . Stabiliti care dintre acestea S8 utilizeaza ~i in ce ordine: d. 23 c . 52 a . 36 b . 24 (Bacalaureat - Simulare 2006) 28. Variabila vf mernoreaza adresa elementului din varful stivei . Fiecare elemen t al stivei rnernoreaza intr-un camp ad r adresa urrnatorului element din stiva. Variabila q poate memora adresa oricarui element al stivei. Sa se realizeze elirninarea elementulu i din varful stivei: b. q =v f-> a dr ;vf =q - >ad r ; d e l e t e q ; a . q - >a d r =v f; v f - >a d r =q;delete q ; d. q= v f ; v f =q- >a dr ; delete q ; c . q =v f; v f =v f - >a d r; d elete 'If ; (Bacalaureat - Simulare 2003) 29. 0 lista tiniara simplu i nlan\uita cu adresa de i nceput merno rata i n variabila p este vida daca: b. p ~~ NULL I lp a. *p ==NULL I ! "" P d . e p ! =NULL / "p c. P ! =NUL L I p (Bacalaureat - Sesiunea spec iala 2003 ) 30. i ntr-o lista dub lu in lantuita cu cel pu tin 4 ele mente, fiecare ele»acu-:>adp ; men t rel ine i n carnpu l adp ~ i adu adresa eleme ntul ui precep""'q->odtJ; dent si respectiv urrnat or din lista. Daca p reprezinta adresa p- >ad p=NOLI ,; primu lui element din lista, iar q e ste de acelas i tip cu p , atunci delete q ; secventa alaturata realizeaz a: a. interschim barea pr ime lor doua compo nente b . elim inarea primu lui element d. eliminarea ult irnului elemen t c . elimin area ce!ui de-a! doilea element (Bacalaureat - Sesi unea specia la 2005) 31. i ntr-o lista dublu inlan! uita cu cel putin 4 elemente, fiecare eleme nt reline i n carnpu l ad p ~ i adu adresa eleme ntului precedent ~i resp ect iv urrnator din llsta , Daca p reprez inta adresa pr imulu i elemen t din lista , atunci p ->adu->adu->adp este a. adresa primu lui element b. adresa celui de-al doilea element c . adresa celu i de-al treilea eleme nt d . adresa celui de-al patrulea elemen t (Bacalaureat - Simulare 2005) 32. Intr-o lista circulara simplu i nlantuita fiecare element refine i n carnpul next adresa eleme ntului urmat or. Stiind ca. pentru variabi la p ce rnernoreaza adresa unui element oareca re din lista, este adev arata relatia p ->ne xt=p , atunci lista este fermata din: a. zero componente b. 0 components c . 2 componente d. minim 3 componente (Bacalaureat - Sesi unea august-septembne 2005 ) 33. Daca vf ind ica ultimu l nod al stivei , care dintre urrnatoa rele expresi i trebuie sa fie adeva rate , pentru ca stiva sa fie vida? a. v f ==NULL b. v f - >urm ==O
q;. ; p-
c.
v f - c-u r me e Nu L l,
d.
vf ~ ~O
Informati d
157
34. Daca v f indica ultimul nod al stivei, jar q urrnatoarele secve nte de instructiuni extrage a. q e v f-c-u r rn : v f = q -> u r m; d e l e t e q; c . q =vf ; v f = q -> u r m; d e l e t e q ;
un pointer catre tipul nod, care dint re nodul d in varful stivei? b . c.=v :: ; v : =v f ->urm ; d e l e t e q ; d . q =v f ;v f = q - >u r m ; d e l e t e q ;
35. Daca variabila cap rne moreaza adresa primului nod din coa da si va riabil a b aza rnernoreaza adresa ultimului nod din coada, ca re dintre urrnatoa rele exp resii trebuie sa fie adevaratc . pentru a avea 0 coada vida? a. be z a e v NlfL l .
b . cap-> urm= == ba z a
c . cap==b az a
d . c ap = = NUL L
Miniproiccte: Observatie: Pentru realizarea urrnatoarelo r miniproiecte S8 va lucra i n echipa. Protesorul va numi ccnducatorii de proiect, le va distribui proiectele si le va aloca un buget pentru realiza rea lor (pentru simpli!icare , buge tul va fi folosil numa i pentru plata membrilor ech ipei care vor realiza proiectul). Conducatorii de proiect vor negocia cu profesorul termenul de predare a aplicatiei, echip a cu care 0 vor realiza, si , daca este cazul, bugetul care Ii s-a alocal initial. Pe timpu l realiza rii aplicatiilor, membrii echipelor pot migra de la a echipa la alta. cu co nditia sa rarnana incadrati Intr-una dintre echipe, iar miqratia sa se faca numai cu accep tul conducatortlor echi pelor int re care migreaza. Fiecare echipa va fj to rrnata din : -7 Condu catoru! pro ie ct ulu i I~i va forma echipa ~i va distribui sarcinile pentru fiecare membru, negociind initial suma repartiza ta din bugetul alocat pentru realizarea sarcini i. Va fixa termene de executie pentru fiecare memb ru al echipei ~i va urma ri rnodulin care sunt respectate aceste tenn ene. In cazul In care unul dintre membrii echipei nu i~i realizeaza core ct :?i la timp sarcinile, va redistr ibui a parte dintre sarcini lntre ceilalti rnernbri ai echipe i, renegociind suma din buget alocata fiecaruia dintre ei La sfarsit , va da calificative fiecarui membru al echipei , In functie de modul in care si-au respecta t termenele, de modul in care au cooperat cu ceiialti membrii ai echipei si de calitatea lucrarilor executate. -7 Ana listu l va analiza cerinte!e info rmatio nale ale aplicatie i. va determina functiile apli catiei ~i va elabora modul de rezolvare (datele ~i structurile de da te folos ite, procesele in care este descornpusa aplicatia - care vor f implementate cu subprograme - si meniul care asiqura intertata cu utilizatorul ). In rea!izarea acestor sarcini va f ajuta t ~i indrurnat de conducatorul proiectului. -7 Grupul de pro g ram atori (numarul lor trebuie sa fie stabilit in funct ie de dimensiunea proiectu!ui) va implernenta in Iimbajul de programare solutia qasita de analistul echipei. Conducatorul proiectului Ie va repartiza subprogramele pe care Ie vor realiza ~ i specificatiile fiecarui subprogram: datele de intrare , datele de iesire si functia subprogramului. -7 Testo ru l va testa aplicatia . EI va trebu i sa aleaqa set uri de date de intrare astfel incat sa gaseascii erorile de loqica ~i de executie ale aplica tiei , -7 Documcnta ristu l va Intocm i docurnentatiile aplicat iei : documentatia pentru beneficiar si docurnentatia pentru pro iectantul aplicatiei La terminarea pro.ectului membri i echipelor vor prim i note pentru evaluarea activ.tatii lor. Sistemul de evaluare trebuie sa tina cant de venitu rile rea lizate pentru munca depusa , de calificativul obtinut de !a conducatorul de proiect si de ca!itatea muncii eva luata de profesor. 1. Pentru biblioteca scolii sunt aduse carti de la mai multe edituri. Cartile trebuie organ izate i n ordinea alfabetica a autor ilor , ~i pe fiecare autor in ordinea alfabetica a titlurilo r. Este posib il ca pen tru acelasi autor ~i acelasi titlu sa se prirneasca ma i mu lte exempla re. Se va folosi cate 0 stiva pentru fiecare autor, In care se va simula teancul de titluri primite , pentru fieca re titlu rnernorandu-se si numarul de exe mp lare . Numele autorilor si adresa
158
Implcm cnta rca st ruct ur ilor de da te
varfului stivei de carti asociate S8 vor memora i ntr-o lista ale carei elemen te contin in info rmati a utila do ua carnpuri : un camp de tip sir de car acte re pentru numele auto rulu i si un camp de tip pointer cate tipul nod al stivei pentru varful stivei. Scrieti a aplicatie care sa asigure urrnato arele ope ratii prin intermediul unui meniu : a. Distribuirea pe autori si titluri a unui teanc de carti sosit de la 0 editura. b . Afisare a titlurilor si a nurnarului de exemplare ale unui autor al ca rui nume se citeste de la tastatura. c. Afisarea in ordine alfabetica a autorilor si a numarului de titlu ri si de exemplare pent ru fiecare auto r. d. Numele autorilor cu cale mai multe, respectiv cu cere rnai putine titluri. e. Numele autorilor cu cele ma l mu lte, respectiv cu cele ma i putine exemplare. 2. La un concurs participa mai multi candidati identificati du pa nume ~i prenume . Fiecare candidat primes te la i nscriere un nurnar de identificare. Concu rsul consta i n trei probe , notele putanc lua valori de la 1 la 10. Rezultatul concursulu i se stabileste pe baza mediei aritrnetice a notelor primite. Trebu ie prevazute doua varian te de admitere a candidatiler: sunt adrnis i toti candid atii care au a medie mai mare decat m ~i sunt admlsi, i n ordinea med iilor, primii k candidat i (valorile pentru m si k se citesc de la tastatu ra). Scrieti 0 aplicatie care sa asigure urrnatoa rele operatii prin intermediul unui rneniu: a. Inscrierea unui no u cand idat la concurs. b. Retragerea unui candidat din concurs. c. Completarea notelor ~ i calcularea mediei pentru fiecare candid at. d . Modifica rea infor rnatiilor despre un candidat. e. Afisarea candi datilor adrnisi i n fiecare dintre cele doua variante in ordinea descres catoa re a medi ilor. f. Afisarea candidatilor adrn isi in fiecare dintre cere dou a va riante i n ordinea alfabetica a numelui si prenumelui . 3. Intr-un depou exista 0 linie pe care se gasesc mai multe locomotive , aranjate in ordine a in care au intrat in depou, ~i a linie pe care se TRIAJ LOCOMOT IVE gasesc mai multe vagoan e, aranjate i n ordinea i n linia de linia de care au intrat in depou. Fiecare locornotiva ~i intrare i e~ i re fiecare vagon are un num ar de identificare. In plus , pentr u fiecare vagon este preciza ta ~ i clasa (clasa 1 si clasa 2) Pentr u linia care contine locomotivele exi sta un tria] cu k linii de rnanevra . Valoa rea k lin ii de rnan evra pentr u k se citeste de la tastatura. in triajul vagoanelor exista 0 linie de intra re ,,1 0 linie de iesire pe care depla- TRIAJ VAGOANE sarea se poate face numa i in sensul saqetilor si 0 linie de linia de linia de ma-nevra pe care dep!asarea se poate face in ambele intrare ies.re sensuri. Scrieti 0 aplicatie care sa asigure urrnatoarele operatii prin inter-mediul unui meniu: a. Intrarea unei locomotive in depou. l ,inia de _ b. Afi~area locomotivelor din depou . Jm anevra c. lntrarea unui vagon in depou . d. Afisarea vagoanelor din depou , precizandu-se cate vagoane sunt de c1asa 1 ~i cate sunt de clasa 2. e. Formarea unei garnituri. Garnitura este fermata dintr-o locornotiva cu numarul de iden-tificare p n vagoane , dintre care m vagoane sunt de clasa 1 (valorile pent ru p. n si m se citesc de la tastatura).
"i
Inform atica
159
2.7. Graful 2.7.1. Definitia matcmaticii a grufului Se nurneste graf (G) 0 perec he ordonata de rnultirni (X,U), unde X este 0 rnultirne finita ~i nevld a, iar U 0 multirne de perechi formate cu elem ente distincte din mu ltirnea X (familie de subrnultimi cu doua elemente din rnultimea X). Terminologie:
-7 Elem entele rnultirnii X se nume sc varfuri sau noduri. Mulfirnea X se mai nurneste
~i
multirnea varfurilor sau rnultimea nodurilor grafului G. Ea este de forma :
x = {X1J X2, X3, ... , Xi• ... , X
n}
unde Xi reprez inta nodul i al grafulu i G care are n noduri . -) Ordinul grafului reprezinta numarul de noduri ale grafului, n :
ordinul grafului = eard(X) = n
-7 Elementele rnultimii U sunt perech i de nocuri , adica submultirn i eu doua elemente din rnultirnea X ~i se noteaza cu Uk . Elementul Uk este definit de perechea de forma {x;, Xj} , unde x, 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 .
Mul\imea U are proprietatea de s imetrie daca §i numai daca, pentru orico per ee he d e noduri (x;, Xj), daca [x, Xi}E U, at un ei §i (xi ' X;}E U in functie de prop rietatea de simetrie, grafurile se clasifica In : ~ Grafuri neorientate. Un graf G=(X,U) este un graf neorientat daca multirnea U are pro prietatea de simetrie. Mu1limea U este fermata din pereehi neord onate {xi, x;}. ~ Grafuri orientate. Un graf G= (X ,U) este un graf orientat daca rnultimea U nu are proprietatea de simet rie. Mu ltimea U este fermata din pe re c hi ordo na te { Xj, Xi}. Pentru a identi fica tipu l de graf pe care 11 veti folosi pentru a repre zenta datele , daflniti rel atla dintre noduril e grafului si verificati daca relatia are proprietatea de sirnet rie, astfel: ~ Daca nodul X In relatie eu nodul y irnplica ~ i ca nodul y este In relatie cu nodul x, atunci grafu l este neoriental. ~ Daca nodul X In relatie cu nodul y nu irnplica ~i ca nodul y este In relat ie cu nodu! x, atunci grafu l este oriental.
I S1bul.dlJi.u de CSlZ I Seop: identifiear ea tipul ui de graf pe care 11 folositi pent ru a rezolva problema . Enuntul problemei 1. Pe neno unui jude! exist» mai muite locetitet) care sunt legate prin sose te pe care S8 citcule in ambele sensuti. Sa se identltice traseele pe care se poate ajunge de la localitatea A la tocalitatea B.
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 .
~.
$
1. Prin ce tip de graf va fi reprezentat un grup de persoane lntre care s-au stabil it relat ii de vecinatate?
~. 2. Prin ce tip de g r~f va fi reprezentat un grup de persoane Intre-
r
n-rri-nt:
srminoloqre
Elementele multirnii U (perech ile de noduri) S8 numesc mucn u. Multirnea U se mai nurneste si Itimea muchiilor grafului G. 0 muchie, fiind un element din rnultirnea U, este ce terrninata de 0 subrnultirne cu doua eleme nte din multimea X: muchia k a grafului ( ), care uneste nodurile Xi ~i Xj , este determinata de subrnultirnea {Xi, xi} ~i se noteaza cu x"j ' [x., Xj] ~i [ Xj , Xi ] reprezinta aceeasl muchie a grafului. Graful G are m muchii : nurnar ut de muchi i = ca rd (U) = m
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.
Grafu l S8 reprez in ta In pla n prin intermediul unor elemente geometrice: n od uril e se reprezinta prin cercuri, iar muchiil e prin linii drepte care unesc anumite cercuri .
0"
~
Nodul xi al grafulu i G
Muchia Uk=[Xi,Xj] a g rafului G
' - Nodul Xj al gratului G Elemenlele mult irnii X (nadurile) se identiflca cu ajutarul unar etic hete , care pot fi numere sau litere. Pentr u simp lificare , vom folosi ca etichete un sir de numere consecutive, lncepand cu nurnarul 1. De exemplu, pentru un grat cu n noduri, vom tolosi etiche tele: 1, 2, 3, ..., n-1, n. 0 muchie se va nota cu [i ,j] , unde i ~i j sunt etichetele nodurilor incidente cu muchi a. De exemplu , muchia [2,3] este muchia care uneste noduri le cu etichetele 2 ~i 3 Exem plul 1: in gratu ! G, =(X" U, ) din figura 1: -7 Ordin ul gratu lui este 8. -7 Graful are 8 naduri (n=8) ~i rnultim ea nodurilor este X,={1,2,3A,5,6,7 ,8} -7 Graful are 9 muchii (m=9) ~i mu ltimea muchiilor este Fig . 1 U ,={[1,2]. [1,3] , [1 A], [2,3], [2,5], [3A], [3,5], [6,7]. [6,8]) . -7 Nodu l 1 este n od adia cent cu nodur ile 2, 3 ~i 4, iar nodu l 6 este adiacent cu nodurile 7 ~ i 8. Nodurile 3 ~i 4 sunt adiacente deoarece perechea de noduri [3A] EU , . Nadu rile 5 ~ i 6 nu sunt adiacente deoarece perechea de nodur i [5 ,6] ~U ,. -7 Nodul5 este nod inci dent cu muchiile [2,5] si [3,5], dar nu este incident cu muchia [1,2]. -7 Nodul 3 este nod extrem much iilar [1,3], [2,3], [3AJ ~i [3,5]. -7 Muchii le [1,21 si [2,3] sunt m uc hii inciden te deoarece au un nod comun (nodul 2). Muchiile [1 A] ~i [2 ,3] nu sunt muchii incidente deoarece nu au un nod comun .
~ ~
~
Teorema 1 Daca graful neorientat G are n noduri (x " X2, ..., xo) , atunci nu m arul total de grafuri neorientate care sepot forma cu aceste nod uri esteg:
(J= 2c~
b
Dem c nstratle. Notam cu X multimea nodurilor grafului, cu U rnultirnea muchiilor, cu A multimea tuturor subrnultirnilor de doua elemente din X ~ i cu B multimea {O,1}. Multimea A are urrnatoarete elemente (subrnu ttimi) :
162
Implemen tarea st r net u r ilor d e date [1,2J,
[1,3], [2,3].
[1,4], [2,4].
[1,n]
0- 1 sub mulpm i
[2,n]
0-2 submulturu
[0-1,0]
Nurna rut total oe su bmultirnieste: (n- I) +( n -2) + ... + 1 =
1 sub rnuhirne
n x( n - I) 2
Notarn cu a - card{A):;;i cu b - card(S). Fieca rui graf ii putem asocia 0 funcue f:A ~B de finita a taturat. lovers, unei functii f:A ~ B ii putem atasa un grat, astfel: f(1x,y})=1 daca si numai da ce [x,y]e: U, Rez ulta ca numarul total de grafuri care se pot forma cu n noduri este egal cu 3
numarut de funct ii f. Dar. numarul de functii f:A-) B este ega! cu b
,
C'
" 1' da ca [x.y]
E
U
f( { x.y l)=
_
unde b=2:;;i a=
{ O. caca [x ,yJ e. U
C~
in gra!ul G , - cu ce noduri este adiacent nodu l1? i n gra!ul G, - cu ce muchii este incident nodu l 1? 3. Dati exemple de doua noduri adiacente ~i de ooua noduri care nu sunt adiacente in gra!ul G,. Dati exe mplu de doua muchii incidente ~i de doua muchii care nu sunt incidente in gra!ul G ,. Desenati gra!ul G,=(X" U, ) definit astfel: X, ={1 .2 ,3,4 ,5,6,7 ,8} U, ={[1,2J, [1 ,3), [1 ,5], [2,3]. [2 ,5J, [3,4), [4 ,5J, [4 ,6], [4 .7)}. Desenati gra!ul traseelor rutiere care la c legatura int re localitati le Brasov, Bucuresti, Buzau, Ploiesti ~ i Constanta. Oaca exists mai multe trase e rutiere i ntre doua localitati (de exemplu, Bucuresti ~i Brasov), adauqati la gra! noduri pentru localitatile care identifica unic aceste trasee (de exemplu , Valenl i de Munt e, Tarqoviste si Pitesti), Desenati gra!ul judetelor din Roman ia (intre doua jude te exista a muchie daca cele 1.
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'
/\
2.4.2.2. Gradul unui nod al grafului neorientat
Fig. 3
Nodul unui gra! este cara cterizat pnn grad. Gradul unui nod Xkal gra!ului G esle egal cu nurn arul muchiilor incidente c u nodul ~i se not oaza c u d(xk) ' Tcrminologie : ~ ~
Se nurneste nod terminal un nod care are gradul egal cu 1 - d(xk) = 1 (este incident cu 0 sinqu ra muchie). Se nurneste nod izolat un nod care are gradu l ega l cu 0 - d(xk) = 0 (nu este adiacent cu nici un alt nod al grafului, adica nu S8 g a se ~ te in extremitatea nici unei muchil) .
Info rmat ica
163
Exemplul1 :
®
Graful G 4 =(X 4 ,U 4 ) din figura 4 este defin it astfel : X 4={1 ,2,3,4 ,5,6 ,7,8,9, 10,11} U,={[ 1,2], [1,4J, [2,3J, [2,5], [3,4J, [3,5], [5,6J, [5,7J , [5,8J, Fig . 4 [7,9] }, in graful G 4 : -7 G rad u l nodu lui 5 este 5, deoar ece are 5 muchii incide nte: [2,5J, [3,5], [5 ,6J, [5,7] ~i [5,8J -7 Nodu l 9 este nod te rm inal, de oarece are gradul 1 (0 sinqura muchie tncide nta: [7,9]) . -7 Nodu l 10 este no d izolat, de oarece are gradul 0 (nic io mu chie incidental.
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).
Observatie: intr-un graf cu n noduri, oricare ar fi nodul egal cu 0 ~i m ai mic sa u egal cu n-1 (O';d (xk)'; n -1).
Xk ,
gradul sau este rnai mare sau
-------------- .-----.. 1. in g raful G 4 : precizali gradul nodu lui 3 ~ i identificati nodu l cu gradul cel
mai mare, nodurile izolate si nodurile terminale. 2. in graful G 3 : identiflcati nodu rile care au gradul 2, precizati cate noduri au gradul impar si care este nodul cu gradul eel mai mare. 3. in graful G s: precizat i grad ul nodulu i 3, identificati nodurile izolate si nodurile term inale , precizati cate noduri au grad ul 2 ~i cate noduri au gradu l impar.
Teorerna 2 Daca gra ful G are m rnu chl i (Ul, U2, ... , um) ~i n noduri (x-, X2, .. . , Xo ) , atunci in tre gradul nodu rilc r si numarul de muchii exista urrnatoarea relatie: suma gra dalor tuturor noduriJ or
grafului este cgala cu dublul numarului de muchii:
i: d( 'J ~ 2 m
;,- 1
Dem on stratie. Fiecare muchie Uk = [xj, Xi] coresounde unei unitati din gradul nodului Xi ~i unei unita\i din gradul nodului Xj . Rezulta ca fiecare muchie contribute cu 2 unitati la sum a gradelor.
Exemplu . in gratul G 4 : d(1) + d(2) + d(3) + d(4) + d(5) + d(6) + d(7) + d(8) + d(9) + d(10) + d(l l ) = 2+2+3+2+4+1+2+ 1+1+0+0 = 18 = 2x9 = 2xm
... Propozltla 1. Pentru orice graf G , nurnaru l nodu rilor de grad impar es te par. Demon st ratie. Suma gradeJor nodurilor fiind un numar par, aceast a surna trebuie sa contina un numar par de termeni care sunt numere impare.
Exemplu . in graful G 3 exista 4 noduri cu grad impar (3, 6 , 8 ~i 9).
164
Imp lcmcntarca st r ucturilor d c da tc
Propozitia 2. Numarul minim de much ii, rnm tn, pe care trebuie sa Ie aiba un graf neorien tat, cu n noduri, ca sa nu existe noduri izola te, este: III "''''
=[
II ;
I]
sa
sa
Dernon stratl e. Pentru ca un nod X j nu fie izolat , trebuie ca d(X r);:::.1. Pentru ca toate noduri le nu fie izolate, trebuie ca suma gradelor sa fie mai mare sau egala cu n . Dar, suma gradelor este dub lul nurnarului de muchii - m . Insearnna ca , pentru n par - mmin=n/2 , jar pentru n impar - m min=(n+1 )/2 .
Teorema 3 Daca gralul G are
n nod uri (na), atunci eel putin doua noduri au acetasi grad.
Dernonstratte - prin reducere la absurd. Presupunem cit nu este adevarat. Cum, oricare ar fi nodul xe. O ~d( xk)~ n -1 , ln searnna eel sinqurul sir de n numere, diferite intre ele doua cate c oua. care pot reprezenta gradele unghiurilor este 0, 1, 2, ... , n-l . Deoarece un nod es te lzotat, eel ma i mare grad al unu i nod nu poate fi decat n-2 (nodul nu se poate lega de el Insusi s! de nodul izolat). Rezulta ca sirul de numere definit mai sus (singurul ~ir care se poate defin i) nu poate reprezenta sirul gradelor in graf.
1. in graiul G, ,, verificati ca este Indeplinita relatia dintre gradul nodurilor si nurnarul de muchii ale gralului . ldentiflcati nodurile cu grad impar ~i verificati ca nurnarul lor este par. 2. Daca un graf are 8 noduri, care este nurnarul minim de muchii pe care trebuie sa Ie aiba, ca sa nu fie noduri izolate. Oesenati un graf care, avand nurnarul minim de muchii stabilit, nu contine noduri izolate . Daca un graf are 9 noduri, care este nurnarui minim de muchii pe care trebuie sa Ie alba, ca sa nu fie noduri izolate. Desenati un graf care avand numarul minim de rnuchii stabilit nu contine noduri izolate.
,}
2,7,2.3, $irul grafic Se nurneste sir g rafi c un sir s de n numere intregi pazilive (d" d" .." do) care pot reprezenta gradele unui graf neorientat, cu n noduri. Propozitia 3
Cond itllle necesare ca un ~ir de n numere intregi pozitive (d" d" ..., dol sa fie un sir grafic sunt: (1) d,,; n-r , penlru once i=1,n; (2) suma d, + d, + ... + do trebu ie sa fie un numar par. Demo nstratle. Neces itatea ccn ditiei (1) rezutta din faptul ca grad ul ma xim al unui nod dintr-un graf cu n noduri poate fi n -t . Necesitatea conditie i (2) rezulta din Teo rema 2 - suma gradelor fiind ega la cu dub lul numa rului de rnuch!i, este un nurnar par .
Ac es te conditil nu sunt intotdeaun a ~i suficientc . Pentru a verifica dac e sirul de numere este sir graf ic, se face ana liza sirului de numere . Exem ple: (a) s=(1,1,2,3,3,4,5,5,7,8) Acest sir nu indeplineste una dintre conditiile necesare - (2) " suma numerelar este 39. (b) s=(1,1,1,2,2.3,5,6,8,9) Acest sir lndeplineste condltiile necesare (suma numerel or este 38 l}i fiecare nurnar este mai mic sau egal cu 9: 9=1 0~1 ) . Aceste cond itii nu sunt tnsa suficiente . Din analiza sirului rezutta ca nodul 10, avand gradul 9, este legal de toate celelalte 9 naduri . Nadurile 1, 2 si 3 sunt naduri l erminale. Ele nu pot f leqate decat de nadul 10. Rezulta ca gradul maxim
165
III fo r illa Iicii
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]}. ~
Precizat i daca sirurile s,= ( l ,1,2,2,4) ~i s,=(0,1,1,1,4) pot fi siruri gratice. Pentru sir ul care este sir grafic, gasiti un graf care i S8 poate as ocia .
2.7.3. Graful oricntat Spre deosebire de gratul neorienta!, In gratul orientat pere c hile de nod uri s unl ordo nale . Gratul orientat se mai nurneste ~i digraf.
2.7.3.1. Terminologie ~
Elementele rnultirnii U (perechile de nodur i) se nume sc arce. Mul\imea U se mai nurneste ~i rnultirnea arcel or gratului G. Un arc, fiind un element din multirn ea U, este determinat de 0 submultirne ordonata, cu doua elemente, din multimea X: arcul k al gratului (Uk), ce uneste nodurile x; ~ i Xi ' este determinat de subrnultimea {x;,x,} ~i se noteaza cu [x ;, xi] ' [ x;, xi] ~i [Xi, Xi] nu roprezinta ace las i arc aJ g rafulu i. Gratul G are m aree: nu m aru l de arce = ca rd( U) = m
-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 ~ ~
I
~
Se nurneste prcdcccsor al nodului Xi orice nod de la care intra un arc in nodul Xi Mul1imea predecesor ilor nodului Xi este fermata din multimea nodurilor de la care ajung arcele care intra in nodul Xi . Se noteaz a CU P(' si S 8 defineste ca m uttimea: P(x) = { Xi e X I (xj, x;)e U)
e,
166
IlIIplclllcntarca st r nct ur ilor dc datc
-7 Mul~irnea arce lor care ies din nodul U+(x,) = {u=(x,.
Xj)
Xi S8
IUEU} .
-7 Multimea arcelor care intra in nodul x,
I
noteaz a S8
CU
U+(X i) ~j
noteaza cu
U -(X i)
S8
!?i
de fine ste ca rnultimea S8
define ste ca rnutti-
mea U"(x ,) = {u=(x;. x,) UEU}
-7 Nodul sursa a l grafului este nodul care are rnultimea succesorilo r fermata din toate celelalte noduri, mai putin el, jar mu ltimea predecesorilor sai este mul timea vida.
-7 Nodul destinatie al gralu lui este nodul care are multimea predeceso rilor fermata din toate celelalte noduri, mai putin el, iar rnultimea succesorilor sai este rnultirne a vida. Observatii 1. card(S(x))=card(U+( x)) ~i card(P (x ))=card(U"(x)) 2. Pentru nodul sursa al qrafului card(S (x))=c ard(X).1 ~i card( P(x ))=O. 3. Pentru nodul destinatie al gralului card( P(x))=ca rd (X)- 1 ~i car d (S( x))=O. 4. Daca un graf are un nod sursa , atunei nu poate ave a un nod destinatie, ~i inve rs. Un g raf o rientat G es te d efinit de 0 per eche de rnulti m i : rnultim ea nodurilor sal e - X 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.
0 "'- Nodul x i al g rafu l u i G
~ ' - Nodu l
Xj
Arc ul uk=[xi,X j] al g ra ru l u i G
al grafului G
Exemplu :
:;>
t; , in graiul G, =(X" U, ) - din figur a 5: -7 Ordinul grafului este 5. -7 Gral ul are 5 nod uri (n=5) si rnultim ea nodurilor este X, ={ 1,2,3,4,5} . -7 Gralul are 7 arce (m=7) si multirnea arce lo r este U, ={[1 ,2], [1,4 J, -7
-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
nodul4 este nod succesor al nodului 1. Nodu l 3 nu are succesori.
-7 Mul!im ea pred eces oril or nodului 3 este fermata din nodurile 2, 4 si 5. Nodul 2 este nod pred ecesor al nodului 3. Nodul 1 este nod predecesor al nodului 4 , dar si nodul 4 este nod pred ecesor al nodului 1. Nodul 5 nu are prede cesori .
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
Dem onstratie. Se dernon strea za la fel ca Teorcma 1, eu deosebirea ca multimea Beste {D,1,2,3} card( B)=4 , ia r fu nctia f este de finita atatur at
f(l x.Y I) =
3' daca [x,Y]
E
U ~ i [y,x]
2, daca [x,y)
E
U
E
U
{ 1, oaca [y,x) E U 0, daca [x,y] e U ~ i [y.xj e U
1. 2.
in graful G, - cu ce noduri este adiaeent nodul 2? i n graful G, - cu ee arce este incident nodul 2? 3. Dati exemplu de doua nodur i adiacente in graful G, . 4. Dati exemplu de doua noduri care nu sunt adiacente in grafu l G, . 5. Da!i exe rnplu de doua aree incidente i n graful G, . 6. Dati exemplu de doua aree care nu sunt incidente in graful G7. 7. in graful G, precizati ce fel de extremitate este nodul 4 pentru fiecare arc cu care este incident. Preciaati rnultirne a succesorilor ~i rnultirnea predecesorilor nodului 4. 8. Desen ati qraful G, =(X" U, ), defimt asttel. G, X, ={ 1,2 ,3,4 ,5,6,7} . U, ={[ 1,2]. [1,5], [2 ,1J, [2,4J, [3,4J, [4,3J, [5 ,3], [6 ,5J, [6,7], [7,5] }. 9. Cate grafur; orientate se pot eonstrui cu 3 aree? Desenali 10 dintre aceste grafuri. . 10. Pentru graful G, din figura 6, precizati ordinul, numarul de ( \ II G, noduri, nurnarul de aree ~j rnultirn ile Xg ~i Ug.
(JF-
2.7.3.2. Gradele unui nod al grafului orientat Nodul unui graf orientat este caracterizat prin grad ul intern
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))
~i se noteaz a Cll d+(x).
Tcrrninologie :
-7 Se nurneste nod terminal un nod care are surna gradelo r eqala cu 1 (gradul intern sau gradul extern ega l cu 1 ~i gradul extern , respectiv gradul intern, ega l eu 0 - d+(x,) = 1 ~i d'( x,) = 0 sau d"(x,) = 1 si d+(x,j = 0). Nodul terminal este incident cu un singu r arc.
-7 Se nurneste nod izolat un nod care are surna gradelor eqala eu 0 (gradul intern si gradul extern egal e eu 0 - d+(x,) = d'( x,) = 0). Nodul izolat nu este adiacent cu niei un alt nod al grafului, adica nu se g as e ~t e la extremitatea niciunui arc.
Observ atii: + ' . • 1. d (x)=ea rd( S(x)) ~ I d (x) =c ard( P{x)). 2. Daca graful are n noduri , pentru un nod sursa al grafului d+(x)=n-1 ~i d"{x)=O, iar pentru un nod destinatie al grafului d-(x)=n -1 ~i d+(x) =O.
168 Exemplul 1:
l mplemcnta r ca structuri lor de d a te 5
Gra!ul G , 0 =(X lO,U lO ) din figura 7 este definit astfel: X lO={ 1,2,3,4,5,6,7,8,9, 1OJ UlO={[ l,2] , [1,4]. [2,1], [2,3], [2,5]. [2,6], [2,7]. [4,l J, [7,2], [8,9), [9,8] j . in gra!ul G lO : -') Gradu l intern al nodului 2 este 2, deoarece are 2 arce care intra: [1,2J ~ i [7,2]. Grad ul ext ern al nodului 2 este 4, deoarece are 4 arce care ies: [2,1J, (2,3], [2,5] ~ i (2,7]. -') Nodul 5 este nod terminal deoarece are suma gradel or eqala cu 1 (gradul intern este 1 ~i gradul extern este 0) ~ i un singur arc incident: [2,5]). -7 Nodul 10 este nod lzo tat , deoarece are gradul 0 (niciun arc incident). Exemplul2 : (." Fie graful Gl1=(X ll ,U l1), unde X ll={ l ,2,3,4,5,6,7,8) si Ull={[l ,2J, (1,5]. [2,1], [2 ,3], [2,5], [3,4], [3,5], [4,3]. [4,5J , [4,6], [4,7], [5,4]). Din lista arcelo r unui graf orientat, puteti preciza urma toarele inforrnatii: -7 Gradu l ex tern al unui nod - numarand de cate ori apare eticheta nodului in Iista de arce, ca prim elemen t din perec he. Nodul 3 are gradul extern 2 (in rnultirnea arcelor, eliche ta 3 apare de 2 ori ca prim elem ent: (3,4J ~i (3,5]). -') Gradul intern al unui nod - nurnarand de cate ori apare eticheta nodului in lista de arce, ca al doilea element din pereche . Nodul 5 are gradul 4 (i n multirn ea arcelor, eticheta 5 apare de 4 ori ca al doilea element: (l ,5J , [2,5), (3,5J ~ i (4,5]) . -7 Mul~ im ea succesorilor un ui nod este fermata din nodurile a carer etich eta apare ca al doilea element i n perechile i n care primul element este nodul preciza!. Mul\imea succeso rilor nodului ± este p , 5, 6, 7) .- arcele: [1,3]. [1 ,5], [1,6] si [1,7]. --7 M u l~imea pre dccc so rilor unui nod este fermat a din nodurile a carer eticheta apare ca prim elem ent in pe rechile in care al doilea ele me nt e ste nodu l precizat. M ulttrnea predec esorilor nodu!ui ;). este {2, 4) - arcele: [2,;).] si [4 ,;).J. Exe mplu l3 C " Fie gra!urile G 12 =(X 12 ,U12), unde X 2={1,2.3,4} si U' 2={[l ,2], [1,3], [l,4J (2,3J, [3,4J, (4 ,3]), ~i G13 =(X 13,U"j, unde X13={1,2,3,4) ' ~i U13={[2,1]. [2,3J, (3,1], [3,4J, [4,lJ, [4,3]). Din lista r: IJ muchiilorunui graf, puteti preciza urmatoare le informatii: -') Nodul s urs a al unui gra! apare pe primul lac din pereche de n -t ori - ~i niciodata pe locul al doilea. i n gra!ul G 12 , nodul 1 este nod sursa. Desenati gra!ul G 2 pen tru a ' veri fica ace asta afirrnatie . -') Nodu l destinati e al unui gra! apare pe al doilea lac din pereche de n-l ori - si niciodata pe primul lac. In gra!ul G 13 , nodul 1 este nod destinatie. Oesenati gra!ul G13 pentru a verifica aceasta afirm atie . Observatie l ntr-un gra! cu n noduri, oricare ar fi nodul Xk, oricar e dintre gradele sale este mai rnaresau egal cu 0 ~i mai mic sau egal cu n -1 (O,;d+(xk) s n -t ~i O,;d -(xk) s n-t ). 1, In graful Gg - preciza ti gradul intern ~i gradu l extern ale nodul ui 5, identificati nodul cu gradul extern eel rnai mare si nodunle cu gradul intern eel rnai rnic. 2. in graful G lO - identificati nodurile care au gradul intern 1, precizati cate noduri au gra dul intern egal cu gradut extern, care sunt nodurile terminale ~i care sunt nodurile izolate.
Info rm atica
169
3, i n gralu l G l l - preciza ti gradu l intern si gradul extern ale nodulu i 4, ldenti flcati nodurile izolate ~ i nodurile terminate, identificati nodurile care au gradul extern maxim ~i nodurile care au grad ul intern ega l cu gradul extern . Tcororna 5
Daca gralul orienta t G are m ar ce (u, . U2, .... Um) ~ i n no duri (x-, X2..... Xo) . atunci i ntre gradele nodurilor ~ i nurnarul de muchii exista urma toarea relatie: suma gradelor interne ale tuturor noduriJor este egala cu suma gradelor exteme ale tuturor nodurilor ~i cu numarui de arco : II
II
L d +( \j)= L d -( \ i)= m j,.,1
j"' l
Demons tratl e. Fiecare arc Uk ;; [Xi. Xj] corespu nde unei un ttati din gradul extern al nodului Xi ~ j unei unitali din gradul intern al nodului Xj_ Rezulta ca fiecare arc contribuie eu 0 unitate la suma gradelor interne ~j eu 0 unitale la suma gradelor externe.
=
Exem p lu. i n gralul G g : d+(1 ) + d+(2) + d+(3) + d+(4) + d+(5) + d+(6) 1+3 +1+2+2+ 1 d' (1) + d' (2) + d' (3) + d' (4) + d'(5) + d' (6) = 1+2+ 2+2+2+1 = 10, m fiind ega l cu 10 --------
=10 si
~ In graful G 11 verificati ca este Indeplinita relatia dintre gradurile nodurilor
~
si nurna rul de arce ale grafului .
2.7.4. Rcprezcntarca
~i
implemcntarca grafllilli
Exista ma i multe moduri de reprezentare la nivel logic a unui graf, care pot fi implem entate i n memoria unui calculat or, lolosind diverse tipuri de structun de date . Aceste reprezentari pot fi folosite in algoritmii care pre lucreaz a grafuri si, implicit, in programele prin care vor fi impJernentati in calculator acesti algoritmi. Printre rnodurile de reprezentare a unui graf se numara: -7 re preze ntarea prin ma tricea de a d iaconta : -7 reprezenta rea prin ma tricea de incidon ta : -7 reprezentarea prin Iista muehiilor (areelo r) ; -7 reprezentarea prin Iista de adiacenta (Iistele veeinilor); -7 reprezentarea prin matricca costurilor. Fiecare reprezentare prezinta avantaje in ceea ce prives te utilizarea efi cienta a memoriei interne , in fun ctie de tipul grafului (cu noduri put ine . dar cu muchii mu lte - sa u cu noduri mu lte , dar cu mue hii putine) ~i din punet de vede re al eficientei algoritmilor de prelucrare (i n functie de aplica tie). in urrnatoa rele rep rezent ari se con side ra ca gralu l G= (X.U) are n nod u r i ~i m mu chii.
2,7.4,1, Reprezentarea prin matricea de adiaccnta Matricea de ediaccnta a unu i gra f es te 0 matrice patrata binara de ordinul n (A,I,Il), a le care i e lemente a iJ sunt definite astfel :
I. dad Ii, il E U a j,J = { o.Jacali."j Jrl U Implementarea qraf ului prin matricea de adiacent a se face printr-un tablou bidimensional (0 matrice patrata cu dimens iunea n), asttet: i nt
a «r:>]l< :1> ] ;
170
Implemcutarca structurrln r de datc ;
Exempl e: Graful ncorientat G 1
2 1
0
1
2 3
1
0
1
1
4
1
0
5 6 7
0
1
8
.s. 0 0
0 0 0
3
4
1
1
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
--~-
1
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
0
1 1 1
6 0 0 0 0 1 0
0
Proprietati le matricei de adiacenta : 1. Ele mentele de pe dia go nala pr incip als au val oa rea 0 - din definitia grafului re zulta ca
oriee muehie (arc) [i. j) trebuie sa respeete conditi a i,.j . 2. i n cazul unui g ra f n eorientat , matricea de adiac erita este 0 m atri c e s irne t ric a fata de diagonala principa ta. deoarece , dac a exista rnuchia [i , j] , atu nci exis ta ~i muchia U, i]. Accas ta r e prez entare es te recorn and ata p en t r u probl em ele in c are se tc stc aza pre zenta u n c i m u c hii sa u a unui ar c in tre d ou a n o duri , se ca lcu loa z a gradul unui n od etc . - deoa rece pe r mi te un ac c es r apid la n odu r i le s i m u chi i le (arc ele) unui graf.
Algoritmi pentru reprczenta rea grafurilor fo losind matricea de adiacenta Din matr icea de ad ia centa pute ti obt ine urrnato arel e inform at ii: Graf neoricntat Suma elemente lo r matr ice i de aotacenta esle eqala eu 2xm (dubtul numarului de muchii ). Gradul unu! nod i este egal cu suma elementelor de pc lin ia i (sau cu su ma eleme nte lor din colo ana I). Nodurile adiaccntc nodului i sunt nodurile j U=1 .n) pentru care clc me ntc le din linia i sun t eqale c u 1 (altl l lls t l Mal pot f definite ca ncdurile j U=1,n) pc ntru care clemente lc din co loa rta is unt c gale ell 1 (aU][iJ=1)
Numaru! de vcctn! at nodului i este egal eu cradul nodului. Muchia [i,j] a grafului reprezmta un element al matrieei de adtacenta care Indephneste conditia: afiJOl = 1 (sau aUlfil = 1)
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
(Bacalaureat - Sesiunea specia ls 2003) Raspunsul coreet este matricea a). Pentru a identifica mat ricea de adiacenta a grafului din fiqura , S8 vor elimina pe rand variantele incorecte, prin verifica rea urrnatoa relor conditii: 1. Matricea trebuie sa fie binara - toate matriceJe indeplinesc aceas ta con ditie ; 2. Elemen tele de pe diagonala principala trebuie sa aiba v aloarea 0 - matricea b) nu Indeplineste ace asta conditie . 3. Deoarece graful este neorient at, matricea trebuie sa fie s irnetr ic a - matricea c) nu lndeplineste acea sta conditie 4. Din analiza grafu lui S8 observa ca doua noduri au gradul 2 si dou a nodu ri au gradu l 3; in matricea de adiacenta treb uie sa existe dou a linii care sa contina doua elemente cu valoarea 1 $i doua linii care sa cantina trei element e cu valoarea 1 matricea d) nu ind epllnes te aceasta conditie.
2. 3.
4.
1. Scrieti matric ea de adiacen ta a gratului G4 . Folosin d informatiile din matrice a de adiacenta , deterrninati: gradul noduJui 5, nodu rile izolate si nodu rile terminale . Scrieti matricea de adiacenta a gratului neorientat G14=(X ,4,U 14 ), unde X 14={1 ,2,3,4} si U 14 ={[1,2]. [2,3], [3,4], [4,1]). Ce prop rietate are acest qraf? Scrieti matricea de adia centa a grafului Ga. Folosind inforrnatiile din matricea de adiacenta, deterrninati: gradul intern al nodului 5, gradul extern al nodului 4, succe sorii si predecesorii nodului 2 ~i predecesorii nodului 3. Scrieti matricea de adiacenta a grafului G 11. Folosind intorrnatiile din matricea de adiacenta, deterrninati: gradul intern al nodului 5, gradul extern al nodului 2, nodurile adiacente nodului 5, succesorii ~ i predecesorii nodului 4, nodurile terminale ~j nodurile izolate. Scrieti matricea de adiace nta a qrafului orientat G1 5 din figura 8. Scrieti matricea de adiac enta a grafului G 12. Cum iden:05 tificati in matricea de adiacenta nodul sursa al grafului? Fig. 8 Scrie ti matr icea de adiacenta a gratului G 13. Cum identificati i n matricea de adiacenta nodul destinatie al grafu lui?
@
5. 6. 7.
®
Implcmentarea algoritmilor pcntru reprczentarea grafurilor cu matricca de adiacenta 1.
Crearea matricei de adlaconta prin introducerea dateler d e la tastatura , Det erminarea gradului unui ned. Salv area matricei de adiaconta intr-un fisier te xt.
Se citesc de la tastatura muchiile (arcele) unui graf orientat (neo rientat) , se creeaza matricea de adiacent a a grafului, se aflseaza nodu rile izolate $i terminale $i se salveaza matricea de adiace nta in fisierul text grall.txt, pentr u gratul neorientat, si graI2.txt , pentru gratul orientat. In fisierul text se scriu, pe primu! rand, ordinul grafului, si pe urrnato arele randuri, li /matrtcei de adiacen ta. Functia sc rie () se foloseste pentru a scrie matricea de
172
Implcm eutu re n st ru ct u r ilor d e da te
adiacenta in fisier. Deoarece matricea de adiacenta a lost dectarata ca va riabila ql oba la, elerne nte le ei sunl initlatlzate cu valoarea O. Pentru testarea programelor se lolosesc gralul neorienlat G, ;;i gralu l orientat G, . Gralul neorienlat Functia grad () se 10105e;;te pentru a determina gradul unui nod. #include <= s L r e a m . ~ >
int a[10J [10J , n, :C.; fstr eam f( "grafl .t xt " , i o s : . ou ti j , v oid .sc r i e t ) t i n t i ,j ; f «n« e n d l ; f o r {i = l; i < = n; i + T ) (for ( j - l ; j <- n ; j+ + ) f« a [ i ] rj J« " " . f « e nd 1 ; ) f. close () ; } int q r a dt Ln t; i) lint j ,g-O ; f or {j =1;j<=n ;j++) g+ =a[i] [jl ; retu rn g i l v oid main () t i n t i ,j ,k ; cou t .ccv nu.m ar de nodur i " ; cdrco-n , c c u t-oc't numa.r de muchii
II.
c in» r1;
f o r \ ~ = l; % < =m ; k T T )
{c ou t -cc vp r LmuI ned e L much i.e I "« k«";
" ; c i n» i ;
cou t .c-c va L do i.Lea nod e L mucn i e i "
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
v oid sc r ie{) { l i e s : €' Lderrt i c a cu cea de La q r a f u I neor-Len t e t j i n t qrad ext{ i n t i) { J.n t j ,g ~Q ; f or ( j = l ; : <= n i j -t l ) g't=a:i] l j l : r eturn g i } in t g rad_int( i n t i) t i n t j ,-:j=O; f or {j = l ; j < = n i j + +} g + =a[j] [i] ; re turn g i } v oid main () ti n t i , j , :: ; c o u t .c-C'riume r de nodu r.i " ; cin » :1; c ou t -ccvn umar de arce "; cin» rn; fo r (k=::' ; k<=rn ; kH-} {co u t.c-cv nodu I. initial a L a r cu Lu i, " < x k -oc '" : " ,' c i n » i ; cout« " n o d u 1 final a1 ar c u l u i " « k« " : " ; ci n» j; al i ] [ j]=l ; } co u t.c -C'No d u rLl e Lzo La t e sun t : " ; for (i= l; i <,....n,· i t·+ ) i f (g r ad_int ( i. ) +g r a d_e x t (i) =:-::0 ) c out-oc k-cc'' " ;
c out«endl «" Nod u r i l e t e r mi n a l e ,sunt : " i f or ( i = l; i < = n i i +-+ ) i f
serie () ; }
(g rad int.(i)+g r a d _e xt(i)==l)
ccu t -c-c j.c-c ''
";
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
.txL ' · , i o s : ; i n! ;
for ( i = l; i < ~ n; i + + )
fo r (j=l ;j<=n ;j++) int nr_m() t int 1 ,j ,m=O ;
: »a [=- ; l i l .
f . c l o s e () ; }
for { i = ~ ; i < = n ; i + + )
for (j=l ;j<=n ;j+ t) s+ =a. [ i] [ j] ; r e t u r n m/2 ; } int g r a d ( ti n t; .i.) { I / es t e ident iea ell cea de 1a exemp l ul an t er t or j void main () lint i ,j ,ma:-: ; c t t.e s t e t j , max-qr a d t l j • for ( i ~ 2 ; i < = n ; i + + ) if (g r a d( i»ma x) ~ a x = g r a d (i ) ; cec e ccv n c d u r aLe eu c eI rna I mul t i vec rni sun t : " ; for {:i = l; i <"'" rl; H · + ) if (g r a d{ i)=o=max) c o u t cc Lc -c'' It; cout«e ndl«" Gr n f u l a r e "« n r m( ) « " muc h i i " « e ndl; cou t.c-C'H u c h i i Le gr a f u lui s un t : "; for (.L= l; i <= n; i ++ ) f o r ( j -= i + l ; j <=n ;j ++ ) i f (a l i J [ jJ""=l) cout« i«" -"« j« " " ; }
Graful orientat Functia n r _ a ( ) se foloseste pentru a determina numa rul de arce ale grafulu i. Functia vecini ( ) se Ioloseste pentru a determina nurnarul de vecini ai unui nod. La afisarea arcelor , se parcurge toata matr icea de adiace nta. #include < f s t r e a m. h > in t ,,[10J [IO],n ; f s tream f( "g:-ilf2 .t xt " , i o s : : i n ) ; v o i d c it.e s t.e t ) { I l e s t e Lden t i.c a eu cea de in t nr_a() lint i ,~ ,m=O ;
2.,]
q re fu l n ecr Len t a t. }
f or ( i = ! ; i < = n ; i ~ · )
f or (:=1;j<=n ;j++) :n+ =a.[i] [jl ; r eturn m; } int vecini( i n t i) t i n t .1 , 1.'=0 ; f or l j =- l ; j <=n ; j ++ l if (a, [ i ] [j]o;.;=l I I ,J~jJ[i:'-"o:::l) v ++ ; vo i d ma i n () li n t i ,: ,maz ; c Lt.e s t.e t y , mexe-ve c i n i (::./ ; f or ( i - 2; i <= n; i ,..'t- ) i f {ve::::in~{ii>:na::) me x-vs c In LtLi , c c u t-c c vt.o d u r i 113 cu eel ma i. mu.l t i vec i n i sunt : "; for ( i = 2. ; i <= n ; ':'+ + } if {v12cini(i )==:naxj c ou t « i«" It ; c o u t « endl«" Gr a f u l ar e " « rr!:"_ a. ( « " aree "« e nd l ;
return v ; }
174
Implementarea strneturilor d e datc
oou t.c-C'Ar c e Le g rafulu l s un t : " ; for ( i = l; i < ~ n; i++ ) for
3.
{ j ~ l; j < = n; j + + )
if (a [i ) U J=o:: l) cout« i « "-"« 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.
#include
Graful ori ental. #include < f s t r e a m . h > int a [l OJ [lO ) , f1, m; fstream f( " gr a f4 . txt " , i o s : :in }i vo id c i t e s te() {int k , i ,j ; f » n» m; for ( k = 1; k <=m; k + + ) ( f » i» j; a[,][jJ=1 ; ) f. c l o s e () ; ) void vecini ( i n t i) ffor (int j=l;j<=n ;j++) .i.fit a l i ] [j ]==1 II a [ j ] [l J= =1) ccu c-oc j c-c'' ";} void main () {int i ; citeste() ; oou t-oc vve c i.n i i. fi e ce r-u i nod s unt : "
4.
Gen er area matricei de ad iacenta .
Pentru a testa programele care preluc reaza grafuri implementate cu mat ricea de adiacenta , puteti sa generati aleatoriu matricea de adiacenta Functia gene rare () qenereaza matricea de adiacenta a unui graf neorientat , cu n noduri ~i m muchi i. #i nclude < i o s t r e a m. h > #include < s t d l i b . h > int a ll01 POL n ,D ; void qene r-are () tint k =O , i , j ; randomize(); while ( k
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 () ; .. . }
1. intr-un fisier este sensa 0 matrice patrata, astrel: pe primul rand , un nurnar care reprezinta dimensiune a matricei , ~i pe urmat oarele rancuri. valori numerice despartite prin spatiu - care reprezinta elementele de pe cate 0 linie a matricei. Sa S8 verifice daca aceasta matrice poate fi matricea de adiace nta a unui graf . in caz afirmativ, sa S8 prec izeze daca graful este orien tat sau neorientat gen ereze aleat oriu ma tricea de ad iacen ta a unui gr af orie ntat. 2. Scrieti un program care
sa
3. Scrieti un progr am care cite ste dintr-un fisier matricea de adiacenta a unui graf neorientat ~i care deterrnina nurnaru l mini m de muchii care trebuie adauqate pentru ca graful sa nu conti na noduri izol ate. 4. Scrieti un progra m care citeste, din doua fisiere lext , gl .lxI ~i g2.lxI , matricele de adia centa a doua grafuri , G.=(X.U.) si Gb=(X.Ub), ~i care determina matricea de adiacenta a g raf ul u; reuni une Gr=(X,Url , unde U,= U. V Ub, care se salveaza in fisierul g3.lxI ~i matricea de adiacenta a graful ui in ter sectle G,=(X,Ui), unde U,= U. n Ub, care se salveaza in fisierul qa.txt. 5. Scrieti un program care cites te din fisierul lext graf2.lxI informatii desp re un graf oriental (de pe prima linie - nurna rul de noduri, apoi malricea de ad iacent a) ~i de la tastatura 0 rnult im e A de num ere care reprezinta etichetele unor nod uri din graf - ~ i care afiseaza mu ltirnea arcelor ce au 0 extrernitate ln tr-un nod din rnuttimea A si 0 exl remitate in rnutirne a X-A (X fiind rnultim ea nodurilor grafulu i). Pent ru leslarea programului , se vor folo si graful Gg ~i rnultimea A={1 ,3,4,6).
2.7.4.2. Reprezentarea prin matricea de incidenta Matricea de lncidonta a unu i graf ncorientat es te a ma tri c e binara cu n Iinii c a lo an e ( A II,m), ale ca re i elemen te a ij s unt d efin ite as tfel :
.
~i
m
_ { 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> ] [
,;fD ~
Grafu l G, Fig .9
Graful ncoricntat G 1 1
2 3 4
5
6 Proprletatile matricci de lncidonta a 7 grafului neorientat:
1
2
34
5
6
7
8
9
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
lmplcm entarca st r uct u r ilor de d a te
2. Matrieea de incidenta are 2xm etement e egale eu 1, deoareee fieeare muehie este incidenta cu doua nodur i.
Matricca de incidenta a unui graf orientat este 0 matrice cu n linii §oi m caloane (A n,m), ale carei c leme nte au s unt definite as tfe l: 1' dac a nodul i este extremitat ea final a a arcului j a
i, J
=
-1 , dac a nodul j este extremitat ea in il ni~i a arcului j { 0, dac a nodul i nu este extremitat e a arc ulu i j
lmplementarea grafului neorientat prin matricea de incidenta bidimensional (0 matr ice cu dim ens iunea n xrn ), astfel : int
a [ < ~ >]
S8
face printr-un tablou
[
1
Gralnl G,
2 3 4 5
Fig.10
6
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
Proprietatile matricei de incidenta a grafuJui orientat: 1. Pe fiecare coloana exista un element cu valoarea 1 (pe linia i care corespunde extrernitatii finale a areului) o;i un element eu valoarea -1 (pe linia j care care eorespunde extrerrutatn initials a arcului), iar restul eleme ntelor au valoarea O. 2. Matricea de incident a are m elemente egale cu 1 ~ i m elemente egale cu -1 , deoarece fiecare arc are 0 extrem itate finala ~ i 0 extremitate in i~ial 21. Suma elementelor matricei este O. A ceast a reprezentare este roc orn and at a pe nt ru g ra f urile care a u u n nurnar ma re d e noduri ~i u n nurnar m ic de m u c h ii.
Algoritmi pentru reprezentarea grafurilo r folosind matricea de incidcnta Din matricea de inciden ta puteti obtine urrnato arele info rmatii: Graf neoricntat
Graf orientat
Gradul unul nod ; este egal eu s uma ele me ntelo r de pc linia t.
Gradu! intern al unul nod i est e ega l ell num arul de cle m ent e eu va toa rea 1 d e pe tini a; Gradu t extern at unul nod i este ega t cu num aru l de c lem ent e eu va loa rea -1 de pe lin ia i. Sucecsorii nodului i sunt nodurite j 0=1 ,n) pentru care eleme ntc lc din li nia j sunt ega lc eu 1 in cotoana k (k=1,m) in care etementele de pe
Nodurlle adiaeentc nodulu i i sunt nodurile j 0= 1,n) pentru care c lementel e di n linia j su nt eg ate eu 1 in cotoana k (k=1 ,m) in care ~i etementele de pe tinia i au valoa rea 1:
>[i][ k]
= 1 ~ i ' O][ k] = 1.
Iinia i au valoarea -1: altl lkl = -1 ~i al l lkl =1 Predcecsorii nodu fui i sunt nodur ile j 0=1,n) penru care elc mentcle di n Iinia j sunt ega Ie ell -1 in coloan a k (k=1.m } in care etemen lete de pe
linia i au varo arca 1: alll l kl
= 1 ~ j ' Ul[k] =-1.
177
Informatica .
..
~.
Grafneorientat
-
Graforientat Nodurile adiacente nodu lui i sunt date de
Numarut de vecini at noduJui j este ega l ell qradul nodului Muchia k - Il.ll a grafului este deterrninata de doua elemente ale matncef a{i}kj] ~i a[j]k;} , care
reuniunea dintre rnultimea succesorilor si multimea predecesori lor nodulu i. Numaru! de vec!n! a! nodul ui i esle egal ell cardinalul multimil de noduri adiacente nodului i. Arcul k = [i,j] al grafului este determina t de ooua elemente ale matr icei, a[i}kj] si a[j]kJJ, care
indeplinesc conditia a[i][k]
indeplinesc conditia a[i][ k]
=1 ~ i aO][k ] =1,
~i
sem nifica faptul ca mu chia k este inci denta ell n odurile j §i ~
2. 3.
4. 5.
6. 7.
=-1 ~i allllkl =1, s!
sernnifica faptul ca arc ul k les e din nodul i § i in t ra in nodulj
1. Scrieti matricea de incidenta a grafului neorientat G4 . Folosind inferrnatiile din matricea de incidenta, deterrninati: gradul nodului 5, nodurile izolate si nodurile terminale. Scrieti matricea de incidents a grafului neorientat G Ce proprietate are acest graf? Scrieti matricea de incidents a grafului G8 _ Folosind inforrnafiile din matricea de incidenta , determinati: gradul intern al nodului 5, gradul extern al nodului 4 , succesorii ~ i predecesorii nodului 2 si predecesorii nodului 3. G", Scrief matricea de incidents a grafului orientat G16 din figura 11. ~. Scrieti matricea de incidenta a grafului G 11 . Folosind informatiile din matricea de incidenta ceterm inati: gradul intern al r:t\ ("';\ nodului 5, gradul extern al nodului 2, nodurile adiacente \...'!J \...3..J nodului 5, succesor ii ~i predecesorii nodului 4, nodurile termiFig. 11 nale si nodurile izolate . Scrieti matricea de incidenta a grafului G13 . Cum identificati, in matricea de incidents, nodul sursa al unui graf? Scrieti matricea de incidenta a grafului G14 . Cum identrficati, in matricea de lncidenta, nodul destinatie al unui graf?
,4.
Implementarea algoritmilor pentru reprezentarea grafurilor cu matricea de inc identa 1. Crearea matrice i de in ci denta pr in int rod u cerea datel or de la t astat ura. Det er minarea gradului unu i nod. Salva rca matricci de in cld en ta i nt r-un fi si er text.
Se citesc de la tastatur a muchiile (arcele) unui graf orientat (neorientat). Se creeaza matrices de incidenta a grafului. Se afiseaza gradul nodului p a carui etichet a se introduce de la tastatura. Se salveaza matricea de incidents in fisierul text graf5./xt, pentru graful neorientat, si graf6.txt, pentru graful orientat. In fisierul text se scriu pe primul rand ordinul grafului si nurnarul de rnuchii, iar pe urrnatoarele rancurt, ltniile matricei de incidenta. Functia scrie ( ) se foloseste pentru a scrie matricea de incidenta in fisier . Pentru testarea programelor se folosesc graful neorientat G, ~i graful orientat Gg . Graful neorientat. Functia g ra d () se foloseste pentru a determina gradul unui nod. # include < f s t re e m . f-> i n t a[ l OJ [lO j,n ,m ; fstream f( Hgraf5 .txt " , i o s : i ou t. j • v o i d s c r i e () { i n t i , j ; .f-ocn-c-c " "« m«en d l ; for ( i = l ; i
f« e ndl ; )
h u plemc ntarca st rncl ur ilor de dare
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 + + )
{co u t« "p r i mu l nod a l muc hi e i "« k«": "; cin» i ; c out« " a l doile a nad al muchiei "« k« ": "; cin» j ; a[i] [k] =l; a[j] [ k ]=l ; }
c out«" nod u l = It; cin» p ; c ou t «" Gr a d u l nodul u i "« p«" este "« g r a d {p )«endl; sc r Le () ; } Graful o rlontat . Functia g r ad_ i ot () se toloseste pentru a determina gradul intern al unui nod, iar functia gra d_ex t () se foloseste pentru a determina gradul extern al unui nod. #include
io t serie ()
{ / /est e .i.de n t i.c e ell cea de la graful neo r i e n t a t
}
int grad int{ i n t i) l i nt g=O , k : f or ( k = l; k < ~m ; k ++ )
if ( a[ i] [k j
ee
L} g++ ;
return g ; }
int grad_e xt (i n t i) (int
g~O ,
k,
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 + + )
{CQut«" n od u l i n i t i a l al a r c ul ui "« k«" : ccu e-oc vn o d u j
It ;
cin» i;
f i n a l a I a rc u l u i "« k« " : " ; c in» j;
ali ] [kJ=- l; a[ j] [k ]=l ; }
CQut«" n odu l = " ; cin» p ; c o ut« " Gr a d u l inte r n a 1 nod ul u i "« p« " este "« g r a d_ i n t {p l«endl; c ou t «" Gr a d u l exte rn a1 n odului "« p«" est e "« g r ad_ c x t (p }«endl ; scr ie () ; } 2. Crea rea matricei de in c identa prin citi rea da te lor din un ui nod .
fi~ier.
A fi sarea v ecinil or
Se citesc din fisierele create anterior (graf5.txt, respectiv graf6.txn matricele de incidenta ale celor doua grafuri ~ i se afiseaza vecinii unui nod x a carui eticheta se introduce de la tastatura. Functia c i teste () se foloseste pentru a citi matricea de incidenta din fisier. Graf ul ncorien tat. Functia vecini. ( ) se totoseste pentru a determina vecinii unui nod. #i. nc l ude
f . c l o s e () ; )
I nfunnatica void veci ni( i n t {int k ,j ;
179
i)
for ( k= 1; k <= m; k H I if ( a [i ] [ k] ==1) for ( j = l ; j<=n ; j++) if (j != i && a[j ][k]==l ) cou ccc j cc '' H;) void main ( )
(int P i cout«" no d u l = It; c in» Xi citeste() ; cou t«" Ve c i n i i nodului "« x«" sunt nodu ril e " ; vec i n i( x) ; } Gralul orientat Vectorii binari s ~i p se folosesc pentru a memora succesorii, respectiv predecesoni nodului x . Elementul i are valoarea 1 daca nodu l i este succesor, respectiv predecesor al nodului x ; altfel, are valoarea O. Functille succ () ~ i pred () se lolosesc pentru a determina in vectori i 5 ~ i p succesorii, respectiv predecesorii unui nod. Functia vecini () se foloseste pentru a determina vecin ii unu i nod, prin reuniunea mu ltimii predeces orilor ~j a succesorilor.
#include
}
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
i
&&
( s[j]= ~ l
I I p[j)==l ) ) cou t-oc j-cc" "; )
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;
fstream f ( " g r a f7 . txt
II I
ios: : in ) ;
180
Implcmentarca st r uc t u r ilor de date
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 .
cou t « " cu lung imea "« d [ k l « e n d l ; } } v oid mai n () {c Lt e s t e ( ) ; o o u t .c-C'He d i.a Lu nq i m.iI e s t.e : "« me d i a ccu t .c-cvxu ch .i i. Le s un t: "
o«
end l ;
Graful orientat
#i n c l ude < f s tr e am. l: > i n t a r l O] 115J , d I 1 5 ] , n , m; fs t r e a m f( "graf8 .txt " , i o s ; :in ) ;
v o id c i t e s t e ( ) t int k , i,j , l ; f » n »m ; fo r ( k ~ l; k < =m ; k ++ )
( f » i» j » l ;
al i] [ k]= -l ; a[ j ] [ k ]= l ;
d :'~ ' =l; )
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'
{c i teste () ; c ou ecc vtce d t a Lu nq i.rnL; e s t e : "« me d i a () «end 1 ; cou t c c vA r ce l e aun t.: "
4. Creare a matricei de in cidenta prin citl rea datel or di n matric ea de adiaconta. Afi sarea mu ch iil or ~ i a no d urilo r izo late. Matricele de adiacenta se citesc din fisierele text create anterior: graft .txt , pentru graful neorientat, si graf2.txt , pentru graful oriental. Se creeaza matricele de inctdenta ale celor doua grafuri, se afiseaza muchiile (arcele) ~ i nodurile izolate. Se salveaza ill fisierul text graf9 .txt , respectiv graf1O.txt, informaliile despre muchii, astfel: pe pnmul rand, despartite prin spatii, nurnarul de noduri ~ i nurnarul de rnuchii (arce) ale grafului, si apoi, pe cate un rand, separate prin spatiu, cele doua noduri terminale ale fiecarei muchii (arc). Se folosesc matricele a pentru matricea de adiacenta ~ i b pentru matricea de incidenta ~ i functiile ci te s te () pentru a citi matricea de adiacenta din fisier, salvea za () pentru a salva in fisierul text inforrnatiile despre muchiile (arcele) grafului, t ra ns fo rr.t a () pentru a obtine matricea de incidenta din matricea de adiacenta, af iseaza_ n Oduri_ i zo l a t e () pentru a afisa nodurile izolate, !?i a f i s e a z a _ mu c h i i () pentru a afisa muchiile (arcele). Pentru testarea programelor S8 folosesc graful neorientat G, si graful oriental Gg.
181
Informatica Graful neorientat
#include
for
(i=l ;i<=n ;i+~)
{for ( k= l ,x = O; k <=m && x ==::O ;l:++) if {!x} cou c-c-c r -cc" " ;}} void sa lvea za ( )
if
(b [ i lLk] = =l)
x= l ;
( f 2« n« I, "
i =l ; i < = n ; i f+)
i f {b[i ] [k ]=o;;=l) f2 « i « " ";
f 2« e n d l ; }
f2 . clos e () ; ) void main ()
{c i t e s t e J) ; t r a ns forma () ; a f i.s e a a a unuc h .ii. Lj r cou t.c-C'Ho d u r i. J e .i z 0 1 21 t.e .s u n t : " ; afi seaz3_nodu ri_i z ol a t e () ; s e l voaz e () ; }
Graful orientat
#include
l int i ,k ,x ;
182
Im plementa rca str uctur ilor de date
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 ;
f2 «n« " " « rn« endl; fo r ( k= l ; k<=mi k++l {for ( i ~ l; i<=n ; i ++)
(if (b[i) [ k]== - lj
x~i;
if
(b[i] [ k ] == l) y=i ; }
f2 « z« " "« y«endl ;} f2 . close () ; } void main () ( c iteste( ) ; t r an s f orma {); e f i s ee z a a rc e(J ; cou c-ocvNod u r i Le i z olat e s unt : " ; af i seaza nodu r i sa lve a z a( ) ; }
.i zc Le t e () ;
1. int r-un fisier text este scrisa a matrice , astfel : pe prim ul rand - doua numere separate prin spatiu, care reprezinta num arul de linii si numarul de coloane ale mat ricei, si, pe urrnatoa rele randuri - valori numerice despartite prin spatiu , care reprezint a eleme ntele de pe cate 0 linie a rnatricei , a. Scrieti un program care verifice daca aceasta matrice poate fi matricea de incidenta a unu i graf neor ientat. in caz afirmati v. sa S8 afiseze cate noduri izolate are graful (ln dicatie. Se verifica urmatoarele cond itii: a) sa fie a matrice binara: b) suma elementelor de pe fiecare coloan a sa fie ega la cu 2; c) sa nu existe doua coloane identice. Un nod este izolat daca sum a elementelor de pe linia sa este egala cu 0). b. Scrieti un program care sa verifice daca aceasta matrice poate fi matricea de incidents a unui graf orientat. in caz afirmativ, sa se determine cate nod uri care au gradul intern ega l cu gradul extern exista (lndicatie. Se verifies urrnatoarele conditii: a) pe fiecar e coloana sa nu existe cecat 0 valoare e9a la cu 1, una eqala cu -1 ~i restul egale cu 0; b) sa nu existe doua coloane identice. Un nod are gradul intern ega I cu gradul extern daca suma elemen telor de pe linia sa este eqala cu 0). 2, Scrieti un program care citeste din fi ~ier ul text graf6.lxl matricea de incidenta a grafului orientat ~ i care : a. aftseaza nurnarul de vecini ai unui nod p a carui eticheta se citeste de la tastatura: b. genereaza mat ricea de adiacenta a grafu lui din mat ricea de incidenta ~i a salveaz a in fisierul graf6a.txl .
sa
2,7.4,3, Reprezentarea prin lista muchiilor Lista muchiilor unui gra f este fe rmata din m el em ente ca re contin, fi ecare, ca te 0 pereche de doua noduri , Xi!§i Xi, care Iorrnea za 0 m uch ie, ad ica pentru ca re [X i, Xj)E U, Imp lementarea acestui tip de reprezen tare se poate face folosind una dintre urrnatoarele structu ri de date :
-7
Matricea muchiilor u c u dimensiune m x 2, in care fiecare linie coresp unde unei muc hii (arc) ~ i in fiecare lin ie se inregistreaza i n ce le doua coloane etichete le nodurilo r care se gasesc la extr ernitatile muchiei (arcului) . int u [
183
I n fo r m at i ca
Vcctorul muchiilor u cu dimensiunea m ale carui elemente sunt Inreqistran, fiecare i nregistrare fiind fermata din doua carnpuri x ~i y ce con tin etichetele nodurilor care se gasesc la extrernitatile much iei (arcului). Pentru elementele vectorului se defineste tipul de data muchie, de tip i nregistrare.
7
s t ru c t muchie { i n t x, y ; } ;
muchie u[
o 1 2 3 4
5 6
7 8 9
1 2 3
1 1 1 2 2 3 3
4
Graful neorientat G 1
3 4 4
Implementarea cu vector de lnroqlstrari Muchi ile
5
6
7
6
8
~
- -- - - - - - ---"------ - - - - - -
lmplementarea cu matrice
o 1
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
Implcmenturea st r uct u r ilnr de da le
Algorilmi p enlru reprez enlarea grafuri lor f ol o sind li sta much iilor Din lista muchiilor puteti obtine urrnatoarele informat ii: Graf neorienta t
Graf orie nta l
Gradul unui nod i este egal , in funct ie de implementare, cu num a rul de apa ri tli al e et lch et cl no d ului in matrice. respectiv in carnpurile vectorul ui de tnreqist rari .
Gradu l extern al nodului i este egal, in functie de implernentare. cu numaru l de aparit f ale etic hetel nod ului i n coloana a matricei. respectiv in pnmul camp , in vectoru l de lnreqistrari. Grad ul in tern al nodu lu i i este ega l, in functie de tmptementare, eu nurn aru l de apa ritf ale etichetci nodu lui in coloana 1 a matricei. respectiv i n al doilea cam e. in vectorul de inre ci strari. Succesorii nodului i sunt, in funcl ie de implementare, euchetete j di n coloana 1 pentru care u[k][O]=i, respectiv etichetele j din carnpui (I{k] y pentru care u[k].x=i (k=l ,m). Prcdecesorii nodu lui i sunt , i n functie de implementare. etichetele j din colo ana 0 pentru care u[k][1 ] =i , respectiv etichetele j din carnpul (I{k]x pentru care u[k].y=i (k=l, m). Nodu ri lc adiaccntc nodului j sunt date de reuniunea dintre multirnea succesorilor ~i multi mea predece sorilor nodului. Num aru! de vecini ai nod ului i este ega l eu cardinalul rnultimi i de nodur i adiaeente nodului l.
Nc d urile adiacc ntc nod ulu i j sunt , in functie de implernen tare. etiehele le j din coloan a 1, pentru care u[k][O] =i , sau din coloana 0, pentru care u[k][1]=i, respectiv etich etele j din carnpul u[kj.y, pe ntru care u [k] .x=i , sau din campul u{k]x. pentru care u[k] .y=i (k=1.m).
Nurna ru l de vccin i ai nodulu i i este egal eu
gradul nodului.
2. 3.
4.
G" 5. 6.
7.
a
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
0
0
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
pe urrnatoarele randuri, nodurile de la extrernitatile unei muchii (arc). Functia scri e () S8 foloseste pentru a scrie inforrnatiile din matricea muchiilor in fisier. Pentru testarea prcqramelor se lolosesc graful neorientat G, si graful orientat Gg. Graful neo rientat . Functia gra d () se foloseste pentru a determina gradul unui nod. #i nclu de < f s t r e a m. h > int a[lO J [2] , n, m; fs tr eam f t vq r a f l l c t x t t'v Lo s : : o u t ); int g r ad( i n t i) lin t k , g=O; fo r (k ~l ; k<=om ;k"+) i f (af k] [OJ==i I I ark]
[ lJ~~i)
g++ ;
return g ; }
void sc r i e ()
lin t k ; f «n« " "<
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 out«endl « " 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
l int i ,j , k ; cou't-ocv numa r de ncdur i. "; c i n» ni c c u ec c vmcnar de arce "; cin>>m;
f o r (:'< =1 ; kc -m : k+ -r ) {c o u t «" n o ciu l initial a1 a rcului "« k« ": "; c in» i; cou t .c-cvn o d u L final a L arcului "« k«" ': " ; cin» j; ark] [ O ] ~ ;' ; a rk] [ :l ~ j ; } cou t« " No d u r i l c iz o late sunt : It; f o r ( i = l; i < =n; i ++ j i f ( g ~ a d _ i n t{ i ) + g r a d_ e z: t( i } = = O ) coc e c -cd c -c" If; c ou t« e ndl«" No d u r i l e t erminale sunt : " ;
f o r (i =l ; i <=n i i +';' } if (g r a d_ i n t( i) +g r a d e x t{ i)==l) cout« i «" sc r ie () ; }
If;
186
Implementare a struct urilor de date
2. Grearea vecto rului de m uc hii prin c itirea m uchiil or (arcelor) din fi sier, Prelucrarea info rmati ilo r asociate muchiil or. Datele se citesc din fisierele text create anterior : grafT.!x!, pentru gratul neorientat, si grat8.!x!, pentru gratul oriental. Pentru un nod p a carui eticheta se citeste de la tastatura , S8 aflseaza eel rnai apropiat vecin (sau cei mai apropiat i vecini , dace exists mai multi) la care S8 poate ajunge din nodul p. in cazul grafului neorientat, eel mal apropiat vecin este nodul adiacent nodului p care tormeaza cu acesta muchia care are lungimea cea mai mica ta\a de muchiile incidente cu ceilalfi vecini . in cazul gratului orientat, eel mai aprop iat vecin la care S8 poate ajunge din nodul peste nodul succesor nodului p care forrneaza cu acesta arcul care are lungimea cea mai mica fata de arcele incidente cu ceilalti succesori. Functia ci teste () S8 foloseste pentru a citi datele din fisier. Pentru testarea programelor S8 Iolosesc gratu l neorientat G , si gratul orientat G g . Graful neoricntat. Functia izolat () determine daca nodul este izolat. #include < f st r e a m . h> struct muc hie t int x, Y, d;}; muchie u [2 01; i n t n, m; fstream f ( "g ra f7 . t xt Jt I Lo s : : in ); void ci t.e s t e t) {int k; f» n» rn; for (k~ l ; k<~m ; k++ ) f » u [ k ] . x » > u [ k] . y »u t k l . d : f . close () ; } int i zola t ( i n t i ) lint k ,g~O ; for (k~ l ;k< ~m ;k++ ) if ! U[ k ) . F ~i II u [ k ]. y ~ ~i ) g++ ; return void main ( ) {int k ,p /min ; ci tes te () ; cou t-oc vtco d u L : " . cin» p; if (i2 0 1at(p }) cout«" Nod u l "« p«" nu a re vecini " ;
g~ ~O;)
else {ke I ;
while {u l k lc x l e p & & u l k l mi. n eu [ k ] . d :
. y ! ~p )
kH ;
for ( k++ ; k<=ffi ; k++ ) if ( u[k] , F~P II u [ kl .y ~ =p ) if (u l k l d -cmi .n ) rni n =u [k ] . d ; cout«" Di s t a n t a mi nima e st e "<
v
Graful oriental. Functia suce () determine daca nodul are succesori.
#include
187
Infor m a tica vo i d main ()
{in t k , p , mi n ; cite ste( ) ; cou t «" Nod u l : "; ci n» p ; if ( ! slice (p) ) cout« " No d u l u« p«" nu are ve c ini l a c ar e s a se p oa t a a junge " ; else
{ ke L : wh ile (u l kl . x ' =p ) k++ ; min =u [ k] . d ; for (k+ + ; k<=m ;k++) if {u ] k'] . x==p && u [k] . d
2.7.4.4. Reprezentarea prin lista de adiace nta Lista de adlacenta este fer mata din Iistele L, (1::;i'::;n) ca re c ont in toti vecinii unui nod Xi la care se poate ajunge direct din n odul Xi, ad ica to at e noduril e Xj pentru care [Xi,Xj] EU. Obs erv at ie. in cazul graful ui neorienta t, lista li a vec inilor unui nod Xi al grafu lui este fermata din nod urile Xj ad iacente nodului Xi . i n caz ul graful ui orien tat, lista li a vecinilo r unui nod Xi al grafului este fermata din nodurile Xj care sunt succesorii nodului Xi. Implementarea ac estui lip de reprezenlare se poate face : -7 static , folosind una dintre urrnatoarele structuri de date : A . Matricea lis te i de adi acenta B. Vectorii liste i de ad iace nta -7 dinamic , cu ajutorullistelor lnlantuite.
Graful nco ricntat G , ~_o d
lmplementa rca statica A. Matricea Iistei de adiaconta L cu 2 Iinii si n+ 2xm coloane pent ru graful neorientat, respectiv cu n+m coloane pentr u graful orie ntal, defm ita ast fel :
-
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
Implcm cnta rcu structuril or d e dat e
Prim a lin ie contine etichetele nodurilor ~i listele de adiacenta ale fiecarui nod; este fermata din doua secnuni: Grafu l orientat G g a. Primele n coloane contin etiche tele nodurilor: Nod Li sta de ad ia ce nta L[O] [ i]= i (1';i.;n). 1 2 b. Urrnatoa rele m x2 caloa ne , respectiv m coloa1,3 ,4 2 ne , co ntin in ordine cele n liste de ad iacenta 3 5 ale celo r n noduri. 4 2,5 - A do ua Iini e cont ine inforrnatiiie necesa re pentru a 5 3, 6 identifica in prima linie lista de ad iacenta a fieca rui 5 6 nod ; este fermata din c oua sectiuni: a. Primete n coloane contin , in ordine, pen tru fieca re nod i (1 ::;i::;n), indicele coloanei din prima linie din care in cepe llsta de ad iacen ta a nodului: L [1] [i 1= j , unde j este indice le coloa nei de unde in cep e lista de adiacenta a nodului i. Daca nodul este izolat, se va memora valoarea 0 - L [1 ] [i] =0 (nu exis ta lista de adiacenta pentru acel nod). b. Urrnato arel e mx2 caloane. respectiv m caloane, contin in ordine mformatii despre modul i n care se in lant uiesc eternenteie din lista. Daca nod ul L[O ] [ i ] se gase~te i n interiorul listei, atunci L[l ] [ i ] =i +1 (indicele urrnatorului element din lista) . Daca nodul L [0 ] [i] se gas e'ite la sfars itul listei , atunci L [ 1] [i] = 0 (s-a term inat lista de adiacenta a nodului i). Matricea este defin ita astfel : a} pentru graful neorientat in t L [ 2 ] [
Gralu l neoriental G, Nod uril e
...
A
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 ~
~
--------
Ind icii colo ane lo r
Grafu l orienlal G, Noduri le r
A
,
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 -.,..--
----
Ind icii co loan clor
B . Vectorii Iistei de adiacenta: un ve cto r L cu dirnensiunea m x2 , pen tru gratul neorientat, respectiv cu dimensiunea rn, pentru gratul orienta t, care conti ne listele de adiacen ta ale fiec arui nod, si un ve ctor cap , cu dime nsiunea n . care contine indicii de la care incepe lista vecinilor fiecarui nod in vec torul L. Indicii din vecto rul cap corespu nd
etichetelor nod urilor . Ce i doi vectori sunt defini ti ast fel: a) pen tru gratu l neorientat: int cap [ ':'"1> j , L (2 "'<:n> J ; b) pentru graful orientat: in t c ap ~
lntorrnutic a
189
7
8
L
L3 Graful orientat G,
1
cap
234 2 S
C-1 J
»>
1
2
I
1=U
J /
[JQ
6
I
\
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
L
3
S 8
5_U TIT iJ
Ls I
Observatie . Fiecare lista de vecin i Lr, contine indicii coloanelor j in ca re de 1 in matricea de adiacenta (a [ i] [j] ~ 1 ) .
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 >] ;
L
2 1 2 3
_I
.~1 41fj 5
4
~s ic1
5
-t--·f:II~--ITJI.O 5
6
Gr aful orientat G,
190
Im pleme nt a rea str uetur ilor de date L
2
1 1 2
3 4 5
1 1 2
G ratul neorientat G 1
7
8
6
7 8 Acoasta reprezen tare este recornandata pentru grafurile care au un nurnar mare de noduri ~i un nurnar mic de muchi i.
A lgoritmi pcntru roprozcntaroa g rafurilor fo losind Hst elo de ad iacenta Din lista de adiacerita irnplornontata static cu rnatr ice puteti obtine urmatoarele intorrnatii: Graf neo rie ntat
Graf oriental
Lung imea ustc! de adiacenta a nodu!u i l neizolat , cu eticheta mai mica decaf n , este egala cu dife renta dintre pr imu l indic e j (j=i+1 .n1) diferit de 0, din prima sectiu ne a liniei a doua (L [1] [j] :t-O), ~i indicele caloanei din care in cepe
Lungimea listei de adiacenta a nodului i neizclat. cu eticheta mai mica cecat n, S8 calculeaza la fel ca l?i in cazul grafutui neorientat. Pentru nodul n lung imea listei de adiacenta este egala eu (n+m +1 - L[1][n] ), Gradu l exte rn al nodului i este egal eu lungimca li stei de adtacenta a nodu lui. Gradul intern al nodului i este egal, eu numarul de aparitii ale etichetei nodului in a doua secnune a pr imei linii a matrice i (L[OlU] =i, cu j=n+1 ,n+m).
lista de adiacenta a nodului i (L[1l Ol . L[1][i]) Pentru nodu Jn . lungimea liste i de adiacenta este eqala eu diferenta dmtre nurna rul tota l de eoloane, plus 1, si indicele coloanei din care incepe lista de adiacenta a nodu!ui n (n+2x m +1 - L[1][n] ). Lungimea listei de aolacenta se mai poat e determina prin numarare a in linia a doua a elementelor diferite de 0, lncepand cu elementul din coloana L[1][i] ), la care se adauqa 1 Gradul unui nod i este egal cu lunqlmea Iistei de adiacenta a nodului sau cu numarul de aparitii ale et ichetei nodu lui in a doua secttune a primei linii a matricei (L[ O] U]=i, cu i=n+1,n+2*m) . Nodurile ad iacen te nod ulu i i sunt nodurile a carer eticheta apare in lista de adiacenta a nodului i
Succeso rii no d ulu l i sunt nodurile a carer etiche ta apare in lista de adiacenta a nodului i Pr ed ec esorii n od ului i sunt nodurile j i n a c arer lista de adiacent a aoare nodul i.
191 . - .
Info rm a tica Graf neorientat
Graf orientat
Nurna rul de vect n t at uodutu ! i este egal ell
Mllchia [i,j] a grafu lui reprez inta nodul ; ~ j un nod l din lista de adiacenta a nodului i din prima Iinie a
Nodurile adia c ente nod ulu i j sunt date de reuniunea dintre multimea succesorilor ~i multimea prede cesorilor nodului . Num ar ul de vc ctn! ai nodu lui j este egal ell cardinalul mu ltimi i de nod uri ad iacente nodului i. Arcul [i ,j] al grafului rep rezinta nod ul ; s! un nod j din lista de ad iacent a a nodului i din vectorul L
matrioei (U Oll i1El;).
(U Ollil EL,)
aradul nodului,
Din lista de adiacenta imptomontata static eu doi vectori puteti obtine urrnatoarele intormatii: Graf ncorientat
Graf oriontat
Lu ng im ca listei d e adiacenta a nod ului i neizolat. cu eticheta ma i mica decat n, este egala cu difere nta dintre primu1indice j U=i+1,n-1) diferit de 0, din veeto rul cap (cap[jl;tO), ~ i indice le elemen tului de la care in cep e lista de adiac enta a nodului i (capO] - cap[i] ). Pentr u nod ul n, lungimea listei de ad iace nta est e ega li3 eu diferenta dintre nurn arul tota l de elemente ale vectorul L, plus 1, ~i indicele elementului din care ineepe lista de aoiacenta a nodului n (2xm +1 - cap [n]) .
L un gimc a li st ci de adiacenta a nodului ; neizolat. cu eticheta ma i mica decat n. se calcule aza la fel ca ~ i in cazu1grafului neo rientat . Pentru nodul n . lungimea listei de adia cent a este egala eu (m +1 • ca p[n] ). Gr adu l extern al nodu tui I este ega l eu lun gimea li stei de aot ac on ta a nodulu i. Grad ul int ern at nod ului r este ega l eu num arul de apa ritii ale et iche te i nod ului in
vsctoullistei l (l UJ=;, cu j=1 .m).
Gradu l unui nod ; este egal eu lungi mea Iiste i de adiacenta a nod ului sa u cu nurna rul de aparitii ale et ichetei nodului in vectorullistei L
(l Ol =;, cu i=1,2·m). Nodurile adia centc n od utul I sunt nodurile a ca rer eticheta apare in lista de adiacenta a nodului i din vectorul L.
Nurn aru! de vecinl a! no d ului f este ega! cu qradu l nodului . Muc hia [i,j] a grafului reprezinta nodul ; ~i un nod j din lista de adiacen ta a nodului i din vectorul L
Suc cesorii n odulul I sunt nodu rile a carer eticheta apare in list a de adia centa a nodului i din veeto rul L. Pr ed cccsori i nodulul r sunt nodurile j in a carer lista de adiacenta din vectorul L apare nodu li. No d ur il e adiacente no dutul I sunt date de reun iunea dlnt re mu ttirnea succesorilor ~ i mult imea pred eces orilor nodulu i, Num arul d e veci ni at no dut ulr este ega l eu eardina lul multimii de nod uri adiacente nodu lui l. n rc u! li.Il a! grafulu i reprezinta nodu l i :;; i un nod j din lista de adiace nta a nod ului i din veetoru l L
(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
Nu m aru l de ele mente d in toate listele simplu inla nlu ite este egal eu 2xm ( du blul nu ma rului de m uchli), Lung ime a nst e! de adlacenta a nodului ; este eqala eu numeru ! de nod uri ale listei ce are adresa nodului p rim ecata cu un.
Num aru t de ele me nte din t oate liste 1e simp1u Inlantuite este ega l eu m { n um aru l de a rce). Lung im ca Iis tei de adtacen ta r este ega la cu num arul de noduri ale Iiste i care are adre sa
nodului prim eoata cu l [i]
192
Im plcmen tu r ca st r uet u r ilo r de date Graf neoriontat
Graf orientat
Gradul unui nod i e ste ega l ell lungimea listei de a dlacenta .
Gradul extern a! nodului i este egal eu lungimea Iiste i de adlacenta a nodului. Gradul intern al nodului i este egal, ell numaru l de aparitii ale etichetei no dulu i in toate Iistele simplu Inl antuite. Succesorii nodului ; sunt nodurile a care r etichet a apare in lista ce are adresa nodului
Nodurile adiacente nodului ; sunt nodurile a
carer eticnet a apare in lista ce are adresa nodului prim egala ell L[i].
Numarul de vecini at nodului i este egal cu
qradul nodului. Muchia Ii.Il a grafului reprezinta nodul i ~ i un nodj din lista ce are adresa nodului prim eQala cu L[i]
2. 3.
4.
6.
prim egala eu L[i ]. Predecesorii nodului ; sunt nodurile j in ale care r liste (ee au adresa nodului prim egala ell LOll apare nodul i. Nodu rile adiacente nodu lui i sunt date de reuniunea dintre rnultime a succesorilor sl multimea predecesorilor nodulu i, Numa ru! de vecini ai nodului j este egal cu cardinalul rnuttirnii de nod uri adiacente nodului i. Arcul [i.j] al grafului reprezinta nodul i ~i un nod j dinlista ce are adresa nodului primegala cu L[i].
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.
7. Scri eti lista de ad iacent a a qrafului G". Se vor folosi eele trei melo de de im pleme ntare. Cum identifi cati - in fieeare imp lementare a listei de adiacenta - nodul destinatie al gral ului?
Implementarea algoritmilor pentru reprezcntarca grafurilor cu lista de adiacenta 1. Crearea listei de adiacenta in implementare statica prin citirea Iistelor de vecini din flsi er. Determinarea gradului unui nod. Obtine rea matricei de adiacenta din matricea Iistei de ad iac ent a, in tr-un tisier text se gasese urrnatoarele informatii desp re un gra! neorienta t (~ i varianta orie ntat) : pe prima linie, valorile pentru nurnar ul de noduri n !?i numarul de rnuchii m, despa rtite orin spauu , iar pe urrnatoare le n linii, de spartite prin spatiu , nurnarul de veeini ai unui nod si lista vecinilor (:;;i varianta nurnarul de succe sori ai unui nod si lista succesorilor).
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, .
Graful neo ric ntat
~i
g raful oriental _ impl cmcntarca cu matricc
#i nc l ude < f s t r e a m. h > i nt n, m , ~[ 3 J [ 50J , a [ 1 0 J [10 J ; //pentru graful n e o r i e r. t a t: fstr e am £ 1 ( " qraf13 .t xt " , i o s : :in l , £ 2 ( "g r af l.') . L:{t " , i o s : :out ); // pe n t r u g r a f u l o rienta t // f s t r e a m f l ( "gru f l lJ . t x t " , i o s : :in ) , f 2 (" g r z,. f 1 6 . t z t ",ios: :ou t ); v o id c i t.e s te () tint L j , x , k ; f l »n»:n ; fo r (i = l; i < o=n; i ++ ) L[1J [ij ""i ; j =- n+l ; for ( i = l; i <= n; i ++ )
{rI o>x , if
( F ~O) L [2 ] [i) = O; e l s e { L [ 2 ] [ i]=j ; f or ! k = l ; ~ < = x ;
k~ +1
{ f l» L [ l } [j] if ( k '~ " 1
~ [ ] [j) = j + l ; else L [ J [j; =O;
J++ ; ) ) )
::1 . close {} ; } int g rad {i n t i ) lint g ,j=L[2 ] [i] ; i f (1,[ 2J ( i. ; = =O) 9 =0 ; else { g o= "2.; while (!'[ 2j [j J ! =Ol { g ++ ; j ++ ;)} return c; ; } int ~!:"ad_ma;·; () tint i ,I;:ax=C; f or ( i = l ; i< =n ; i+f) if iq rad\ i1 >max m a x = g ~ 2 d{i) return :n2X ; l void t r aaa pune ()
lint i ,j ; f or (i =1 ; i< =n ; { j = L [ 2 J [i} ; if
i+ + )
(L[ 2j [ i. ; ! = O) {wh a Le ILl 2] [j] ~ o' O I {a l i ) [L [l ] [jJJ = l; a l L] ( L[ l J )j]]= l ; )})
j++ ; }
;
194
I m p lc m cnta rca st r ucru r llor de d ate
void s c r ie()
(int i ,j ; f 2« n« e nd l ; for {i""l ; i<~n ; i ++) {for (j = l ; j<~n ; jT +1 £ 2« a [ i ) [j ] « " " . f2 « e n d l ; ) £2 . close () ; ) void main () {inti; citeste () ; cout«" Gr a d u l eel mai maTe este "« g r a d _ma x () « e n d l ; oou t-c-C'N o d u r i.Le vc u gradul eel ma l mare s1Jnt~ : " ; for ( i=l i i< = n; i·j· ,,,) if (g r a d (i) -o- q r ad max {} [" ccc ecc r -c-c '' t r an spun e t-j • scrie() ; }
".
Gra fu l nc ori en tat si qra f ul o rie ntat - im p lem c ntarea eu vocto ri . #include < f s t r e a rn. h > int n,m , L[ SO] , a r l O] [ 1 0] , c a p ( 1 0 ); /Ipentru graf ulneCrienat fstre am fl ( " g r a £1 3 . txt " , ios: : in ) , £ 2 ( "gr-af1 5 . txt " , ios: : out ) ; I/pentrugraful o r l e n a:: / I f s t r e a mfl ( " g r a f 1 4 . t x t " , ios : : in ) f2( " g r a f 1 6 . txt " , ios: : out ); void ci tes te ( ) lint i , j =l , x , k ; fl »n »m; f
for { i = l; i < ~ n ; i + + )
{ fl »x ; if ix ~ ~O I cap[ i] = O; else {c a p Ci ]""']; for (k ~l;k<~x ;k H f lo close () ; } int g r a d ( i n t i ) (int g ,j ; if ( c a p[ i J ~ ~ O ) g~ O ;
I
( fl » L [j ]; j ++ ; ) } )
else {if ( Lcn j
{ j ~ i + l;
while ( c a p [ jJ=~O &&j<= n) j++ ; i f ( j==n+l) g=2 -A- m+l ::" c a p [ i J ; II g =m+l -cap[ i ] ; pentr u grafu l else g ~cap[j ]-cap[iJ ;}
orientat
else g =2*m+l -cap [ il ; } return g ; } int grad max() ( / /este Loe n t tcc cu e ea de l a implementarea e u mar r i.ce j void t ran s p u n e ( ) ti nt i, j; for ( i = l ; i< =o ; i ++) for ( j ~ O ;j
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,
Pe nlru teslarea progra melor se lolose sc gralul neorientat G,
~i
gralul oriental G9 .
Graful neorientat ~i gra fu l o riental - implemc ntarca cu m atri cc
#include < f s t r e a m. h > in t
n ,m ,L[ 3 ] [ 5 0 J, a [ l OJ [lO J ;
/Ipe nt r u gr a f u l neorientat fs t r e am f l( " g raf 15 " , i o s : : i n ) , f 2 ( " g r a f 1 7 . t x t " , i o s : : o u t ) ; //pentru gr a ful orie nta t Il f s t r e a m f 1 ( "grafI6 _t xt " , i o s : : in ) , £2 ( "graf I8 . tx t " , i o s : : o ut ) ; v o i d c i, t este () {int L j ; £ 1»n ; for ( i = !; i <= n ; i T+ ) for l j ~ l; j < ~ n; j ++ ) f fl» a [ i ] [j] ; i f l a [ i ] [ j] ~ ~ l) m l + ; ) fl . c l o s e l) ; m=m/ 2 ; } //numai pen tru graful neori entat v oid transpune { ) {int i ,j ,k ,g ; f o r ( i ~ l; i < ~ n ; i. t+ ) L[ lJ [ l ]~ i. ; ke-n -t I r f or ( i = l ; i < = n ; i + ' ~ ) ffor l j~ l, g ~ O; j < ~ n; j + + )
if (a[ iJ [j]~~ l) { L [ l ] [ k] ~ j ; L [ 2 ] [ kJ ~ k - l ; k++ ; g++ ; ) I g~ ~O) L[2] [il ~O ; e l s e f L [ 2 ] [ iJ~ k -g ; L[2] [ k -1J~O ; ) ) ) i nt grad( i n t i ) {I / i d e n t i c a eu e e a de la ~~lerr£ntarea eu rna t r i ee } void s c r Le () {in t .i ,j=l , J.: ; f2 «n« " "« m«e nd l; f or (i= 1 ; i <=n ;i++) if (L[2 J [i] ~ ~O) f2 «0 « e n d l ; el se { f 2« g r a d ( i) -cc'' " ; f or (k ~l ;k <~grad(il ; k++, j ++ ) f2 «L[ 1] [ j J«" " ; f2 « e n d l ; ) f2 . c l o s e ( ) ; ) v oid main () {c i t e s t e ( ) ; tr a n s p une ( ) ; seri e() ; } if
Graful ncorientat
~i
g raful orientat _ im plcmcntarea cu vecto ri
#i n cl u d e
196
Imp lemcntareu st r uct u r ilor lie da te
v o id sc r i e {) { i n t i I j ; £2 «n. « " "
{f 2« q r a ci ( i) « " "; f e r ( j= O; j
3. Crearea listei de adiace nta in implementare dinami ca prin citirea lis tei muchiil or din fi sier. Determ in area veci nilor ~ i a gr ad ului unu i nod. inlr-un fisier text se gasesc urmatoarele mformatii despre un graf neo rienta t (~i variant a orientat) : pe prima linie, valorile pent ru nurnaru l de noduri n si nurnarul de muchii m, iar de pe urrnatoarele m linii, cate 0 pereche de numere de spartite prin spa tiu, care reprezinta etichetele nodu rilor ce tormeaza a muchie (arc). Se citesc din fisierul text aceste informatii ~i se cree aza lista de adiacen ta implernentata dinamic. Se afiseaza vecinii ~i gradul fiecarui nod . se Ioloseste pentru a initializa cu va loarea NULL eleme ntele vectorulu i L Functia ini (pointerii nodului prim al listei de adiacenta a fiecarui nod din graf) , functia adauga _ nod 0 pentru a adauqa un nod ina intea nodulu i p r im la lista simplu Inlantuita a unui nod din qraf, functia c r ea re ( ) pentru a crea lista de adiacenta, functia g rad () pentru a determina gradul (~ i var ianta , gradu l extern) al unui nod, functia af isa r e _ v ec i n i ( ) pe ntru a afisa veci nii fiecarui nod, iar functia afisa r e _ g r a d () pentru a afisa grad ul fiecaru i nod. lnforrnatiile se citesc din fisierul text graf11 .txt pentru graful neorientat ~i graf12.txt pentru graful oriental. Pentru testarea progra melo r se l olosesc graful neorientat G , si graful orientat G g . # i n cl u de < f s t r e a rIl. h> st ru ct nod t i nt i n f o ;
to
nod * u r m.
j ,
nod * L [ 2 0 ] ; i n t n ,m ,' f stream f l ( " g r afl l . t x t " , i o s : : i n ) ; voi d init () { :» n» ~; f or ( i n t :=l ; i<=r. ;i++) L[i}=NULL; } voi d a da ug a_nod( ::1od *&p r i :n, int y)
{Lod *p =n e w nod ; p- >i nfo:o:y ; p - >u r m=pri m; pr~ rn= p ; } v oid c r e e r e () t i n t Y. ,y ; wh i le (f » x »y) ( a d a u g a _ n o d ( L [ x . , y ); a d a u g a _ l1 o d {L [ y ], x );} f . close () ; } v o id af~sare_vecini() {for (i n t ~=: ;i< =n ;i -+) { co u
t
c c v v e c Ln
i i.
nodc Lu
i.
" < x L c -c '" :
" ;
f o r (nod *p '""'L [ i l ; p ! =cNULL ; p=f:- >u r m) cou t « p - >l nf c« " cou t «endl ; }} i nt g r ati ( i n t i) t i n t 9"'0 ; fo r
(nod * p = :" [ =-- ]; p ! =NULL; p = p ->urm)
g++ ;
r e t urn g ; }
vo id afis are grade(} {fo r (i n t i = l ; i <= n; i ~+ ) cout«" Gr a d u l n o du lu i "« i« ": "« g r a d (i ) « e nd l ; ) v oi d main () {i n i t : l ; c r ea r e t ) , afis are_v e c ini() ; afisa r e _9ra d e{) ; }
It .
I nformati cii
19 7
1. Scrieti un program care citeste listele de adiacenta ale gratului din fisierul text graf I 3.txt, penlru gratul neorientat, respectiv din fisierul grafI4.txt , pentru gratul orienlat, ~i care afiseaz a nodurile izolate. Liste le de ad iacen ta S8 implementeaza dinamic ~i static, in cele doua var iante. 2, Scrieti un program care citeste listele de adiacenta ale gratului din fisierul text graf I 3.txt, pentru gratul neorientat, respectiv din fisierul grafI4.txt, penlru gratul orienlat , ~i care afiseaza muchii le (arcele) gratului. Listele de adiacenta se implernenteaza dinamic ~i static in cele dOUc3 variante . 3, Scrieti un program care citeste din doua fisiere text, respectiv din g5.txt un grat orientat, reprezentat prin lista muchiilor, ~i din fisierul g6.txt un grat orientat, reprezentat prin lista vecinilor, si care verifica daca cele doua qrafuri sunt identice (lndicat ie. Se reprezinta ambele grafun prin matricea de adiacent a si S8 cornpara cele ooua matrice de adiacenta),
2.7.4,5 , Aplicatii practice 1. i ntr-un grup de n persoane s-au stabilit doua tipuri de relatii: de prietenie si de vecinatate. Scrieti un program care sa citeasca matricele de adiacenta ale celor doua grafuri dintr-un fisier text (pe primul rand, nurna rul de persoane, ~i pe urma toare te randuri, in ordine, liniile fiec are i matrice de adiacenta) ~i care sa afiseze: a. persoanele care sunt §i i prieten e !?i vecini (lndic atie. Se deterrnina rnuchiile din gratul intersectie a celor doua graturi neorientate); b. eel mai mare nurnar de persoane care S8 qasesc intr-un grup de vecini prieteni (lnd icat ie. Se determine gradul maxim in gratul intersectie a cetor c oua grafuri.) Pentru testarea programului forrnati un grup cu 10 dintre coleg ii vost ri ~ i descrie ti cu ajuto rul a doua graturi cele doua tipuri de relatii. 2. intr -un grup de n persoane s-a stabilit 0 relatie de cunosti nta: persoa na x este in relatie cu persoana y daca 0 cunoa ste pe aceasta. Relatia de cun ostinta nu este reciproca. 0 celebrit ate este 0 persoana care este cunoscuta de toate persoanele din grup , dar care nu cuno aste nici 0 perscana (este un nod destinatie al gratulu i). Un necunoscut este 0 persoan a care cuncaste toate pers oanele din grup dar nu este cunoscuta de nici 0 perso ana din grup (este un nod sursa al gratu lui). Un singuratic este 0 persoana care cunoaste 0 sinqura perscana din grup sau este cun oscuta de 0 sinqura pers oana din grup (este un nod term inal al gratul ui). Un strain de gru p este 0 persoana care nu cunoaste nici 0 persoana din grup ;;i nu este cun oscuta de nici 0 perscana din grup (este un nod izolat al gratului). Dernonstrati ca in grup nu poate exist a decat 0 sinqura celebritate ;;i un singur necunoscut. Scrieti un program care sa citeasca dintr-un fisier matricea de adiacenta a grafului ;;i care sa afiseze : a. daca exista 0 cefebritate , sa se precizeze persoana, iar daca nu exista, sa se precizeze: persoana care cunoaste cele rnai putme persoane ~ i persoana care este cunoscuta de cele mai multe persoane; b. daca exista un necul1oscut, sa se precizeze persoana , iar daca nu exista. sa se precizez e: persoana care este cunoscuta de cele rnai putine persoane si persoana care cunoa ste cere mai multe persoane ; c. daca exista sin qurotici, sa se precizeze persoanele; d . daca exista strbini de grup, sa se precizeze persoanele; e. cate perso ane cun osc dear doua persoane din grup iii sunt cunesc ute la randul lor de trei persoane din grup (nodurile care au gradul intern egal cu 3, iar gradul extern egal cu 2);
198 f. g.
Implcmcntarca structurilor d e da te cate persoane sunt cunoscute de un nurnar de membri egal cu nurnarul de membri pe care Ii cunosc (nodurile care au gradul intern ega l cu gradul extern); care sunt persoanele care S8 cunosc reciproc (pe re chile de nodur i intre care
exista arce duble). 3. La graful judetelor, adauqati un nod cu eticheta 0, care reprez inta exteriorul tarii, ~i muchiile corespunzatoare , care evidentiaza judetele limitrofe. Creati cu un editor de texte fi~ieruljudete .txtcare sa ccntina urrnatoarele inforrnatii: pe primu l rand , numarul de judete. pe urmatoarele rand uri matricea de adiacenta , pe urrnatorul rand , in ordinea etichetelor nodurilor, denumirile judetelo r separate prin spatiu (pentru judetele care au un nume format din mai multe cuvinte folositi ca separator Iinia de subliniere). pe urrnatorul rand numele vecinilor Rornanie i separate prin spatiu, si apoi, cate un rand pen tru fiecare judet limitrof, in care scrieti separate prin spatiu urmatoarele inforrnatii: eticheta nodului ~i tara (tarile) cu care se i nvecineaza, precizate prin nurnarul de ordine din lista numelor. Scrieti un program care sa citeasca aceste inforrnatii din fisier ~i sa Ie transpuna intr-o implementare a grafului , adecvata problemei , si care sa aflseze: a. judetele care au cele mai multe judete vecine - se va preciza nurnarul maxim de vecini si numele judetelor care au aceasta proprietate; b. judetele care au cele mai putine judete vecine - S8 va preciza nurnarul minim de vecini ~i numele judetelor care au aceasta prcprietate: c.
judetele de la granita - pentru fiecare judet se va preciza numele sau si numele tarilor cu care se lnvecineaza.
4. Intr-o zona turistica exista n localitati. intre unele localitati exista legaturi directe, fie
prin sosele nationale, fie prin sosele judetene. l.eqaturi!e directe sunt caracterizate de lungimea drurnului, rnasurata i n kilometri . Se vor folosi doua graluri : Go=(X ,U o) pentru leqaturile prin sosele nationale ~i GJ=(X,UJ) pentru leqaturile prin sosele judetene, Cele dou a grafuri se vor citi din doua fisiere text, care contin pentru fiecare legatura directa, pe cate un ra nd, separate prin spatiu , cele doua etichete a le noduri lor asociate localitatilor si distants dintre localitati. Scrieti un program care sa citeasca aceste inforrnatii din fisier si sa Ie transpuna intr-o implementare a grafului, adecvata prebleme i, si care sa afiseze: a . localitatile la care nu ajung drumuri nationale (nodurile iz olate, in primul graf) ; b. cea mai scurta leqatura directa dintre doua localitati - se va prec iza eticheta nodurilor asociate localitatilor, distanta dintre local itati ~i tipul scselei prin care se asiqura leqatura : c. pentru doua localitati prec izate , a ~i b (etichetele noduri lor a si b se citesc de la tastatura) , sa se precizeze daca exista leqatura directa . daca exista . sa se rnai precizeze tipul soselei si distanta dintre locahtati: d . pentru 0 localitate p (eticheta p a nodului se citeste de la tastatura ), sa se afiseze toate localitatile cu care are leqaturi directe ~i distants pana la aceste localitati (ln d icat ie. Se dete rrnina grafu l reuniune a celor doua grafuri .); e. loca litatea care a re cele rnai multe leqaturi directe cu alte localitati - ~i sa se afiseze localitatile cu care are lega turi (nodul cu gradul maxim in graful reuniune). 5. intr-un munte exista n grote . Fiecare grat a i se qaseste la lnaltimea h; fa\a de baza munte lui. Intre unele grote exista comunicare directa, prin intermediul uno r tuneluri . Exista si grote care cornunica cu exteriorul. Desenati a retea ipotetica de grote ~i construiti matricea de adiacenta a grafului neorientat asociat {grotele sunt nodurile, ja r
Info rmuticii
199
tunelurile sunt muchiile) . In altimile grotelor S8 vor memora intr-un vector. Gasiti 0 modalitate de a evide ntia grotele care comunica cu exteriorul. (Ind icat ie. Adauqati la graf nodul 0, care reprezinta exter iorul munte Jui.) Scrieti matricea de adiacenta ~ i vectorul cu Inaltirnile grotelor, in fisierul text grote.txt. Scrieti un program care sa citeas ca matricea de adiacenta si vectorul din fisier - ~i care sa afiseze : a. numarul de tunelu ri de comun icare (nurnarul de muchii ale gratului); b. grotele care au leqatura cu exteriorul (nodurile i pent ru care exista muchie cu nodu l 0); c. grotele care cornunica direct cu cele mai multe grote (nodurile cu eel mai mare grad); d. grotele care nu co rnunica prin tune luri cu alte grote (nodurile izolate); e. ce a mai ina Ita grat a si cea mai [oasa grata ca re cornu nica cu exterio ruJ ; f. pentru a grot a a carei etiche ta se citeste de la tastatu ra, sa se afiseze grote le cu care cornunica direc t, precizand pentru fiecare tunel daca suie, cob oara sau este la acelasi nivel cu grota . 6. Reteaua de strazi dintr-un oras este fermata din strazi cu dou a sensu ri ~ i strazi cu sens unic de circulatie , Ea poate fi reprezentata printr-un graf orientat, i n care intersecfiile sunt nodurile, iar arcele - sensul de circulat ie pe strazile care leaga doua inter sectii (traficul auto) . Nodurile sunt intersectii de eel putin 3 strazi. Pentru a stabili prioritatea i n intersectii si pen tru a fluidiza traficul intersecuile vor fi modernizate. Pentru mod ernizare se vor folosi panouri cu semne de circulatie, semafoare - :;;i se vor amenaja sensuri giratorii . Pentru fiecare strad a din ca re se poate intra in intersectie , se rnonteaza in intersectie un panou cu semn pentru prioritate. Pentru fieca re strada pe care nu se poate intra din intersecue se rnonteaza in intersectie un panou cu semnul de interzicere a circ ulatiei , i n toate intersectiile vor fi montate panouri cu sem ne de circulatie , corespunzator strazilor incidente cu intersectia. Fiecare dmtre aceste mijloace de modemizare are un cost panoul cu semn de circulatie - costul c t , sernaforul - costul c2. ~i sensuI giratoriu - costul c 3. Pentru a stabili modu l in care este rnodernizata fiecare intersectie, intersectiile au fost c1asificate in intersec tii rnici (intersectii cu 3 strazi, i n care var fi mantate numai panouri cu semne de circulatie). intersectii mari (intersectii cu 4 strazi, care vor fi semaforizate ) :;;i intersectii foarte mari (intersectii cu peste 4 strazi, in care se vor am enaja sensu ri giratorii). Desenat i o retea ipotetica de strazi :;;i construiti matricea de adiacenta a grafu lui orientat asociat. Scrieti matricea de adiac enta in fisierul text strazi.txt . Scrieti un program care sa citeasca matrice a de adiace nta din fisier :;;i care sa afiseze: 3 . inte rsectiile la care nu se poat e ajunge din nici 0 alt a inte rsec tie (nod urile care nu au predecesori ); b . inte rsectiile de la care nu se paate ajunge la a nici 0 alta intersectie (no durile care nu au succesori ); c. daca exista intersects tara nici a intersecue succesor sau tara nici 0 intersectie predecesar, sa se corecte ze desenu l retelei (prin adauqarea unui nurnar minim de arce), astfel i ncat sa nu existe asemenea intersectii - :;;i sa se actualizeze si fislerul strazi.txt. d. intersectiile la ca re se poat e ajunge dire ct din cele mai mu lte intersectii (no durile care au ce l ma i mare grad intern ); e. inte rsec tiile de la care se poate aju nge direc t la cele ma i multe inter sectii (nodurile ca re au cel ma i ma re g rad extern ); 1. num aru l de strazi pe care se circula i n ambele sensuri (nurnarul de pe rechi de noduri i ~ i j pentru care . i n matric ea de adiacenta, elementele a[i][j) ~i aOWl sunt ega!e cu 1);
200
Irnplcm cntn rc u st r uct ur ilor de date
g, numarul de intersectii mici, mari si foarte mari (clasificarea nodurilor i n functie de nurnarul de noduri adiacente: noduri eu 3 noduri adiacente , cu 4 noduri adiacente ~ i cu cel putin 5 noduri ad iacente ); h. numar ui de pan ouri eu semne pentru prior.tate care S 8 var folosi (suma grade lor interne ale nod urilor): i. nurnarul de panouri eu semne pentru interzicerea circul atiei care S8 vor folosi (diferenta dintre suma grade lor externe ale nodurilor ~ i nurna rul de straz i cu sens dub lu de circulatie): j. numa rul de sema foare care se vor men ta (suma grade lor interne ale nodurilor care au 4 nodur i adiacente ); k . costul de rnoder nizare necesa r pentru fieca re lnterse ctie ~ i costul total al modernizarii. 7. Pe un munte exista mai multe parcele eu Ianete ale saten ilor. Unele tanete au aeces direct la dru mul satesc, all ele nu. i ntre propr ielarii parcel elor veci ne exista relatie de prieten ie - sau nu . Dac a do; propr ietari vecini sunt prieten i, i ~ i perm it unul altuia accesu l pe propr ia parcela. Pent ru a transporta fanul, saten ii care nu au acces la drum ul satesc , trebu ie sa trea ca peste parcelel e all or sate ni, ca sa ajunqa la el. Un proprietar este co nsiderat izolat daca nu are aeces direct la drumu l sate sc si nici nu este i n relatie de prieteni e cu vr eunul dintre vecinii lui. Se vor folosi dou a grafuri: unul pentru a repreze nta relatia de vec inatate a fan etelor, iar allul penlru a reprezenta relatia de prietenie dinlre proprietari. Desenati 0 harta ipotetica a fane\elor si stab iliti relatii ipotetice de prieten ie i ntre vecini. Constru iti rnatrice le de adiacen ta ale celor doua grafuri asoc iate. Scr ieti malricele de adiacenta in fisierele texl Ien ete.txt ~i prie teni.txt. Scrieti un prog ram care sa citeasca matricele de ad iacenta di n fisiere ~ i care sa furnizeze urrnatoarele informatii a. daca exista prop rietari izolati, sa se afise ze lista propriet arilor vecin i cu care trebuie sa stabileasca relatii de priete nie, pent ru a ajunge la drumul satesc, !iii sa se iden tif ice vecin ii care au acces direct la drumul satesc; b. care este proprietarul eel mai neprietenos (care are eel ma i mare procent de vecini cu ca re nu este prieten). 8. Se anal izeaz a rniqrat ia unei specii de pasari catatoare pe perioada unui an. Migra\ia are doua etape : rniqrat ia de toarnn a, can e pasarile migrea z8 din zone Ie reci catre zonele calde (migra\ia de la rece la cald), si rniqratia de prirnavara. cand pasarile miqreaza din zone le calde cafre zonele reci (miqratia de la cald la rece). Fiecare etapa a miqratiei va fi reprezenta ta printr-un graf oriental. in graful rniqratiei de la rece la cald, nodurile care apart in zonei reci au numai succesor i, iar nodurile care apartin zone: calde au numai predec esori. i n graful rniqratiei de la cald la rece nodurile care apartin zonei calde au num ai succesori, iar nadurile care apart in zonei reci au numa i predecesari. Fiecarui nod i se asoc iaza coordonate le geogra fice. Oesena ti cate 0 harta ipotetica pentru fiecare etapa de rniqratie. Construiti. cu un ed itor de texte, fisieru' migraliel. /xt, care va contine pe prima linie n1, nurnarul de noduri ale prirnului graf, pe urrnatoarele n1 linii, matricea de adiacen ta a graf ului, ~i apoi, pe urrnatc arele n1 linii, coordonatele geografice ale fiecarui nod de pe harta (sunt 6 entitati de intorrnatie, separa te prin spatiu: doua valori nume rice i ntregi pentru latitudine, in grade ~i minute, ~ i un caracte r pentr u ernisfera, doua valori nume rice intregi pentru longitudine. i n grade si minute . si un caracter pentru meridian). Construiti cu un editor de texte fisierul migratio2.txt, care va cont ine acelas i tip de informat ii, pentru cel de al doilea graf al miq ratiei. Scrieti un program care sa
201
Informa tica
citeasca aceste informatii din fisier, sa Ie transpuna intr-o implementare a grafului adecvata prob lemei (rec om and are - implementare prin matrice de adiacenta si vector de structuri pentru coordonatele geografice) si care sa afiseze urrnatoarele inforrnatii: a. daca cele doua grafu ri sunt corecte (daca a[i][j]= 1, atunc i au][i]=O - , i produsul dintre gradul intern , 1 gradu l extern ale fiecarui nod trebui e sa fie 0; in plus, treb uie ca nodu rile din zon a calda sa coincid a - i n ambe le grafuri); b. dac a in gra ful rniqratiei de la rece la cald exista un nod destinatie al grafului - , i ce sern niflcatie are exis tent a lui pentru rniqratie ; c. daca pasarile s-au rein tors i n aceleasi zone , prirnavara (nodurile din zona rece coincid in cele do ua grafu ri); i n caz con tra r, sa S8 specifice no lle locatii aparute i n zona rece in care a ajun s specia respective: d. sa S8 obtina matricea de adiacenta a har1ii rniqratiei, pe in treaga perioada a anului , prin reuniunea celor coua grafuri (daca dupa rniqratia de primavara au aparut noi locatii pe harta in zona rece, se vor adauqa la primul graf ca noduri izolate).
2.7.5. Grafuri spccia le Se definesc urrnatoarele grafuri specia le: -') g raful n ul; -') g ra ful c om pie!.
2.7.5.1. Graful nul Graful G=( X,U) se nurn este graf nul daca m ultim ea U es te v ida (U=0), adi c a graf ul nu are mu chii. Reprezent area sa in plan S8 face prin noduri izolate . Exemplu: Graful N=(X.VJ - unde rnultirnea X={1,2.3.4} este rnultimea nodurilor, iar mult imea V=0 este mult imea muchiilor - este un graf nul (graful are nod uri dar nu are muchii) - figura 14.
.
Observa tie . Matricea de adiacenta a unui graf nul e ste mat ricea zero (nu ' contine nici un element eu valoarea 1).
(1) @ 0)
0
Fig. 14
2.7.5.2. Graful complet Un gTat e ll n nod uri este un g Taf compl et daca are proprieta tea ca, orica re ar fi do ua n od uri ale gra fului, ele s un t ad iacente. EI S 8 no toaza ell K n. Ob serv atli . 1. S8 poate construi un sin gur gra f neoricn tat co m plet, ell n noduri , deo arece i ntre doua noduri , x si Y. exista 0 singura muchie [x,yj . in figura 15 este prezentat graful neorientat complet K4 . EI are 6 muchii. Desenati grafurile neorientate complete Ks si K6. Nurnarati cate much ii au aceste grafuri.
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
Im plementarea structurilor de date
ncmon st rat!e . Nurnarul de muchii cstc cat de numa rul de subrnultimi de 2 clemente care se pot forma dintr-o rnultirne cu n clemen te, aoica m =
C/~
2. Se pot construi mai multe grafuri orientate com plete, cu n noduri , deoa rece dOU3 noduri x ~ i y pot fi adiacente In trei situatii: exista arcul [x,V], exista arcul [Y,x] sau exista arcele [x,Y] si [y,x] .
Teorema 7 Nurnarul de grafuri orientate complete care
S8
pot construi cu n noduri este egal cu
Dem on stratie Deoarece nurnarul de subrnultimi de 2 nooun care se pot forma dintr-o muttime de n
noduri este a=
CI~ ' ~ j pentru fiecare pereche astfel deflnita S8 pot defini trei situatil de adiacenta.
a rezurta ca numarul de grafur i complete ca re se pot co nstrui este de 3 .
Exemplu . Pentru n=4 se pot 6 defini 3 =72 9 graluri orientate complete. In l igura 16 sunt prezentate patru dintre acestea . Definit i alte patru gralur; complete cu 4 noduri.
~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.
Algoritmi pe ntru prelucrarea grafurilor comp lete 1. Al goritm pentru a determina nurnarul minim d e aree ca re trebuie ad auq ate la u n g ra f o rienta t , pentru a obtin o un graf o rie ntat camplet.
A lg oritm u i. Se nurnara perechile de nod uri i si j (i:,t:j) int re care nu exista nici un arc. Impl em entarea algo ritm u lu i i n program , inforrnatiile despre graful orientat se citesc din fisierul text gc.txt: de pe prima linie numarul de noduri , ~ i apoi , de pe urmatoarele randuri matricea de adiacenta.
#i n c l ude i n t n ,a[lO J [ l OJ ; fstream £( "gc.t xt" , i o s : : i n );
voi d c.l t e s t e t ) void main ()
{ l i s e c .i t e s.t.e ma t r i .ce a d e arf i a cen t.a d i n f i s Le r }
{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
i
.If (a [ L]
[J J ~~O
&&
a[j ]
[ .l J ~ ~ O I
m++ ;
cout«" Numa r u l de are e ca re trebuie ada ugate este "« 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 -
-
2
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 >
ffinc l ude
cou t « "Numarul ma x i m de no dur i izolate
e ~t e
"« n- n l - l ;}
1. Scrieti un program care citeste , din fisierul text graf.-cl. txt, inforrnatii despre un graf neorientat (de pe prima linie, nurnaru l de noduri, apoi mat ricea de adiacenta) , ~i care verifica daca este un graf com plet. 2. Scrieti un prog ram care citeste, din fisierul graf_c2.txt. info rrnafii des pre un graf orientat (de pe prima linie , nurnarul de noduri, apoi matricea de adiacenta) - si care verifies daca este un graf complet.
2.7.6. Grafuri derivate dintr-lIll graf Se definesc urrnatoarele grafuri : -7 graful pa rt ial; -7 su bgraful ; -7 graful c om plem en tar.
2.7.6.1 . Graful partial Fie graful G = (X,U)
~i
multimea VS;;U. Graful Gp = (X,V) se nu m csto graf partial al gratulu; G.
Altfel spus, un graf partial al grafului G esto 01In susi s au un graf ca re s-a obtinut prin climinarea unor mu chii (aree) din graful G.
Exemple : 1. Pentru graful neorientat G, = (X" U,), definit anterior , graful G, p = (X" U, p), definit astfel: -7 rnultimea n odurilor este X,={1 ,2,3,4,5,B,7,8}. -7 multim aa muchiilor este U,p ={(1,2], [1,3], [1,4J, [2,3], [2,5J, [3,41 , [B,7]}. este subqraf al grafului G , - figura 17. Grafu l
G,
~
®!Ec:> ~
~~®
Fig. 17
~'@
~
Graful partial G, p
GI (I
204
lmpl cm cn tarcu s t r uc ru r ilo r lie da te
2. Pentru graful orientat G IO=(XlO.UlO) definit anterior, grafu l G10p = (Xr o, U1CP) definit astfel: -7 rnu lt irne a nodurilor este X lO={1 ,2,3,4,5,6,7,8,9,10j, -7 rnultlm ea arcelo r este U, oP=([2,3) , [2,5J, [2,6), [2,7J. [4,1], [7,2), [8,9] , [9,8)}, este subgraf al grafului Gl 0 - figura 18.
5 Grafu l
~ ......
G, o
.J
4
~
5
Grafu i
® partial G 10P
9
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
Numarul de grafuri pa rtiale care se pot obtine cu m -t muchii (arce ):
'" '"
Nurnarul de grafuri part iale care se pot obtine cu m -z muchii (arce). :
(,m -~
Nurn arul de gra fur i parti ale care se pot obtine cu 0 muchie (un arc ):
cl
Nurn arul de grafuri pa rtials care se pot obtin e Nurn arui total de grafu ri part iale este :
rara
nici 0 muchie (nici un arc ):
C::: + c:::- + c:::I
l
+ .. + C~l1 +
C: 1
=
'"
2'''.
Algoritmi pentru prelucrarea grafurilor partiale
1. Ge ne ra re a tut uror gra furilor partia le ale unui graf neorien tat. Algo ritmul. Se fotoseste m etoda backtracking . i n stiva se vor genera muchi ile 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~ . ~ >
f s tre a m f ( "g :::-a ::::" 3 . :x t " , ':c ,s : : i :-d ; typedef i ~t 3 t i v A [ l OOJ ; in t ;l ,ffi,p ,k , ev , as ,a lClflO] ,o[lOlf 20] ,nr ; s tiva ~l ; void ci t.e s te (}
205
III fo r ma ticii t int L j 1»n»x ; for (i= ; < =n ; i + '~ ) ; j < = n ; j + + } { f l» a [ i ] [jJ ; i f
f or { = m=~ / 2 ;
void
(a:i] [jl == l) m+-i- ; }
.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;}
int succ e sor- ( ) (s t [ k l
{if
{ s t [ k ] = s :: [ k ] 1-1;
return l ; } else r e t urn OJ }
i n t va li d i l {i f
fo r
( k>: (i n t
&&
s l: [ k ]
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
c out« " Gr a f u l p art i a l
"< Xn.r-c-ce rid L, o o u t.c -cvlqu c h i.a I e : ".
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
(bl j ] [ st[ i J ] == l ) cou t.cc j -c-c'' ".
"; }
{ / / p u r t e a f i x tl a a Lqo r i .tmu Lu.i ba c k r r -a c k i n q }
void main ( ) ( c i t e s t e {) ; t r a n s f o :r8ar e { ; f or (p=r.; p>=O ;p - -) b L() ; }
2. Ver ifi carea d aca un g raf G p este graf part ial al unu i graf G. Al goritmu l Se verifica daca cele doua grafuri au acelasi nurnar de nodur i si daca graful G p nu contine muchii care nu exist a in graful G. Im plementar ea al gori tmu lui. Se cilesc , din doua fisiere text glp .txt ~ i g2p ./x/, inforrnatii despre doua grafuri neorientate (sau orientate ): de pe prima linie, nurnaru l de noduri, si apoi, de pe urm atoarele randuri , rnatricea de adiacen ta. Matricele de ad iacent a ale celor doua grafuri sunt a ll}i a 2, cu dimensiu nea n, respect iv m. Functia grafp () verifies daca grafu l G p est e graf part ial al grafului G. # i n clude < i c s t r e a m . h > f stre a m fl ( " g l p . c x: " , i o s : : i n ) ,f2 ( " g 2 p . : xt " , i o s : :in ); in t Cl ,n , a1[ :0) [:0] , a 2[:O : [10) ; i n t g ra f p () {i f (m t e n ) r eturn 0 ; el s e f or ( i n t i=l i i< =n ;it--t-) f o r (i n t j~l ; J <~n ;j"+) if (a 2[i) [ j ' ~1 && 01 l i l [j]~ O i r e t urn 0 ; r e turn 1 i } v oid ma i n ( ) l i nt i , j ; f l »~l ; for { i = l ; i < = n ; i + ~ )
f o r {j = l ; j < = n ; j .... +) £1» a 1 l i l [ ""'] ; : 1 . c l o s e () ; i:"2 »;r: ; f o r i-i=l ; i<=;lI ; 'i 1·) f o r f j = 1; j <=m; j ++ ) f2 »5.2[:'] [j} ; :2 . c l o s e () ;
206
Implem entarea strncfn rilor de d a te
if (grafp(J ) oou b-ocv e s t e q r a f partial
"; else cout«" n u c ste gra f p artia l " ; J
3. Ob t inerca unui g raf partia l G p al unul graf G. Algoritmui. Se elimina din graful G much iile, in functie de conditia irnpusa de problema . Reprezentarea eea mai adecvata pentru graf este matricea de adiacenta , i n care S8 atribuie valoarea 0 elementelor a [i] [j] ,i a [j] [i], corespunzatoare muchiilor [I,j] care trebuie eliminate ..
Im pl em entarea algorltmu lui. Se citesc, din fisierul text g3p.txt, informatii despre graful neorientat: de pe prima linie nurnarul de noduri n ~i eticheta unui nod x , ~i apoi, de pe urrnatoarele rand uri, matricea de adiacenta a grafu!ui. lnforrnatiile despre graful partial obtinut se scriu in fisierul text g4p .tx/, astfel: pe primu! rand nurna rul de noduri n , 1numarul de muchii m si pe urrnatoarele m rand uri - muchiile, sub forma de perechi de etichete de nodur i oespartite prin spatiu. Cerinta este sa S8 obtina subgraful prin eliminarea tuturor muchi ilor cafe au la extrernitati un nod cu grad par !?i nodul x. in vectorul v S8 mernoreaza nodurile care au grad par . Funct ia ci t.e s t.e () S8 foloseste pentru a citi intormatiile despre matricea de adiacenta a grafului din fisierul text. funct ia scrie () pentru a scrie In fisierul text informatiile despre lista muchiilor grafului partial , functia grad () pentru a determina gradul unui nod , iar functia graf_ p a r t i a l () pentru a obtine graful partial. Pentru a obtine graful partial , se cauta toate much iile care au la extrernitati un nod cu gradul par si nodul x (muchiile [v[i),x) pentru care a[v[i)] [x]~~l),i se elimina aceste muchi i. Pentru testa rea programu!ui se va folosi graful G3 si nodul 6. itinclude < i o s t r cem . h > fstream f 1 ( " g 3p . t x t", ios: : in ) f £2 (H g 4p . t x t " , ios: : out ) ;
int a[2 0] [20 ] , n, m, x , v [l O]; void c i t este(} { / / s e c i t. e s r.e rna t.r i cea de ad i acen \-.3 d i n f i.$ i er ) int g r a d (int i ) tint j , g = O; for ( j=l ; j <~n ; j++) g+=a [i ] [j ] ; return g ; } void graf~part i a l ( ) tint .i , k~ O ; for ( i =l ; i< =n ; i++) i f (g rad (il %2--0) ( k++; v[ k ]- i ; ) for (i = l ; i<=k ;i++) i f ia[v [i]j l x] - ~ l ) { a l v j i I ] [x )-O ; a [x ] l v [j ]] - O; m-- ; ) ) void csc ri. e j ) {int i, j; f2 « n« " "« m«endl;
for (i =l ;i<=n ;i+ +) for ( j - l ; j
207
lnfurm utica
de pe prima linie nurnarul de noduri, apoi matricea de adiacenta, ~ i ca re verifies daca
unul dintre grafuri este graf partial al celuilalt. in caz afirmativ, se afiseaza care este graful care este graful partial. (lnd ica tie . Daca cere doua grafuri au acelasi ardin n , se identifica graful care are mai multe rnuchii (m) sl num arul de muchii ale celuilalt graf - p (rnzp). Pentru grarul cu m muchii, se genereaza taate matricele de adiacenta ale grafurilor partiale cu m muchii ~ i n noduri - ~i S8 verifies daca una dintre ele este identica cu matr icea de adiacenta a celuilalt gra!.) 3. Scrieti un program care cites te din fisieru l text graf19.txt matricea de adiacenta a unui graf neorientat !?i care genereaza un graf partial prin eliminarea muchiilor care au la extremitati un nod ce are gradul minim ~j un nod ce are gradul maxim in graf. lnforrnatiile despre graful part ial obtinut se scriu intr-un fisier text sub forma listei de rnuchii . Pentnu testarea programului se va folasi gratul G4.
,1
2.7.6.2. Subgraful Fie graful G = (X,U). Graful Gs= (Y,V) se num esta subg raf al gr afului G dac a Y ~ (subgrafu l contine num ai noduri ale grafulu i) 9i mu chiile (arc ele) din multimea V sunl t0 3t8 muchiile (arcel e) din rnultimea U care au ambele ext rernitati in multirne a de no duri Y. Se spune c a subg raful Gs esle ind us sau general de multirnea de noduri Y. Altfel spus, un subg raf al grafului G esle el insu si sau un graf care s -a obtinu t prin suprirnarea din graful G a unor nod uri ~ i a tuturor muchiilor (areelar) incidente cu
aces te noduri. Exernpl e: 1. Pentnu graful neorientat G, = (X"U ,) , definit anterior, gratul G t s = (Y"V,). definit aslte l: ~ rnultlmea nodu rilor este y ,=(1,2.4 ,5,6.7). ~ rnultim ea muchi il or este V, =([1.2]. [1 A]. [2.5]. [6,7]}. este subgraf al grafului G, - figura 19. Gratul
G,
~ ~ q~ ~ ~ 0 '@
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
Implemcntureu st r uct u ri lor de date
n em cn atret re. Subg rafurile se pot obtme : prin elirmnare a niciunui nod (obtinandu-se grafu! initial ): a unui nod (obhnan du-se subg rafurile cu n-1 noduri): ...; a n-1 noduri (obtinandu- se subqraf urile eu un nod): Numaru! de subg rafuri ca re se po t obtine eu n nod uri: Numarul de subgrafu ri care se pot obtine eu n-1 nocun: Numarul de subgrafu ri care se pot obtine eu n-2 nod uri: Nurnarul de sub grafu ri care se pot obune eu 1 nod " Nurnarul tot al de subgrafuri este : C~ +
l
c::-r + <:::-1+ .
+ e ll
;;
2" _1.
Algoritm i pentru prelucrarea subgrafuriJo r 1. Genera rca tuturor s ubg raf urilo r unui g raf.
Alg or itmui. Se foloseste metoda backtracking . in stiva se genereaza nodurile subgrafului. Deoareee subqraful poate avea p noduri (15p5n), se va apela repetat subprogramul b t () , la fiecare apel generandu -se variantele eu p noduri. Fieeare apel al subprogramului bt () trebuie sa genereze C~ de noduri din gral . La fieeare apel al subprogramului, sotutia se obtine atunci cand In stiva s-au generat cere p noduri ale subgrafulu i. Pentru nodurile generate in stiva se afiseaza muehiile (areele) care exista in graf. Implem entar ea alq orltmulul . Se citesc , din fisierul text gra fl./x/ , matricea de adiacenta a unui graf neori entat, respectiv, din fisierul graf2.txt, matric ea de adiac enta a unui graf oriental. Pentru fieeare subgral general. se afiseaza numarul de noduri ,i muehiile (arcele). in variabila n r se conto rizeaza nurnarul de subqrafuri generate . in functia tip ar () se afise aza subqraful general. Pentru testarea programelor se l olosese gralul neorientat G, si graful orientat G g ff include < f s t r e a m. h >
f s tr e am f{ "g ~a ': =- .t x t " , i o s : : i n ) ; 1/ f s tre a m f( "g:-a f2 . t.x :. " , i o s : :i n j ; pen t r u q r-a f u L o ri .ent .a t t ype def i ;. t s : ~va{lOCJ ; int n. , !=' , ,(,ev ,a s ,3[lOl [10, . r. r .
s:Lva st ; v oid c it e s t e ( ) ( I / s e c it ~ ~ t e ma t r icea de a d i ac enta din f i ~ i e r} v oid .i n.i t I I ( 3 t [ k ] = O;) int 2\1CCe SOr ( ) {if ( s t[ k J
cou t « " S Lb g r afu L "« n r«endl«" Nod u r j J. e:" ; (i=l ;i <=p ;iH') cout.c -cs t l i l c c " or; c ou t « e ndl ; t.c-c v i i I! t t fo r (i= : ; i<=p ; :..,.. _) fo r c o u
M u c h
L
e
:
" ;
fo r ( j = j + l; j < = Pi j + ~ ,
c c u
II
c-c
vA
r
c e
L e
:
"
;
p
f or { j = : ; j < = p ; ~ + ~ ,
e
n
r
u
q
pe ~ ~ ru
r
a
f
u
L
c
r
L c n
t
a
t
gra f ul o rie nt a t
I II form a tid if (a l st [L ] ] cout«endl;}
209 [ s t li ] ]~ ~1 i
c out« s L [i j «" - "« s t [J J« "
" .
void b t ( ) { / / p art e a fix 3 a a I'qo r i t mu Lu i. back tr a cki n g } v o id mai n () t c Lt oa t o t j : for ( p ~ n ; p > ~ 1; p - - 1 btl ); )
2. Verificarea daca un graf G s este sub graf al unui graf G. Algoritmul. Se verifica daca : -7 nurnarul de noduri din graful G s este rna! mic sau cel mult ega l cu nurnarul de noduri din graful G : -7 etiche tele nodu rilor din graful Gs exista printre el ichetele grafului G : -7 intr a nodurile din graful G s exists muchiile dintre nodurile din graful G si numai acelea. Im plemen tarea alg o ritmu l ui. Se citesc , din dou a fisie re te xt glslxt ~i g2s.lxt. inforrnatii despre doua grafuri neo rientate (orientale ): de pe prima Iinie nurnarul de noduri ~i apoi, de pe urrnatoarele randuri, matricea de adiacenta . i n fisie rul g2s txI pe ultim ul rand, du pa matricea de adiacenta, este mem orat un sir de numere care reprezinta etichet ele ncdu filar din acest graf. Matricele de adiace nta ale celo r doua grafur i sunt a l ~i a2 , cu dim ensiun ea n , respectiv m. In vectorul v S8 merno reaza etichet ele nodur ilor celui de aJ doilea graf . Fu n ctia subg ra f () verifica da c a graful G s este subgraf al grafului G. #include <. i. c s t r e am. ~ >
i nt ol, n ,a1[10] [ 1 0 1, a 2 [ 1 0J [101,v[10 ]; f str e am fl( " g l s .txt " , i o s : : i n) ,f2( "q2 s .: xt " , i o s : : i n } i in t s ubq r a f () {i f (m>n ) r e t u r n 0 ; el se { fo r ( i n t i = l; i <=m; lH-) i f (v[ i} >nJ r e t urn 0 ; f o r (i n t i = l ;i <=-:D i i +-l- ) for (i n t j=l;j <=::n ; j ++ ) if (a.2 [ i ] [ j ]! =al[v [ i )) [v[j }] l r eturn 0 ; ) return I ; } void ma in ( ) l i n t i, ji fl »n : fo r ( i = l ; i ~ = n ; i + + ) fo r ( j ~ l; j < ~ n ; j ++ ) fl » al l i J Ij ]; :l . c l o s e () ; f? »rn i fo r (:i =I ; i<=ru ; .1. -! +) f or ( j = l ; j < o;; m; j + + ) £2 »a2[i] [j ] ; fo r ( i =l; i < =nl ; i +T } f 2 » v [ i } ; f2 . c l o s e ( ) ; if ( s u b (j r a f ( ) ) c cu t-cc ve s t c s ubq.ra f " ; e l se cou t o cv r:u e s t e subgr'af " ; )
3. Verif icarea da ca doua matri ce de adiaconta pot reprezenta ma tr icele de ad iacenta ale unu i graf ~i ale unui s ubgra f al aces tu ia. Algor itmu i. Ma tricele de adiacenta ale celor coua grafuri au dimensiunea n , res pectiv p . Se identifica graful care are ordinul mai mare (n) ~ i grad ul cetuilalt graf - p (nz p). Pentru graful cu n nod uri se genereaza toate matrice le de adiacen ta ale subgrafurilor cu p noduri ~i S 8 verifica dac a una dintre ele este identic a cu matricea de adiace nta a celuila lt graf). Generarea tuturor subgra fur ilor cu p noduri S8 face cu m et od a ba cktracking . In stiva S8 vor ge nera nodurile subgraf ului. Impl ementa re a algoritmului. Se citesc din doua fisie re l ext, graf_ls.txt ~ i gra f_2s .txt. inforrnatii despre mat ricele de adiacenta a doua grafuri neo rientate : de pe prima linie,
210
Im plcme n ta rea st r uc t u r ilor de dat e
numarul de noduri, apo i matricea de adiacen ta. Se verifica dac a unul dintre grafuri este subgraf al celuilal!, iar in caz afirmativ, se identifica care este graful ;;i care este subgraful. Matricele de adiacenta ale celor doua grafuri sunt a l si a2. Variabila x S8 foioseste pentru a identifica reialia dintre cele doua grafuri: daca are valo area 0, a doua matrice de adiacenta se asociaza unui posibil subqraf, iar daca are valoarea 1, prima matrice de adiacenta se asocia za unui posibil subgra f. Variabila loqica ga s i t S8 foloseste pentru a determina daca una dintre matricele de adiace nta reprezinta matricea de adiacenta a unui subgraf: are valoarea 0 - False , daca nu este subgraf si valoarea 1 - True daca este subgr af. in matricea b se va construi matricea de adiacenta a unui subqraf format cu nodurile gene rate in stiva. Functia ze ro ( ) se toloseste pentru a initializa cu 0 elementele matricei b - inain te de generar ea fiecarui subqraf. Functia tipa r () S8 toloseste pentru a genera matricea b ~i pentru a a campara cu rnatricea asocrata unui posibil subgraf. Functia furnizeaza un rezultat logic : 1 - true , daca matrice a qenerata ~i matricea asoc iata unui posibtl subgraf sunt egale : altfel , are valoarea a - False . Rezultatul acestei functii este atribuit variabilei gasi t . Subprogramul bt ( ) se executa atat timp cat nu s-a generat 0 matrice de adiacenta egala cu cea asoci ata unui posib il subqra! (gasi t==O) ;;i se mai pot cauta solutii pentru matricea generat;; (k > O). #i nclude in t n ,p ,al[lOj [lO} ,a2DO] [ lO} ,b(2.0] flO] ,v[lO] ,n r , x ,as ,ev , k , ga si': ; fstrea m fl( "grafl_s " t:-~t " , i o s : . Ln ) , f 2 (" g r a f 2 _ s. t x t"/io s : : i n ) ; typedef int stiva[lOO] ; s t Lve s t : v o id zero ()
{for (in t i=l ; i <=p ;i+ +) fo r (int i~ ] ;j<-p ;j ++) v o i d i n i t ( ) ( s t [k ]=O; )
b ii J
iiJ~O ; )
i nt succ e sc r () {if (st [ kJ
<=p ;j~+)
if
(alfstfi]] l s t l j l l e
if
{a2{i]
s
l I b[iJ [jJ=l ;
for ( i = l; i <=p; i ++ ) for l ; - I ; : < = p ; j ~ + )
else (for
(j~
:=b[':'] [j.)
return
a; }
i-. ;i<=p ;i+~)
for j=l ;j<=p ;j++)
if (a2 s t I i
; [st[jJJ==lj brio fi; =l ;
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-+)
': 1»a 1 I i ] [j
J; :"1 " close ()
;
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
( x ) cou t .ccv p r ima matrice de ad j acent a e s t e a sub g r a f ulu i "; else cout« "a doua ma;:rice de a.d i a c e n t a este a subgrafului "; else c out« "nu este subgraf " ; } ------.... ~ 1. Scriet i un program care citeste din fisierul text grafl6.txt matri cea de adiacenta a unui graf orientat - ~ i care gen ereaza taate subgrafurile ca re S8 pot obtine. lnforrnatiile despr e subgrafuri se vor salva in fisie rul text gralsI6. txt. Pentru fiecare subgraf generat se va scrie, pe un rand , text ul Subgraful x are p nocun (unde x este nurnarul de ardi ne al subgrafului generat, iar p numa rul de noduri) ~i pe randut urrnator textul Arcele - urm at de lista de arce a subg rafului general. 2. Scrieti un program care citeste din doua fisiere text , gralls.txt si gral2s.txt inforrnat ii desp re matricele de adiacenta a do ua grafuri orientate (de pe prima Iinie numarul de noduri, apoi matricea de adiace nta) ~i care verifies daca unu l dintre grafuri este subgraf al cel uilalt. in caz afirmativ , se precizea za ca re este grafu l si ca re este subgraful. 3. Scr iet i un program care cite ste din fisierul text grafl6.txt matricea de ad iacenta a unui graf orient at - ~i care genereaza subgraful care S8 obtine prin elimin a rea nodulu i ca re are cei ma i mu lti vec ini.
2.7.6.3. Graful complementar Fie graful G = (X,U) ~ i rnu lt lrnea de muchii (arce) V. Gra!u! Gc = (X,V) se numeste graf complomentar al grafu lui G daca are proprietatea ca doua noduri sunt adiacente in gra ful G c, nu m ai dacii nu sunt ad iace nte in graful G (U " V = 121). Altfel spus , un graf com p leme ntar al qr afului G contine aceleasi noduri ca dar nici 0 muchi e din ac est graf.
~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
8
rl L....(
G, c
~GrafUIcompleme ntar 0
c.,
6
(.;\
4
5
8
Fig. 21
2. Pentru graful orie ntat GlO=(XlO,U lO), definit anterior, graful Gl 0c= (XlO,VlO) , definit astfel: G10c -7 multlm ea nodurilor este X,o={1.2 .3,4.5,6,7,8,9,1OJ. -7 rnu ltirnea arcelor este V,o={[1.3J, [1,5J, (2,4J, [2,8J, [3,2J, [4.2J, [5,2J, [5,6J , [7,1]. [8.2J, [9,31 . [9,10]) este graf comp lementar al qrafului G10- figura 22.
212
Implem entarea s t r net nr ilur de date 5 1
Gratul
G,o Fig . 22 Scrieti un program care citeste din doua flsiere text graCi c.txt si graf_2c.txt inforrnatli despre doua grafuri neorientate - si varian ta orientate - (de pe prima linie. numaru: de noduri, apoi matricea de adiacenta) $i care verifies daca unul dintre graturi este grat complementar al celuilalt graf. (Indlc at ie. Oaca cele doua grafuri au acelasi nurnar de nod uri, S8 determine graful inter sectie, care va trebui sa fie gratul vid).
2.7.6.4. Aplicatii practice 1. Din grupul de n persoane inlre care s-au stabilit relalii de prietenie. afisati, pentru fiecare persoana , persoanele cu care nu este in relatle de priet enie . (lndicatie. Se genereaza gratul cornplementar.) 2. Din grupul de n persoane intre care s-au stabilit relatii de cunostinta, elirnmati strainii de grup ~i singuraticii. (Indicatie. Se genereaza un subgrat al qrafului initial, pnn eliminare a tuturor nodurilor izolat e sau terminale.) 3. La gratul judetelor, construiti un vector in care rnernorati. pentru fiecare judet, un indice pentru provincia istorica din care tace parte (1 - Munterua, 2 - Moldova etc.). Obtineti din graful judetelor , subqrafurile provinciilor istorice. Precizati provincia istorica ce contine cele mai multe judete , ~ i provincia istorica ce coniine cele mai putine judete . 4. Din gratul grotelor. obtineti subgratul grotelor care se gasesc la a Inaltirne h , cu h1$h:'5 h2. Venficati cate dintre aceste grate cornunica direct cu exteriorul rnuntelui. Valorile pentru lnaltirnile h1 si h2 se crtesc de la tastatura. 5. in reteaua de strazi a orasului, doua strazi se inchid pentru a fi reparate . Etichetele intersectiilor care sunt legate de aceste strazi se citesc de la tastatura. Sa se veritice daca, prin inchiderea acestor strazi, traficul auto nu este perturbat, in sensuI ca vor exista intersectii la care nu se mai poate ajunge. (lnd ica tie. Se genereaza gratul partial al traficului, prin elimina rea arcelor dintre nodurile precizate. l?1 se verifica caca exista noduri care au gradul intern egal cu 0.) 6. Se citesc, din doua fisiere text doua matrice de adiacenta a doua grafuri care au acelasi nurnar de noduri . Sa se verifice daca aceste matrice pot reprezenta matricele de adiacenta a relatiei de vecinatate. respectiv a relatiei de prietenie pentru satenii care au tanete. (Indicalie. Se verifica daca gratul cu mai putine rnuchii este grat partial al celuilalt graf).
213
Info rm atica
2.7.7. Concxitatca grafu r ilor 2.7 .7.1. l.antul intr-un graf G= (X,U) se d efineste lan tut ea fiind 0 s ue eesiune de noduri care au proprietatea ca, oricare ar fi dow! noduri succesi ve, ele sunt adia cente. G raf u l neorientat Daca mu ltirnea noduri lor unu i graf neorientat este X={X" nodul i, - L(I, .ikJ - va fi defini t prin rnultimea L(I, .I, )= i l" orice i (1<;i<;k) , ia r muc hiile [1 , ,1,], [12,13] , [1 3 ,14 ] , ... , [1,., ,1,] E
traseu prin care
S8
X2 , 12
, x.}, un lant de la nod ull- la I; . .. . , I, } , unde I,EX pentru U. Lantul poate fi interpretat ca un
parcurg anumite muchii ale grafului, traseul fiind ordinea in care
S8
parcurg aces te muchii: [1, ,12], [1 2,13] , [13 ,14 ] , ... , [l k• k ] . Fiecare pe reche de noduri succesive din "l Ian! reprezin ta pa rcur ge rea une i much ii. Daca exista L( x;,xj) , se spune ca nodul Xj es te
accesibil din nodul
Xi .
Graful orientat Daca multirnea nodurilo r unui gra f orien tat este X={X" X2, x o}. un lant de la nodul 1, la nodu l Ik - L(I, .lk) - va fi definit prin rnultimea L(I"I,) =[I 12, , I; , ... , Ik] , unde I;EX , pent ru " 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
lmplcmcutarca structurilor de date Clasificarea lanturilor - in functie de :
Noduri
I
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
diferite i ntre ele: [1,,1,] ~ [1,.1,1: (I,.I,J ~ [I, .I,J: ...; [1 ,,1,) ~ [I" .IJ; ...: [lk •2 .1 k.,1;t. [1" "'1<] - aceeas! much ie (arc) peate fi parcursa 0 sinqura data .
Neelementare
Compuse
Con tin noduri care se repeta - prin acelasi nod se poate trece de rnai rnurte ori.
in lant se pot re peta u ne le much ii (aree) - aceeasi mu chie (arc) poate fi parcursa de mai multe ori .
~
Exemple: 1. Pentru graful neorientat G 19 : -? l.an tul L , (1,7) definit anterior este un lant neelem entar , deoa rece se repeta nodul cu eticheta 3. Este un lant campus , deoarece in lant se repeta muchia [2 ,3) -? l.antul L, (1,7) = {1, 2, 3, 6, 7} esle un lant elementar deoa rece fiecare nod este parcurs a sinqura data. -7 l.an tul L, ( 1,7) = {1, 6, 3, 2, 6, 7} esle un lant simplu , deoarece nicio muchie nu se repeta, dar este un lant neelementar, deoarece se repeta nodu l cu el ichel a 6. 2. Pentru graful oriental G,o : -? l.antul L , (1,5) definil anlerior esle un lant neelementar, deoarece se repeta nodul cu el ichel a 6. Este un lant campus, deoarece i n lant se repeta arcul [6,7]. -? l.an tul L, ( 1,5) = {1, 2, 3. 7, 6, 5} este un lant elementar, deoarece fiecare nod este parcurs 0 sinqu ra data . -? l.antul L, (1,5) = {1, 2, 4, 5, 2, 3,6, 5} este un lan] sirnplu , deoarece niciun arc nu se repeta, dar este un lant neelementar deoa rece se repeta nodul cu eticheta 2. Teorem a 10 Daca un graf confine un Ian! i nt re doua noduri, x ~i y, atunei contine un Iant elem entar intre nodurile x si y. Dern on strati e Consideram lantul L(x,y)=! x, 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
Dacii un Ian! esl e elemenlar, alunci este ~ i Ian! simplu. oemcnetrat !e - prin recuc ere la absurd. Presupunem ca lantut elementa r este Jan! campus . Daca este lant campus, el treb uie sa parcurqa de dou a on aceeasi muchie (arc), ceea ce ar insemna sa treaca de doua ori prin nodurile adiacente muchiei (arcului). l.antut fiind elementar, nu trece lnsa de doua ori prin acelasi nod.
Algoritmi pentru determinarea lanturilor elementare intr-un graf 1.
Afi ~a rea
lanturilor elementare dinlre doua noduri.
Algorilmu l. Pentru generarea lanturilor elementare intre nodul x ~ i nodul y , se foloseste metoda backtracking . Nodurile lantului elementar vor fi generate in stiva. Primul nod din stiva este nodul x. Conditia ca un nod adauqat in stiva sa taca parte din solutie (sa fie valid) este sa formeze 0 much ie (un arc) cu nodul adauqat anterior in suva ~i sa nu mai existe in stiva (conditia ca lantul sa fie elementar). Solutia se obtine atunci cand nodul adauqat in stiva este nodul y. Imp lementa rea algoritmului. Se citeste din fisierul text graf1 .txt matri cea de adiacenta a unui gral neorientat . respectiv , din fisierul graf2.txt matric ea de adiacenta a unui gral orientat. Se mai citesc de la tastatura doua valori numerice care reprez inta etichetele a do ve nodur i din grar. Se cauta toat e lanturt le elementare care exista tntre cele coua noduri ~ i se afise aza. Oaca nu exists nici un lant elemen tar, se afiseaza un mesaj . Functia c i t es t e () se foloseste pentru a cif matricea de adiacen ta din fisier . Variabila este se foloseste pentru a verifica daca s-a gasit un lant elementar intre cele doua noduri (are valoarea 0 - False, dacii nu s-a gasft un lant elementar). Pentru testarea programelor se lo losesc gralul neorientat G, ~i gralul orientat G, . #i nclud e
r e t ur n I ; } int solutie() { return st[k}==y ; } lise ob~ine solu~ia atunci c and ultimul nod adaugat in stiva e s te y void t.Lpa r ()
{f or (i n t i=l ,este=l ; i<=k ;i ++) cout«s t[ i] « " " ; cout«endl;} void bt () {/ I p a r t e a fi xa a a lg o r i t mu l u i } { k = 2; init () ; wh i l e (:<>1) ( a s =-1 ; ev=O ; while {a s && l e v )
216
Impl em entarea st r uct u r ilur de date {a s =s uc c e s o r ( };
if {a s ) ev=va lid ( ) ; } i f ia s ) i f ( s o l u t i e ()) t i p a r ( ) ; e ls e { k++ i in i t () ; } e l se k - - ; } } v oid ma i n e) ( c i t e s t e ( ); cou c-oc " >;» "; ct rc- >x , c o u t«" y = ". c i n» y ; st[l] =z:; bt () ; i f ( ! est e) cout«" Nu e x Ls t a l an t " ; }
2.
A fi~a rea
tutu ror lanturilor elementare din g rato
Algoritm ul. Pentru generarea tuturor lanturilor elementare din grat, se vor genera lanturile elementare dintre nodul x (t sxs n) ~i nodul y (1$y$n), folosind metoda backtracking . care se va apela pentru fiecare pereche de noduri x 'Ii y (x>,y) . Imp leme nta rea al gori tmului. Se citeste din fisieru l text grafl.txt matricea de adiacenta a unui grat neorientat, respec tiv, din fisierul graf2./xt matricea de adiace nta a unui graf oriental. Se cauta toate lanturile elementa re care exista In graf si se afiseaza. Daca nu exista nici un lant elementar, se afiseaza un mesaj. Pentru testarea programelor se folosesc graful neorientat G, si graful orientat G, . #include < f s t ~ e a m . h >
typedef sLi va[lOOj ; int a[20] [20} , n, k , a s , ev , x , y , e st e =O; s :: ':" v a st ; fstream f( " =J=a:'~ .t xt " , i o s : :in ) ; void c Lt e s ce t ) ( l I l a te l c a l n e x e mpL u I p r e ce d ent; void Lnj t () { f /1<.1 Ee L C 3 in e x e rnp Lu L pr e c edent: } i n t .succe sc r t ) { / / La fe l c e i n e x emp Lu L pre ce d e n t
in t va La d {) { l i l a te l c a i n e xernp lu .l. p r e c edent } i n t s oL u t i.e ( ) { / / La f e L c a in e x e mpl ul p rece d en t } void t i po r ( ) { I l I a fel ca i n e x e mpl u l pre cedent } void bt() { I / pa r t e a fi x 5 a algo r ~ tmu~ u i - c a i n e xempl u l preceden t } void ma in () { c Lt e s r.e t j • fo r :x=l ; x < = ~ ; x~+j for (y=l ; y<= n ;y++) i f ( z !~y) { 3 t [ 1 : = ~; btl) ; } if
3.
(!este) cou t c c vt tu e x t s-;c Lan t ur ;
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.
Algor itm ui. Se verifica daca : ~ sirul de etic hete poate forma un lant (daca fiecare pereche de noduri consecutive din lant este leqata prin much ie. respec tiv arc); ~ lantul este simp lu (se verifies daca muchiile formate cu noduri le din lant nu se repeta). Impl ementarea alg or itmului . Se citesc din fisierul text graf3 .txt lista muchii lor unui graf neorientat. respectiv , din fisierul graf4 .txt lista arcelor unui graf oriental. Se citeste apoi, de la tastatura, un sir de k numere , care reprezinta etichete ale nodurilor din graf. Se verifica daca acest sir de noduri poate reprezenta un lant simplu in graf. $iru l de numere citite de la tastatura se mernoreaza in vectorul v . in vectorul z cu Inreqistrari de tip muchie, se memoreaza muchiile (arcele) pe care Ie formeaza doua noduri succesive din sirul de numere. Pentru a identifica doua muchii (arce) identice, perechile de etichete care torrneaza 0 muchie sunt memorate ordonat. Functia ci t e s t e () se fotoseste pentru a citi intorrnafiile din fisier 'Ii pentru a Ie memora in matricea de adiacenta a grafului , functia La rrt. () se
\n 1'0 rm a tica
217
toloseste pentru a verifica daca sirul de numere poate reprezenla un lant din graf, functia si mp lu () se toloseste pentru a verifica daca lantul este un lant simplu. Pentru testarea programe lor se folosesc graful neorientat G, si graful orientat G, . #includ e
mi.:chie <: [10 J ; i n t < ,n ,m ,a [ 1 0 ) [ 10 ) , v [ 1 0 ]; fst re a m f { "g r a f J. t x L" , ios:: i n ) ; v oid ci t este {/
t i nt i ,x ,y ; f »n»m ; f or {i <; i <9n ; i ++ ) { f» x» y ; a [x ] I y ]~ l; aryl Ix] =l ; ) f . c l o s e ();) i n t lant () { f o r (int i = L i
b.
c.
d.
e. f. g.
1. Scrieti un program care citeste dintr-un fisier text lista much iilor unui graf nearientat (g ra /3. /xI) sau varianta graf orientat (g ra /4.IX/), ~i care: a. Ve rifica daca un ~ir de k numer e citite de la tastatura reprezinta un lant ele me nt ar pentru graf . Cauta toate lanturile elementare cu lungimea d ~ i Ie afiseaza. Valoarea numerics d se citeste de la tastatura. Daca nu exrsta nici un lant elementar cu lungimea d, se afiseaza un mesaj. Cauta toate lanturile elementare . eu lungimea cea mai mica, ce exista intre coua noduri x si y, ~i Ie afiseaz a. Etichetele nodurilor se citesc de la tastatura. Daca nu exista nici un lant elementar , se afiseaza un mesaj.. Cauta toate lantunle elementare intr e doua noduri x si y , care tree printr-un nod z care are gradul minim in graf. Etichetele celor doua noduri se citesc de la tastatura. Daca nu exista nici un lant elementa r. se afiseaza un mesaj. Cauta toate lanturile elementare de lungime maxima ~ i afisea za cate lanturi s-au gasit ~i care sunt ele . Daca nu exista nici un lant elementar , se afiseaza un mesaj. Cauta ~i afiseaza eel mai lung lant elementar care este format din noduri care au etichete cu numere consecutive, ordonate crescator. Cauta si afiseaza eel mai scurt lant elementar care trece prin p noduri si prin q rnuchii (arce) date. Se citesc de la tastatura urmatoarete valori numerice: p - nurnar de noduri, un ~ir de p numere , care reprezinta etichete ale nodurilor din graf t q - numar de muchii ~i un slr de q perechi de numere, care reprezinta muchii (arce) din graf.
2. int r-un fisier text sunt memo rate informatii despre doua grafuri neorientate G' ~i G" : pe primul rand nurnarul de noduri ale celor ooua grafuri (n, ~ i nz), pe urrnatoarele n,
218
lmplcmenturca st r uct ur tlor de dale
rand uri mat ricea de adiacenta a grafu lui G', iar pe urm atoa rele n2 randuri matricea de adiacenta a grafului G " . Scrieti un program care citeste din fisierul text informatiile despre cele cou a grafu ri ~i care determina doua noduri p si q (p din graful G' ~ i q din graful G" ) care - daca se leaga printr-o much ie - asiqura leqatura , printr-un Ian! de lungimea k , i ntre doua noduri precizate x ~i y (x din graful G' ~ i Y din grafu l G" ). Valorile pentru x , y ~ i k se citesc de la tastaura.
2.7.7.2. Ciclul Un Ian! care are toate muchiile distincte doua cate doua extrornitaf care coin cid - se numesto ciclu .
~i
Ciclul este un Ian! simplu ([1, ,1,) '" [1, ,13 ); [1,,1,) '" [13,I, J; ...; [I" I,l " [I,." I,J; ...; [I,." I,.,J " [1,., ,1 ,)), in ca re extremitatile coincid : 1,=lk_ Un graf far a cicluri se nurne sts graf ac iclic . Daca toate nod uriIe unui ciclu sunt distincte doua cate doua , cu excepti a extrernitatilor, ciclul S8 nurnes te cic lu clcme nta r.
Exem pl e: 1. Pentru graful neo rientat G 19 : ~ Lantul L, (1,l ) ={1, 2, 3, 6, 2, 1) nu este un ciclu deoarece in Ian! se repeta muchia [1,2). ~ Lantul L s(1 ,l ) = {1, 2, 6, 3, 7, 6, l)=C, este un ciclu neelementar deoar ece se repeta nodul cu eticheta 6. ~ l.ant ul Lo(l ,l ) = {1, 2, 3, 7, 6, 1)=C 2 este un ciclu eleme ntar deoarece nu se repeta niciun nod .
2. Pentru graful orie ntat G, o: ~
l.antul L4 ( 1,1) ={1, 2, 4, 5, 2, 1} nu este un ciclu deoarece i n lant se repeta arcul [l ,2J . l.an tul L5(1,1) = ( 1, 2, 5, 6, 3, 2, 4, l }=C, este un ciclu neelementar deoarece se repet a nodul cu etic heta 2. ~ t.ant ut L6 (1,1) = {1, 2, 3, 6,5,4 , 1} este un ciclu eleme ntar deoarece nu se repe ta niciun nod. . G~ .. 3. Un circuit elec tric poate fi reprezentat cu ajuto rul unui graf orientat G 21 , i n care nodu rile rete lei sunt nodurile grafu lui, iar sens ul arce lor este dat de sensu I ales pentru curentul electric - figura 25. ~
"
R,
--.
11 I 12
R,
+'• I,
E,
R, R, 2 ~ I,
E,
R,
1
4 :;
l~
4
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
unde q este nurnarul de arce ale ciclului. ......-----. ....-..... Pent ru circu itul electric din figura 25, S8 considera cunoscute urrnatoarele marirni: R" R2, R3. Rs. Rk, I" E, ~i E2. Scrieti un program care sa calculeze - in graful circuitului electric - rnarirnea rezistentei R4. Teorema 12 Daca un g raf coniine un ci clu, atunci contine ~ i un ciclu elementar. Demons t ratie - Ia fel ca derno nstr atte de la Teorerna 11, de la sub capitoul Lant uri.
Doua lantu ri - L 1={ 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
Implementa rea stru cturllor d e d a t e
#in clude < f s t ream .L>
typedef s tiv a [lOO J ; int a[2 0 J [20 ] , 0 , k a s , ev , x , e s t e e O, s t i v a st ; i
fstream f( "g ra f l .txt " , i o s : :i n ) ; ( I I :;; e c i t.c s t c me t .r i cee d e e d a a cent.a d in f.i s i.e rI
void citeste() void .i n i t Cl
{ / / es t e ident i c a c:.:: cea de 1a a f i $area l a n t;:ur i lor elen;e:1tare } int s u c c e s o r ()
{! Ze s t e .i d e n t L o a CD CEa de La c L i se rce Lan t u ..ri L c r e Lemen t a r e } int va Li d () { / / s-s t e Ldent t ca ell cea c e La af t s e re a Lan t ur i.Lo r element are } i nt ~') o l 1J r, i e ( ) {return a [ s t[ k] ] j x ]== l && k>2 ; } lise ob;;:ine solut;:iaatunci canci ultimlJl nodadaugat este ad iacent //nodu lui x ~i in s t i vb cxist~ eel pu~i n troi Docturi void t Lpa r () {f or (i n t i=l , e st e= lii <= k; i ++ ) ccut«s t [i]« " "; cou t« x«endl;} void bti} { / I p a r t e a fix a a e Lqc r i t.mu l ui. v oid main () { c i t e st e.t I :
,
for ( z=1:x<=n ;x++j { s t j Ll e x : bt () ; } i f (Le s t.e j oou t.c-cv Nu e x i.s t.e n.i c i. u ri c .icl.uve L eme ri ua r" i }
1. i n exemp lul prece de nt, sunt afisate lanturi care tormeaza acelasi cicl u (acelas i ciclu este afisat de mai multe ori: deosebirea consta do ar in nodul cu care se i ncepe ~i se i nchei e ciclu l). Modificati programul astfel tnca t sa se elimine afis area inforrnatie i redu ndante (afisarea aceluia si cicl u de mai multe ori ). 2. Scrieti un progra m care cites te din fisier ul te xt graI3 !x! lista muchiilor unui graf 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,
nemon strat!o - la fel ca demonstratia de la Teorema1 1 de la subcapitolul Lanturi.
A l g o r it m i pentru determina rea drumurilor elem cntare intr-un g raf orientat 1. Aftsarea drumuri lor el em entare din grato Algoribnul. Se va folosi algoritmul pentru determinarea tuturor lanturilor elementare din graft la care elementul solutiei generat in stiva, la nivelul k (k>1), va fi considerat valid numai daca trecerea de la nadul de pe nivelul k-l la nodul de pe nivelul k se face, In graf, in sensul arcului. Implementarea algoritmu lui. Se cite ste din fis ierul graf2tx t mat ricea de adiac enta a unui graf orientat. Se ca uta toate drum urile elemen ta re care exista i n graf - si se afiseaz a. Dac a nu exista nic i un drum ele mentar , S8 afiseaza un mes aj . Pentru testarea prog ramului se folos este graful oriental Go-
#inc lude
stiva [~OC] ;
int a l20J [ 2 0 } , n , k , a s , e v , x , e s t e =O; s r j va st : f s t r e a m f( "griJ.r 2 . t x t " , i o s : : i n ) ; vo id c i t.e s t.e.l ) { / I s e c it.e s t e rna t r i cee de c d i ac en t a d i n f La i.e.r }
222
Im plemcnt a r ea str uct u rt lor dc d atc {/ / coenttce ell c ea de 'La atLsaroa Larrt.u.r i.Lo r'< e Lemerrt .ar e ]
void ini.t ()
int s u c c e s o r () {! lea c e e vcte 1a af i se rce Lan t.u .ri.Lo r c Iemcnt ar-e ) int valid ( ) {if i k > l ) if (a[ st[ k - 1J] [ s t [ kJ ]~= O I return 0 ; for {i n t i"'=l ; i
int s o l u t i e ( ) {return st[kl ''''''''"y; } void t i p a r
{)
{for (i n t i = l , e s t e ""=l ; i <= k ; i ++ ) cou t «st[ i]« "
II.
cout« x«endl;}
void bt O { / lpar teo fi xa a a Lq o.r i t rnul ui } void main () {c i teste fi ; f or (x=l; x<=n ;x++J f o r Cy~l ; y < ~ n ; y H I if ( x! ~y l i f { ! es t e I cout«" Nu e xi s ta " ; }
( s t [ l l ~x ;
bt. () ; }
2. Algoritmul Roy -Warshall de determ inare a rnatricei drumurilor. Matricea drumurilor este 0 matrice patrat a binara de dimen siune n (n rep reze ntand ordinul grafulu i), delinita astlel: a[ilDl ~ { 1, daca exista d rum de la nodul i la nodul j 0, daca nu exista drum de la nodul i la nodul j lnforrnatiil e din rn atri ce a drumurilor se pot folosi pentru a verifica daca exi sta drum i ntra doua noduri al e grafului Algoritmul. Daca nu exists un arc de la nodul i la nodul j , con siderarn ca exista d rum de la nodu l i la nodul j , daca exista un nod k (ksel ~i k*j) care are propri etatea ca exi sta un drum de la nodul i la nodul k ~i un drum de la nodul k la nodul j . Matneea ~ 2 drumurilor S8 obtine din matricea de adiacenta prin transformari 3 4 5 sueeesive, astfe l: se gene:eaza toate nodurile k (1;;k;; n), iar pentru fieeare nod k se genereaza toat e perechile de noduri i (Lek) ~, j (jek ) Fig , 26 si se verifica daca a li ] [kJ~l ~i ark] [j]=1. in eaz afirmativ, i n matri cea de adiacenta S8 atribuie valoarea 1 elernentului a [i] [j]. 3 4 5 1 2 G" Pentru graful G" din figu ra 26 matrieea de adiacenta sutera 1 0 1 0 0 0 0 1 0 0 urmatoarele cinei transformari. La fiecare transformare , daca 2 0 1 1 0 1 0 3 dru mu l de la nodul i la nodul j trece prin nodu l intermediar k 0 0 0 0 1 4 (drumu l treee de la nodul i la nodul k si de la nodul k la nodul 0 0 0 1 0 J), atunci el ementului a [i] [j ) i se va atribu i valoarea 1. 5
k=1 1 2
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
5
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
4
0 0
5
1 1 1 0 0
1 1 1 1
1 2
3
1 0 0
4 1 1 1 0 1
5 0 0 0 1 1
-
1 2 3 4
5
-
1
1 1 0 0
2 1 1 1 0 0
-- - -
5 3---- - 1 1 1 0 0
4
1 1 1 1 1
3
1 1 1
1 1 1 0 0
~ - ~-
4
0
k=5
3 1 1
2
-
5 1 1 1 1 1
~ - - _ .
0
4
5
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" .
#i nclude
void cit es te()
{l i se
c i tc~ te
mat r i cea de ad iacent5 din
f i~ ie r }
void t r e ns tc rme () . {for (int k=l; k<= n ; k++} for {int i = l; i <= n; i + + ) for{int j = l ; j<=n;j++ l
i f {a [ i ] [ j]~ ~ O && .il e k && j! ~ k ) a li. ] [ j ] ~ a [i. ] [k] *a[kl [j ] ; ) vo id a f i ae a z a t) {c o ut« " Ex i s t a drum intre perechi lede nodilri " « e nd l ; for (int j.::-""l,- i<=n ;i ·i+) f or (int j =l ; j <"-" n;j++-} i f (a [i. ] [ j ] ~ ~ l && .i ! ~j) cou t;e ;e;" ( " «i.« " , "« j «" ) "«" " ; ) voi d main() { c i.te s t. e t L : t. c a n a r o r ma ri . a f Ls eaz a Ll : } Complexitatea algarilm ului Ray -Warshall Algoritmul de transformare a matricei de adiacenta Tn matricea drumurilor are ordinul de complexitate O(n xnxn)= O(n\ deoarece fiecare stru'ctura repetitiva for se executa de n ori, iar structurile fo r sunt imbricate.
Scrieti un program care citeste , din fisierul text graf4 .txt, lista muchiilar unui graf orientat - ~ i care a. Verifica daca un sir de k numere cit ite de la tas tatura reprezinta un drum elementar pentru graf. b. Cauta to ate drumurile elementare cu lungimea cea mai mica dintre dou a noduri x :;;i y :;;i le afiseaza . Etichetele nodurilor se citesc de la tasta tu ra, Daca nu exista niciun drum elem entar, sa se afiseze un mesaj . c. Cauta toa te drumurile elementare de lungime maxima :;;i afiseaza cate dru muri s-au gasit :;;i car e sunt ele. Daca nu exists niciu n drum ele mentar, sa se afise ze un mesa j.
2.7.7.4. Circu itul lntr-un graf ori entat un drum care are toate arcele distincte doua ca te doua ~i extrernitati care coincid se nurneste c ir cuit. Circuitul este un drum simplu (arcele sunt distincte doua cate doua ([d"d2I t~[d"d 31: [d ,]t[d 3,d4 ] : ... ; [d , ] t [dk_ ki; ...; [dk~"d k~ 11~t[d k~1,dJ) in care extrernitatile caincid (d,~d k). "d "d "d
224
Implement area st r uc t u r ilor de date
Circuitul oternentar este circuitul i n care toate nodu rile sunt distincte doua cate doua, cu exceptia primulu i ~ i a ultimulu i - care coincid. Exe m ple - Pentru gral ul orientat G 20 : -7 Lantul L 1O(1,1) ={1 , 2, 3, 6, 3, 6, 3, 7, 6, 5, 4, 1) nu este un circuit, deoarece arcele [3,6) ~i [6 ,3) au lost parc urse de doua ori. -7 Lantul L,, (1,1) = {1, 2, 3, 6, 3, 7, 6, 5, 2. 4, l}=C, este un circuit neelementar, deoarece se repeta eticheta nodurilor 3 si 6. -7 Lantul L' 2(1,1) = { 1, 2, 3, 7, 6, 5, 4, 1) =C2 este un circuit elementar , deoarece nu se repeta eticheta niciunui nod .
Toorerna 14 Daca u n graf co nt ine un ci rcuit, atunc i contine
~i
un c ir c uit elem en tar.
Demcn st rati e - Ia fel ca dernonstratia de la Teorema11 de la subcapitolul Lanturi.
Algoritm pentru determinarea circuitelor elementare intr-un graf orientat Al goritim ul. Se foloseste acelasi algoritm ca
~i
in cazul determinarii ciclurilor elementare intr-un
graf orienta t, cu deosebirea ca se tine cont de orienta rea arcului care lea qa dou a nod uri.
#i nc l ude ~fs tYe am .~> typedef st i v a [lOO] ; in t a [ 20J (20] , :l, k, a s, e v, x ,e s t e= O; stiva st ; f s tre am f ( "gra::2 . t x t " ios : : in ) ; vo i d c i t e s t e t ) { l i s e c i t e s t;e ma tr Lcea de ad Lac ent.e di n f i.s i e r } void ini t ( ) {! / i de n ti c B cu cca de la a f l.so rce Lantu r j Lo.r c l e ment.e r e l i n t succe so r () { / / Jcenr t ca C'J cea de La af i serca Lant.u r i Lor e Lement a r e } in t VC11id () ( i f l k > l ) i f (a [st [k-l IJ l sr I kl 1~~O I r e tu rn 0 ; fo r ( i n t i =l ;i
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
InI'll rill a t icil
d. Cauta toate circuitele elementare care tree numa i prin noduri ca re au gradul intern ega l cu gradul extern - ~i Ie afisea za. Daca nu exists niciun circuit elementar, se afiseaza un mesaj.
2.7.7 .5. Graful conex Un graf G S8 numeste graf conex daca are propri etatea Ca l pentru ariee pereche de noduri diferite intre ele, exlsta un lant care sa Ie lege.
Altfel spus, un graf este conex daca , pentru orice pereche de noduri {x, 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
0
sinqura cornponenta conoxa (grafuJ insusi).
Exemplu - i n graful neorientat G23 definit anterior, fiecare dintre cele trei rnultimi de noduri, C l , C2 si C3 , induce cate 0 components conexa . Daca un graf este defin it prin multimea nodurilor si rnultirnea muchiilor, -7 rnultirnea nod ur ilor este X23={1,2,3,4,5.6,7,8}. -7 rnul tim ea m uchiilor este U23 ={[1Z], llAJ, [231. [2.4J , [3.41, [~'§l , [~J} . pentru identificarea componentelor conexe, procedati astfel: PAS1. Se formeaz a prima components conexa , pornind de la prima muc hie. Se scriu nodurile incidente cu muchia i n prima cornponenta conexa - C,={l ,2} - ~ i se marche aza rnuchia: [12]. Componenta conexa C l este componenta cure nta.
226
Implementa rea struetllri lor de date
PAS2.
Se parcu rg celelalle rnuchii. Dad; se qaseste a much ie nernarcata, care contine noduri din com ponenta conexa curenta, 58 adauqa nodu rile la cornponenta : C,; {1,2,4,3), se rnarche aza much ia: [11], ~ , !L±], QAj. PAS3 . Daca rna! exista much ii nemarcate , S8 identifica prima muchie nernarcata si S8 formeaza urrnatoarea componenta conexa, scriind nodurile incidente cu muchia - C, ;{5,6} ~i S8 rnarcheaza mu chia: [5•.6.1. Componenta conexa C 2 este componenta curenta. PAS4. Se parcurg celela lte muchii. Daca se gase, te a muchie nernarcata care contine nod uri din componenta conexa curenta, S 8 adauqa noduri le la cornponenta: C,;{5,6,7} si se marcheaza muchia: [w. PAS5 . Se executa Pasul 3 ,i Pasul 4 pana se marcheaza toate muchiile, ldentificand urrnatoarete componente conexe . PAS6. Se verifica daca t0 3 t8 nodurile din rnultirnea nodu rilor 58 reqasesc i ntr-o components conexa. Daca exists noduli care nu apartin unei componente conexe, acestea sunt noduri izolate, , i vor forma, fiecare dintre ele, a compcnenta conexa. C3 ;{8}.
,i
Teorema 15 Numarul minim de muchii
mmin
necesar e pentru c a un cortex este n..... 1 .
g ra f
neo rient at,
eu n
n o du r i . s a f l e
Altfe l spus , intr-un graf neorientat con ex cu m rnuchii 9i n no duri: rnzn -d . Demonstratie. Notarn cele doua prop czitii, astfel: (1) - G raf ul G neorientat, cu n noduri, are n -1 muchii si este conex . (2) - Grafu l G neorientat , cu n nodu ri, este conex ~i minima l cu aco asta proprietate (d aca se Inlatura orice mu chie din graf , el devine neconex). Trebu ie sa oernoostra-n ca (1).:;::>(2) - Se foloses te pnncipiu l inductiei matematice (se note aza cu Pi propozitia i): P1 - Gr aful G1, cu un nod 9i nici 0 muchie (m = 1-1=O), este conex sl este mini mal cu aceasta prop rietate (nu ma i exist a much ii care sa fie elimin ate ) P2 - G rafu l G2, cu doua nodu ri 9i a muchie (m ::2-1=1), es te cone x (muchia nu poate lega cecat ce te doua noduri) 9i este minima l cu aceasta propne tate (prin elimina rea muchiei, noduri le sunt izolate cbtinan du-se coua componente conexe). P3 - Graful G3, cu tre i nod uri si c oua muchii (m=3 -1 =2), este conex (cele d oua muchii sunt Inctdente: unul dintre nod uri este adiacent cu ce \e doua much ii - ;;i prin el va trece lantu l care leag a celelalte doua nod uri) ~ i este min ima l cu aceasta proprietate (prin el imina re a unei muchii, unul dintre noduri este izolat, obtmandu -se doua com ponente conexe ). Pn - Graful G n, cu n noduri ;;i n-1 muchii, este conex ~i min imal cu aceasta pro prietate (se presupune adevarata ). P n+1 - Considerand prcpozitia Pn adevarata . trebuie sa demonstram ca grafu l G n+1 , cu n+1 noduri ~i n+2 muchi i, este conex 9i m inimal cu aceasta propr ietate. Prin adauqarea un ui nod s! a unei mucb li la grafu l G n, se poate obtine un graf con ex . Nod ul adauqat se leaqa cu much ia noua de graful G n (;;i, im plicit, la lanturile din acest graf) , obtinandu-se un nou graf con ex . Presupunem graful obtinut nu este min imal cu aceasta propri etate. Inseamna ca, pr in eliminarea une i much ii, se obtine un graf conex. Daca eliminarn muchia adauqata, se izole aza nodul n+ 1, cbtina ndu-se doua com ponente cone xe . Daca se elirni na a much ie din graful G n, se obtin dOU8 comp onen te conexe, deoare ce graful G n est e m inima l cu aceasta proprietate . Rezulta graful G n este minimal cu aceasta proprietate .
ca
ca
Exemple de grafuri conexe cu n noduri 9i nurna r minim de much ii: ~ Fiecare nod es te legat de aile doua. cu exceptla a doua nod uri term inale Exis ta n-2 noduri cu gradul2 ~i doua noduri cu qr adulf ; 1lI " ,in ::::
2x( n -2 ) +2 x l 2
n- t
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",;"
=
2
~i
n-1 nod uri cu gradul1 .
n -I
Propozitia 4 . Daca un graf cu n noduri are p compo nente conexe , atunci nurnarul minim de muchii care trebuie adauqate , ca sa devina conex, este p-1. Demonstratle Putem considera fiecare cornponenta conexa ca un nod a! unui graf cu p nodun. Numaru! min im de muchii necesare pentru ca acest graf sa fie conex este p-1 .
Propozitia 5 . Daca un graf conex cu n noduri are n-1 muchii, atunci orice pereche de noduri este leqata printr-un lant, ~i nurnai unul. Dem onstratie - prin redu cere la absu rd. Graful G fiind conex , rnsc amna ca exista eel puttn un lant care leaqa cricare dou a nod uri, x ~ i y . Presupunem ca exista eel putin dou a lantur i i ntre ncdurile x ~ i y : L1 ~ i L 2. Insearrme ca . suprimand a much ie din lantul al do ilea. graful rarnane conex , deoa rece nod uriIe x ~i y vor fi legate prin lantul L1. lnsearn na ca un graf cu n noduri s! n-2 muchii este conex , ceea ce cont raz ice Teorema 15. Rez ulta ca cele doua nodu ri, x ~i y , nu sunt legate decaf printr-un singur tent
Propozitia 6. Daca un graf neorientat cu n noduri ~i m rnuchii este conex, nurnarul maxim de much ii care se pot elimina pentru a obtine un graf partial conex este: m -n+1 . Demonstratle. Oeoarece numaru l minim de much ii necesare pentru ca un graf sa fie conex este n-1, atunei din graf se pot elim ina restu l much iilor: m-n+1 .
Teororna 16 Un graf neorientat conox cu n noduri ~i n...:.1 muchll este aciclic ~ i maximal cu aceasta proprietate. Demonstratle: Notam eele coua propozi tii, astte l; (1) - 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
Implcmcnt urcn st r ucru r ilu r d e
:;;i 2)n j = 111
.
;"'1
Nurnarul de muchii care trebuie eliminate din compon enta conexa i, pen tru a obtine un graf part ial cone x aciclic . este egal cu rn, - n: +1 (Propo zina 7). Rezulta numarul total de rnuchii care trebuie eliminate din grat, pentru a obfine gra f partial conex acidic, este egal cu :
ca
I'
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 :
= -,-I,' ',-_- -'.I':.c)_x-,: ( ,' ',-_- -'.1'_+:........:. 1)
m ru3\
2
-
Dernon strati e - prin reducere la absu rd. Numarul maxim de rnuchii corespunde unor p-1 com ponente cone xe forma te din naduri izolate s! a cc mponenta conexa ferma ta cu n-p+1 nod uri. Pentru ca sa se ab!ina nurnarul maxim de rnucttii. ultima componenta trebuie sa fie un graf comp let K n_p care are nurr-arul de much ii m:
+,
(n -p ) x (n -p +l )
III
:::0
"--'-"-7'---'--"-
2
Sa pres upu nem ca exis ta Ins a un graf format din p-2 componente conexe forma te din noduri izolate ~i cu dou a cornponen te conex e C, cu n, noduri ~i muchii ~i C2 CU na noduri ~i 1n2 mu ch Ii, cu n , ~ n 2~ 2, n, + " 2 = n-p+2 care are numarul maxim de muchii m, + m z = m max Cele doua componente conexe pe ntru a avea un numar maxim de muchii trebuie sa fie qrafuri complete: C, =K n1 ~i C2=K n2 Modificam ace st qraf rnutand un nod din companenta C2 i n componenta C, . in com ponenta C, acest nod trebuie unit prin much ii cu cel e n, nod uri ale componentei. Nurnarul de muchii ale componentei C, va fi m, + ", . in componenta C2 prin eurnmarea nodului. se inliHura ~i cere na - 1 rnuchii care iI uneau cu celelate noduri din graf. Numarul de muchii ale componentei C2 va fi m 2- "2 + 1. Numarul tota l de muchii al nou lui gra f este + n, + m 2 - ttz + 1 ~ 1n1 + m2 + 1 = m max+ 1. Concluzia contrazice ipoteza ca gratu l initial avea nurnarul maxim de muchii. lnsearnna ca graful care are nurnarul max im de muchii es te cel care conune p-1 compo nente conexe form ate din noduri izolate s! o cornpcn enta conexa forrnata cu n- p+1 noduri care este graful complet K n_p
In,
In,
+'.
2.7.7.6. Graful tare conex Un gra! orientat G se nurneste gra! tare conex daca are proprietatea ca, pentru ori ce perech e de noduri diferite i nt re ele, exi sta un drum care sa le leg e. Aille l spus , un gra! orientat este tare conex caca - pentru orice pereehe de noduri { Xi, Xj} , ca re au proprietatea x /*Xj - exista un drum de la Xi la Xj.
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.
Graful orientat G' 4= (X' 4, U 24) - figura 28 - definit astfel: -7 multimea nodurilor este X' 4=(1,2,3,4,5,6). -7 rnultlmea arce lor este U'4 =([ 1,2], [1,41, [2,31 , [3, 1], [4,5], [5,4]). nu este conex, deoarece nu exista niei un drum lntre un nod din multirnea C, =(4,5} ~ i un nod din rnultimea C,=(1,2 ,3}, sau din rnultirne a C,=(6}. Daca un graf orie ntat G=(X,U) nu este tare conex , se poate defi ni un subqraf tare conex al grafului G, adica se poate defini a rnultirne X'eX care sa induca subgrafu l G'=(X',U'), ce are proprietatea ca este tare con ex .
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
Im p lcrncn ta rca stru ct ur ilor dc date
sorilor nodul ui si apoi urmatoarea cornponenta conexa . prin intersectia celor doua rnultirni (in exempl u, nodul 4 ~i S2={4,5), P2={1 ,2,3 A, 5} ~i C2= S2" P2 ={4,5)). Se repeta acest pas pana cane nu S8 mai identifica in rnultirnea arcelor niciun nod care sa nu apartina unei componente tare conexe. PAS5 . Se verifica daca toate nodurile din rnultimea noduri lor se reqasesc intr-o components tare consxa. Daca exista noduri care nu apartin unei componente tare canexe, acestea sunt noduri izolate - si vor forma , fieca re dintre ete 0 com pone nts conexa. C,={6}. Graful componentelor lare conexe ale unui graf care nu esle l are c onex G=(X ,U) 58 obtine prin reducer ea fiecarei co m ponente conexe la u n no d. Identificarea grafului componentelor tare canexe este utila in rezolvarea uno r prob leme, prin descompunerea problemei in subprobleme (rezolva rea problernei pentru fiecare componenta tare conexa) ~i combinarea solutiilor - strategia di vide et im pera.
Exe mplu: T'C,c ~ .", in graful oriental G25= (X25,U'5) - figura 29 - definit astlel : ~ mult imea no durilor este X 25={ 1 ,2,3A ,5,6,7}. ~ multi m ea arce lo r este U' 5 ={[1.2], [1 A], [2,3], [3,11, [4,5], [5,61, [6A ], [7,5J, [7,3]} 1i':';\ Gc" componentele tare conexe sunt C , ={1,2,3), C,={4 ,5,6} ~i C,={?}, .'. iar graful componentelor tare conexe Ge2S = (Xe2S ,Ue2S) - figura 30 - este definit astfel. ~ mu lt irnea nodurilor este Xc 25={ C C" C,} . ~ rnultirnea arc elor este Uc25 ={[ c, " C2], [C " C , I, [C " C z]}.
Algorilmi pentru delerminarea conexitatii grafurilor
, C3 Fig . 29
Fi g. 30
1. Deter min area c ompone nte lor co nexe in t r-un graf. Alg o ritmul. 0 components conexa este fermata din toate nodurile intre care exista un lant elemen tar. Deoarece un nod nu poate sa apartina decat unei componente conexe, se va folosi un vector cu n elemente - pentru a memora nodurile care au fast deja inregistrate intr-o componenta conexa . Initial, elementele vectoru lui au valoarea 0 (nici un nod nu a fost i nregistrat intr -o cornponenta conexa), iar daca un nod x va fi adauqat la 0 components conexa, valoarea elementului x din vector va fi 1. Pentru a verifica dac a exista un lant elementar intre dow! noduri x si y se folosese metoda backtracking. Observ ati e, Acest algoritm poate fi folosit atat in grafurile neorientate, cat si in grafurile orientate. Mai poate fi folosit ~i pentru a verifica daca un graf este conex: fie se verifica daca intre nodul 1 si fiecare dintre celelalte noduri ale grafului exista un lant elementar , fie se verifica daca prima components conexa obtinuta contine toate nodu rile grafului. Im pl em enlarea algoril m ul ui. Se citeste din fisierul graf19 .txt matricea de adiacenta a unui graf neorientat (varian ta din fisierul graf20.txt - rnatricea de adiacenta a unui graf orientat) ~i se aflseaza componentele conexe. In vectorul v se mernoreaza nod urile care au fost deja inregistrate tntr-o cornponenta conexa. Variabila este se foloseste pentru a verifica daca s-a gasit un lant elementar intre coua noduri (are valoarea a - False, daca nu s-a gasit un lant elementar). Varia bila rn se foloseste pentru a nurnara componentele conexe identificate. Functia ci te ste () se foloseste pentru a citi matricea de adiacenta din fisier. Functia cornponen t e ( ) se foloseste pentru a afisa componentele conexe ale grafului: pentru fiecare
Informatica
231
nod x (1:5""n) care nu a fast afisat intr-o cornponenta conexa (v I x l =0), se cauta toate nodurile y (1:5y:5n si y*x ) care sunt legate cu un lant elementar de nodul x . Pentru un nod y gasit, se rnarcheaza in vectorul v faptul ca a fast adauqat la a components conexa (v [yJ ~ 1 ) . Pentru testarea programului se folosesc graful neorientat G, ~ i graful neorientat G22. #include < fs t r e a m.h > t ype d e f st iva[lOOJ ; in t a[20] [20] ,n,k ,as ,ev , x , y ,v[20) ,este=O ; stiva st ; f stream f ( "gr8a£19 . 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 "
n ,
fo r ( y ~ l; y < = n ; Y + - 1
if (x!=y l (este =O; bt l ); if {e s t e )
{ v [ y } ""l; cout-ccy-;c"
" ;}}
cout«endl ;}} void main() t c Lce s t e t j • componente () ;}
2. Detenninarea co m po ne nte lor c onexe i ntr-un gr af oriental. Alg oritmui. 0 components conexa este fermata din toate nodurile intre care exista un drum, eel putin de la un nod la altul (drumul nu trebuie sa asigure leqatura in ambele sensuri). Altlel spus, daca exista un drum de la un nod x la un nod y , cele doua noduri x ~ i y apartin aceleiasi componente conexe - chiar daca nu exista si un drum de la nodul y la nodul x . $1 in acest algoritm se foloseste un vector cu n elemente pentru a memora nodurile care au fast deja ln reqistrate intr-o cornponenta conexa . Pentru a verifica dac a exists un drum de la nod ut x la nod ul y se tolososte mat ricea drurnurilor. Pentru graful G 22 din Figura 26, in matricea drumurilor se observe ca exists drum de la nodul 1 la oricare celelalte patru noduri din grar. Graful are a sinqura cornponenta conexa .
. .
.
,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
Implcmcntareu st r uct ur ilur d e date
(v [ i ] =O), se cauta toate nodunle j (1Sj'; n ~i io'i) la care ajunge un drum ce porneste din nodul i . Pentru un nod j gasit, se rnarcheaza in vectorul v faptul ca a fast adauqat la a cornponenta conexa (v [j ] =1). Pentru testarea programului se foloseste graful orientat G" .
#include
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
III form a tid #inc lude
v oid c i t e ste() {l i s e c i te ~t e mat r i c e a d e adiac en ;a di n f i s i e r } void i ni t() {/ I :"de n t i c a ell cea d e la afi~a :-e a drumur i l o r elementa re } int succ e s o r() {/ I i den t i ca cc cea de 1a afi 9 a ~e a d rumurilor elementa re } in t va l i .d () { / / Ident i.ca eil c e a de la af i s e ree d rumurilor e Lemen t e r e I int ao Lu t i.e L)
{re t urn s t[k] ===OY i }
lI se ob t i n e solutia atune i cand ultimul nod adaugat in stiva este y vo i d
t
Lpe r ()
{e s t e = 1;)
s olu~ ie (u n d ~um intre nodurile x $i y j , // va r i a bi l a este va avea val oarea 1 void bt ( ) { / i i d c n t i c 5 ell cea de La af i s ar-ee d r umu r i.Lo r e Lemen t e r c } void coxponen t e () l i n t i ,j , m=O i
// d a c3 ex ista
fo r ( i = li i <= n; i + + )
if
( v[ iJ ~~O)
{m+ + ; v [ i ] = l ; cou t c c vCc mp o neri t a co ne x e for ( j = l ; j <= n ; j t + ) i f (j ! ;;o: i ) {z = i; y = j ; s t l l l e x • cstc;;o:O ; b tl) ; x = j; y .... i : s t j l j ex : es te=O ; bt (} ; if (estel & & E: 3 ': e 2 ) {v[j ]=l; cou t cou t « e n d l ; } }
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
1
2 3 4
5
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
Matricea de adla ce nta G22t
1 2 3 4
5
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
5
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
drumu ril or G22t 2 3 4 5
1 1 1 1 1
1 1 1 1 1
0 0 0 1 1
0 0 0 1 1
Matri cea intersec tie
1 2 3 4
5
1 1
e-!1 0 0
.
~ Fig. 31
Matricea d rum u ri lo r G22
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
Implem enta re a structurilor de d a te
Interpretarea datelor din mat ricea intersectie se tace astfel: doua noduri i ~i j fac parte din aceeasi cornponenta tare conexa - daca exista drum de la nodul i la nodul j (a [i] [j] ~ 1) . Pe matricea intersectie se pot identifica cele doua componente conexe : C1={l, 2,3} ~ i C2={4 ,5}. Im pl ementarea algoritmului . Se citeste din fisierul graf20.txt matr icea de adiacenta a a unui graf orientat. Se foloseste matricea ap in care S8 rnernoreaza arcele i n sens invers si matricea drumurilor obtinuta din aceasta. Pentru a identifica nodurHe i si j intre care exista un drum atat de la nodul i la nodul j , cat ~i de la nodul j la nodul i , se obtine matricea b care este intersectia celor doua matrice ale drumurilor: a ~i ap. Functia ci teste ( ) S8 foloseste pentru a citi matricea de adiacenta din fisier. Functia transforma_ s ( ) S8 foloseste pentru a transforma matricea de adiacenta a in matricea drumurilor, iar functia transforma_p () pentru a transforma matricea de adiacenta ap in matricea drumur ilor. Functia intersectie () se foloseste pentru a obtine intersectia celor coua matrice ale drumurilor. Functia compone nte () se foloseste pentru a afisa camponen tele canexe ale grafului: pentru fiecare nod i (15i5n) care nu a fast afisat Intr-o components conexa (v [i] =0 ), se cauta in matricea intersectie a drumurilor b toate nodurile j (lSjSn ~ i jo'i) la care ajunge un drum ce porneste din nodul i. Pentru un nod j gasit, se marcheaza in vectorul v faptul ca a fast adauqat la a cornponenta tare conexa (v (j] ~1 ) . Pentru testa rea programului se toloseste grafu l orienta t G". #include
a
di n .f .i e .i.er l
void predecBso r() {for (int i = l ;i<~n ;i++) for l i n t j=l ;j<=D ;joHl april [j )=a[ j] I i ] ; } vo.i.d vtr arre f'o rrne s.I ) j
{for (int k=l ; k<=n ;k++) for {int i =1 ; i<=r: ;i++) for (int j~l ; j<=n ;j++} if( a l i ] [j ]==O && i! = k && j! =k) al i ] v oid
I j ) ~a [ i ]
l le]* a [ k ] [j ] ; ]
t ran s fo ~ma ~ ( )
(for (int k= l ; k<=n ; k++ l for (int i=l ; i <=n ; i+ + ) for (int j=l ;j<=n ;jl- +I if (a p l i ] Ij]~~O & & .i l e k && j != k ) apri l [ J ) =a p [ i ] [ k ] * a p [ k] [ j] ; ) vo id i n t e r s e c t i e ( ) {for {int i = l; i <=Jl; .L++ } for l i n t j ~l ; j<~n ;j oH) b l i ] [j ] = as [i ] [j] *apli ] [j] ; )
void cornp'onerrt e () {for (int i = l ; i<= n ; i+ +) if
(v[i] ~=O)
( n r + +; v[i ] =l ; cout« endl«" Comp oo E: n t a "« n r«" : "« i.« " for t i n t j=l ;j<=n ; j+ ·I:) if (bli ]
[j ]~ ~l
&&
i != j l
{coutx-c j c-c'' ";
v[j] ~ l; ) } )
void main () {c i t e ste ( ); predecesor{) ; t r a n s f o r m a ~ s i n t e Ls e c t i e ( ) ; componente() ; }
( ) ;
t r a n s f o rm a ~p ( ) ;
Infonnaticii
235
1. Scrieti un program care citeste din fisieru l text graf3.!x! (graf4.txt) lista muchi ilor (arcelor) unui gral neorientat (orientat) - si care ve rifica daca graful este conex ~i afiseaza un mesaj de informare . 2. Scrieti un program care citeste din fisierul text graf14.!x! lista de adiacenta a unui graf orientat - ~i care verifica daca grafu! este tare conex si afiseaza un mesa j de informare. 3. Cornparati, din pu nct de vedere al eflcientei , cei doi algoritmi de determinare a componentelor tare con exe dintr-un gral oriental. 4. Scrieti un program care citeste din fisierul text graf2.!xt mat ricea de adiacenta a unui graf orientat - -?i ca re determine graful componentelor tare conexe !?i nurnarul minim de arce care trebuie adauqate pentru ca gralu l sa devina tare can ex. Solutiile pentru arcele care trebu ie adauqate S8 vor salva in fisierul text graf_comp.txt. lndi cati e: CeJe p componente tare conexe vor f nodur i in noul graf - !?i vor fi reprezentate printr-un vector eu p elemente de tip inregistrare : struct camp {int n ; int v flO ] ; } ; camp cIlO] ; iar arcele vor fi reprezenate prin matrice de adiacenta . a cornponenta conexa , c [i] are c [i] . n noduri ; un nod j al componentei i fiind c [i] . v [ j ] .
2.7.7 .7. Aplicatii practice 1. Din grupul de n persoane intre care s-au stabilit relatii de prietenie sl de vecinatate, determinati grupurile de prieteni , grupurile de vecini si grupurile de vecin i prieteni, (In dicat ie. Se deterrruna componentele conexe pentru fiecare gral.) 2. Folosind informatiile din graful judete lor deterrninati nurnarul minim, respect iv numarul maxim, de judete prin care trebuie sa treaca un turist care tranziteaza prin Roman ia, stiind ca vine din Ungaria si trebuie sa ajunqa in Bulgaria. (Ind ica t ie. Se deterrnina un lant de lungime minima , respectiv maxima , Tntre doua judete limitrafe , care sunt la granila cu cele doua lari.) 3. Din gralul grotelor stabilif grotele care vor fi inundate de un parau subteran care izvoraste dintr-o grata a carei eticheta se citeste de la tastatura. Precizati tunelul (sau tunelurile) prin care paraul va ajunge In exteriorul muntelui. (Ind icatie. 0 grata este inundata daca se qaseste la acelasi nivel sau la un nivel mai jos decat 0 grata in care exists apa Se transforms graful neorientat intr-un graf orientat, in care arcele vor pune in evidenta relatia: grata x este in relatie cu grata y daca apa curge de la grata x la grata y. In acest graf determinati toate drumurile care pornesc din grata din care izvoraste paraul). 4. i n reteaua de strazi a orasului, patru strazi se inchid pentru a fi reparate. Etichetele intersectiilor care sunt legate de aceste strazi se citesc de la tastatura . Sa se verifice daca prin i nchiderea acestor strazi nu se izoleaza unele zone ale orasuiui de alte zone . (lndlcat ie. Se gene reaza graful partial al traficului , prin eliminarea arce lor dintre nodurile precizate ~ i se verifica daca graful obtinut este tare conex .)
2.7.8 . Parcurgcrca grufului Parcurgerea grafului reprezinta operatia prin care sunt exam inate in mod sistemat ic nodurile sale , pornind de la un nod dat i , astl el lncat lieca re nod accesibi l din nodul i pe muchiile (arcele) adiacen te sa fie atins 0 sinqura data . Vecinii unui nod sunt repreze ntati de toate nodurile adiacente lui si accesibile d in el.
236
I m plcrn c nta rca stru cturllor d e date
Vizitarea sau traversarea unui graf este operatia prin care S8 parc urge graful trecandu -se de la un nod i (nodu l curent) la nod uriIe vecine lui, intr-o anurnita ardine , in vederea prel ucrarii inforrna tiilor asocia te nodurilor. Pentru parcurgerea grafurilor , exista urrnatoarele doua metode : 1, Metoda d e p arc u rge re "i n latirne" - Breadth First (BF ). Se viziteaza mai Intai un nod initial i, apoi vecinii acestuia . apo i vecinii nevizitati ai acestora, 9i asa mai departe pana cano se parcurg toate nodurile grafu lui. 2. Meto d a de parcu rg er e "in adancime" - Depth First (OF ). Se viziteaza mai Intai un nod initial i , dupa care se parcurge primul dintre vecinii sai nevizltati, de exemplu j, dupa care se trece la primul vecin nevizitat al lul j , ~i asa mai departe - pana cand se parcurge Tn adancime ramura respectiva. Cand s-a ajuns la capatul ei, S8 revine la nodul din care s-a plecat ultima data, ~i S8 parcurge urrnatorul sau vecin neviz itat.
' G" Ex em pl u - pentru graful neorientat G" = (X'6,U'6) - figura 32 - definit astlel: -7 mu lt irne a noduril or este X26={1 ,2,3,4,5 ,6,7,8,9j. -7 rnu ltirnea rn uchiilo r este U26={[1,2], [1,3], [1,4], [2,5], [3 ,5], [3 ,6], [3,7], [4 ,7], [5,8] , [6,8J, [6,9]} Graful G' 6 poate fi parcurs astfe l, pornind din nodul 1: 1. In cazul metodei de parcurgere SF - "in la\ime", vor fi parcurse pe rand nodurile:
Fi g. 32
1,2, 3, 4,5 , 6, 7,8 ,9 2. I n cazul metodei de parcurgere OF - "in adancirne", vor fi parcurse pe rand nodu rile:
1, 2, 5, 3, 6, 8, 9, 7, 4
2,7,8.1. Parcurgerea in latlme - Breadth First Pentru aceasta metoda de parcurgere a unui graf cu n noduri, S8 folosesc urrnatoarele structuri de date si date elementare : 1. Vari abil ele d e mem ori e: n pentru nurnarul de noduri ale grafulu i, k pentru nodul care 58 prelucreaza . i si j pentru parcurgerea matricei de adiacenta si a vectorilor. 2. Matri cea de ad la ca nta a g raf u l ui a. 3. Vect orul de v iz itare vi z i ta t . EI contine n elemen te in car e S 8 i nreqistreaza nodurile vizita te . Elementele vectorului vizi ta t [i] sunt definite astfel:
. it a t "1 { 1, da ca no dul i a fast v izita t I =
\'I ZI
0, daca nodul i nu a fo st v izitat
inca
4. Coada de asteptare c a noduril or parcurse. Coada de asteptare c gestioneaza nodurile prelucrate. Pentru coada de asteptare se foioseste implementarea statica cu un vector c cu n elemente. Pentru gestionarea cozii de asteptare S8 folosesc dou a variabile de memorie p rim si ul tim care joaca rolul de indicatori pentru a memora adresa primului element din lista (capul cozii) ~i , respectiv , adresa ultirnului eleme nt din lista (coada cozii). in aceasta coada de asteptare vor fi inregistrate nodurile vizitate, in ordinea i n care au fast vizitate. Initial, caada de asteptare contine un singur element care corespunde nodului cu care lncepe parcurgerea qrafulul, iar valoarea indicatorilor p rim ;;i ul t im este 1. Pe rnasura ce se parcurge graful , se cornpleteaza urmatoare.e elemente ale vecto rului c . Atunci cand se prelucreaza un nod k de la capul cozii de asteptare, prin coada cozii de asteptare se introduc toate nodurile i vecine cu nodul k care nu au fast vizitate Inca . Al g oritmul pentru parcurgerea gra fului este urrnatorul: PAS1 . Se citesc din fisier , valoarea pentru variabila n ~i matrice a de adiacenta a grafului.
237
In f orma tiea
PAS2 . Se initiatizeaza cu 0 elemente le vectoru lui de vizitare vizi ta t , deoarece initi al nici un ul din tre nod uri nu a fa st vizitat. PAS3. Se int roduce de la ta statura valoarea variabilei de memorie k . corespunzatoare primu lui nod eu care incepe parcurgerea grafului. PAS4 . Se lnitia lizeaza coada de astept are c (indicatorii ~i continutul primului elemen t intradus i n coad a de asteptars), astfel: p r Ime-L, u l t im ~l l}i c [prim] «-k, deoarece, in coada de asteptare c este i nregistrat doar nodul k cu care incepe parcurgerea. PASS. Se actualizeaza vect orul v i zi ta t - atribuind elementului k al vectorului valoar ea 1, deoa rece a fost vizitat (v i z i tat [k] <-1 ). PAS6. Cal li m p coada nu este vida (p r im<=u 1 tim) executa PAS7. Se extrage urrnatorul element din coada de asteptare , corespunzator nodu lui caru ia i S8 vor vizita vecin ii (k e-.c [pr J.m] ;) . PASS . Pentru toa te nodurile i vecine ale varfu lui k , nev izitate inca , executa PAS9. Se incrementeaza valoarea indicatorului u l t i m, pentru a inreg istra urrna torul nod care va tre bui vizitat prin adauqare la coada cazii de astepta re [u L t irnt-ul ti m+ 1 ; ). PAS10 Se acauq a la sfarsitu l coz ii de aste ptare c , nodu l i vecin nodu lui k care nu a fast inca vizita t (c [u l tim ] ~ i ;) . PAS11 P rin adauqarea nodului j la coad a de asteptare c se considers ca ace st nod a fost vizitat - !?i se actualizeaz a elementul din vectorul de vizitare care corespunde acestui nod (v i z i ta t [i] <- 1 ; ). Se revine la Pasul 6. PAS12S e pre qateste indicatorul pri m pentru a se extrage urrnato rul nod din coada de aste ptare , ai carui vec ini vor fi vizitati (p r-L me-pr-L m- t r ). Se revine la Pa sul 7. PAS13 S e afisea za lista nodurilor vizitate, i n ordinea in care au fost vizitate , prin extragerea lor din vec torul c , porni nd de la elementul 1 ~ i pana la elem entul n . Pentru graful G 26 • pornind din nodul 1. nodu rile in coada de v iz ita t
0 2
1
1
0 3
0 4
0 6
0
5
a~t e p tare
0 7
sunt adauqate astfel:
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
3
1 C
v iz itat
I
I
I
•
!
'
!
!
I
U
I
U
!
U
I
U
I
10 C
vi zi t a t
I
I
I
'
!
!
!
_
!
...
I
...
I
10 C
pri m= 3
e> ul t i rn= 7 .
238
Implemen tarea st ru ct uri lur lie date
c
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
c
prim= 9 :..:::- u l tim=9.
10 prirn-1 0 ::::::) ul tim-9 . Tcnninarc : pr irn> ul tim
Pentrn imp lementarea algoritmului se lo loses c subprog ramele : -7 functia pro cedural a ci teste creeaza matri cea de ad iacenta , prin preluarea inferrnatiilor din fisierul f (dimensiunea matricei de adiacenta l? i matricea); -7 functia procedurala ini t init ializeaza coada de astepta re cu primul nod vizitat ; -7 functia operand este_vida te ste aza coada de astepta re daca este vida; -7 lunclia procedurala adauga adau qa un nod la coada de astepare : -7 funct ia proce durala e l i mi n a elimina nodul prelucrat din coada de asteptare: -7 functia procedurala prelucrare prelucreaza primul nod din coada : adauqa la coada de asteptare tal i vecinii nevizitati ai acestu i nod ~i apoi iI etimina din coada de asteptare: -7 functia procedura la afisare afiseaza nodur ile grafului i n ordinea pre lucr arii.
Pentru testarea programului, S8 tolose ste grafu l neo rientat G26, a carui matrice de adia centa se citeste din fisieru l text graf21 .txt.
int n , a [10] [10] , v i z i t a t [20) , c [20] , p r i m, u Lt Irn , 1: , fst ream f{ "graf21 .t: xt " , i o s : :in ) ; void citeste() { l i s e c i t.e s t.e ma t r i.cea de ad i e ce n t.a din f Ls Le r } void init( i n t k) { p r j mcu Lt.Lmc l , c l u Lr Lm l e k : v i z i t a t l k l e- Lr I
239
I II for ma tid i n t est e v i d a ( ) {retur n ul t im
"; c in» k;
i n i t ( k) ;
while ( ! e s t e vida()) p r e l u crare{) ; c o u t «" Nod u r i l e v i z i t a t e pr In metoda BF sunt : "«endl ; ~ ~ /\ tcnric ~ ~
.
a f i s a r e() ; }
Prin pa rcu rg erea in lati rne a unui graf , determl nati lanturil e, resp ectiv d ru m urile de lungim e minima.
Cornplcxitatca algoritmului de parcurgcre in latirne
Algo ritmul const a in eliminarea unui nod din coada de asteptare "i adauqarea vecin ilor (succeso rilor) sai in coa da de asteptare. Fiecare nod va fi adauqat i n coada de asteptare o data si, prin urmare, va f eliminat din coada de astepare 0 sinqur a data. Comp lexitatea operati ilor de eliminare a celor n noduri din coada de astept are este O(n). Pentru a adauqa noduri la coada de asteptare, sunt exarninati vecinii (succesorii) nodului curent. Vecinii (succesorii) unui nod sunt exarninati 0 sinqura data , atunci cane nodu l este eliminat din coada de asteptare. Nurnarul total de vecini exarnina ti este egal cu m nurnaru l de much ii (arce) ale gra!ului. Complexitatea operatiitor de adauqa re de noduri este O(m). Comp lexitatea algoritmului este liniara O(m+ n). Determinarea drumurilor de lungime minima, intre oricare doua noduri din gra!, cu ajutorul algoritmului de parcurqero in latime Al goritmui. Pentru a gasi drumurile de lunqime minima care pornesc din fiecare nod, se va parcurge gra!ul in latirne de n ori (parcurgerea se va face pornind din fiecare dintre cele n noduri ale gra!ului). Pentru a putea reconstitui drumul, se foloseste un vecto r (p) - pentru a memo ra predecesorul unui nod in parcurgerea in la\ime: lrnplementaroa algoritm ului. Se citeste, din fisierul graf21 ./x/, matricea de adiacenta a a gra!ului neorientat G' 6. Se afiseaza drumurile de lungime minima dintre noduri. Se !oloseste variabila globala x , pentru nodul din care porrneste drumul, si implicit, parcurgerea in latirne a gra!ului. Functia ze ro () se toloseste pentru a initiaiza cu valoarea 0 vectorii v i zi tat si p ina inte de a incepe 0 noua parcurgere a grafului, pornind din nodul x . Functia adaug () a fost modificata prin adauqarea instructiunii de actualizare a vectorului p la adauqarea unui nod in coada de asteptare (in elementul corespunz ator nodului vizitat i S8 mernoreaza predeces orul sau in parcurgerea in latime - nodul k ). Functia a fiseaza () S8 foloseste pentru a afisa drumurile de lungime minima de la nodul x pana la fiecare dintre celelalte noduri ale gra!ului. in aceasta functie se Iolosesc urmatoare le variabile locale: i pentru a parcurge coada de asteptare "i vectorul d : j - pentru a parcurge nodurile gra!ului (aceste noduri sunt nodurile destinatie ale drumurilor care pornesc din nodul x ): d - un vector in care se rnernoreaza nodurile drurnului (nodurile sunt inre gistrate in ordine inversa:
240
Im plcm enta rca structurilor de datc
de la predecesorul nodului j pana la nodul x); y - pentru predeceso rul unui nod si este a variabila de tip logic , pentru a verifica daca exista drum de la nodul x la nodul j. Vectorul p nod 1 2 3 4 5 6 7 8 9
p
[ O ~~
#include < f s t~ eam . h> typedef sLi va[l OO] ; in t a [ 10j [ 1 OJ vi z i .t.a t. [10 J,c [1 OJ, P l l OJ I n , p rim , u l tim , k I x ; f
f s tr e a rn f {"graf 21 . t xt " , i o s : : i n) ; voi d c Lt e s t e t ) { l i s e c i t e s t;e matriceade ad Lac.ent a din f i$ ier ) void z e r o() {for (i n t i=l ; i<=n;i++) {v i z i t e t Li.L e O', p[il = D; }} void i n :if(i n t k ) { p r i m = u l: t 'L m ~ l ; e [;Jl t i rn] .:= k ; '.Ii z i t a t lkl = l ; p [k ]= O; } int es t e j v i de () {return u L t i.mcp.r Lm r } void a d aug( i n t i , int }c) {u l t i rn+ +; c lu l t im j-e i , v i zi t .at Li l e l. : p[iJ .=k ; } vo i d p r e l u c r a r e ( ) {i n t i ; kvcLp r jm l • (i;;;ol ;i<= D i i + -l ) i f j && i lt t ls.e L i kr , f o r
L
a
k
]
[
1
]
=
=
1
v
z
a
L
i
O
)
a
d
a u q
l
prim++ ; } void a r i s a re ( )
li nt i ,j , e st e , y ,d[lO ) ; cou t-c-c't Drumu.I minim car e po rn e s t e d .i n 'no d u I " « x« " : "
"
2.7.8 .2. Parcurgerea in adancirne - Depth Firs t Pentru aceasta metod a de parcurgere a unu i graf cu n nodur i se folosesc urrnato arele structuri de date ~ i date elementare : 1. Var iabilele de m em orie. n pentru nurnarul de noduri ale grafu lui, k pent ru nodu l care se pretucreaza , i ~ i j pentru parcurgerea matricei de adiacenta si a vecto rilor . 2. Matri cea de adl acenta a gr afului a. 3 . Vecto rul de viz itar e v izi tat. EI contine n elemente i n care S8 tnreqist reaza nod uriIe vizitate . Elementele vectorului vizi tat [i ] sunt definite ca ~i in metoda pre ceden ta de parcurgere. 4. Stiva st a nodurilor par curse . Stiva st gest ioneaza nodurile vecine parcurse in adaricime. Pentru gestionarea stivei se Ioloseste variabila de memo rie vf pentru a identifica ultimu l nod intrat in stiva. Pentru stiva se folo sest e impl emen tarea static a cu
Inform aticii
241
un vector st CU n elemente . in stiva vor fi Inreqistrate , In ordine, nod uriIe vizitate in adancirne , pe 0 directie Initial, stiva contine un singur element care corespunde nodului cu care incepe parcurgerea grafulu i, iar valoarea variabilei vf este 1. Pe rnasura ce S8 parcurge graful , S8 completeaz8 urrnatoa rele elemente ale vectorului 5 t . Atunci cand S8 prelucreaz8 un nod k , pe la varful stivei S8 introduc in stiva to ate nodurile i vecine cu nodu l k care nu au fost vizitate inca. Algaritmul pent ru parc urge rea grafului este urrnato rul: PAS1 . Se citesc din fisier valaarea pentru n ~i matricea de adiacenta a grafului. PAS2 . Se lnitiallzeaza cu 0 elementele vectorului de vizitare v i zi t at, deoarece nici unul dintre noduri nu a fost vizitat. PAS3 . Se introduce de Ja tastatura valo area variabilei de memorie k , corespunzatoare primului nod cu care incepe parcu rgerea grafului , si se afiseaza eticheta lui. PAS4 . Se initia llzeaza stiva st (varful si continutul varfului stivei), astfel: vf<--l; s ti l v f l e-ck : deoarece lnitial in stiva st este inregistrat doar nodul k cu care inc epe parcurgerea . PAS5. Se actualizeaza vectorul vizitat atribuind elementuJui k al vectorului valoarea 1, deaarece a fast vizitat (vi zi tat [k] <--1). PAS6 . Cat timp stiva nu este vida (vf<>O ) executa PAS7. Se extrage din varful stivei , elemen tul corespunzator nadului caruia I se vor vizita vecini i (k e-e t. [vf] ;). PAS8 . Se initlalizeaza nadu l i cu care lncepe cau tarea (i<-- l;) . PAS9. Cat tim p nu s-a gasit un nod i vecin nodului k , nevizitat inca (i <=n ;;i (a[i ] [ k ] = O sau (a[i] [k]=l ~ I viz itat[1]=1))) ex ecu ta PA S10. Se trece la urrnatorul nod , in vederea verificarii (i~i +l ; ) , ;; i se revine la Pasu l 9. PAS11. Daca nu s-a mai gasit un nod i vecin nodului k nevizitat inca , atunc i se elirnina nodul k din stiva, prin coborarea varfului stivei (vf~ vf -l) , altfe l se afiseaza nodul gasit i , se adauqa in varful stivei (vf~vf+l; st [vf] ~i ; ) si se actualizeaz a elementul din vectorul de vizitare care corespunde acestui nod , deoarece prin adaugarea nodului i la stiva st se conside ra ca acest nod a fast vizitat (v i z i tat [i] <--1; ) ~i se revine la Pasul 6. Pentru graful G'6, parni nd din nadu l 1, nadurile i n stiva sunt adaugate as\fel : vizi ta t st v izitat st vizitat st
IT 1 1
0 2
1
1 1
1
2
I
•
0 3
I
0 4
I
0 5
I
0 6
I
0 7
1
I
o=J~-·r-T'~T.-·r===T l nitializa rea stivei cu primul nod : vf-l.
I
1 1
I
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
I
1 0 9
1 2
I
I
I
0
1 0
3
4
1 -1 -0~5i
1 1 5
I
I
I
0 6
1 0 7
I
~C-=:J
0 8
10
I
J 10
Prelucrarea nodului: vf= 2 <> vf=3 . vizi tat st
I
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
Implem enturca stru ctur ilor de date vi zi t at
I
1 1
I
1 st vi zita t I
1
I
v i z ita t I
1
I
1
I
1
1
st viz ita t
1 2
1
st
I
1
I
2
I
1 3
I
0
2
I
1 3 5
I
0
I
3 0
I
1 6 8
vizit at
C1 I
1
1
2
I
1
3 5
I I
0
I 1 I 1 I 1 I
0
I
I
I 1
1
st
I
1 1
1
st
6
I 8 I
1
I
2 2
1 2
I
I I I
1
st
I
1 3 5
J
2
I I
1 2 2
I I
1
I
2
1t~1
0
I 1
st v i zitat
1
I
2
LlJ
2
1
1
2
1
I
I
1
I
1
3 5
I
4
I
3
1 5
I
1 6
I
1
I
1 st
1
I
7
I
I
0
I
1 3 5
I I
0 I 1 4 5 3 r--7
1 3 5
I
1
I
4
I
3
I
1 5
7
1 I 1 I 1 4 3 5 5D~
I
1 3 5
I
1
I
4
I
3
I
1 5
7
2
1 2
I
I
0
I I I
10
1 8
0 9
10
1
10
1
1
8
9
1
1
8
9
1
1
8
9
1
1
8
9
10
10
I 1 7
I I
I
I
10
I~
e> vf=5 .
I
4
I I
I
6
I
1
1 9
~ v f = 4.
1
I
I
7
I 0
I
6
1
I
7
I ::::::>
1 6 4
I
v f =6.
I
1
I
7
I
I
10
II~
1
1
B
9
1
1
8
9
1
1
8
9
1
1
8
9
10
I
::::::> vf=S .
I
1 6
1
I
7
I
I I
1 3 5
I
1 4
I
I 3 I
1 5
I I
1
I
1 3 5
I
1 4
I I
1
I I
1
5
2 I I Prelucra rea nodului: vf::::: 3
I I
6
Preluc rarea nodului: vf- 4 viz ita t
0 9
10
I
Prelucrarea nodului: vf= 5 :::::;. vf=4 .
C1 I
st
0
4
Prelucr area nodului: vf= 6
v izitat
B
I
Prelu crarea nodului: v f= 5 vizi tat I
I
1 6
Prelucrarea nodului: v f _4 vi zi tat
1
10
I
6 5 7 3 ! 6 I 9 I I 2 I I Prelucrarea nodului: v f = 6 c> vf= 5 .
1
1
I
0 7
5
Pre luc rarea nod ului: vf= 5 v iz i tat
I
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
n
1 5
0 9
Prelucra rea nodului: vf- 6 :::::;. v f= 5 . 4
1
I
4
2
st
I
4
5 I 3 I 6 I I Prel ucrarea nodu lui: vf=S c> vf=6 .
2
st
st
I
I 1 I 1 I 1 I 1
vizita t
I
1 0 1 I 1 I 0 0 4 3 5 6 7 2 8 I 2 I 5 I 3 I 6 I I Prel ucrarea nodului: vf=4 => vf=5 .
1
::::::>
6
1
I
7
10
I
v f- 3 .
I I
1 7
I I
c> vf=2 .
I
10
III forma t icii
243
vi zi t a t
I
1 1 1
I
1
I
1
I
1 4
I
1
1
1
1
1
I
1
1
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
I
st
2
I 2 1
3
1
5
I
6
1
8
7
I
I
Prelucrarea nodului: v f- 2 => vf- l . v izitat
st
I
Pentru implemen tarea algoritmului se folosesc subprogramele: -7 functia procedurala c i t e s t e creeaza matricea de adiacenta prin prel uarea informatiller din fisierul text f ; -7 functia proce durala ini t lnitializeaza stiva cu primul nod vizitat; -7 functia operand este_vida testeaza stiva daca este vida; -7 functia procedural a adauga adauqa un nod la stiva: -7 functia proced urala el imi n a elirnina nodul din varful stivei; -7 functia procedurala pre l u crare prelucreaza nodul din varful stivei: cauta primul veci n nevizitat ~ i dac a gas e~te un astfel de nod, i l afiseaz a ~i i l adauqa in stiva: altf el, nodul din varful stivei este eliminat (nu mai are vecini nevizitati) : Pentru testarea programului se foloseste graful neorientat G 26 a carui matrice de adiacents se citeste din fisierul text gra f2 1.txt. Obs ervati e. Pentru grafurile orientate, i n functia p relu cra re () conditia structurii repetitive este: Lc en s s I la[ k] [ iJ ~ ~O I I ali] [ k J~~O) i l I(a[ k ][ i ] ~ ~ l I i a l i ] [k] ~ ~ l) && v Lz i r e t l i l e s Lj )
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 ;
cou t «" No d u r i l e vlzitate prin metoda DF s u n.t : "«end l; o ou ti-c-ck-c-c" " ; in it (k) ; whil e ( ! e s t e _ v i d a() preluc rare() ; }
~ Prin parc urge rea in adancime a unui graf detenninati nodur ile f tcnne ~ c are apart m aceleiasi componente co nexe, respectiv ~ubrafului ~ de succes o ri ai unui nod .
~
Complexitatea alg oritmului de parcurgere in adancirne Algoritmul consta in extragerea unui nod din stiva ~ i adauqarea vecinilor (succesorilor) sai in stiva, iar daca nu mai are vecini, nodul este eliminat din stiva. Fiecare nod va fi adauqat in stiva a data si, prin urmare, va fi eliminat din stiva 0 sinqur a data. Complexitatea
244
Implemcnta re a st r u ct u r i lo r!l c date
operatiilor de eliminare a celor n noduri din stiva este O(n). Pentru a adauqa noduri in stiva sunt exarninati vecin ii (succesorii) nodu lui din varful stivei . Vecinii (succesorii) unui nod sunt exarninati 0 sinqura data , atunci cand nodul este extras din stiva. Numarul total de vecini exarninati esle egal cu m - nurnarul de rnuchii (arce) ale gratului. Comple xitalea operatiilor de adauqare de noduri este O(m ). Complexilatea algoritmului esle liniara O(m+ n) Determinarea conex itatii grafurilor cu ajut oru l algo r itm u !u i d e p a rc urg e re in
adancime 1. Afi sarea compon entalor con exe dinlr-un grato Algor itm ui. 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 t«endl«" Co mp o ne n t a conexa "
o . }}
2. Afl saroa componentelor tare co ne xe dintr-un g raf oriental. Algorit mui. Nodul cu care incepe parcurgerea in adancirne pentru a components tare conexa se cauta printre nodurile nevizitate inca . Pentru acest nod S8 determine multimea nodurilor care torrneaza subgraful succesorilor si multimea nodurilor care formeaza subgratul predeces orilor. Prin intersectia celor doua subgraturi (rnu ttirni de noduri) se obtine componenta tare conexa. Identiflcarea celor doua rnultirni de noduri S8 face parcurqand in adancime gratul pentru fiecare rnultirne, pornind de la un nod initial. Un nod se considera
[II form a tic
a
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 : "
246
b. c. 2.
Implcmc ntarca stru cturilor lie date 1. Scrieti un program care citeste din fisierul text graf4.txt lista arcelor unui gral orientat ~ i care. folosind algoritmul coresp unzator de parcurgere a unu i graf orientat, realizeaza: a. Afiseaza lanturile de lungime minima dintre noduri. Verifica daca doua noduri x ~i y apartin aceleiasi componente conexe (sl variants . aparlin aceleiasi componente tare conexe). Etichetele nodurilor se citesc de la tastatura, Veriflca daca graful este tare conex si afiseaza un mesa] de informare .
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.
2.7.8.3. Aplicatii practice 1. Din grupul de n persoa ne i ntre care s-au stabilit relat ii de prie tenie, afl sati cel ma i mare grup de prieteni. (lndicatie, Se deterrnina componenta conexa care confine cele rnai rnulte noduri). 2. Din grupul de n persoane i ntre care s-au stab ilit relatii de cu nostinta, afisati grupu l format din cele mai multe persoane care se cunosc reciproc . (ln d lcatie, Se deterrnina componenta tare conexa care contine eele mai multe noduri.) 3. Din gralurile care pun in eviden ta relatiile de vecinatate ~i de prietenie ale satenilor care au fanete , obtineti urmatoarele inforrnatii: a. Care sunt saten ii cei mai l ndepartati de drumu l satesc . (In dic atie. Gasi ti eel ma i lung lant din lanturile de lungime minima din graful fanetelor. ) b. Care sunt satenii izolatl. (l ndicat ie. Sate nii care nu se gases c in gralul de vecinatate i ntr-o componen ts conexa i n care se afla ~i un satean cu iesire la drumu l satesc .) 4. Din gralurile care pun in evidenta sosele din zona turistica , stablliti cate localitati raman izolate daca se distr uge un pod pe care trece soseaua care leaqa doua localitati ale carer etichete se citesc de la tastatura. 5. In reteaua de strazi a orasului, stabilit i eel rnai scurt drum in tre doua intersectii ale carer etichete se citesc de la tastatura.
2.7.9. Graful pondcrat 2.7.9 .1. Dofinitia grafului ponderat Consideram un gral G=(X.U) ~ i 0 functie I :U-> R+ care asociaza fiecarei muchii (arc) u un nurnar real pozitiv (care poate avea sernnificatia de cost, dlstanta, timp , durat a). nurnita in genera l costul muchiei. Functia f se numeste functia cost Un graf G
= {X,Uj pent ru
care s- a defini t 0 func tle cost se n u meste gr~1 pondorat
Observatii : 1. Gra ful ponderat se mai nurneste si graf cu costuri. 2. Grafurile ponderate se folosesc in aplicat ii i n care trebuie dete rrninata valoarea minima sau valoarea maxima a unei rnarirni asociate grafu lui, adica a functie i cost.
247
In forma tica 3. 4.
Se defineste costul unui drum de la nodul x la nodul y ca fiind surna costurilor muchiilor (arcelor) care torrnea za acel drum. Metoda cea mai adecvata pentru reprezentarea unui graf ponderat este rnatricca costurilor . G I 1.,f.F -VP'·
Exemplu - Graful G 27 din figura 32 .
1l'tJ$
I SwdbhlL Ole Cal.Z I Seop : exemplificarea unei aplicati i in care pentru reprezentarea datelor graf ponderat.
S8
foloseste un
Exemplul 1. a firma deline depozite de marfa in mai multe /oca/itali. a retee de sosete leaga direct unele dintre aceste iocelitet '. Distente dintre aou« locaitali este masurata in kilometri Sa se determine traseul pe care trebuie se-t parcurga a mesin« pentru a transporta marfa de la depozitul din oresu' A la depozitul din oresut B astfel ince: distanla percutsii in kilometri sa fie minima . l.ocalitatlle forneaza nodurile unu i graf neorienta t in care fiecare muchie reprezinta 0 leqatura
directa pe sosea lntre doua localitati. Fiecare muchie are asociata
0
rnarirne - distanta,
Aceasta rnarirne este costul muchiei , iar grafu l este un graf ponderat. Cerinta problemei este de a determina un drum cu lungime minima (cu cestui minim) intra doua noduri ale grafulu i.
Exemplul 2. a perso ene irebuie sa se deplaseze cu autoturismul cat mai repede intre doua intetsectii din ores. Traficul intre aou« iniersectii nu este intotdeauna in ambele sensuri. Cunoscent: timpul mediu de deplasare intre daua intersectli, sa se determine care este traseul pe care trebuie s8-1 a/eaga pentru a ajunge de la intetsectie A la intersectie B cat mai repede. lntersectiile forneaza nodurile unui graf orientat in care fiecare arc reprezinta sensuI de circulate pe 0 strada care leaqa direct doua intersectii. Fiecare arc are asociata 0 rnarirne timpul mediu de parcurgere. Aceasta rnarirne este costul muchiei, iar graful este un graf ponderat. Cerinta probleme i este de a determina un drum cu tirnpul de parcurgere minim (cu costul minim) intre doua noduri ale grafulu; Obsurvatie , Grice problema la care solutia este de a gasi drumul cu costul minim (sau maxim) dintre doua puncte se rezolva reprezentand datele printr-un graf ponderat _ ' ~I folosind un algontm de determinare a drumului cu costul minim (respectlv'" . ... maxim) dintre doua noduri ale grafulu;
2.7.9,2 , Matricea costurilor Matricea costurilor unu i graf este 0 matrice patratica de dimensiune n (A n,Il)' ale c arei el emente aiJ sun! definite astfel tncat sa puna i n evidenta costul asociat fi ecarei muchii (arc), in functie de cerinta aplicatiei, exists doua forme de reprezentare a matrice i costu rilor: ..,. matricea c osturilor minime - pentru a determina valoarea minima a functiei cost ; ..,. matri cea c ostu rilor maxime - pentru a determina valoa rea maxima a funct iei cost. a) Matricca costurilor rninlrne . Elementele arj ale matricei sunt definlte astfe l:
'{C' dac,aex. ista a m·uchie (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
Im plcm cn tarca st r uct ur ilor d e dat e
Fiecarei muchii (arc) care nu exista in gral i se asocia za 0 valoare lo arte mare, deoarece, cautancu-se costul minim, acea sta muchie (arc) nu va mai 1 2 3 4 5 fi selectata. Deoarece pentru impleme ntarea matricei nu 1 0 4 3 00 00 S8 poate folosi simbolul 00, in locul lui S8 va folo si cea mai 0 7 8 00 00 mare valoare ce S8 poate reprezenta in calculator pentru 2 3 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
ale rnatrice i sunt definite astfel:
c, dac_a ~xista 0 muchie (un arc) cu costul c > 0 intre nodu rile i si j , cu i " j H i, i =
{
O, daca 1= J - 00 , daca nu exista a muchie (un arc) intre nodurile i
~i
j, cu i
;C.
j
Fiecare i muchii (arc) care nu exista in graf i S8 asociaza 0 valoare foarte mica, deoarece, cautandu-se costul maxim, aceasta muchie (arc) nu va ma i fi selectata. Deo arece pentru implementa rea matricei nu se poate l olosi simbolul - 00 , i n locu l lui se va lol osi cea mai mica valoa re ce se poate reprezenta in calculator pe ntru tipul de data asoc iat costului . Scrie ti matricea costurilor maxime pentru gralul din figura 32.
Algoritmul pentru c rearea matricei costurilor Pentru a crea matricea costurilor trebuie sa se citeasca pentru fieca re muchie (arc) nodurile de la extrernitati " i costul asociat fiecarei muchii (arc). Aces te inforrnatii se pot citi de la tastatura sau dintr-un fisi er. Alg ori!mu l pentru crearea matricei costurilor este: PAS1 . Se initializeaza matric ea astl el: toate elementele de pe diagona la principala cu valoarea 0, iar restul elementelor cu valoarea coresp unzatoare pentru 00 (-00). PAS2 . Se act ua li zea za ma t r icea cu informatiile despre costurile asociate muc hiilor (arcelor) astlel: pentru fiecare muchie (arc) li ,n cu costu l c . ele mentului alilU] ; se va atribui valoarea costu tui c. Impl em entarea algoritmului pentru matrices costurilo r minime a unui gral oriental. Pentru initializarea matricei costurilor S8 foloseste functia ini t () , iar pentru actualizarea ei functia c i t i re ( ) . Elementele matricei fiind de tip i nt nu se poate folos i pentru simbolul 00 constanta de sistem MAX INT, deoarece i n algoritmii de determinare a drumului cu costul minim prin adunarile repetate ale elementelor matricei (care pot avea sl valoarea MAXI NT) se depaseste capacitatea de reprezentare a tipului int o Exista doua solutil: a. pentru eleme ntele matricei se alege tipu l long , chia r daca acest tip de data nu este justil icat de valori le loarte mici ale costurilor ( ~ i se obtine 0 utilizare inefic ienta a memoriei interne); b. S8 defineste 0 constants cu 0 valoare foarte mare in comp aratie cu celelalte costuri. in implementarea agoritmului s-a ales varianta unei constante definite - loiAX . Datele S8 citesc din fislerul text cost.txt in care pe prima linie exists un nurnar care reprezinta numa rul de noduri ale qrafului, iar pe urrnatoarele randuri cate trei valori numerice separate prin spati u, care repr ezinta nodurile de la extremitatea unui arc - i si j - ;;i costul asoci at arcului -
C.
Pentru testarea program ului se foloseste gralul Gn
249
I II form " tid # i nc l ude < fstr e a m. h > int
a [ l OOJ ( 100 ] , n ;
int con s t MAX ~ 50 00 ; f s tream f( " c o s t. t x t " , i o s :: i n ); v o i d in i t t I / I s e Ln i. t.La.l i z eaz a ma t r i cee c os turil o r {int L j : f» n ; for ( i = l ; i <=n ; i ++ } f o r i j ~ l; j < = n; j ++ )
if
( i ~ ~j)
a[iJ [jJ=O ; els e ali] [j]=:'JAZ ; ) actuali zea z a ~atricea costurilor eu date:e d i n
voi d citi r e{) lise {int Lj ,c ; wh i le ( f» i»j»c) a {L] l j l =c ; f .e t oe e () ; } vo id ma i n () { . . . }
fi~ier
Scrieti un program care creeaz a matricea co sturilor maxime pentru graf neorientat. Pentru testare considerati i n graf ul din figura 32 ca arcele sunt rnuchii .
2,7.9 .3. Algoritmi pentru determinarea costului minim (m axim ) Pentru determinarea drumului cu costul minim (maxim) intre doua nod uri ale unui graf se poate folosi: -7 al goritmul Roy -Floyd; -7 algor itm ul Dijkstra Ambii algoritmi folose sc principiul enuntat prin teorema lui Bellman : d rum ul opti m (cu cost ul minim, respectiv maxim ) intre doua nod uri oarecare i l?i j co nt in e numai d ru m u ri partial a optim e (cu costu ri min ime , respe ctiv maxime) care trec prin alte noduri ale gratu lui. Altfel spus , dac a drumul optim dintre doua noduri oare care i ~i j trece printr-un nod k, atunci ~i drumurile de la i la k ~i de la k la j sunt optime. Cei doi algoritmi difera prin modul in care se identifica noduri le intermediare k.
Fig. 33
a) Algoritmul Roy-Floyd Al goritmul foloseste un principiu asernanator cu cel care a fast utilizat pentru determ inarea matricei drumurilor: gasirea drumului optim intre doua noduri oarecare i si j prin descope rirea drumurilor optime care iI compun si care tree prin nodurile k se face prin transformarea matricei costur ilor . Matricea trece prin n transformari, in urma carora fiecare element a [ i ] [ j] va me mora cost ul drumului minim dintre nodurile i si j . PAS1 . Penlru etiche te ale nodului k de la 1 la n (adica pentru arice nod al grafu lui) exec uta : PAS2. Penlru arice pereche de noduri din graf i ~ i j (cu t s is n si t sj sn) executa: i PAS3. Dac a suma dintre costul drumului de la i la k si costu l drumu lui de la k i la j (a [ i ] [ k]+ a [ k] [jJ) este mai mica decat costul drumului de la i la j (a [ i ] [ jJ) , at unci in matricea costurilor cost ul drumului direct de ! la i la j este inlocuit cu costuI drumului ca re trece prin nodul k
! i
(a [ i ] [ j]= a li] [k J+a [ k ] [ j J) .
Pentru grafu l din figura 32 matricea costur ilar sutera urmatoarele cinci transforrnar i. La fiecare transformare , daca drumu l de la nodul i la nodul j are costul mai mare decat costul drumur ilor care trec prin nodul intermed iar k (de la nodul i la nodul k si de la nodul k la nodul j) , atunci elementului a [ i] [ j] i se va atribui valoarea a t il [ k] + a [k] [ j] .
250
Implernentarea strueturilor de date k=1 2
k=2 34
5
1
0
4
3
co
0 5
co
'"8
1
2 3
'"7
1 0
2
co
'" '"0
3 4 5
'" '"
co co
0
eo
4
co
4
5
2
6
5
0 2
2 4
3 3
0 5
eo
co
4
6
5
2
0
4 5 11 12 7 I 8 12 13 0 1 ", 2 I 0
k=4 2
1
0
4
2 3 4 5
co
0 5 9
'" '"2
6
1
2
1
0
2
co
3 4
'" co
4 0 5 9
5
2
6
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
4
0
5 12 8 13 17
5
2
0
1 2 3 4 5
1 0 10 15 19 2
2 4
0 5 9 6
3
4
3 11 0
11 7 12 0 2
4
5
5 12
8 13 17 0
Interpretarea datelor din matricea obt inuta in urma transformarilor se fac e astfe l: drumul de la nodul i la nodul j are costuI minim a[ i ] [j ] . De exemplu , drumul cu costul m inim de la nodu l 2 la nodu l la nodul 4 are costul minim 7. Matric ea nu furnizeaza informati i des pre etichetele drumului cu c ostu l m inim . Pentru im plem entarea algor itm ului se folosesc subprogramele: -7 funct ia procedurala in it initializeaza matricea costurilor: -7 functia procedurala c it ire actua lizeaza matricea costurilor cu date1e din fisier: -7 functia procedura ta tra nsformare transforrna matricea costurilor; 7 functia procedural a afisare afiseaza lungim ea drumu rilor min ime i ntre toate nodurile grafu lui.
#include < fstream .h> int a[ lOO] [lOO],n ; int canst MAX =5000 ; f stream f ( " c o s t . tx t ", i o s: : i n ); vo i d init () { l i s e i n it i a l i zeaza mat ri cea c o s t u r i l or l void citir e(} {l I s e actuali zea za mat r i cea costur i l or ell date l e din fi $ier } v o id t r ans f o r ma r e ( ) li s e trans forma mat r i cea costu rilo r { f or (i nt k~l ;k<=n ;k++) for {int i =l ;i<=n ;i++) for (int j~l ;j<~n ;j++) i f (a [ i J[ k ] +a [ k J [j]
lnformatiile din m atricea c ost urilor transformata prin algoritmul Roy Floyd se pot fotosl pentru aver if ica daca ex.sta drum cu costul minim intre doua noduri ale grafului , iar in ca z afi rmat iv , se poate atrsa lungimea lui ~i se poate descopcri drumul ,
Algoritmul de descoperire a drumului eu cost ul minim pornind de la matricea costurilor transtormata foloseste acelasi rationarnent ca la transformarea ei: daca lungimea drumului minim dintre noduriIe i ~ i j este eqala cu suma dintre lungimile minime a coua drumuri care tree printr-un nod intermediar k (a [ i ] [k]+a[k j [j]=a[i] [j J). atunci nodul k face parte
Informa tica
25 1
din drumul de lungime minima de la i la l Deoarece problema pentru determinarea nodurilor care forrneaz a drumul de lung ime minima S8 descompu ne in doua subprobleme: de terrnina -
rea drumului minim de la nodul i la nodul k (cu k" i) ~i determinarea drumului minim de la nodul k la nodul j (cu k.;j), in implementarea algoritmului se foloseste strategia divide et im pora Pentru implementarea al goritm ului prin care se determina drum ul minim dintre doua noduri x ~i y (a carer eticheta se citeste de la tastatura) se folosesc subproqra mele :
-7 fun ct ia procedurala init initializeaza matricea costurilor; 7
functia procedu rala citire actuali zea za matricea costurilor cu datele din fisier:
-7 func tia proced urala transformare transforms matricea costurilo r;
-7 func tia procedurala d r um deterrnina nodurile dru mu lui eu cost minim; -7 functia procedu rala afisare afiseaza costul drumulu i minim drumu l; #inc lude
~i
nodurile care torrneaza
fstream f{ " c o s t . t x t " , i o s: : in) ;
void i n i t ( ) {! /se initia lizeaz a me t r i.cee cos t ur i.Lo r l void c i t i r e { ) { / I s t:: ectualLzeeze rnet r i cea costurilor cu da tele din fi$ier } void t r a n s f o r ma r e ( ) { l i s e transformamatricea costuri lor } void drum (i n t L . int j) // se de t e r mi. ne noduril e d rumu 1u i mi nim {int k , qa s i.t : for (k=l, gasi t=O ; k ee-n && l.qe s Lt , k+ +) if l i ! ~ k && j !~kl && (a[iJJj] ~~ i1[ i}[k]+a[k J .lj Jl {d r uml i , k ); ·d rum( k , ] ); gasi t = l ; } if (!gasit) c ou t « j « " "i } void a f i s a r e (int x , int y ) {if (a(x Jly ]
{int x, y ; cout « " x = " i cin» x; cou t« " y = It; c in» y; i n i t n; c itire () ; t.rensIorme re rj • a fisare(x,y) i }
Complexitatea alqoritrnului Roy -Floyd Algoritmul de transformare a matricei costurilor are ordinul de complexitate O (nxnx n )~ 0 (n
3
)
deoarece fiecare structura repetitiva for se executa de n ori, iar structurile for sunt imbricate. Algoritmu l de de terminare a drumurilor cu costul minim din matricea costuri lor transtorrnata
are ordinul de complexitate al algoritmului di vid e et imp era: 0(n xlg2n). Ordinul algoritmului 3 3 este 0(n )+ 0(n xlg 2n) ~ 0(n + nxlg2n) ~ O(n'). Modificati programele care implementeaza algoritmul Roy Floyd astfel lncat sa 5e determi ne dr um ur ile cu costul maxim .
b) A lqoritm u l D ij k stra Algoritmul lui Dijkstra construieste drumurile cu costuI minim care pornesc de la un nod oarecare x - nodul sursa - pana la fiecare nod din graful G ~(X ,U) - nodul destinatie. Algoritmul lntretine 0 multirne cu nodurile care au fost deja selectate - S, si 0 coada de prio rita t i Q cu nodurile ca re nu au fas t selectate inca: Q=X -S, astfel:
252
Im ilcmcnturca st r u ct urilo r de date
~
Un nod y este declarat selectat atunci cand s-a det erminat costu l final al drumul ui cu c ost ul minim de la nodu l sursa x la el. Selectare a unui nod nu este echivalen ta cu gasirea drumului cu costul minim deoarece este po sibil ca in urma calc ula rii costului sa rezulte ca nu exista drum de la nodut x la acel nod. ~ i n coada Q prioritatea cea mai mare 0 are nodul pentru care costul drumu lui are valoarea cea mai mica dintre toate costurile de drurnuri care porn esc de la nodul x la celelalte noduri nese lectate i nca. La fiecare extragere a unui nod din coad a de prioritati Q , nodul este adauqat la rnultirnea S, iar coada de prioritati este reorqanizata i n functie de acest nod (se recalculeaza costul drumurilor de la nodul x la noduril e rarnase i n coada, co nside rand ca unele drumuri, daca tree ~i prin nodul extras, pot sa-si rnicso reze costul). Pentru calcularea drumurilor de lungime minima S8 i ntretine 0 rnultim e 0 in care S8 rnerno reaza co stuI drumurilor de la nodul x la nodurile neselectate, costuri care S8 reca tculeaza la fieca re extragere de nod . Drumul cu costul minim care porneste din nodul x este fonmat din nodul initial x ~i creste pana cand coada de prioritati Q nu mai corinne noduri. Deoarece, cele doua rnultirni S ~ i Q sunt disjuncte, iar reuniunea lor este multimea nodurilor X, este suficient sa S8 in tretina numai multimea S. Aigo ritmul foloseste strategia greedy , deoar ece intotdeauna alege nodul eel rnai apropiat de nodul sursa x. 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
Implementarea algoritmului. Se folosesc trei vector! ~ Vectorul s pentru rnultimea nodurilor selectate, definit astfel : D' ca ca nod ul i nu a fost selectal s(i) = { 1, da ca nodul i a fost selectat lnitial, elementele vectorului s au valoarea O. cu exc eptia etem entului s [xl care are valoarea 1. La terminarea executie i alqo ritmului, toate elementele din vectorul s vor ave a valoarea 1. Nodurile i pentru care s 1i ] =0 se consldera ca fac parte din coada de prioritati Q ~ Vecto rul d contine costul drum urilor, astfel: d[i] = costul drumului minim gasit la un moment dat de la nodul x la nodul i (co t s tsn ). lrutial d [ i ] =a [x l [ i 1. La terminarea algoritmului, d [i ] = costul minim al drumului de la nodul x la nodul i. ~ v ectorulp mern oreaza drumurile gasite intre nodul x ~i cele lalte noduri i ale grafului. Memorarea drumului se face prin leqatura cu predecesorul care este defin ite astfel: p [i l rnemoreaza nodul j care este predecesorul nodului i pe drumul de ta x , cu
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
p
1 0 0
-3
4 ~
.5
0
0
0
0
4
I co 1 I 0
co
1
I
3
0
Drumul cu eostul eel mai mic este eu nodul 3: d [3 1=3. Nodul 3 se va extrage din eoada Q. Se analize aza nodurile care raman in coada de pnoritati: Nodul 2. d [3] +a [ 3] [2] = 3+5 = 8 > 4. Nu se rnodifica nimie. Nodu l 4. d [ 3 ] +a [ 3] [4 ] = 3+r = a: > 4. Nu se rnodifica nimie. Nodu l 5. d [3] +a [ 3] [5 ] = 3+r , = r · > 4. Nu se mod ifies nimie. Ve c torii 1 2 3 4 5 1 0 1 s 0 0 4 cc d 3 0 ""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
2
3
4
5
5
1 0 0
1
1 3 1
1 11 2
0 12 2
.2
.3
4
.5
1
1 3 1
1 11 2
1 12 2
d
4
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
termin a executia alqoritmului.
Final: Vectorii
1
s d
1 0
4
P
0
1
~
254
Implcmenta rea struetnrilor de date
Din datele care se qasesc i n vectorii d ~i p la terminarea algo ritmului se obtin urmatoarele lnforrnatii: -') d[i] reprezinta costul minim al drumului de la nodul x la nodul i. De exemplu, pentru nodul 4 costul minim este 11. -') Din vector ul predecesorilor se reconstitu ie drumul cu costul minim de la nodul x la nodul i . De exemplu , pentru nodul 4: p [4] =2, iar p [2] =1. Drumul este 1--+ 2--+ 4. Pentru imple mentarea algoritmului in care S8 deterrnina drumul cu costul minim dintre doua noduri x si y (a carer eticheta se citeste de la tastatura) se folosesc subproqrarnele : -7 functia procedurala init initializea za matricea costu rilor; -7 tunctia procedura la c it ire actual izeaza matricea costurilor cu datele din fisier; -7 functia procedura la gene rare_drum transforms vectorii d si p conform algoritmuJu i pentru a obtine drumur ile cu costu l minim de la nodul x la oricare alt nod i din graf; -7 functia procedu rala drum dete rrnina noduriIe drumului cu cost minim de la nodul x pana la un nod i din graf - folosind inforrnatiile din vectorull p; -7 functia procedurala af isare afiseaza lungimea drumurilor minime care pornesc din nodul x pana la fiecare nod i din graf si noduriIe care forrneaza drum ul; #include < f s t r e a m. h > int a[ l OOJ [l0 0 ] , d [ l OOJ , s [ l OOJ , p I1 0 0 J ,n ; i nt c ons t MAX=5 000 ; fstream f{ "cost .txt " , i o s : : i n) ; void init() { l i s e ini t i a l i ze a za matr icea costu ri 1or} vo i d ci tire() {l i se actua1i zeaza matricea c os t Bri1or cudate le din f i ~ier } v o i d gene r are=d rum(i n t xl lise gene reaz a drumuri1 e {int i ,j , min ,y ; s lxl=l ; for ( i =l; i< =n ;i++.} {d [ i ] ~a [ x J
if
(i '~ x
[ i J; d [i]
&&
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
{mi n =d [j J ; y~j ; )
for ( j ~ l; j <~ n; j + + )
if
(s[jJ ~~O &&
d[j J>d [yJ+a[yJ
[il!
{ d [ j l ~d [ Y J + a [ y ]
[jl; p[j J~y ; ) ) )
v oid drum( i n t i} { if {p l i ] ! ~ O l dr um(p [i]) ; cou t-oc i c-; " " ; } voi d afisare( i nt xj {for ( i nt i ~l ; i<=n ;i++) if (i.! =x) i f (p[i]
!~O)
( c cut c cv d r umu l cu co s t.u I minim d ela nodul "« x; cout«H 1a nodul "«i«" are castu1 "« d [ i 1«endl ; drum( i) ; c out« endl ;} el s e c out «" Nu exista d~um de 1a "« x«" 1a H« i« e n d l; } vo i d main ( ) {i nt x ; c ou t« " x= H; c i n » x; .i n i.t.Ll : c itire () ; qe ne .rar-ej d r-umt x j Co m p lex ita tea algo ritmulu i lui Dijkst ra
,
e r i.e e re (x) ; }
Pentru determinarea drumului cu costuI minim se executa pasii algoritmu !ui. Pasul 2 are ordinul de complexitate O(n). Pasul 3 se executa pentru fiecare nod din graf, mai putin nodu! sursa, deoarece fiecare nod trebuie selectat a data (se executa de n-1 ori). Pentru
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).
=
-------- ~ Mo dificati prog ramul care irnplernenteaza algoritm ul Dijkstra astfe l ,~ J tn cat sa S8 determine drumurile cu costul maxim.
2.7 .9.4. Aplicatii practi ce 1. 0 persoana oficiala trebu ie sa se deplaseze i ntr-un eras intre do ua puncte situate fiecare lntr-o intersect ie. Traficul intre coua intersectii nu este intotdeauna in ambele sensuri , dar intre oricare doua inte rsectii exista trafic prin intermediul altar inter sectii. Pe fiecare str ada a traseului trebuie sa existe un anumit nurna r de aqenti care sa asigure securitatea persoanei aficiale. Scrief un program care sa determine traseul astfel incat nurnarul de aqenti sa fie minim. Datele se citesc dintr-un fisie r, astfel: de pe primul rand, nurnarul de inte rsectii, iar de pe urrnatoa rele randuri, triplete de numere x , y, z care sernnifica fa ptul ca pen tru traficu l de la intersectia x pana la inte rsectia y sunt nec esa ri z aqenti (cele doua intersectii sunt legate direct). 2. 0 firma are mai mult e puncte de lucru lntr-o zona geografica . a retea de sosele leaqa .direct unele dintre aceste puncte de lucru si intre oricare do ua puncte de lucru exista a legatura prin intermediul retelei de sosel e. Distanta dintre doua puncte de lucru lntre care exista leqatura directa este rnasura ta In kilametri. Firma trebuie sa-si stabileasca lntr-unul din punctele de lucru sed iul central. Criteriu l de alegere este ca suma dlstantelor la celelalte puncte de lucru sa fie min ima . Scrief un program care sa stabile asca punctul de lucru care va fi ales ca sed iu. Dal ele se citesc dintr-un fisier , astfel: de pe primul rand, nurna rul de puncte de lucru , iar de pe urmatoa rele randuri, triplete de nu mere x , y , d care semnifica faptul ca punctele de lucru x ~i y sunt legate direct de 0 sosea cu lungimea d . lndi cati e. Pentru fiecare punct de lucru S8 deterrnina suma distantelor minime la taate celelalte puncte de lucru , dupa care se deterrnina suma minima.
3. 0 firma trebuie sa colecteze ambalaje din mai multe puncte de lucru din oras, fiecare punct de lucru gasi ndu-se pe 0 anumita strada. 0 retea de intersectii leaga direct une le dintre aceste puncte de lucru ~ i lntre oricare doua puncte de lucru exista 0 leqatu ra prin interm ediul trafic ului pe strazi. Traficul lntre doua intersectii nu este lntotdeauna In ambe le sensuri, dar lntre oricare doua intersectii exista trafi c prin intermediul altar intersectii. Cantitatea de ambalaje care paate fi colectata in tre doua intersectii lntre care exista trafic direct este rnasurata In kilograme. Scrieti un program care sa gaseasca un traseu optim Intre doua intersectii A ~ i B astfel lncat 0 rnasina care pleac a din intersectia A si trebuie sa ajunqa In intersectia 8 sa calecteze 0 cantitate cat mai mare de arnbalaje. Datele se citesc dintr-un fisie r, astfel: de pe primul rand, nurnarul de intersectii, iar de pe urrnatoarele randuri, triplete de numere x , y , c care sernnifica faptul ca intersectia x este leqa ta direct de intersectia y prin traficul de pe 0 strada de pe care se poate colecta can titatea c de amba laje. Elichetele intersectiilor A ~ i B se citesc de la tastatura.
256
Implcm entarea s tr uct urilor d e date
4. 0 firma se poate aprov iziona cu trei sortimente de mater iale de la mai multe depozite situate i n localitati raspandite i ntr-o zona geografica. intr-un depo zit nu este obligatoriu sa existe toate cele trei sortimente . a retea de sosele leaga direct unele dintre aceste locaiitati si intre oricare dcua localitati exista 0 legatura prin intermediul retelei de sosele . Distanta dintre doua localitati intre care exists legatura directs este rnasurata in kilome tri. Firma trebu ie sa S 8 aprov izioneze cu unu l dintre sortiment ele de materiale. Scrieti un progra m care stabileasca depo z itul de la care S8 a proviz ioneze firma astfel i ncat drumul care tre buie parcurs pentru aproviziona re sa alba lungime a minima. Fie carui sort iment de material i se atribuie un nurna r: 1, 2 si 3. Datele se citesc dintr-un fisier text. De pe primul rand se citesc nurnarul de localitat i n i n care se gasesc depozite ~ i numarul de legaturi directe i ntre localita ti. m . De pe urrnatoarele m randuri se citesc triplete de numere x, y, d care sernnifica faptu l ca loc alitatile x si y sunt legate direct de o sosea cu lungimea d . De pe fiecare dintre ultimele trei rand uri, in ordine a etichetelor sortimentelor de materi ale , se citeste cate un slr de numere despartite prin spatiu cu
sa
sa
inforrnatii despre locatiile depozitelor unde se gas e~ te acel sortiment de material: primu l nurnar rep rezin ta numarul de depozite, iar urrnatoarele numere etichetel e loc alitatilo r in care se qa sesc aceste de poz ite . Nurna rul sortimen tului de materiaIe p se cornun ica de la tastatura. lndicatie. Se deterrnina distants minima de la localitatea i n ca re se gase~ te firma la loca litatile i n care se gasesc depoz itele si se alege dintre acest e distante cea ma i mica distanta care corespunde unui depoz it ce confine sortimen tul de mat eria l p.
2.7.1 . Grafuri spcciale Exista urrnatoar ete grafur i speciale: -7 graf uri bipartite ; ~ grafuri hamiltoniene: ~ grafuri euleriene : -7 grafuri t urn eu.
2.7.10.1. Graful bipartit Graful G = (X,U) se numeste graf bipartit dac a exista dou a rnul tirnl nevide de noduri A ~i B ca re au urmatoarelo pr oprietati : AuB=X ~ i A"B=0 ~ i orice muchie (arc ) din rnultl mea U are 0 ext rem ita te in m ultim ea de noduri A ~i 0 alta ext rem itate in rnul tirnea de noduri B.
,
Example:
, , , ,
, B care sa Indeplineasca conditiile din definitie : A = {1, 3, ,
1. Graful neorientat G4 definit anterior este un graf bipartit , deoarece exists
1
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:
1
[1,2) c> 1EA si 2 EB [3,4) c> 3EA si 4 EB [5,7) c> 5EB si 7GA
[1,4) c> 1EA si 4eB [3,5) <> 3EA ~i 5EB [5 ,8) c> 5EB si 8EA
[2,3) "" 2eB ~i 3eA [5,6) "" 5eB ~i 6 EA [7,9) c> t e». ~ i geB
1
, , , , , ,
, I
,, ,
1 , ' ,@ , ' @O' , , \
I
/
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 .
[1,2] => 1EA ~ i 2EB [2,4] => 2 EB si 4 EA [4,5] => 4 EA ~ i 5EB
-,
I
[2,1] c> 2 EB si 1EA [3,5] => 3EA si 5EB [5,3] => 5EB ~i 3EA [6,5J => 6 EA si 5EB
[2,3J => 2 EB ~i 3EA [4,2J => 4 EA ~ i 2 EB [5,6] => 5EB si 6 EA
I ~
,
I
Fig . 36
Graful bipartit G ; (X,U) se nurn ests graf bipartit cornplet dac a - pentru orice nod Xi EA §i orice nod xje B - exista 0 muchie (un arc) fe rmata din cele doua nod uri care apartine rnultimii U; [Xi, Xj]EU, Exemple: 1. Graful neorientat G,,;(X28 ,U' 8) definit astlel: X28 ;{1 , 2, 3, 4) ~i U'8;{[1,2]. ~3 [1AJ, [2,3], [2.3]) este un graf bipartit complet. deoarece exists multirnile A si B care indeplineasc conditiile din definitie: A;{1 , 3) ~i B;{2, 4). Se observa ca: 2 4 AuB; (1 ,2,3A }; X, si A,,-,B; 0 si ca fiecare nod din rnultimea A este legat cu 0 Fig . 37 muchie de fiecare nod din multimea B. 2. Graful orientat G29 ; (X 29,U29) definit astfel: X29;{1 . 2. 3, 4) ~i U, g;{[1 ,2], ~ 2 [1,4J, [2,1], [2,3], [3,2], [4,3]) este un graf bipartit complet, deoarece exists G2~ rnultimile A ~i B care sa Indeplineasca conditiile din defin itie: A;{1 , 3) si 3 4 B;{2 , 4). Se observ e ca: AuB;{1, 2, 3, 4};X, si AnB;0 ~i ca fiecare nod . din rnultimea A este legat cu cel putin un arc de fiecare nod din rnultirnea B. Fig . 38 Observatie. Graful neorientat bipartit complet se noteaza cu Ka,b ~ i are axb rnuchii, unde a; c ard (A ) ~ i b; ca rd(B). De exemplu , daca graful neorienta! are 3 noduri, S8 obt in urrnatoarele variante de grafuri bipartite complete: Elementele multimii A 8 1 2.3 1,3 2 3 1.2 1.2 3 2 1.3 2,3 1 1,2.3 0 0 1.2.3
Muchiile ar afului
[1 .2J. [1.3J [2.1J. [2.3] [3.1]. [3.2] [1.3J. [2.3] [1.2]. [3.2] [2.1]. [3.1] nu exista, deoarece 8- 0 nu exista. deo arece A- 0
Numaru! de muchii ale arafului 1/2-2 1x2=2
1/2 -2 2x1 =2
2/ 1-2 2/1-2 3xO- 0 Ox3-0
Algoritmi pentru prelucrarea grafurilor bipartite 1. Generare a tutu ror graf urile neorientate bipartite compl ete cu n noduri. Al goritmul. Problema se reduce la a genera toate subrnultimile care se pot obtine din cele n eleme nte (exceptand rnultimea inltiala ~ i multimea vida). Nurnarul total de submuln timi obtinute este 2 - 2 . Solutia este de a genera intr-un vector nodurile care apart in multimilor A ~i B. astfel: daca un element are valoarea 1, nodul care are eticheta corespunzatcare indicelu i elemen tului apartine rnultirnii A; altfel , apartine multimii B. Impl ementarea alg oritmului. Functia ge n e r are () qenereaza grafurile bipartite complete. Tn vectorul a se genereaza nodurile mult irnilor A si B. Initial elementele vectorului au
258
Implem en ta rea st r uctur ilor de date
valoarea O. Variabila po sLbd L se foloseste pentru a verifies dac a mai exista posibilitati de genera re de submultirni (are valoarea 1 - true , atunci cane mai este posibil sa se genereze subrnultirni ). # inc l ud e < i o s t r e a~ . h >
# incl u d e
;
l j ~ n;
wh ile
if
(j> O & &
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
{cout « "Cr a f u l ': « k «endl « "i'·hl l t i me a A : "; fo r (i = 1; i <= n ; i + t) if (a [ i]) c o uu c c i, .c c " cout «" i1u l t i me a B : fo r ( i =l ; i <= n ;i-tt)
tI
.
".
i f ( ! a[i]) cou t c c i c c " cout«en d l ; cout;c " Hu cb i i.Le sunt : " . for {i=l ; i<=n ;i ++) i f (a[il~~l)
If
.
f o r (j = l ;j<=n ;j-t+) i f (a[jl==O & & i ~ = j) cout«" [ " « i « " , " « j « "] to; cout«en d l ;} }}} void main { } ( i n t n ; c out«" n uma r de nodu rL > 'I; cin » n ; c c n c r e re tnl r )
2. Ver ifi c ar ea un ui graf dac a es te graf biparti t . Algo ritmul. Pentru a verifica daca graful este bipartit, se genereaza rnultimile de noduri A B pan a cand ace ste mult irni i ndeplinesc conditia unui graf biparti t, sau pima cand s-au generat toate multimile ~i nici una dintre variante nu a indeplinit condit ia pentru gra! ul bipartit. Gra!ul este bipartit daca i ntre orice pereche de element e din cele doua rnultiml (x ,y), cu x EA si YEB - exis ta muchie care sa Ie lege in gra! ([X,y] EU). Pentru generarea rnultirnilor de noduri A ~ i B se pot folosi doua variante: ~i
Vari anta 1. Ca ~ i in algoritmul prece dent, se qenereaza ln tr-un vector toate submultirn iIe care se pot obtine din cele n etichete de noduri (exceptand rnultirnea initiala ~i multimea vida) ~ i se verifies daca nodurile apartinand celor doua rnultimi generate pot fi rnultirnile unui graf bipartit. Impleme ntarea algorit mul ui. Se citesc din fisieru l text gb.txt info rrnatii despre un graf neorientat (nurnarul de noduri ~i matricea de adiacenta ). Functia bipar t i t () verifica daca graful este bipartit furniz and un rezultat logic. Elementele vectorului x in care se genereaza muttirnile A ~i B sunt initial O. Variabila ga si t se foloseste pentru a veri!ica daca s-au gasit cele doua rnultimi de noduri corespu nzatoare unui gra! bipartit (are valoarea 1 - true , atunci cand s-au gasit).
# inc l ude <: £ s t r e a m. h > #inc lude
fi ~i e r }
Informatica
259
{m=n; while (m>O && x [ m ] ~ ~ l i f (m==OI posib i l~O ;
l
(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)
i f I( x[i]~l && x[j] =ll II !di] ~O && x [ j J ~ O ) qesLt -O r l j return g asit i } void maine) {c i t e s t e ( j; if (bi?a rt:'t()) cout« " Es t e bipa r t i t "; else cout« " Nu este bipartit " ; } Var ian ta 2. Elementele multirnilor A ~ i B se genereaza separat , in doi vectori. Pentru generarea multirnii A se foloseste me toda back tracki ng (etichetele nodurilor multirnii A se genereaza in stiva), Functia bt () este apelata de n-1 ori pentru a genera in stiva cele p elemente ale rnultirnii A (t spsn- t) . Multirnea Beste fermata din nodurile gralulu; care nu se gasesc in multirnea A. Imp lom enta rea algo rit rnului. Matricea A este matricea de adiacenta a grafului, iar in vectorii a si b S8 gene reaZ8 elementele multimilor A ~j B. in functia t i pa r ( ) S8 copiaza continutu' stivei in vectorul a si S8 scriu in vectorul b etichetele nodurilor care nu sunt in vectorul a. Pentru a identifica etichetele nodurilor care nu sunt in vectorul a se tolo seste variabila 10g;c13 gasi t . Tot in aceasta functie S8 verifica daca aceste rnultirni corespund unui gral bipartit, asttel: se verifica, pentru toate elementele celor doi vectori, daca muchiile generate cu un nod din vectorul a ;;i un nod din vectorul b sunt muchii in graf. in caz afirmativ, se verifica daca muchiile astfel generate sunt toate muchiile grafului. Variabila nr . se Ioloseste pentru a nurnara muchiile formate cu nodurile din cei doi vectori, iar variabila logica este pentru a verifica da ca gralul este bipartit. (are valoarea 1 - true , caca nu rnarul de muchii qasite este egal cu nurnarul total de muchii ale gralului m]. #in c l u de
fstream f( "gb .txt " , i o s : :in ) ; typedef int stiva[lOO] ; int n , k , ev ,a s , f'.. [lO] [10] , b [ l O] , a r l O] , ID, e s t e, p; s c Lva s t ; void c i Les t e () (int i, j ; f »n ; fo r ( i = l; i < =n; i ++ ) for (j ~l ;j<~n ;j++1 ( f» .~ [ i ] [j] ; m=m+A [ i] [ j ]; J L c l o se [) ; vo i d i niL() { s t [ k ] = O; J int suc::::e sor () {if (st[k]
rn~m! 2 ; )
Implemcntarca stru ct urllor de dat e
260
{f o r ij=l ,gasit=O; j < ~p && 'gasit ; j++) if (a[jl= =i) g asit =l ; if i'gasit l {q ++ ; b[ q]=i ; ) ) f or ( i =l ; i<=P i i++) f o r ( j ~l ; j<=q ; j++) i f (~.[a [i) ] [b[jJ] ~ ~l ) n r ++ ; if {nr==m ) este=l ; } v oi d b tO {/ /partea f ixa a algoritmului backtracking } v o i d main ()
{ c i t e s t e {) ;
f or (p=l i p<=n - l && ! e s t e; P+ +) bt {) ; i f (este) c o ut«" Es t e bi pa rtit " ; e ls e cout«" Nu este b ipar t i t " ; } 1. Scrieti un progr am care citeste din fisieru l gra f.-b1.txt matricea de adiacenta a unui gral neorientat si, de la tastatura, doua siruri de num ere ce reprezinta noduri d in graf - si care verifies da ca cele doua siru ri de numere pot reprezenta pentru gral cele doua rnultirn i ale unui gral bipartit. 2, Com parati din punct de vedere al eficientei cei doi algorit mi prin care se dete rrnina daca un gral neo rien tat este bipartit. 3, Scrieti un pro gram care cite ste din fisierul graf.-b2.txt matricea de adiacenta a unui gral orienta t 'Ii care verifies c aca gralul este bipartit. in caz afirmativ, se afiseaz a rnultimile de noduri A 'Ii B.
2,7.10 .2. Graful hamiltonian Intr-un gral G=(X ,Ul , se nurneste lant hamiltonian lantul elementar care confine toate nodurile grafului. Altlel spus, un lant este hamiltonian daca porneste de la un nod oarecare si parcurge a sinqura data toate nodurile gralului.
l.antul hamiltonian in care nodul initial coincide cu nodul final se nurneste ciclu hamiltonian. Ca i ntr-un gral sa ex iste un ciclu hamiltonian este necesar ca pe langa un lant hamiltonian sa mai existe 'Ii a muchie care sa lege primul nod allantului de ultimul nod al lantului, Un graf care contine un ciclu hami ltonian se nurn este 9raf hamiltonian Altlel spus, un gral hamiltonian este un gral i n care - pomind de la un nod oarecarese pot parcurge 0 si nqura data to at e noduril e grafului, revenind 13 nodul initial. G, o Gralu l G" din figur a 39 contin e ciclul ham iltonian C= (1, 2, 3, 6, 4, 5, 1}.
Observatie. Un graf hamiltonian nu poate contine noduri izolate. Propozitia 10
Gralul complet K, este hamiltonian. Demonstratie. Graful complet K n poate f pnvit ca un poligon cu n raturi, in care fiecare varf al poligonului este legat de celelalte varfuri prin diagonale, iar varfurile poligonului parcurse pe laturi forrneaza un ciclu hamiltonian.
$
W
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 CLIIJOa§te 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)~
n-1-d(x,). Dar, d(x;)2n/2. Rezulta ea
d ( y)~
ipoteza. Cont radictia a aparut din presupun erea
n-1 -n/2=n/2-1, adlea
d(y) ~ n/ 2 ,
ca gr aful G nu este hamiltonian .
ceea ce contrazice
262
Implcm entarea stru ct urilnr de date
1. verificati daca gra ful ham iltonian G, o din figura 39 lndeplineste conditiile preciza te in teorerna . 2. Desenati toate grafurile hamiltoniene cu 4 nodu ri. G 31 3. Veriticati daca este hamiltonian graful G31 =(X 3 1,U3 1) cu X 31= {1,2,3,4,5,6,7j si U31={[1, 2], [1,5]. [1,6]. [1,7]. [2,3], [2,7]. [3,4), [3,5], [3.7]. [4,5]. [4,6J, [5,6J). Daca este graf hamiltonian, gasiti un ciclu ham iltonian si veriticati daca graful lndepline.;;te conditiile precizate in teorerna . 4. Dernonstrati ca un graf bipartit cu nurnar impar de noduri nu poate fi graf hamiltonian. 5. Dernonstrati ca nurnar ul ciclurilor hamilloniene din graful com plet cu n noduri este I n ~ I) ! . Alqoritmul pentru parcurgerea unui graf hamiltonian A lgoritm ul. Pentru a determina daca un graf este ham iltonian S8 verifies daca exista un clclu hamiltonian. Este suficient sa S8 caute lanturile elementare care pornesc din nodul cu eticheta 1 .;;i S8 Inchid in acest nod. Se poate folos i fie metoda backtr ack i ng, fie metoda parcu rge rii i n l a~ime a g rafu lu i. Prin aceste met ode S8 pot determina .;;i toate ciclu rile hamiltoniene, caca exista, astfe l: se cauta toate ciclu rile elementare care , pornind dintr-un nod, parc urg toate celelalte noduri ale qrafulu i ~ i se i nchid printr-o muchie cu nod ul de porn ire. Im plem entarea algoritm ului. Se citeste din fisierul graf_h.txt ma tricea de adiac enta a unui graf neo rientat. Daca graful este ham iltonian , se afrseaza ciclurile ham iltoniene gasite. Daca nu exist a nici 0 solutie , se afiseaza un mesaj de informare. Pentru generarea lanturilor elementare se foloseste me toda backtrack ing. Noduri le lantului elementar vor fi generate i n stiva . Functia ci teste () se fotoseste pentru a citi matr icea de adiacenta in fisier, Variabila e ste se foloseste pentru a verifica daca s-a gasit un ciclu hamiltonian pom ind d.n nodu l cu eticheta 1 (are valoarea a- False , daca nu s-a g5s lt un ciclu hamiltonian). #~ncl ude < f s t r e a m . n >
typedef s t i v a [ l OO]; in t <'"1 [2 0 J [201 ,n ,k ,o s ,e,t ,este=0 ; s t i ve s.t , fstream f( "grafh .t x t " , i o s : :in }; void c i te s t e ( ) { / / s e c i t e .:;o t e matricea de ad ia c e n ta } v o i d i n it () { s t ! k J ~ O ;}
int s u c c e s 6 r () { i f (st[KJ< n) {s t[ k J = s t [kJ +l ; r e t u r n 1 ; } else r e t u r n 0 ; ) int valid () {if ( k > l & & a [st[k -l ] J [ c t [ k] ] ~ ~ O ) retu rn C; for (i n t i = l ; i
Informatica
263
2.7.1Q .3. Graful eulerian intr-un gr at G=(X ,Uj , se numeste lant eulerian lantulcare confin e toate muchiile gratului, fiecare muchie fiind prezenta a slnqura data. Un lant este eulerian daca porneste de la un nod oarecare 'Ii parcurge a singura data toate rnuchiile grafului (este un Ian! simplu care parcurge toate muchiile grafului). Lantul eulerian in car e nodul initia l coincide cu nodul fina l se numss te ciclu eulorian. Ca i ntr-un graf sa ex iste un ciclu eulerian este necesar ca , pe langa un lant eu lerian , sa mai
existe si a much ie care sa lege primul nod al lantului de ultimul nod al lantului, 'Ii acea muchie sa nu rnai fi fast parcursa . Un graf c are contine un cicl u eu lerian so numesto graf eulerian. .Altlel spus, un graf eulerian este un graf in care, pornind de la un nod oarecare se pot parc ur ge 0 sinqu ra data to ate m uchiile grafu lui , revenin d la nodu l initial. Graful G" din figura 40 contine ciclul eulerian C= (1, 4, 6, 7, 4, 5, 7, 8, 3, 2, 8, 5, 2, 1}. Ob serv ati i 1. Un graf eulerian poate co nt ine no duri izolate 2. Pentru ca un graf poata fi tacut eulerian prin adEiugarea muchiilor trebuie sa fie i ndeplinite urmatoarele conditii:
~ 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
4
5
6
7
3
8 .
Fig.40
din numa rul de nod uri eu grad impa r.
[ §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,
~," ~
oresulu! """" '" Problem: un traseu prin care un vizitator sa parcurga toate ~ cele patru sectoero ale oresutui lA, B, C § ! 0), ~~ in tcrceti du-se in punclul de unde a plecat, trecetid peste fiecare pod a singura data. 0...-"": $~
-
r
,
~
...
~
~
~~~ . ~ . ~,
a\ ,
,
"
~_
Cele patru zone (notate ~~ Fig. 41 ." , ~ cu A, S, C 'Ii D) 'Ii cele sapte poduri (notate cu a, b. c. d, e, si f) reprezinta nodurile unui e) graf neorientat G" (figura 42), lar muchiile reprezinta posibiiltatea de a treee pe un pod dintr-o zona, In alta zona . Problema consta In a gasi In aeest graf un ciclu care sa parcu rqa toate muchiile a sinqura
F' 42 Ig.
data, adica un ciclu eulerian. Matematicianul Euler a demonstrat maternatic, in anul 1736, ca aceasta problema nu are soluni ~ (ca acest graf nu este eulerian). ~
264
I mplementarea strueturilor de date
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
(2)=>(1) - prin reducere la absurd . Presupu nem ca graful G nu este eulerian. Graful fiind conex, nu confine noduri izolate . Fie doua nodur i oa recar e x :;;i Y lntre ca re exls ta 0 muchie ([ X,y] EU ). Nodul Y evano gradu l un numar par, tnscamna CEl exista un nod z cu care formeaza 0 much ie ([ y,z] eU ). Continuand in aces t mod, se ajunge la un nod W care forrneaza much ie cu nodu l x ([ w ,x] eU ), deoarece :;;i grad ul nodului x este un numar par. Rezulta ca in graful G exista un c ic lu Vom cons idera, dintre ciclurile care exista i n acest graf, ciclu C de lunqme maxima, dar care , conform presupunerii facute , nu confine toate rnuchiile grafului. Pentru fiecare nod din acest ciclu se consume doua unitat i din gradul lui. cautarn 0 muchie care nu face parte din cic lul C , dar este incidents cu un nod din ciclul C. Aceasta much ie exista deoarece oaca nu ar fi, ciclul C ar forma 0 cornponenta ccnexa , ceea ce contrazice ipotez a ca graful G este conex. Fie muchia [X,Y] EU, cu XEC . Pom ind de la aceasta muchie, pe muchii care nu apartin ciclului C, trecand prin noduri ale ca rer gra de nu au fast epu izate , se obune . dupa un numar finit de past, un no u cic lul C1 care se inchide in nodul x . Prin concatenarea celor doua cicluri care au un nod comun (x) . se obtine un cicJu de lungime mai mare deca f ciclul C, ceea ce contrazice presupunerea ca ciclu C are cea mai mare lung ime . lnsearnna ca el confine toate much iile grafului :;;1 graful este eulerian. Observatie, Aceasta teorema. precizand conditiile necesare ~i suficiente ca un graf sa fi e eulerian , poate fi fo los ita pentru a construi un algoritm care Sa verifice daca un graf es te eulerian .
G34
1. Verificati condititle din teorerna pentru graful eulerian G32 din figura 40. 2. Verificaf daca graful G 34 =(X34.U34) cu X34={1 ,2,3,4,5,6.7) "i U34={[ 1,2], [1,3], [2,3], [2,4], [2,5], [3,5], [3,7], [4,5], [4,6], [4,7J, [5,6]) esle eulerian. Daca gra fu l este eulerian , gasiti un ciclu eulerian ~i verificati daca graful Indeplineste condi-
tiile precizate i n teorerna. 3 . Dernonstrati CEI l ntr-un graf conex G exista doua noduri diferite x si y leg ate printr-un lant eulerian - dac a si nu m ai d aca ele suntsi ngurele noduri cu g rad impar di n g ra f. 4 . Desenati toate grafurile euleriene cu 4 nod uri.
G"
"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 mp leme nt area structurilor de da te
Aigoritm ul pentru dcte rminarea cic lulu i eulerian este urrnatorul: PAS1. Se citesc va lorile pentru va riabilele de mem orie n si m ~j matri cea de adia cen ta a . PAS2. Se ver ifica daca graful este eulerian. adica daca l ndeplineste cond itia sa nu alba noduri izolate, nodurile sa aiba grad e pare ~ i sa fie co nex : (in imp lementarea algorit mului: e u l e ri a n = ! v izolat ( ) &&g r a d p ar () && oon e x () ). PAS3. Daca grafu! nu este' eul erian( variabila eUl er ian~re valoa rea false), atunci S8 afiseaza m esaju! 'Grato! nu esle eulerian' fji S8 terrnina algoritmul; alttel , S8 serie me saju l 'Graful este eulerian' si S8 trece la Pasul 4 pentru a determina un ciclu eulerian . PAS4 , Se pleac a dintr-un nod oareca re (de exempl u, nodul 1: e [ 1] =1) PASS. Ex ecuta urrn atorii pas i pentru a construi i n vectorul c un prim cielu prin parcu rgere a din apro ape in aproape a muchiilor grafului, pornind de la nodul eu etieheta j eq ala cu 1: j ~ 1 (acest cielu exista, deoarece grad ul nodului de porni re este par, eeea ee lnsearnna ca orieare ar fi muehia pe care se porn este, mai exis ta cel putin a muc hie care soseste i n acest nod) . PAS6 . Cat t i m p nu s-a qasi t a muchie lntre nodul curen t k din coa da c (e [ k n.~ i un alt nod j din graf (j<=n ) exec ut a: PAS? Daca exists a muchie i ntre nodul curen t k din coad a C (c [ k ] ) ~i un alt nod j din graf (a [ e [ k] ] [j ]~~1 ) , atunc i se trece la Pasul 8; altfel, se trece la Pasul 11. PAS8. Se adauqa nodul j la coada C ( k ~ k + 1 ; e [k] ~ j ;) . PAS9 , Se micsoreaza cu a unitate grad ul celor doua nodu ri parcurse (g [ j ] -- ; g[e[ k -1 ] ] -- ; ). PAS10 . Se ste rqe din matricea de adi ac enta muchi a pa rcursa (a [e [k ]] [ j ] =D ; a[j] [e[k]] =D;). PAS11 . Se trece la urrnatc rul nod prin ' incrementarea lui j (j ~j+ 1) si se revine la Pas ul 6. Pana can d nodul curent din coada c (c [k]) este diferit de nodul de pornire. PA S 2. Cat timp rnai exista muchii care nu au fast incluse i n ciclu (k - l
typedef s t i.va [20 J ; int n,o f20 1L2 0J , v i zi t a t [ 2 0 J , v f, k , r:l , g l 2 0 1 ,p= l, cf 2 0 1 , cl I 20 j; stivu st ; fs t r eam
f ( " ':J :::- a f ~ e . t x t " , i o s ;
;i n ) ;
void c i t e s t e{ ) { / / s e c it ~~ t e matricea d e a d i a c e n t ~ } voi d i.n it( i r: t i) { v f = l ; s t j v f l e i : v .iz i t .a t Lt l e-L r } i n t e s t e j v ida ': ) {retur n vf ==O; } voi d 2 daug( i n t i ,1 { v f + +; s t j v'fl e i : v i z i t at[i ] = 1; } v o id e Li.rni n t ) {v t':"'_;}
I nfo r mat ica voi d l i nt
267
p r .eLuc r-a re t) k ~ st I v fl .
i~l ;
( i < ~n && (a[i][kJ ~~ O I I (a[ i ] ! k J~~ l && ( i = = n +1 ) el f rrun (} ; e lse {p..j'+; a d a u g ( i ): }} i n t c one'x () ( k= ).; .i n i t ( k ); whil e
vizitat[iJ ~ ~l )))
i ++ ;
if
while ( ! es te v ida () ) prel u crare \) ; r etu r n
(p==n) ; }
v o id g r a d ( )
{for (int i =l; i <=n; i ++ ) f or (i n t j ~ 1 ; j< ~n ; j++ ) if (a[i J [ j J == l ) ( g [i J++ ;m++ ; I m=1n/2 ; 1 i n t Lz o La t t.) {for (int i =l;i <=n; i ++ } if (g [i J=~O) return 1 ; r e turn Of} in t crad pe r l ) { f o r {i n t i~l; i <""n; i ++ ) i f (g [i J %2 == 1 ) return 0 ; return 1;} void c I'c Lu L) (int i, j ,k= l , p , g ,ga s i t ; c[ 1]=1 ; do for ( j=l, g as i t :::: O; j <=n && ! g a s i t; j + + ) if (a[ c[kJ][j]==1) ( k~ k +l; c[k J ~j ; a[ c[ k -1 J hiJ =O ; a [ jl [c ! l:- 1 JJ ~O ; g[ jJ - - ; g [ c j k- 1 J l--; ga.i t=l ; 1 wh.i Le Lc l k.] != 1 ) ; while
(k- l
(for ( i = l, q ~ O; ~ <=k- l
&& q ==O; i
)
if (g[ c[ i Jl>O I { c l Ll l s c l i.i . q= L I 1 1"= ." do for ( j =l/ g a s i t = O; ~I < = n && !gasi t ;j++) if (e l c L j p l ] [j l ~ ~l) ( p ~p q; c Lj p j e j: a [ cl [p- 1 J Uj J ~ 0 ; a U J [ c l [1"- 1J J = 0; 9( j ] -- ; 9 [ c lf 1"Cl J J - - ; gas i t =1 ; ) while (e l [ p J '= c 1 [ lJ) ; for (j = k; j > ~q ; j -- I e [j +p -1J ~ c [ j J; for ( j =1; j<=1'- 1; i H) c !j+cjJ
Observatie . Daca graful contine noduri izolate, alqoritrnli anteriori se pot ap lica pe subqraful conex care se obtine dup a tnlaturarea nodur ilor izolate . _....-... 1. Deterrninati comp lexitatea algoritmu!ui de qasire a unui ciclu eulerian. 2. Scrieti un prog ram care citeste din fisierul text graf_e1 .!x! matricea de adiace nta a unui graf eule rian si, de pe ultirnul rand, un sir de numere care reprezinta etic hete de noduri - ~i care verifica daca sirul de etichete reprezinta un ciclu eulerian . .
268
Implementarea strueturilor de date
3. Scrieti un program care citeste din fisierul text grale2./x/ matricea de adiace nta a unui graf neorientat care poate contine nodur i izolate si care verifica daca graful este un graf eulerian, iar daca este graf eulerian, aflseaza ciclul eulerian. 4. Scrieti un program care citeste din fisierul text grale3.txt matricea de adiacenta unui gral neori entat conex ~i care verific a daca graful este un graf eulerian, iar dac a nu este, verifica daca poate fi facut eulerian - In aces t caz, S8 prec izeaza nurnarul de m uchi i care treb uie adauq ate ~i care sunt aceste m uchii .
2.7.10.4. Graful turneu Un graf orientat in care , intre oricare doua noduri exista un singur arc ~i numai unul, S8 numeste grat turnou.
;;": Gj,. Exemplu - Gralui G 37 din figura 43 Observa tli 1. Arcul dintre doua noduri poate ave a oricare dintre cele doua orlentari . 2. Gralul tum eu este un gral complet .
Teorerna 20
~ ~ Fig . 43
Orice graf turneu contine un drum elementar care trece prin toate nodurile grafului. Demonstratle - prin reducere la absurd. Presupunem ca nu exista un drum elementar care trece prin toate nodurde grafului. Conside rarn D (xj, xj ) un drum de lungime maxima din graf s! un nod x eD(xj, xj), Graful turneu fiind un graf cornplet, tnseamna ca nodul x este adiacent cu orice nod din drumul D( x i, xj) , inclusiv cu nodurile Xj si Xj. Pot sa apara ur rnatoarel e situ atii: -7 Exista arcul [x.x.] . i n acest caz, tnseamna ca exista drumul D(x ,xj) mai lung decat drumul D( xj ,xj) , ceea ce contrazice ipoteza. -7 Exista arcul [xj .x] . in acest caz, tnseamna ca exista drumul Df xr.x] mai lung cecat drumul D (x j,xj ). ceea ce contrazice ipoteza. -7 Nu exista arcele [X,XiJ :,?i [xj,x] . Oeoarece graful este complet, inseamna ca exista arcele [xj.x] :,?i [x.xj] . Daca pentru orice nod XkED(Xi,Xj) exista arce numai cu sensul [Xk,XJ. tnsearnna ca exista -drurnul D,{ xj, xj) mai lung cecat drumul D( x j,xj ), deoarece contine in plus muchiile [ Xj.1,XJ :,?i [x ,Xj]. Daca pentru ortce nod XkED (Xj,Xj) exlsta arce numai cu sensul [X,XkJ, tnseamna ca exista drumul D 2(xj,xj) mai lung cecat drumul D(xj ,xj) , deoarece confine in plus muchiile [Xj,x] :,?i [X,Xj+1]. Daca exista doua noduri adiacente Xk ~i Xk+1, care apartin drumului D( XhXj) pentru care arcele incidente cu nodul x au sensuri contrare, se obtine un drum D3(x j,x;) mai lung cecat drumul D (x j,xj) , deoarece coni ine ~i arcele [Xk,X] ~i [X,Xk+1J. ceea ce contrazice ipoteza. Rezulta CEI drumul D(xj ,xj) contine toate nodurile din graf.
Propozitia 10 Pentru mice gral tumeu, exista un nod x, astl el inca t toate nodurile y"x sunt accesibile din x pe un drum care contine un are sau doua aree . nemonstrat!e - prin reducere ia absurd. Consiceram nodul x cu gradu l extern maxim - p
Inseamna ca intre nodul x ~i celelalte p noduri exista un drum format dintr-un singur are, Sa presupunem ca printre ceJelalte noduri exlsta un nod y care nu este aeeesibil din nodul x prin coua arce. lnseam na ca din aeest nod pleaca p aree entre nodurile care sunt aecesibile printr-un singur arc din nodul x ~ i un arc catre nodul x. lnseamna ca nodul yare gradul p+1, mai mare decat gradul nodului y, ceea ce contrazice ipoteza
Propozitia 11
Pentru m ice nod Xi dintr-un gral tumeu cu n noduri, d+( Xi) + d-(X j) = n-1 .
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
Ln d+( \ ,) = L" d- (\,) = C;
, unde Xi este un nod din grato
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
intr-un gra! turneu
"
n
i", )
1= 1
L d ' ( \,)' = L .r (\, )' , unde Xi este un nod din grato
Dernon st ratie . d' (x,)' + d-(Xi)xd' (x,) = (n-1)xd' (x,) s! d-(x,)' + d' (x,)xd-(x,) = (n-1)xd-(x,) Scazand cele doua identitati, obtinem d +( x/ - d- (x/ = (n-1)x(d+(Xj) - d- (xj)). Acunand aceasta identitate pentru loate nod urile Xi obunern: n
n
i- I
i- I
L d + (\ , )' - L d" (\ , )'
n
= ( II - I) x (L d' (\ , ) i -I
n
L d- ( \ ,»
= (II - I ) x (Ill - Ill ) = 0
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
lmplerncntarcu st r uc tur tlor de d at e
PAS
Pentru noduril e cu eticheta i de la 3 pima la n exec ut a: PAS4 . Daca exista arcul [ i , 1], atu nci pozitia de insera re k a nodului i este 1 ~i se trece la Pasul 7; aItfel , pentru a parcurge nodurile din drum se initiallzeaza indicele j cu vaioarea 1 si S8 trece la Pasul 5. PASS. Cat tirn p nu s-a ajuns la capatu l vectoru lui 0 (indicele j nu are valoarea m) ~i nu s-a gasit pozitia de inserare a nodului .i.. ex ec uta : j PAS6 . Dac a eXi~ta arcul i ntre nodul cu indicele j din drum ~i nodul i ~i J exista ~i arcul intre nodu l i si nodul cu indicele j + l din drum , at u n ci j pozitia de inserare k este j + l ; alttel , se trece la urrnatorul nod din ! drum prin incrementarea variabilei j ~i se revine la Pasul 6. ! PAS7 . Se deplaseaza eleme ntele vectorului din pozitia k (de inserare) spre , dreapta. ! PASa. Se inserea za nodul i In pozitia k. ! PAS9 . Se incrementeaza lungimea m a drumu lui 0 si revine la Pasu l 3. ~
Impleme ntarea alg o ritm ului. lnforrnatiile despre gralul neorientat se gasesc in fisierul grafJtxt: pe prima linie num arul de nodur i, apo i matr icea de adiacenta. Nodu rile drumului elementar vor fi genera te in vectoru l n . Se lolosesc urrnatoare le functi i; ci t es te ( ) pentru a citi matricea de adiacenta din fisier, gene r are () pentru a genera vectorul D l?i a r i.aa r e () pentru a afisa drumu l elementar gasit. in -functia gene r a re () S8 folosesc urmatoarele variabile locale: i - pentru eticheta nodului care se adauqa la drum, j - pentru a cauta eticheta nodului dupe. care S8 insereaza in drum nodul cu eticheta i, k - pentru pozitia in care S8 inse reaza i n vectorul drumului nodul cu eticheta i, m - pentru lungimea drumu lui la un moment dat (numarul de noduri adauqa te la drum) ~i gas i t - pentru a sti daca s-a gasit pozitia de inserare a nodului i in vector (este 0 varia bila logica - pentru fiecare nod i este inltializata cu valoarea False - 0 -' , cu sernnificatia ca nu s-a gasit i nca pozitia de inserare). Pentru testarea programulu i se foloseste gralu l G37. #include < f s t r e a m. h > i nt n ,a[10 ] [ 10] , 0 [1 0) ; fst ream f ( ''r,;r a f _t . txt '' ,ios : :in i i void c i tes t e () { I I se ci t e s ce me tr i c e a de ad .iacen t a } vo id g e ner a re ( ) (i nt i ,j ,k ,m=2 ,gasit ; if 1,,[1; [2)~~1) ( O l l J~ 1; 0[2J~2 ; ) e lse { D [ l J =2 i ~[2] =1 ; } for ( i =3 i~<=n ii++) {if t a l L] [0[1] J ~ ~l) k ~ l; else {fo r . (j=l,gas it =O ;j<=n && ! g a si:: ;j":-+ ) i f ia[D[j:J [i]~~ l & & ali] [ D [ j +l ]] ~ ~l ) qa s Lt e l , ;:=j+1 ; ) f or ( j ~m+ 1;j> t: ;j - -1 0[ j l ~ 0 [ j -1 J ; D j k l e.i : m++ ; ) ) v oid afisare () {for (i n t i =l i i <= ni i ++ ) c o u t« O[ i ] « " " i } v oi d ma i n () { c i t e ste \} i qe n e r ar.e () i a f Lrsa z..e () i }
Daca graful G 37 din figura 43 este gralu l unui concurs hipic; dete rrninati traseul pe care trebuie sa-l parcurqa un cala ret.
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
_
~
cunosc prirnele trei erase prin care trebuie sa treaca lraseul. Etichetele oraselor initia le se cornunica de la tastatura . lndicatie. Dodecaedrul poate fi reprezentat cu ajutorul unui graf neorientat. in care trebuie sa se gaseasca un circuit hamiltonian . Nodurile sunt cele 20 de varfuri ale poliedrului (figura 45).
Fig . 45
4. Joc ol de sa h . Sa se gase asca un traseu de acoperire a lablei de sah cu una dintre piese (piesa tre buie sa treaca 0 sinqura data prin fiecare dinlre cele 64 de patrat e ale la blei de sah ,i sa revina la pun ctul de plecare). Piesa poate fi: a. calul - se cepl aseaza in forma de L (problema a fost studiata de Eule r i n anuI 1759); b. dama - se dep laseaz a in oricare dintre patratele adiacente; c . nebunul - se depla seaza numai i n patratele afiate pe diagonala patratului i n care se gase,te ; d . tura - se deptaseaza num ai i n patratele afiate pe verticala sau pe orizontala fa\a de patratul in care se gase,te . tn dicat ie. Ta bla de sah poate fi reprezentata cu ajutorul unui graf neorrentat i n care trebuie sa se gaseasca un circuit ham iltonian . Nodurile sunt cele 64 de patrate ale lab lei de sah, jar intre doua nod uri exista muchie numai daca piesa pea te sa se deplaseze i ntre cele doua patra te, conform regu lilor jocului. 5. Scri ef un program care sa demenstreze ca problem a podurilor din ora sul Ko nigs· ber g nu are solut ii. 6.
a persoana dore ste sa viziteze mai rnutte cabane, legate prin trasee turistice , astfel l ncat sa parcurqa fiec are traseu 0 singura dat a , i sa se relntoa rca la locul de plecare . Leq atura dire cts dinIre doua cabane este caracterizata prin timpul necesar parcurgerii traseului de rnunte (costul asoc iat fiecare i muchii ). Scrieti un progr am care sa gaseasca traseul turistic si care sa determine timpul necesar parcurgerii lui.
272
lm pl em cntarca st r uct u r ilor de d a te
7. Masa rot unda a reg elui Arthur. Scrief un program care sa afiseze sotutia araojarii la masa rotunda a rege lui Arthur a celor 2xn cavaleri, stiind eel fiecare dintre cavaleri are n-1 dusrnanl ~ i ca la rnasa nici un cavaler nu trebuie sa stea Ifmga dusmanul lui. lnd icatie. Relatiile dintre cavaleri pot fi reprezentate cu ajuto rul unui graf neorientat in care nodurile sunt cavalerii, iar muchiile leaqa numai cavaleri care nu sunt dusrnani. Dernonstrati eel acest graf es te un graf eulerian ~ i gasiti un ciclu eulerian . 8. Scrieti un program care sa gaseasca solutia de a dese na figura 46 fara a ridi ca creion ul de pe hattie ~ i fara a trece cu creion ul pe a latura deja ce sen ata. ln d icatie . Figura geomet rica poate fi re prezentata printr-un graf neorientat , in care nodurile sunt varfurile figurii, iar rnuchiil e, laturile . Prob lema cons ta i n a gasi in acest graf , Fi . 46 care nu este eulen n, un lant euleria n. 9 9. 0 compet itie sportiva se desfasoara prin meciuri directe intre doi participanti. Nu exists meciuri nule ~ i nici meciuri eliminatorii (trebuie sa existe cate un meci int re fiecare doi participanti). Scrieti un program care sa afiseze 0 solutie de organiza re a cornpetitie sportive (ordinea de desfasurare a meciurilor). lnd icati e. Deoarece doi participanti nu joaca impreuna decat un singur meci, rneciul va fi defimt prin relatia nesirnetrica sportivul x [oaca cu sportivul y (adica, daca sportivul x joac a cu sportivul Y. atunci sportivul y nu mai joaca eu sportivul x). Graful campionatului este un graf orientat, in care nodurile reprezinta sportivii. iar muchiile, meciurile. Prin modul de organizare a cornpetitiei. el este un graf turneu.
@
Adovarat sau Fals: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Nodul x este incident cu nodul y daca forrneaza Irnpreuna 0 rnuchie. Gradul intern al unui nod dintr-u n graf orientat este egal cu nurnarul de arce care ies din nod. Intr-un graf orientat, rnultimea predecesorilor unui nod este fermata din rnultimea nodurilor de la care ajung arce care intra in nod. intr-un graf oriental. suma gradelor interne si a grade lor externe ale tuturor nodu rilor este eqala cu dublu l nurnarului de muchii. Matricea de incidents a unui graf orientat este a matrice binara. in tr-un graf oriental. nurnarul de vecini ai unui nod este egal cu suma dintre gradul intern ~ i gradul extern ale nodului. Lista de adiacen ta a unui graf orientat este fermata din Iistele vecinilor fiecarui nod din graf . Graful nul corinne numai nodur i izolate. Un graf neorienta t cu 5 noduri poate contine maxim 10 much ii. Un graf orientat cu 4 noduri poate cont ine maxim 12 arce. Un subgraf se obtine prin eliminarea unor rnuchii (arce) din graf. intr -un lant elementa r fiecare muchie se parcurge 0 sinqura data. int r-un ciclu elementar 0 muchie poate fi parcursa de mai multe ori. Un drum este un lant in tr-un graf orien tal. in matrieea dr umurilor elementul a[ilDl are valoa rea 1 numai daca exista un drum de la nodul i la nodul j ,?i un drum de la nodul j la nodul i, 0 cornponenta cone xa a unui graf este un graf partial conex al acestu ia. Prin parcurgerea in latirne a unui graf se pot determina componentele conexe ale grafului.
Infurmat ica
273
18. Un graf conex cu n noduri 19. 20. 21. 22. 23.
24. 25. 26. 27.
~i
n-1 muchii confin e eel putin un ciclu .
U n graf tare con ex e ste un graf orientat conex. Un gr af bipa rtit com plet este un graf comp let care este bipartit. Cu patru nod uri se pot gene ra 14 grafuri bip artite complete. Un graf ha miltonian poate co ntine noduri izolate. Dati; tntr-un graf cu n no dur i (n"53) gradul fiecaru i nod este mai mic deca t n/2, atunci graful nu este hamiltonian. l. antul euleria n este un lant elementa r car e parcurge toate muchiile grafulu i. Un gr at eulerian poa te contine p componente co nexe , cu cond itia ca p-1 compon ente conexe sa fie formate numai din nod uri izolate. in tr-un graf turneu cu n nodu ri, suma dintre gradul intern si grad ul exte rn ale ori carui nod este n . Num aru l de arc e dintr-un graf turneu cu n nodu ri este n x( n- 1)/2 .
Alaqeti: 1. Deterrninati nurnarul total de grafuri neorientate distincte cu 3 nodu ri. DOUEl grafuri S8 considera distincte daca matricea lor de adiacenta difera . a. 4 b. 7 c. 64 d. 8 (Bacalaureat - Sesiunea special a 2003 ) 2. Nurnarul de grafuri orientate care S8 pot construi cu 3 noduri este: a. 8 b. 9 c . 64 d . 16 3. Numarul maxim de aree intr-un graf orientat cu 5 noduri este: a. 5 b. 10 c. 20 d. 25
Urrnatorii 12 item i se refera la graful neorientat cu 8 ncdu ri si avand much iile [1 ,2], [1,3], [1,4], [1,5], [2,3], [3,4] , [3 ,7J, [4,7] . [4 ,5). 4. Numarul de noduri care au gradul maxim este :
a. 1
b. 2
c. 4
d. 3
c. 0
d. 3
5. Nurnarul de nodu ri izolate este:
a. 1
b. 2
6. Numarul de e lemente de 0 din ma tricea de adiacenta este: a. 9 b . 18 c. 20 7. Nurna rul de elemente de a din matricea de incid enta este : a. 18 b. 9 c . 36 8. Suma elementelor de pe Iinia 1 din matr icea de incid ents este:
a. 8
b. 4
c. 2
d. 46 d . 54
d. 6
9. Numarul de ciclu ri e lementare de lungime 4 este:
a. 4
b. 3
c. 6
t n.Nurnarul de lanturi elementare de lungime 4 este a . 16 b. 8 c . 10 11. Numar ul de lan tur i eleme ntare in tre nodu l1 :;;i nodul7 este:
a. 6
b. 3
c. 4
d. 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
Im p lcmcnta rca structurilo r de date
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
17. Nurnarul de elemente de 0 din matricea de adiacenta este: a. 9 b. 18 c. 26 18.N umarul de elemente de 1 din matr icea de incidenta este:
d . 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
de lanturi elementare de lungime 4 este : b. 8 c. 10 de circ uite elementare de lungime 4 este : b. 4 c. 3 de lantu ri elementare l ntre nodu l 1 ~ i nodu l 6 este : b. 3 c. 4 de dru mu ri elementare lntre nodu l 1 si nodul 6 este :
d. 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
(Bacalaureat - Sesiunea august 2003) ~ 3 28. Se considera graful neorie ntat din fig ura alaturata. Sa se determine care dintre urmatoarele liste reprez inta lista de adiacenta a nodului 3: 2 4 a. 1 2 4 b. 3 1 2 4 c. 24 d . 1 34 (Bacalaureat - Sesiunea lunie-iulie 2003 ) 0 o 0 29.Se considers un graf orientat avand matricea de adiacenta alaturata . 0 0 o 0 1 o 1 o0 0 Stabiliti care dintre nodur ile grafului au gradul intern egal cu gradul extern . 0 1 100
a. 3
b. 1
c. 0
d. 2
0 1
o
1 0
(Bacalaureat - Simulare 2003 ) 30.intr-un graf neorientat cu n noduri nurnarul maxim de muchii ce pot exista este: 2 a. nx(n+1 )/2 b. nx (n-1 )/2 c. nx(n -1) d. n (Bacalaureat - Sesiunea iunie-iulie 2003) 31 .Numarul maxim de muchii intr-un graf neorientat cu 8 noduri care nu contine niciun ciclu este: c. 27 d. 7 b. 8 a. 4 (Bacalaureat - Simulare 2005)
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
(Bacalaureat - Simu lare 2003) 34.Se cons idera graful neoriental din figura alatu rata . Sa se dete rmine M 3 etiche ta nodului care are lista de adiacenta 2 3 5. a. 5 b. 4 c. 3 d. 1 5 2 4 (Bacalaureat - Sesiunea iunie-iul ie 2003) 35. Se cons idera un graf orienta t dat prin listele de adiac enta : 1) 2 4 2) 4 3) 1 5 4) 42 3 5) 2 3 4. Stabiliti numarut de noduri care au gradul intern egal cu gradu l extern . a. 3 b. 1 c. 3 d. 2 (Bacalaureat - Sesiunea iunie-iulie 2003) 36. Numarul minim de nodu ri dintr-un graf neorientat cu 12 muchii , fara noduri izolate, graf format din exact 3 componente conexe: a. 7 b. 8 c. 9 d . 10 (Bacal aure at - Sesiunea specials 2005) 37.Nu marul minim de componente conexe ale un ui graf neorientat cu 9 muc hii ~i 12 nod uri este: a. 2 b. 3 c. 4 d. 5 (Bacalaureat - Sesiunea iunie-iulie 2005) 38.Ca re e ste nurnarul minim de much ii care pot II plasate intr-un graf neorientat cu 53 de nodu ri, astfel lncat sa nu existe nici un nod izolat? a. 27 b. 26 c. 53 d. 52 39.Se conside ra un gra f neorientat G cu 8 nod uri ~i 16 muchii. Nurnarul de noduri izo late din G este :
•
c. eel mult 1 d . eel mu lt 2 (Bacalaureat - Sesiunea iunie-iulie 2003 ) 40.Stabiliti care dintre urmatoarele matrice de adiacenta corespunde grafului din figura alat urata . b I 0 1 0 1 0 c) 0 0 0 1 1 d I 0 0 0 1 a) 0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 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-j»1 . 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
N
Implemcntarea structurilor de date
276
42.Care este matricea de adiacenta a unui graf neorientat cu 4 noduri, 2 muchii si eel putin un nod izolat? a)
0
1 1 0
1 0 0 0
1 0
1 0
b)
0 0 0 0
0 0
1 1
0 0
1
1
c)
0
1 0
0
1
1
0 0 0 0
0 0 0
d)
1 0 0 0
0 0 0 0
0 0
0
0
1
1 1
0
1 1
1
0
(Bacalaureat - Simulare 2004) 43.Se considera un graf orientat cu 6 noduri etiche tate cu numere de la 1 la 6 si 6 arce astfel lnca t exista un arc de la fiecare nod cu eticheta i catre un nod cu eticheta ix2 daca exists un astfel de nod sau catre nodul cu eticheta i-1 in caz contrar. Care este lungimea maxima a unui drum in graf?
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)
0
1
0
1
0
0
1
1 1
c)
0
1
1 1
0 0
1 1
1
d)
0 0
1
1 1
0
1 1
1
0
10
(Bacalaureat - Sesiunea speciala 2003) 45.1n matricea de adiacenta asociata grafului orientat din figu ra alaturata 3 nodurile sunt numerotate de la 1 la 4 corespun zator linillor matricei. Nurna rul de elemen te egale cu 1 aflate deasupra diagonalei princi pale • • depaseste numarul de elemen te egale cu 1 aflate sub diag onala 2 4 principa la cu 1 a. 2 b. 0 c. 3 d. 1 (Bacalaureat - Sesiunea iunie-iulie 2004) 46.Se considera un graf orientat cu nod urile numerotate cu 1. 2, 3, 4 , 5, 0 0 0 0 0 cor espunzator liniilo r matricei de ad iacenta alatu rate. Stabiliti daca 0 0 0 1 1 nodur ile 1 si 3: 0 0 0 0 0 a. apartin aceleiasi componente conexe b. sunt noduri izolate 0 1 0 0 1 c. sunt conectate printr -un lant d . sunt noduri ad iacente 0 1 0 1 0 (Bacalaureat - Simula re 200 3) 47.Care dintre urrnatoare!e secvente de nodu ri reprez inta un lant in graful o 1 0 1 0 1 0 0 1 0 neorientat dat prin matricea de adiacenta alatura ta stiind ca nod uriIe o 0 0 1 1 sunt numerotate de la 1 la 5 corespunzato r liniilor tabloului? 1 1 1 0 1 a. 3 4 1 2 5 b. 1 5 3 4 2 4 c. 4 1 2 4 5 d. 2 1 3 4 o0 1 1 0 (Bacalaureat - Sesiunea iunie-iulie 2004 ) 48 .Se considera graful neon entat dat prin matr icea de ad iace nta alaturata . in o 0 1 graf, nodurile sunt numerotate de la 1 la 4, corespunza tor liniilor tab loulu i. 1 0 0 1 o0 0 1 Sa se determine lun gimea maxima a unui lan\ ce uneste nod uriIe 1 si 3: 1 1 1 0 a. 1 b. 2 c. 3 d. 4 (Baca!aureat - Sesiunea iunie-iulie 200 3) 49 .Care dintre urrnatoarele secvente rep rezinta un drum in graful orientat dat o 1 0 0 prin ma tricea de adiac enta alaturata, stiind ca nodurile sunt num erota te de 1 0 0 0 1 1 0 1 la 1 la 4 coresp unzator liniilor ,i colaanelor tabloului? o 0 1 0 a. 3 4 3 2 4 b. 3 1 2 3 c. 2 1 3 4 d. 4 3 1 2 (Bacalaureat - Sesiunea special a 2004)
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
(Bacalaureat - Sesiunea iunie-iulie 2003) 54 .Numarul de grafur i canexe aciclice care
S8
pot obtine
CU
.
4 nod uri este :
a. 2 b. 4 c. 28 d. 24 55. Se co nsidera un graf orientat tare conex . Stabiliti nurnarul circuitelor care ccntin t08t8 noduriIe gralului : a . exact unul b. cel mult unul c. nici unul d. cel putin unul (Bacalaureat - Sesiun ea iunie-iulie 2003) 56. G radul maxim a l unui nod ce S8 poate obtine intr-un graf neorientat conex cu n noduri ~ i n-1 much ii este (s-a notat cu [n/21catu l Impartir ii Intreqi a lui n la 2): a. n- 1 b. [n/2] c. n d. 2 (Bacalaureat - Sesiunea iunie-iulie 2003) 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.
a . graful este conex c. graful este ac ictic
o
0 1 0 0 o 1 1 0 o0 o1 o0 o1 o1
o
0 1 0 1 0
b. orice noua muchie s-a r adauqa graful devine conex d. orice much ie s-ar elimina graful dev ine ac iclic
(Bacalaureat - Simulare 2003) 58.in gralul neorientat dat prin matricea de adiacenta alaturata numaru l de 0 0 1 0 componente conexe este:
a. 0 59. Stabiliti a)
0
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
(Bacalaureat - Sesiunea august 2003) 60. C ite graluri hamiltoniene se pot erea cu 4 noduri? a. 1 b. 2 c. 4 d. 5 61. Cate graluri hamillo niene se pot erea cu 4 noduri si 5 muchii? a. 1 b. 2 c. 4
d. 5
278
Implern en tarca structu rilnr de date
62. Cate graturi euleriene se pot crea cu 4 nodu ri?
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
0
c~ \
d'D
(Bacalaureat - Sesiunea august 2004) 66.Conslderand un graf neorientat avanc nodurile 1,2,3 ,4,5 , 6,7,8,9 cores punzato r liniilor mat rice i de adiacenta alaturate , stabiliti care dintre urrnatoa rele propo zltii este adevarata: a. este un grat bipart it b. este un graf conex c. este un graf eule rian d. este un graf hamiltonian 67. Cate muchi i are graful bipart it complet G=(X,U), cu 11 noduri ,?i cu rnultirnea nodurilor A si B definite astlel : AuB=X , An B=0 si card (A)=4? a. 4 b. 10 c. 16 d. 28
0 1 1 0 0 0 0 0
o
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
68. Care dintre urrnatoarele aflrmatii sunt adevarate? 3. un graf hamiltonian este un graf care contine un ciclu eleme ntar ca re trece prin b.
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
propr ietati ale matrice i de adiacenta a grafului turneu
si coloana je ste egala cu n ; 9i coloana j este eqala cu n -1 ; si coloana j e ste eqala cu n -1 , oricare a r fi i 9i j; ~i coloana j este eqala cu n, oricare ar fi i 9i j.
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
74. Se considers grafu l turneu care corespunde matricei de adicen ta de la problema anterioara, Un calaret care in cepe cu obstacolul 1 poate alege din n variante de trasee , unde n are valoarea : a. 2 b. 3 c. 4 d. 5 75. Conside ram un graf neorientat avand nodurile 1,2,3,4,5 corespun zator liniilor matricei de adiacenta alaturate. Cate muchii trebuie adauqats pentru ca graful sa fie un graf eulerian ~i hamiltonia n? a. 1 b. 2 c. 3 d . imposibil
o
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
Implementare a strucruri lor de da te
d. Sa
S8 reproiecteze reteaua prin adauqarea unui numar minim de leqaturi directe intre servere, astfel incat oricare dintre servere s-ar defecta , reteaua sa ramana functionala (cu exceptia clientilor serverului defect , restul clientilor trebuie sa aiba acees la resurse le retelei).
3. lntr-o tabrica S8 realizeaza un tip de prc dus care este format din mai mullte subansambluri. Fiecare subansamblu este produs de 0 sectie. Un subansamblu poate fi, la randul SaU , campus din alte subansambluri. Exista 0 sectie in care S8 asarnbleaza produsul final si sectii care , pentru a produce propriul subansamblu , nu au nevoie de subansambluri produse in sectii'e fabricii. Sectiile fabricii si relatiile dintre sectii pot fi reprezentate printr-un graf orien tat, astfel: sectii'e sunt nodurile grafului, iar arcul [x,y] insearnna ca subansamblu l produs de sectia x este folosit de sectia y . Desenat i 0 organigrama ipotetica a sectiilor fabricii. lnforrnatiile despre organigrama fabricii S8 citesc dintr-un fisier text: de pe prima linie n - nurnarul de sectii si m - nurnarul de arce ale grafului, de pe urmatorul rand un sir de n numere intregi care reprezinta stocul de subansambluri realizate in fiecare sectie , de pe urrnatorul rand un sir de n numere l ntregi care reprezinta nurnarul de anqajati din fiecare sectie ,i apoi, de pe urrnatoarele m randuri, cate trei valori numerice in tregi care reprezinta etichetele nodurilor terminale ale unui arc (x si y) §i nurnarul de subansambluri pe care trebuie sa Ie furnizeze sectia x sectiei y , pentru a se putea obtine a unitate din produsul final. Scrieti a aplicatie care sa furnize ze urrnatoarele inforrnatii: a. Sa verifice daca se poate realiza 0 unitate din produsul final folosind subansamblurile care exista pe stoc in sectiile fabricli. Oaca nu se poate realiza a unitate din produsul final, sa se precizeze sectiile care sunt vinovate ca nu au produs suficiente subansambluri. b. in fabrica, se inchid coua dintre sectiile care realizeaza subansambluri (subansamblurile se vor cumpara de la alti producatori). Etichetele nodunlor corespunzatoare acestor sectii se citesc de la tastatura. Veriflcati daca, prin inchide rea acestor sectii, alte sectii ale fabricii nu devin inutile. a sectie devine inutila atunci cane prin inchiderea unei alte sectii, subansamblurile produse de ea nu mai sunt necesare. Daca apar sectii inutile, in urma inchiderii celor doua sectii initiate. afisati eticheta corespunzatoare sectiei ~i inchideti ~i aceste sectii, Reorqanizati fabrica prin eliminare de sectii - pana cand nu vor mai exista sectii inutile. Afisaf nurnarul de anqajati care trebuie disponibilizati prin inchiderea sectiilor. Afisaf organigrama fabricii dupa reorganizare , prin etichetele sectiiior care au mai rarnas, si arcele dintre acestea. (Ind icatie, Cenerat i subgraful initial, prin eliminarea nodurilor corespunzatoare sectiilor care se inchid . Generati apoi subgrafuri ale ultimului subgraf obtinut prin eliminarea nodurilor care au gradul extern egal cu O. Subgraful final cbtinut va corespunde noli organigrame. Cand elirninati un nod, adunati !a nurnarul anqajatilor disponibitizaf anqajatii din sectia corespunzatoare nodului). 4. Pentru realizarea unui proiect trebuie executate mai multe activitaf (analiza, elaborarea modulelor de program, testarea, elaborarea docurnentatiei etc.). Unele activitati sunt concitionate de executia altora (de exemplu, nu se poate scrie un modul de program fara sa se fi Iacut analiza aplicatiei), alte activitati se pot desfasura independent unele de altele (se pot scrie module de program sau se pot testa unele dintre module, independent unele de altele). Fiecare activitate are un timp maxim de executie. Sa se reprezinte sub forma unui graf orientat activitatile de rea!izare a fiecaruia dintre miniproiectele anterioare :;;i sa se determine timpul maxim de executie al fiecaruia dintre ele.
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=)
s
6 Fig, 47
2.8.1.2. Proprietatlle arborilor liberi Teorema 21 Urrnatoa rele definitii sunt echivalente pentru un graf G cu n noduri ~i m rnuchii: (1) G este un arbore . (2) G este un grat aciclic cu n -1 muchii . (3) G este un grat cone x cu n -1 m uchii . (4) G este un graf tara cicluri maximal (c aca i n grafu l fara cic luri G unim doua ncduri oa recare neadiacente printr-o muchie, gra fu l obtinu t contine un cic lu). (5) G est e un grat conex minimal (daca in grafu l conex G suprirnam 0 muchie oarecare , graful obti nut nu ma i este cone x). (6) Orice p ere c he d e n o d uri este le qata p rintr-u n Ian! ~ i n u mai unul. Demonstratle. Este suficient sa se demonstreze implicatiile (1)=>(2), (2)=>(3), (3)=>(4), (4)=>(5), (5)=>(6) . i (6)=>( 1). Prin tranzmvnatea acestor impficatii rezutta implicafiile (2)=>( 1), (3)=>(2), (4)=>(3), (5)=>(4), (6)=>(5) .' (1)=>( 6). Din aceste implicatii rezulta ca (1)"",(2), (2)"",(3), (3)<0>(4), (4p(5), ( 5 )~ 6) ~i (6) c» ( 1). Din tranzitivitatea relatie i de echiva lenta rezutta oricare coua din cete 6 propozuii suntechivalente.
(1)::::)( 2). lpoteza: Graful G este cone x ~ i acic lic - din defin itia arborelui (1). Conctuzie : Graful G este aciclic ~i are "·1 muchii (2). Proprietatea ca graful G este aciciic este cornuna ipotezei ~i concluzie i, Trebuie demonstrat doar ca un graf co nex aciclic are n-1 muchii. Oaca G este conex aciclic. nu trebuie elirn inata rue 0 muctue pentru a se obune un graf partial conex acic nc. Cum nurnarul de muchii care trebuie eliminate dintr-un graf conex pentru a obt ine un graf partial conex acicuc este egaI cu m-n+1, Inseamna ca in acest caz, m-n+1=O . Rezulta ca m=n-1 . (2)=>(3 ). Ipoteza: Graful G este aciclic ~i are n-1 muchii - din de finitia arborelui (2). ConcJuzie: Graful G este conex ~i are n-1 muchii (3). Proprietatea ca graful G are n-t muchii este cornuna ipot ezei :;;i concluziei. Trebuie demonstrat doar ca un graful cu n -t muchii fiind acicl ic este ~i conex. Se stie ca intr-un graf cu p componente cone xe. numarul de muchii care trebuie eliminate pentru a obtme un graf partial aciclic este egal cu m-n+p
G ,~ .;: w,
,c,'!.';:
,.
282
lmplcmentureu strueturilor de date
Gratul G este aciclic (m-n+p=O)
~i
are n-1 muchii (m=n-1) st (n-1)-n+p=O. Rezulta ca p=1 (graful are 0
sinqura com ponenta conex a, deci este cone x). (3):>(4). lpote za : Graful G este conex ~ i are n-t muchii (3). Concfuzie: Graful G este aciclic max imal (4). G fiind conex, numarul de componente conexe p este ega l cu 1. Nurnarul de muchii m ale gra fului G este ega1cu n-t . Rezulta ca numaru l de muchii care trebuie eliminate din gra ful G ca sa se obtina un graf pa rtial aciclic este egal cu: rn-n- p > (n-1)+n+1 ;;: 0, adica nici 0 much ie. Rezulta ca gra ful G este aciclic, Grafu l este maxima l pentru aceasta proprietate, deoarece fiind conex , orice muchie [X i,X j]
care se va acauqa va forma un ciclu cu lantul L(xilxj) - existents acestui lant rezutta din conexitatea gratului G. (4):>(5). Ipoleza : Gratul G este aciclic maximal (4). Concluzie: Graful G este conex minimal (5). a. Presupunem ca gra ful G nu este conex. EI are cel putin dcua componente conexe : C 1 !iii C 2' lnseamna ca exista coua nodu ri xe C 1 ~i y EC2 pe care Ie putem lega cu muchia [x,Y]. Da r, din ipoteza , rezu lta ca once muchie am ada uq a Ja graf, e l va contine un ciclu . R ezu lta ca prin
adauqarea much iei [x,y] gratul va contine un ciclu
~i
ca, int re nodurile x
~i
y exista deja un
!an t ~i e le apartin ac el eia si co m po ne nte conexe , ceea ce co ntra zice pre supunerea
Ia cuta .
lnsearnna ca gratul G este conex . b . Presupunem ca gra tul G care este conex nu este minimal cu aceasta proprietate . Inse arnna ca prin eliminarea unei muchii se obune gratul partial H care are n noduri ~ i m-1 muchii , este co nex ~i aciclic, Gratu! G fiind conex ~i acidic, tnsearnna ca numarul de muchii care trebuie eliminate pent ru a obune un grat part ial conex aciclic este egal cu 0, adica m-n+1=0 ~i men-t . Numarul de muchii ale gra tului H este egaI cu rn-t =n-2. Fiind aciclic rnseamna ca nurnarul de much ii care trebuie eliminate pent ru a obfine un graf pa rtial aciclic este egal cu 0, adica (n-2)-n+p=0. Rezulta ca p=2, adica gratu l part ial H confine doua componente conexe, ceea ee contraziee presupunerea ca el este conex . (5):>(6) Ipoteza: Graful G este conex minimal(5). Concluzie: Grice pereche de noduri este leqata printr-un Ian! ~i numai unu l (6). Gratul G fiind conex , insearnna ca exista eel putin un lant care leaga oricare doua noduri x ~i y . Presupunem ca exist a eel putin doua renturt Intre nodurile x :;;i y : L1 si L2. ln searnna ca, suprimand 0 much ie din lantul al doilea , gratul rarnane conex , deoa rece noduri le x ~ i y vo r f legate prin lantul L 1 , ce ea ce co ntrazi ce ipoteza ca gratu l G este co ne x m inimal. Rezulta ca cele doua noduri x s! y nu sunt legate cecat printr.un singur tanto (6):>(5) lpo teza: Grice pereche de noduri este legata printr-un Ian! ~ i num ai unu l (6). Conciuzie: Grafu l G este conex ~ i aciclic - din definitia arborelui (1). Deoarece in gra ful G , or iee pereche de noduri x s! y este leqata printr-un lant, tnseamna ca gratu l G este conex. Presupunem ca gratul G confine eel punn un ciclu . Considerand dou a noduri oarecare x ~i y care apartm aeestui ciclu . tnsearnna ca intr e cere doua noduri exista doua lanturi diferite, ceea ce 7contrazice ipoteza. R ez ulta ca gratu l G este acicli c.
Propozltia 14 Gri ce arbore cu n no duri are n- 1 much ii. Derno ns tratie . Arb orele fiind un grat conex minimal, tnsearnna ca are n-1 muchii.
Propozitia 15. Grice arbor e c u " >=2 noduri contine eel pu!in doua noduri termina le. Dcm onstralie - prin reducere la abs urd. Presupunem ca nu exista decat un singur nod terminal X. Oricare alt nod din arbore are eel pulin gradu! 2. Alegem din arbore, dintre lanturile elementare
care au
0
extremitate in nodul x, lan\ul de lungime maxima: L(x,y ). Nodul y avand gradul
mai mare decat 1, inse am na ca mai exista , in afara nodului ca re iI pr ec e de in lant , eel putin u n nod z ca re e ste ad iace nt eu el. Lantul fiind e lementar, inseamn a cil nodul y nu exista in
lan\ decat la extremitatea lui, iar muchia [y ,z] nu face parte din lan\ ~ i putem adauga aceasta much ie la lan\. Lan\ul fiind de lungime maxima, i nseamna ca nodul z aparline
283
Inform nrica lantului si prin adauqarea acestei muchii la lan t definitia arborelui (graf aciclic).
S8
inc hide un ciclu , ceea ce contrazice
-------- -----.. 1. Precizati daca este arbore graful G4 0 (x" o, U40 ) definit astfel: X40={1,2,3,4,5,6,7,8,9,1O} U4o={[1,2J, [1,31 , [1,5J, [2,6], [2,7], [3,4], [3,9J, [4,8], [8,10] }.
0 40,: 0 "
, Jr
2. Oernonstrati ca un arbore este un graf bipartit. Reciproca este adevarata? 3. Scrieti un progra m care citeste dintr-un fi~ i e r text intorrnatii despre un graf neorientat (de pe primu l rand , nurnarul de nodur i ale grafu lui - n , iar de pe urrnatcarele n randuri matricea de adiacenta a grafu lui) ~ i care: a. verifica daca graful este un arbore: b.
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
2.8.2. Arborcle partial 2.8.2.1. Definitia arborelui partial Daca un graf partial al unui graf G este arbore, el se numeste arbore partialal grafului G. G " . ti;~~~~'·
, W'
c::=) Graful G 41 Teorema 22
Fig. 48
Un graf G contine un arbore partialdaca
Arbo re partial al grafurui G 41 ~i
numai daca este un graf conex
Dernonst ra tie . Notarn cele doua propozitii, astfel: (1) - Graful G coruine un arbore partial, (2 ) - Graful G este conex .
Trebuie sa dernonstrarn ca (1)=>(2) , i (2)=>(1). (1):::;::.(2). Sa considerarn ca graful G conune arb orele part ial H. Din deflnitia arbo relu i rez ulta ca H este un gra f conex. Din de finitia arbo relui partial rezurta ca H este graf partial al gra fului G. Deoarece graful G se obtine prin adauq area de much ii la un graf conex (H), este ~i el un graf conex. (2):::;::.(1). Daca G este un graf conex minima l, inseamna ca este un arbore (din Teorema 21: (1) e> (5)) ~i H=G, Daca G nu este un graf cone x minimal , lnsearnna ca exista 0 muchie [x ,y] pe care 0 putem elimina astfel incat sa obtmem un graf partia l conex G 1 . Daca graful partial G1 este un graf conex minimal, tnseamna ca H= G1; altfe l se repeta procesul de eumtnare a cate unei mucfui pim a se obtine un graf partial conex minima l. Acesta va fi arboreJe partial H.
2.8.2.2. Definitia arborelui partial de cost minim Conside rarn un graf conex G::::(X,U), 0 funcne c :U~R+ ca re asociaza fiecarei muchii u un numar rear pozitiv cluj, numrt co stul muchiei , ~i un graf H=(X,V) care este graf partial al
grafuru; G (V,;;U). Functla c se numeste functia cost Definim: Costul grafuluieste s uma cos tu rilor muchiil or grafului .
284
Implementarea stru ct urilor de dat e -7 costulgrafuluiG : c ( G ) ~ Lc(lI )
.
-7 costul gr afului part ial H: c( II ) ~ LC( lI ) v
Se nurneste graf partial de cost minim al unui graf G conex, cu functia de cost c . un gr af partial cone x H care are co stul minim . Teorema 23 Graful partial de cost minim al unui graf conex G, cu functia de cost c, est e un arbore . Dern on stratie - prin reducere ta ab surd. Daca graful G este un arbore, atunci H=G, deoarece orice muchie am elimina din G si-ar pierde proprietatea de conexitate. Daca graful G nu este un arbore, i nseamna ca el ccn tme un numar finit de grafuri partiale conexe. Alegem dintre aceste qrafuri
partiale graful H care este graful partial de cost minim. Presupunem eel acest graf partial nu estc arbore. lnsearnna ca el corinne eel punn un ciclu !?i exista 0 rnucrue u=[x ,Y] pe care 0 putem suprim a astfel tncat sa obtinern un alt graf partial conex H1. Rezulta ca: c( H )=c( H 1)-c( u» c( H 1)
Inegalitatea c(H»c( H1) contrazice faplul ca graful partial H este de cost minim. partial H este arbore.
lnseamna ca graful
A rborel e care este un gr af partia l de co s t minim al gralu lui conex G, cu fun ctia de c ost c . se nurneste arbore partial de cost minim (APM) .
[ §mdllll.ll. de caz ) Scop: ide ntificarea aplicatiilor in care se Iolose ste arborele partial de cost minim. Enuntul probleme i . a retee de cetcutetoero este formata din 7 cetcutotoero server conoetate intre ete si calculatoare cliont conectate ta servere. Unele servere pot fi tegate direct, enete nu. Pentru ca reteaua sa tunctionezo trebuie sa se esiqure transportul date /or intre oricete aou« cetcutetoere server (daua servere trebuie sa comunice fie prin /egatura directa, fie prin intermetiiut altor servere). Fiecare legatura onect« dintre doua 2 10 4 2 setvere are asociat un cost de constructie. Legaturife care se pot 5 face intre servere §i costume asociate acestor legaturi sunt 1 1 1 prezentate in figura 49. Sa se gaseasca a sotutie de construire a 8 3 }-- n--{ reteiei de calculatoare (de a lega setvetete intre ele) astfel incet g costul de realizare a retelei sa fie minim. Fig . 4 9
0 •• 0 retea de servere este un gral neorientat G" cu n noduri (i n exemp lu, n=7) , in care nodurile sunt serverele, iar leaqaturile directe dintre doua servere, much iile galului. Gralul este conex (oricare ar fi doua serve re din rete a, i ntre ele tre buie sa existe un lant care sa Ie perrnita sa comunice intre ele). Gasirea solutiei optime de conectare a serverelor, astfel tncat costul finan ciar sa fie minim , in seamna determina rea unui graf conex de co st minim , adica gas irea arborelui partial de co st minim al grafu lui. Observatie. Orice retea de transport (de calculatoa re, rutiera , de cale terat a, aeriana. de teteco muni cat ii, de ca nalizare etc .) este un graf neorientat con ex. Construirea cu 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. ~
--
285
Info rma t ica
2.8 .2.3. Algoritmi pentru determinare a arborelui partial de cost minim Algaritmii pentru determ inarea arba relui partial de cost minim folosesc strategia greedy: PAS1. Se alege un subarbore al arbare lui partial de cost minim - Hini' . PAS2. Gat timp nu s-a format arborele partial de cost mini m ex ec uta : PAS3. Se ale ge a much ie siq u ra din rnultirnea muchii lor nealese (rarnase), PAS4. Se adauqa muchia la subarbare. Mu chia siq u ra trebuie sa Indeplineasca urrnatoarele conditii; -7 sa alb a co stuI minim ; -7 sa apartina arborelui partial de co st minim . Dete rm ina rea arborel u i part ial d e cost mini m a) Algo ritmul lui Kruskal. b) Algaritmul lui Prim
S8
poate face prin:
Cei dai algar itml difera prin: -') modul i n care se aleg e subarbarele de la care se porne ste: -7 modul i n care este gasita 0 muchie siqura. a) Algoritmul lui Kruskal Graful partial al grafului G=(X,U ) care nu contine nici a much ie (are num ai nod uri izolate) este format din n arbo ri partiali disjuncti: H1=(X1,0) cu X1={X1} } H -X 0cuX -x
. 2~( 2, ) .
2~{ 2}
Hk=(Xk,0) cu Xk={Xk} . . . . .. .. . .. . . ... ............
x jn 0 , v i.] (1,;i,;n , 1 ~,;n X1 u X2 u X3 u ... U Xn- X
xt
~i b'D
H n=(X n,0) cu Xn={xn} Se porneste de la doi arbori partiali disjuncti Hi si Hj care S8 unif ica prin adauqarea une i rnuchii sigure . Mu ch ia s igura trebui e sa l ndeplineasca urrnatoarele conditii: -') sa alba costul minim ; -7 sa nu formeze cicluri cu muchi ile deja alese , adica extrem itatile sale sa apartina celor doua multirni disjuncte Xi ~i Xj - muchia este [Xi,Xj] cu XjEXi s i Xj EXj. Structu ra de date fo losita pentru implementa rea grafu lui este Iista muc hiilor. Pentru a qasi mai user muchia cu co stuI minim, lista much iilor este sortata crescato r, dupa cost. Algo ritmul pentru determinarea APM este urmatoru l: PAS1. Pen tru fiecare nod .i, din graf execu ta : se formeaz8 arborii partial i Hj. PAS2. Se sort eaza muc hiile din U in ordi nea crescatoa re a cost ului c. PAS3 . Se alege muchia u cu co stu I minim . PAS4. Se initializeaza APM cu muchia u PASS. Gat ti m p nu s-au selectat cele n - l muchi i exe cu ta: ! PAS6. Se alege 0 much ie sigura din rnultirnea muchiilor nealese (rarnase ) si se i forme aza un arbore partial cu aceasta muchie . 1 PAS? Se unifica APM cu arbo'rele format cu much ia siqu ra. Pentru a tine evide nta arbori lor partiali Hi care se dezv otta, se foloses te lista L i n fiecare element L(i ) al listei se rnernoreaza num arul de ordi ne al arborelui partial din care fac e parte nodul i. Initial, exist and n arbori partial! Hi. fiecare dintre ei contmand un nod al qraf ului, elementele liste i vor L( i)=i . pentru iE :1 , 2, 3, .. .. n }. Pe parcursul executarii alqoritmului, L (i)=j i nseamna CEl nodu l i apartine arbor elui cu numarul de ord ine j.
286
Implementa rea strueturi lor de date
Pentru ca muchia [x,y) care se alege sa fie 0 much ie sigura trebuie sa ind ep lineasca conoitile: -7 sa aiba costul minim - muchiile S8 aleg in ordine, din lista muchiilor, unde ele sunt aran-
jate in ordinea crescatcare a costului; 7 ex trernit atile sale Sa apartina la doi arbori partiali difen!i - trebu ie ca l(x)>,L(y). Dupa ce s-a qas it 0 rnuchie siqura , unificarea arbo rilor 58 face astfel: 7 Daca L(x)
Pentru graf ul G"
arbo rele partial din valoarea l(x) . arbore le partial din valoarea L(y) .
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]
Muchia cu cestui minim este [4,5"] - ,- ,,, L[4]=4 4, 5 c> L[4] _ L[5] Nodul i ~ m ~l L[5J~5 4<5 => L[5] ~ L[4 ]~4 L[i] I ~ m_n- l ~6 A rborii parti al! sunt: H, - ({4,5},{[4,5])) . i H i ~ ( { i } , 0 ) cu IE{l ,2,3,6,7}
I
Urmatoare a muchie cu costul mr ln""m= e",st" e-t1,-,,2'r-:::-r-:-r:~ -'-::-T--=-T":" L[l J~l 1, 2 => L[l ] _ L[2] Nodu l i 1 m ~3 L [2]~2 1<2 => L[2] ~ L[1]~1 L[i] 11 1 3 4 4 6 4 m,n- l ~ 6 Arbc rf part ial! sunt: H , ~ ( { 1 , 2 } , {[ l , 2 J} ) , H , ~ ( {4 , 5 , 7 } , {[4 , 5 J , [5,7])) .i Hi=({i},0 ) cu iE{3,6}
urmatoerea muchie cu costul m;:: ln" im=e",st"e-t4""", 6!,--.-_,--,---,-_.---, L[4]~4 4, 6 c> L[4] < L16] I Nodu t i 1 2 I 3 1 4 1 5 I 6 I 7 I m~ 4 L[6J=6 4<6 => L[6] ~ L[4J~4 I L[i] 1 1 I 3 I 4 I 4 14 I 4 I m.n -l ~6 Arb ori i parti ali sunt: H t ~ ( { l ,2},{[l ,2])), H, - ({4,5,6,7},{[4,5], [4,6J, [5,7])) .i H , ~ ( {3 } , 0 ) Urrnatoarea muchie cu costul mi :;; rnim.:..e",s"te"-\,1,,,,3" 'r-,,--,---,-_.---.-- , m=5 L[1]=1 h3 => L[lJ . L[3] 1Nod ul i 1 2 I 3 1 4 1 5 I 6 I 7 I L[31~3 1<3 => L[3] ~ L[ 1]~1 1L[i] 1 1 11 1 4 1 4 1 4 1 4 I m, n-l~6 Arbor ii part lall sunt: H t ~ ( { l ,2,3},{[1,2],[1,3]}) . ' H,- ({4,5,6,7},{[4,5], [4,6], [5,7])) Urmatoarea muchie cu costuI miin:;; ' lm.:..e",s"te"-\, [3",,6= -r-:-r:--,---:--r--::-.,--:-.-,,, m=6 L[3]~1 h 4 => L[3] , L[6] c:N,:,o,::d:.:lle.-1i:+-,1+-=--f--.":.+'-+~t-=+-'-j m=n-1 =6 L[6]=4 1<4 => L[6] ~ L[3] ~1 L[i 1 • i L[7] ~ L[6] ~ L[5) ~ L[4'-::]"' _ ""'L[""3],_.J... -l -'--'-'--L:....J....:..-L:-'-'--'--'---' Arborele partial de cost minim este: H t ~ ( { 1 , 2 , 3 ,4 , 5 , 6 ,7 } , ([l ,2], [1,3), 13,6], [4,5J, [4,6], [5,7]})
287
Infor ma tica
Pentr u implementarea algoritmul ui se folosesc urrnatoarele variabile ~i structuri de date: -7 variabile!e n si In pentru numarul de nod uri, respec tiv numarul de much ii ale grafulu i; -7 vectorul u , cu m elemente, pentru lista muchiilor; este un " f2\ vector de structun de tip rnuchie ; ~ \2.Z ~ -7 vectorul L , cu n elemente , pentru lista arbor ilor part iali: -7 variab ila ct pentru a calcula costul total al arborelui; -7 variabila k pentru a nurnara muchiile adaugate la arborele partial; initial are valoarea 0 - arborele nu contine nici 0 much ie - valoarea sa finala este n-1 (nurnarul de muchii ale unui arbore cu n noduri); -7 variab ila i pentru indicele cu care S8 parcurge lista muchiilo r; -7 var iabilele x 9i y pentru pentru a memora nodur ile de la extrernitatile unei much ii;
f4\-£
~i
subprogram ele:
-7 functia procedurala c i tire creeaza lista muchiilor u prin preluarea datelor din
fi~ i e r
i n fisierul costapm.txt pe primul rand se citeste 0 valoar e nurnerica ce reprezinta ordinu l grafului, iar de pe urmatoarele rand uri trei valori numer ice separate prin spatiu care reprezinta nodurile de la extremit atile unei muchii ?i costul asociat muchiei : -7 funct ia procedurala ini t initiafizeaz a lista L a arborilor part ial i Hi cu cei n arbori forrnati din cele n nodu ri izolate (arborii care nu contin rnuchii ): -7 functia procedurala sortare sorteaz a lista muchiilor crescator dupa costul asociat: #inc l u de <·fstream .h> f s t r e a m f. tvco s t. a pm , t x t " , ios: :in ); in t n , ffi ,L [2 0} ; I l x /y=noQur i much i.e : c =c ost ·.asoci at muchi ei struct muchi e tint x ,y ,c ; }; Jlu~li st a muchii lor mu ch Le u'[2 0] ; v oi d i n i t ( ) {for (i n t i= l ii <= n ii ++ ) L [i] = i ; } void citi r e (} {int i=O ,x fy / c ; £»0 ; wh ile (f » x» y»c) {i ++; u t i ] . x =x ; uli] .y=y ; uliJ . c=c ; } f . close () ; 1:1=i ; } void sort a r e () tint i ,j ; mu c h i e aux ; for (i =l ;i.
Complexitatea algoritmului lui Kruska l Pasul 1 are ordinul de complexitate O(n ). Pasul 2 are ordinul de complexitate in functie de algoritmul de sortare ales . Algoritmii de sortare prin metoda selectiei directe sau metoda
288
Implementarea st ru ct n r ilo r de d ate
bulelor au ordinul de complexitate O(m '). Pasul 3 nu se poate preciza de cate ori S8 executa . in cazul eel mai defavorabil, S8 parcurg toate cete m muchii, deci S8 executa de m ori. in cazul pasului 3, pentru fiecare muchie aleasa, S8 parcurg toate cele n elemente ale listei L. Rezulta ca pasul 3 are ardinul de camplexitate O(n xm) . Ordinul de complexitate al algoritmului va fi: 2 O(n )+O(m )+O(nx m) = O(max(m 2 ,nxm)) . Daca graful are faarte multe muchii , atunci ordinul sau de complexitate este O(m'). Pentnu graful G 43(x,,3,Ud din figura 51, determinati APM executand algoritmul lui Kruskal. Verlflcati daca solutia obtmuta este corecta executand programul pentru graful G.,.
b) Algoritmul lui Prim Algoritmul lui Prim S8 asearnana eu algor itmul lui Dijkstra pentru determinarea drumurilor de lungime minima in tr-un graf. In graful G=(X,U), subarbore le de la care se porneste Hini! este format dintr-un nod initial numit radacina (r - care S8 cornunica algoritm ului irnpreuna cu datele despre graf) si creste pana acopera toate nadurile din rnultirnea X. Daca arborele partial care se dezvolta este H=(A,V) . definim graful GA=(X-A ,0 ). Nodurile care fac parte din GA sunt memorate intr-o coada de prioritati Q. Coada de prioritati S8 deose beste de 0 coada simpla , prin aceea ca din ea nu se extrage primu l element introdus, ci elementul cu va!oarea cea mat mica (sau cea mai mare , in funct ie de prioritatea a.easa). In coada de prioritati Q se mernoreaza pentru fiecare nod i, eticheta nodul ui j EA cu care forrnea za muchia cu costul minim. La fiecare adauqa re a unui nou nod la arbore, acesta trebuie eliminat din coada de prioritati , iar coada trebuie reactualizata pentru toate nodurile rarnase , deoarece s-a modificat mu'tirnea A . iar un nod din coada de astep tare poate sa aiba muchia cu costul minim cu noul nod adauqat la arborele partial. Arbore le care se dezvo lta este memarat in lista H, astfel: pentru fiecare nod i care se adauqa la arbarele partial, se memoreaza nodul jE A cu care este legat prin muchie. Initial Hinit=({r),0) , GA=(X-{r ),0) , in lista H taate elementele au valaarea 0, iar in caada de prioritati Q, fiecarui nod i# i se va atribui valoarea r (Q(i)=r ). Muchia siqura trebuie sa i ndeplineasca urrnatoarele conditii: -7 sa alba costul minim ; -7 sa nu formeze cicluri cu much iile deja alese , adica sa uneasca un nod din H cu un nod izalat din GA - extrernitatile sale apartin celor doua rnultimi disjuncte A ~i X-A (muchia este [x;,Xj] cu XiEA si xjE X-A). St ructura de da te folosita pentru implementarea grafului este matricea costurilo r. Algo ritmul pentru determinarea APM este urrnatorul: PAS1 . Se initializeaza APM cu nodul radacina r . PAS2. Se initializeaza lista H. astfe l: pe nt ru fiecare nod i din graf execu ta: :H (i) <-0 . PAS3 . Se initializeaza caada de prioritati Q . astfel : Q (r) <- 0 si pentru fiecare nod i'" din graf executa: Q ( i ) e-c, PAS4 . c at timp nu s-au selectat cele n-l muchii executa: PASS . Se aleg e 0 muc hie siqura din multirn ea muchiilor nea lese - muchia [i,j] cu i EA ~ i j E X - A PAS6 . Se adau qa muchia la lista H: H (j) <-Q ( j) .
289
Informatic a PAS?
Se elirnina din coada de prio ritati nodul j adauqat la arbore, atribuindu-i va loarea 0: Q ( j) <.-0 . PASa . Se act ualizeaza co ad a de pno ritati pentru nodu rile ne a lese , astte l pentru fie care nod i din Q ex ecuta : cauta nodul j e A cu care forrneaza mu chia cu costuI minim. Co ada de prioritati Q este impl ernentata cu un vecl or cu n elemente. lnitial : odaca i = r Q(i) = { r daca , '" r in timpu l exacut iei algoritmului: o daca i E A Q(i) = r daca l a Asinu Bj e A a.i.[i,jJEU
{ j daca i ~ A ~i 3 j E A
a .i.]i. j] E U ~ i cosl( [i, j]) = min
La terminarea oxecutiei algoritmulu i: Q(i)=O, pentru orice i (1si Sn). Lista H este irnplernen tata cu un vecto r cu n elemen le. Ini tial: H(i) =O, pen tru orice i (1sisn). '
in tim pul exe c ut io i algori tmului:
o daca i = r sa u i it A lI (i ) = { jdaca iEA, iar[i ,j ]E H
La terminarea ex ec uue i algoritmului:
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 :
Arbo re le part ial (H) Nodul i H[i] Q[i] Costul muchiei [i,Q[i]]
da 1 coac.._ 1 0 0
2 0 1
-
5
d--
-
3 0 1
a
r - - - . . - -' 0---
4 0 1 VMA X
Q _ i n iti al ....... , " . 6 5 0 1 VMAX
0
1 VMAX
7
A rborele init ial
0 1 VMAX
Hinil=({1),0) min=5
j=2
Muchia cu co stuI minim es to [QU11)= [0[21 21= [1,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
Im plementarca srructurilor d e dale
Muchia cu costul minim este-,=,' [QUI ')= [Q[3] 3]= [ 1, 3j 3 Nod ul i 1 2 4 6 5 7 0 1 1 0 0 0 0 H[3J=Q[3] Hli] 0 0 0 1 1 1 1 0 [3]= 0 Q[i ] Cos tu l [i,Q[i]] 10 VMA X VMAX VMAX Actuafzere Q[i] 1 1 0 0 0 2 Q 9 VMAX Costu l [i,Q[i]] 10 VMAX Arborele partia l H-({1,2, ~ , {[ 1 , 2 ], [1,3} i . 1X-A-{4 ,5,6,7} -> m - 2
<3
Much ia ell costul minim est eJQU],]= [Q(6),6)= [3, 6j Nod ul i 1 2 3
---0
5 0 1
]=6
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
Much,. cu costul min im este [QUIj]= [Q[4] 4]= [6 , 4J 4 Nodu l i 1 2 3 6 7 ,/ 5 H[ i] 0 1 1 0 H[4]=Q[4] 6 0 3 0[4]=0 Q[i] 0 0 0 0 0 6 6 Co st ul [i,Q[I]] 10 12 min=2 '4 0 0 0 0 0 6 Actua lizare Q j=5 · 2 Costul [i,Q[I)] 12 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
Muchia cu costul minim este [QUI 0- [Q[5] 5]-- [4 , 51 Nodul i
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
-
0
r
Muchia cu costul min im este [QUI' j]= [Q[7] 7]= [5 , 7] 7 Nodul i 1 2 4 6 3 5 H[7]=0[7] H[i] 0 1 1 6 4 3 5 Q[i] 0 0 0[7J=0 0 0 0 0 0 Cost u l [i,Q[I]] X-A= 0 Actualizar e Q[i] ,~ 0 0 0 0 0 0 Costu l [1, Q[i]] Arborele partial H=({1,2 3,4,5,6, 7),{[1,2), [1,3], [3,6], [4,5], [4,6], [5,7} i - } m --6 ~,
o
Pentru implem entarea algoritmului S8 folosesc urrnatoarete variabile ~ i structuri de date: ~ var iabi lele n ~ i r pentru numarul de noduri, respecti v pentru nod ul radacina ; 7 matricea patranca A, cu dimeniunea n , pentru matricea cost urilor asociata grafului; 7
ve cto ru l Q, cu n elemente, pe ntru coada de priori tati;
-7 ve cto rul H, cu n ele mente , pe ntru lista much iilor d in A PM ; -7 variabila ct pe ntru a calcul a co st ul tota l a l arbo relu i:
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
Q[jJ=O ;
/Ielimina din coada de prioritat;.i Dodul adau g at Ilactuali zea za coadade prio r i t at i
actual i zea za~Q( j) ;
k+ + ; )
cou t.c-c't co s t u I t.o t a I> "
Pasul 2 si pasu l 3 au ordinul de complexitate O(n) Pasul 4 se executa de n -1 ori, i n cazu l pasu lui 3, pentru fiecare much ie aleasa, S8 executa pasul 5 si pas ul 8 de n ori . Rez ulta ca 2) Pasul 3 are ordinul de com plexitate 0((n-1)x(n+n))=0 (n . Ordinul de camp lexitate al 2) algoritmu lui va fi : 0(n)+0(n)+0(n =0 (n\
292
Implementarea st r uet nr ilnr de date Pentru graful G43 din figura 51, deterrninaf APM executand alqoritrnul lui Prim, Verificati daca solutia obunuta este corecta executano programul pentru graful G43.
2.8.2.4. Aplicatii practice 1. Trebuie sa S 8 construiasca 0 retea de autostrazi care sa lege cele mai importante erase din tara . Fiecare tronson de aut ostrada care leag a doua erase are un cost de construire. Sa se determine reteaua de autostrazi astfel Incat toate orasele sa fie legate prin autostra zi :;;i cost ul construirii ei sa fie minim. 2. intr-o localitate trebu ie construita 0 retea de canalizare care sa lege n locuinte si sa comunice cu doua puncte de deversare. Fiecare tronson de retea are un cost de con struire . Sa S8 determine reteaua de cana Jizare astfe l in cat toate locuintele sa alba acces la ea
~i
co stuI co nstruirii ei
2.8.3. Arborclc
CII
sa fie minim .
radacina
2.8.3 .1. Definitia arborelui cu radacina 5e nurn esta arbore cu radacina un arbo re A in care exista un nod pri vil egiat numit no d radacina. Terminologie - Multi dintre termenii folositi sunt preluati din terminologia arborilor -, ~. .A, genealog ici sau a arborilor din natura (ca exemp lu, arborele A, figura 52).
-7 Muchiile unui arbore se mai numese ramuri sau area. -7 Nodul radacina mai este 1 ----- - -- - --- niveluI O numit va rf sau tulpina . in nodul radaeina nu intra nici 3 ----~ - - - - nivelu l 1 un arc. -7 intr-un nod intra un singur -- -@---@-- nivelul 2 Inaltirnea 4 arc (exceptand radacina) care i l leaga de un alt nod , numit parinte sau prede~ : 8 cesar. \ -7 Dintr-un nod pot sa iasa ' , I niciunul, unul sau mai mul' ,'Subarbore Fi g. 52 te arce care i1 leaga de un alt nod numit fiu sau succesor. -7 Nodurile fara succesori (din care nu iese nici un arc) se numesc frunze sau nodur i terminate. Nodur ile care nu sunt termina le se mai numesc nodur i de ramificare. -7 Ooua naduri adiacente din arbare sunt in relatia tata-fiu sau p a rin te-fi u iar muchiile sunt legiituri de tip tata- f iu . intre rnai multe noduri se poate stabili 0 relatie de tipul fi ul fi ului ... fi ulu i sau tatii l tat iilui. .. tatalui, i n primul caz se poate spune ca nodul este descendent sau urrnas al unui alt nod , iar in al doil ea caz ca nodul este ascendent sau stramos al unui nod. -7 Ooua noduri care descind direct din acelasi nod tata se numesc noduri frate. -7 Ordinul unui nod este dat de nurnarul de descenden t! directi. -7 Nadurile sunt arganizate pe niveluri. Nurnerotand nivelurile nodurilor, radacina se gaseste pe nivelul 0, descendentii ei pe nivelul 1, descendenfii acestora pe nivelul 2 etc. Nivel ul unui nod este egaI cu nurnarul de noduri parcurse pe calea de la radacina la el. -7 Un arbore cu radacina este arbore vid (arbore nul) daca nu are nici un nod.
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 eticheta nodului radacina; -7 nurnarul de Irunze si etichetele lor; -7 etichetele nodurilor care se gasesc pe nivelul 2; -7 etichetele fiilor nodului 2; -7 etichetele fratilor nodului 5; -7 eticheta parintelui nodului 9; -7 nurnarul de Irati ai nodului 7. 2. Un arbore cu radacina A, (X. U) esle definit astlel: X;{1.2.3,4.5.6 .7.8.9.10) U;{[1 .2]. [1.3]. [1,4]. [2.6], [3.5]. [3.7], [3.9]. [4.8]. [8.10I} . Precizatl:
-7 daca eticheta nodu lui radacina este 1. cate Irunze are arborele si care sunt aceste frunze;
-7 daca eticheta nodului radacina este 2. cati Irati are nodul cu eticheta 1 ~ i pe ce nivel se gase~te nodul cu eticheta 10; -7 daca eticheta nodului rad~3cina este 10, ce lnaltlrne are arborele , cine este parintele nod ului cu eticheta 1 si care sunt l iii nodulu i cu etic heta 3. Caractnristic i : -7 Nod ul rad acina este un nod considerat privilegiat . EI nu are parinte (asce ndent). ci numai fii (descendentl). Este nodul de la care se conside ra ca pornesc ramurile catre radac inile altar arbori. G rice nod al arborelui poate fj considerat nod radacina .
-7 Un arbore A este fievid, fie lormat dintr-un no d rada cin a R caruia Ii este atasat un nurnar finit de arbor! Acesti arbori sunt subordonati radacimi si S8 numesc subarbori ai arboreJui A. Ori ce nod d intr-un ar bore este rada cin a unui suba rbo re .
-7 intre doi subarbori nu pot exista decat doua tipuri de relatii: a. relatia de incl uziune - unul dintre subarbori este subarborele celuilalt; b.
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.
Definitii recu rsive :
-7 Definitla arbo re lui. Un arbore nevid este
0 rnultime finita A de noduri care au urrnatoa-
rele proprietati: a. Exista un nod care poate fi considerat nod radacina. b. Celelalte nodu ri pot Ii repartizate In i (i::O) rnultirnl disjuncte (A, . A2... ... Ai). fiecare dintre aceste rnult .rni fiind considerate la randul lor arbori.
-7 Defin iti a Ina ltim ii. Inaltirnea unui arbore este eqala cu 1+maximul dintre i naltimlle subarborilor sai . 1. Daca nodul cu eticheta 2 are patru frati, iar nodul cu eticheta 1 este parinte 'e lui, ce ordin are nadul cu eticheta 1?
2. Pentnu arborele cu radacina A, din figura 52 precizati:
-7
ca~i
subarbori are nadul rada cina - pentru fiecare subarbore precizati radacina;
A,
294
Implementarea struetnrilor de date
-7 cali subarbori are nodul cu eticheta 2 - pentru fiecare subarbore precizati radacina; -7 d3~i subarbori are nodul cu eticheta 10- precizati cine este acest su barbo re; -7 in ce relatie sunt subarborele cu radacina In nodul cu eticheta 2 si subarborele cu radacina In nodul cu eticheta 4; -7 in ce relatie sunt subarb orele cu radacina in nodul cu eticheta 2 si suba rbore le cu radacina in nodul cu eticheta 9. 3. Pentru arborele cu radacina A 2 definit anteri or precizati: -7 daca eticheta nod ului radacina este 1, in ce relatie sunt subarb orele cu radacin a in nod ul cu etic heta 2 ~i subarb orele cu radacina in nodul cu eticheta 8;
-7 daca eticheta nodului radacina este 3, caji subarbori are nodul radacina - pentru fiecare subarbore precizati rada cina :
-7 daca eticheta nodului radacina este 2, caji subarbori are nodul cu eticheta 9 - precizati cine este acest suba rbo re;
-7 daca eticheta nodului radacina este 3, caf subarbori are nodul cu eticheta 2 - pentru fieca re subarbore preciz ati radacina..
7 daca etieheta nodului radacina este 4, In ee relatie sunt subarborele cu radacina In nodul cu eticheta 1 ~i subarborele cu radacina In nodul cu eticheta 3. Se nurneste arbore ordonat un arbore eu radacina in care fiji fi ecarui nod sunt ordonati , Observatie. Intr-un arbore ordonat , daca un nod are k fii, atunci exista un prim fiu, un al doilea fiu, ... , un al k-Iea fiu. Se numeste arborescenta sau structura arborescenta un arbore eu radacina in care s -a stabilit nc dul r::idacina . Pentru a lnt eleqe deosebire a dintre tipur ile de arbori enumerate , vom considera pentru exe mplificare un arbore cu 3 noduri etiehetate cu A, 8 si C si vom pune In evidenta numarut de arbori diferiti care se pot form a eu aeeste nodur i. ~ Arbori liber. Se pot obtine 3 arbori liberi diferiti. in figura 53 sunt prezentaf acesf arbori. -7 Arbori eu radaci na, Se pot obtine 9 arbori eu radacina diferiti, Exista trei moduri de a alege radacina (nodul A, nodul B sau nodul C). Pentru un nod radacina ales. se pot obtine trei arbori A diferiti. De exemplu , daca se conside ra nodul A ca nod B C radacina. exista trei moduri diferite de a repartiza in arbore nodurile B ~i C: nodul A are doi fii (8 ~i C) sau un singur fiu: 8 sau C. obtina ndu-se trei arbori diferiti (cei prezentati In figura Fig . 54 54). In total se obtin 3x3=9 arbori cu radacina diferiti.
A
-7 Arbo ri cu radac in a ordonati. Se pot obtine 12 arbori cu radacina ordonati cife riti, Ca ~j In eazul precedent, exista trei moduri de a alege radacina, Pentru un nod racacina ales, se pot obtine patru arbori diferiti, De exemplu, daca se considers nodul A ca nod radacina, exista patru moduri diferite de a repartiza in arbore nodurile B si C:
A l® B
e
e
Fig . 55
B
Fig . 53
l©
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 .
-7 Structuri arborescente . Pentru un nod radacina ales (de exemplu nodul 8 ) se pot obnne 3 structuri arborescente dile rite deoarece exista trei moduri diferite de a repartiza i n arbo re nodurile A ~i C: nodul 8 are doi fii (A ~i C) sau un singur fiu: A sau C (figura 56). Se nume!;iote arbo re pozitional un arb ore cu radacina i n c are es te precizata pozitia tiecarui flu Ob sorv at ie intr-un arbore pozitional , fiii fiecarui nod sunt etichetati cu numere intregi pozitive consecutive, iar daca lipseste fiul cu eticheta k, aceasta etiche ta nu se atribuie nici unui fiu (arborele A 3 din figura 57).
[§
ro«fuilill die
lCBl?:
I
~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
Sef com partiment 1
1
l?ef com partim ent
sel
sel
s el
subco mpartimenl 11
subcompartiment 12
subcomp artim enl
21 r $ef
compartirnent 3 1
13
I
1
11
1
Fig . 58 Firma are 0 structura ierarhica, iar relatiile dint re anqaj ati pot Ii reprezentate cu ajut orul unei arborescent e, in care anqaj atii sunt noduri le, iar arce le rela tiile de subordonare . Rad acina arborelui este directoru!. in tre un angajat care are in subordine un alt angajat exista 0 legatura de tip tata -fiu . intre anqajatii subordonati aceluiasi angajat exista relat ii de colaborare . Acesti anqajati sunt nodu ri frate. Timpul T necesar ca c ispozitia sa ajunqa de la director la toti anqajatii este dat de produsul dint re tirnpul t necesar pentru transmiterea de la un nivella altul ~i inal\imea h a arborelui: T=txh . Enuntul problemei 2. Un produs este realizat din mai multe componente. Fiecare componente la rendu! sall este realizata prin asamb larea aftor componenle . Atat produsul cal componenlele sunt caracterizate prin tr-o tist« de alribute (ptoptieteti): denumire,
.i
296
lmplementarea st r ucru r ilor dc datc
cod, pret, Iunctie reenzet», costul esembletii, firma care a produce etc. Sa se determine pretut produsului (figura 59).
I
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
4. Cuprinsul unei carti are 0 structura arborescenta . Desenati structura arborescenta a capitolului .Implernentarea struc turilor de date" din acest manual. 5. Structura dosarelor cu fisie re de pe hard-disc . gestio nate de sistemu l de operare Windows , este 0 structura arborescenta. Desenati arborele dosarelor de pe hard-disc. Fisiere le vor fi nodurile terminale. 6. 0 matrice cu n Iinii ~i m coloane este 0 structura de date ierarhizata care poate f rep rezentata pe trei niveluri, ca 0 arborescenta, astfel : nodul radacina este matricea, fiii nodului matrice sunt liniile, iar fiii fiecarei linii , elementele de pe linia respectiva. Desenati arborele cu radacina al unei matrice cu patru Iinii ~i trei col oane. Precizati ce tip de arbore cu radacina este.
2.8.3.2. Implementarea arborelui cu radacina Implementarea structu rilor de date de tip arbore cu radaci na se poate face prin: -7 matrice de adiacenta : -7 Iista de adiaconta : -7 roferinte descendente -Iegatura de ti p tata : -7 referintc ascendente -I egatura detip parinte nod terminal . Observatie. Arborele, fiin d un graf neorientat cu anumite proprietati. pen tru implementarea sa stat ics se pot Iolosi aceleasi metode ca ~ i la grafuri, dar aceste irnpleme ntari sunt ineficiente. Arborilor Ie sunt spec ifice implementarea cu leg at u ra de tip tata si implementarea cu leg atura d e tip parinte nod terminal . i n urmatoarele implementari se considera ca arborele are n noduri si radacina are eticheta r.
a) Implementarea prin referinte descendente Legatura de tip tata . Arborele este reprezentat sub forma unui vector t cu n componente in care se memoreaza , pentru fiecare nod, eticheta parintelu i sau. Algoritmul de construire a vectorului este urrn atorul: PAS1. Pentru tiecar e nod L din arbore executa : PAS2. 'l ac a nodul i~r , at u nc i t[il<-O ; altfe l , t[il <- j , und e j reprez inta , .d ul pari nte al nodul ui i. Exem p lu . Vect or ul tata pentru arbore le A 4 din figura 61 este : Nod (indice i) Pari nte (t[i])
1 3
2 3
3 0
4 3
5 1
6 2
Observatie . Din vectorul tata puteti obtine ur matoa rele intormatii -7 eticheta nodului radacina - indicele i pentru care t[il ~O; -7 etichetele nodurilor terminale - nodurile j a carer eticheta nu exista in vectorul t ; -7 eticheta par inte lui unui nod j - t OJ ; -7 etichetele l iilor unui nod j - indicii i pentru care t[il~j ; -7 etichetele frati lor unui nod j - indicii i pentru care t[il~tO]'
.---0
..----...... ~ 1. Reprezentati sub forma vectonului tata arborele cu radac .na As din figura 62. 2. Scrie ti un program care sa citeasca dintr-un fisier informatii despre matricea de adice nta a unui arbore cu radacina (de pe prirnul rand - nurnar ul de noduri n ~ i eticheta radacinii r, iar de pe urrnatoarele n randuri - rnatrice a de adiacenta) ~i care sa scrie vectorul tata al arborelui intr-un al fisier.
A4
Implemcntarcu st r uctu r ilor de dale
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.
Pontru fiecare indice i de la 1 la n-1 ex ec uta : Se cauta nodu l termina l cu eticbeta cea mai micii . PAS3 . Se atribu ie aceasta eticheta lui I[i] . PAS4. Se atribuie lui pt[i] eticheta nodului parinte al nodu lui terminal t [i] . i PASS . Se elirnina din arbore nodul terminal t [i].
i PAS2.
!
i
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 gase§le 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 ):
I
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
A. din figura 61 reconstituiti vect orul t cu ajulo rul vectorului pt. 2. Scrie ti un program care sa citeasca dinlr-un fisier vecl orul pt al unui arbore si care sa construia sca vectorul t. Salvati acest vector, i n acela si fisier, pe randu l urrnator.
_________../""'0. 1. Pen lru arborele
2.8.3.3 . Algoritmi pentru parcurgerea unui arbore cu radacina Parcurgerea unui arbore cu radaci na se po ate face prin: a) Algoritmu l de parcurgere in latirne : b) Algoritmul de parcurgere in adancirne a) Alqoritmul de parcurge re in latirne Meloda: se prelucreaza mai lntai informatia din nodu! radacina, dupa care sunt prelucrate, de la s ta n q a la dreapta , nodurile afla te pe primul nivel, apoi pe cel de al doilea etc . Stru clura de date folosita este coada (e) i n care se adauqa fiii nodului prelucrat. Algo r itm ul penlru parcurgerea arborel ui este urrnatorul: PAS1. Se initializeaza coada cu nodul radacin a r . PAS2. Cat timp coada nu este vida executa (p r i m< =u tl i m): PAS3. Este extras din coada primul nod si este prelucrat. PAS4. Sunt adauqati In coada fii nodu lui prelucrat.
1 3
Fig. 64 Exemplu. Coada de a§teptare 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
Implcmcn tarea structu rilor de date
Pentru implementarea algoritmu lui se folosesc subprogramele : -7 functia procedurala c i t i re creeaza vectorul t (vectorul tata) prin preJ uarea inforrnatiilo r din fisier: -7 funct ia operand rad deterrnina radacina r a arbore lui; -7 tunct ia proced urala i ni t initializeaza coada de astepta re cu radacina; -7 functia operand e s t e _ v i d a testeaza coada de asteptare daca este vida ; 7 funct ia procedurala ada u ga adauqa un nod la coad a de astep tare: 7 funcua procedu rala eli m ina elirnina nodul prelucrat din coada de aste ptare : -7 functia procedurala pre l u c r a re prelucreaza primul nod din coada : adauqa la coada de astepare tof fiii acestui nod $i apoi II elimina din coada de asteptare: -7 functia proc edurala a fi s a r e afiseaza noduri le arborelui in ord inea prelucrarii . #include
b) Algoritmul de parcurgere in adancime Metoda: porn ind de la nodul radacina se prelucreaza fiii unui nod de la stanqa la dreapta , iar trecerea, de la nodul curent la frate le din dreapta , se face numai dupa ce au fast vizitati toti descend entii nodului curent , deci ai 1ntregului subarbore dezvo ltat din acesta . In functie de ordinea relat ive de preluc rare a nodului radacina si, respectiv, a subarborilor, exista doi algoritmi: -7 Algoritmul de parcurgere in preordine . lnforrnatia din nodul radacina este prelucrata inaintea inforrnatiilo r din celelalte noduri ale subarborilor. Implementarea arborelui se face prin referinto desc en dente . 7 Algoritmul de parcurgere in postordine . lnforrnatia din nodul radacina este prelucrata dupa ce au fast prelucrate inforrnatiile din toate celelalte noduri ale subarborilor. Implementarea arborelui se face prin referinte ascendente . Algoritmul de parcurgere in preordine Structura de date folosita este stiva {s t} i n care informatia este torrnata din perechi (nod tata, urrnatorul fiu nepreluc rat al acestuia) . Initial, 5e considers ca nod ul prelucrat este nodul radacina. Notarn: NC = nod curent NP = nod prelucrat (nodul care s-a vizitat) PFNNC = primul fiu nepreluc ra! al nodului curent PFNNP = primul fiu neprelucrat at nodului prelucrat
301
Inform a tid in varful stivei se va memora perechea (NP, PFNNP) .
Algorilmul pent ru parcu rgerea arborelu i este urmatorul: PAS1. Se initializeaza stiva cu perechea (nodul radacina, primul fiu al radacinii). PAS2 . Cal limp stiva nu este vida (mai exista noduri in stiva) axecuta: PAS3. Se exlra g inforrnatii din varful stivei despre: 7 Nodul prelucrat devine nod curent NC,-sl[vf] .NP (Ia prima parcurgere NC,- 1). 7 Primul fiu neprelucrat al nodului prelucrat devine primul fiu neprelucrat al nodului curent PFNNC~sl[vf].PFNNP (la prima parcurgere PF NNC ~3) . 7 Primul fiu neprelucral al nodului curent devine nod prelucrat NP ~PFNNC (Ia prima parcurgere NP ~2 ). 7 Primul fiu neprelucral al nodului prelucrat devine primul fiu neprelucrat al nodului prelucrat PFNNP~sl[vf] .PFNNP (Ia prima parcurgere PF N N P~ 4) . PAS4 . Oaca nodul curent mai are ~i alIi fii neprelucrati, alunci la stiva se adauqa perechea (NC, PFNNC). La prima parcurgere perechea este (1,3). PASS. Daca nodul prelucrat nu este nod terminal ~i mai are si alti fii neprelucrati, at unci la stiva se adauqa perechea (NP, PFNNP) . La prima parcurgere perechea este (2,4). Exemplu. Sliv a la parcurgerea arborelui Ao din figura 64: - - - - - ~._--PFNNP Sti va NC NP PFNNC PAS (1, L) 1 2 1 3 4 3 1 2 1 2 3 4 4 (1,3) 2 3 11 ,3); 12,41 1 5 --_ .._..4 __._3 (1,3) 2 4 2 4 4 (122 (1, 3) 2 4 5 5 -1 3 3 5 4 1 3 5 13, 5l 1 3 5 7 3 5 6 3 (3,6) 5 6 7 4 3 (3,6); (5, 7) 7 3 5 6 5 (3,6) 8 5 7 3 /3,6);(5,8) 7 8 4 5 7 8 /3,6); /5, 8\ 5 5 (3,6) 3 5 8 (3,6) 8 4 5 5 8 13, 6) ~3 3 6 4 3 6 6 5 3 -
-
-
Nodurile sunt parcurse Tn ordinea: 1, 2, 4, 3, 5, 7, 8, 6.
Pentru implementarea algoritmulu i se folos esc subprogramele : -7 functia procedurata c i t ire creeaza vectorul t (vectorul tata ) prin preluarea informatiilor din fisier: -7 functia operand rad dete rmine radacina r a arborelui;
302 -) -) -) -) -) -)
Irnplcmen ta rea st ruc rurilor dc datc functia operand nodt verifica daca un nod este nod terminal ; functia procedurala ini t initializeaza stiva cu perechea (radacina , prirnulfiul al radacinii): functia operand este_vida testeaza stiva daca este vida ; . functia procedu rala adauga adauqa un nod la stiva : functia procedura la elimina elirnina nod ul din varful stivei ; functia procecurata prelucrare prelucreaza nodu rile din varfu l stivei astfel : nodul prelucrat devine nod curent, prirnul fiu neprelucrat al nodului curent devine nod prelucrat, afiseazEi nodu l prelucrat, etirnina perechea de noduli din varful stivei , daca nodu l curent mai are un fiu neprelucrat, adauqa la stiva perechea (NC, PFNNCj , iar daca nodul prelucrat nu este nod terminal ,?i mai are un fiu neprelucrat, adauqa la stiva perechea (NP, PFNNPj .
#include < fst ream .h> struct s t iva tint NP , PFNNP ; } ; s t Lv c s t [2 0J ; int t [ 2 0 ], n , v f ; fstream f lva r co r e t x t vi Lo s : : i n ); i
int nodt( i n t x) {for ( i n t i ===l ; i< =n; i ++ ) if ( t U l == x ) return 0 ; return 1 ; } voidinit (i n t r) {int i=1; v f=] ; while (i< =T1 && t liJ ! "'""r) i+ + ; st [vn .NP=r ; s t [vf) . PFNNP =i ; } int es te vi da() {return v f =-=:O ; } void adaug( i n t x , int y) {v f ++; s t [vfJ . /\,P =x; src(vf] .PFNNP= y ; } void e l im i n () { vf - -;} void pre lucrarc() (int NC"= st [vf] . NP , PFNN C=s~ [ v f ] . PFNN P, NP"" PFNNC, PYNNP , i = PFNNC+ l ; ccut.ccu r'
if ( i <=rt) {PFNNP=i; adaug(NP ,PFNNP) ;}}} void c i t i r e ( ) { t» r,; for (i n t i =1; i <= n ; i + + ) f » t [ i ]; f. c lo s e () ; } int r ad t ) {f o r (i n t i = l ;i<=rt ;i++) if (t [ i]==O) return i ; return O; } void main () {in t x. c.i t Lr e j j.: .c=rad() ; i nt t{ r ) ; cc-rtccv uodu r .t Ie v i zi t ate : "« r « " wh ile (!este_vid a( )) prelucrare () ; }
II .
':::>~ A . ~
Prin parcurgerea i n tat irn e a unu i arbore cu radacina, pre lucrarea face pe n iv el uri ier arhice, iar prin pa rc u rq er ea in adancime in p reordine a unu i arbore, prel ucra rea in fo rrnatiilo r din noduri se f ace dupa relatii le de s ubordonare.
.:s:- informatiilor din noduri se
~ . tcntic ~
Algoritmul de parcurgere in postordine Nodu lui radac ina i se va atribui cea m ai ma re etic heta . Prelucrarea se face prin parcurgerea sirnultana a celor doi vectori ~i cautarea noduri lor care apart in aceluiasi subarbore Evidenta nodur ilor prelucrate este linuta prin intermediu l vectorulu i vizitat (care este definit la lei ca ,?i la algoritmii de parcurgere a gralurilor).
Inform atica
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.
Pentru imple men tarea algoritmului S8 folosesc subprogramele: -7 functia procedurala ci t ire creeaza vecto rii t ~i pt prin preluarea intormatiilor din fisier; -7 functia ope rand te rmina t verifica daca au fast prelucrate toate nodu rile arbore lui; -7 functia proced ura la pre l ucr are prelu creaza nodu rile unui suba rbore , pornind de la nodul term inal cu eea mai mica etic heta . #i nc l u d e < fstream.h> in t t [20J , p t [ 201, v izi tat [ 2 0J , n; fstream I J "a t.bo r e . t xt " f .i. c s r : in) ; v o i d cit i re ( ) {int i ; f » n ; f o r (i = 1; i< =n ; i + + ) f e e-t; l il.: f o r (i=l;i <=n. ;i+ +) f» pt [ i } ; f.close ( );} i nt t.e rm Lne t. ( ) {fo r (i n t i = l ; i < rl; i ++ ) if ( ! v i z it at[ i}) re turn 0 ; r e t u rn 1; } void prelucrare ( ) {in t i, k; fo r ( i= l ;i
Exemplu - in noduriie unui arbore se me rnoreaza eticheta nodului $i un nurnar. La numarul memora t in fiecare nod se aduna suma numerelor memorate In nodu rile descendente . Sa se afiseze noua va!oare rnernorata in fieca re nod. Pentru a putea ca lcula aeeste sume , pareurgerea arbore lui tre buie sa se faca In postordine , ell ajutoru l vecto riior t si pt . Numerele din fieeare nod vor fi memorate in vectorul c . lntormatiile neces ase se eitesc dintr-un fisier text, astfel: de pe primul rand numa rul de noduri n , iar de pe urrnatoarele trei rand uri, cele n valori memo rate In vector ii t, pt si c . Pe un rand, numerele sunt sep arate prin spatiu .
#inc lude < f s t r eam . h> in t t[ 2 0I,pt[20I, c[ 2 0 j,fl ; f s t r e a m f{ " a r b ore .L x t " , Lo s : : i n 1; voi d c i t i re t ) / /se c i t e sc d a t.e Le d .i.n f i s Le r t i nt i ; f »n; for ( i ~ l; i<~n ;i++ ) f » t [i ] ; fo r ( i = l ; i< ~ n ; i + +) f » r t [~ ] ; f or (i=l ;i<=n ;i++) f »c [i} ; f .close ( );} void prc Lucra.re tlIfior' (i n t lo=l ;i<=n ;i ++ ) c[pt[ ill==c[pt l i]] +c [t [ i J J ; } v o i d a f i s a re ( ) { fo r {i ==: l ; i <= r. ; ++) c out« " No d u "« i«" a r e t.o t.a I u ; "« c [ i l«endl; } voi d me i.n () { c .i ire () ; prelucr ar e( ) ; a t i s a re {} ; }
304
Im p lementur ca st r uctn r ilo r de date
in nodurile unui arbore eu radacina sunt memorate numere naturale. lnformatiile des pre arbore se citesc dintr-un fisier text, astfel: de pe prirnul rand nurna rul de noduli ale arborelui, de pe randut al doilea vectorul tata , si de pe al treilea rand. in ordinea etichete lor, numerele memorate in noduri. Scri eti un prog ram care calculeze suma numerelor pare memorate in arbore.
sa
2,8.3.4. Aplicatii practice 1. Co nstruiti arborele ge nealogic al fam iliei, care sa prezinte fili atia (descendentii direct ! ai unei persoane). Se va lua ca nod radacin a unul dintre stra-strabun ici. in fiecare nod se va memora numele unei persoane. lnforrnatiile despre arbore S8 citesc dintr-un fisier text, astfel: de pe primul rand nurnarul de nod uri ale arbo relui, de pe randul urrnator vectoru l tata , ~i de pe al treilea rand , in ordinea etichetelor, numele memorate in noduri. Scr ieti un program care sa furnizeze urrnato are infor matii: a. Pentru un nume de persoana, citit de la tastatura, sa S8 afiseze descendentii directi ~i ca\i copii are fiecare. b. Pentru doua nume de persoana, clute de ta tastatu ra, sa se afiseze strarnosut comun. 2. 0 fabrics de confectn este fermata din rnai multe comp artimente. intr e compartimente exista fie relatii de subordonare , fie relatii de colaborare (relatiile de colaborare se stabilesc pe acelasi nive l ierarhic). in figura 65 este prezentata organigram a finm ei. Fiecare compartiment are urrnatoarele atribute: numele compartimentului , numele persoanei care cond uce acel compa rtimenl ~i numarul de anqajati. Fabrica de co ntecur mreeua gonerala Con fce li! Ierne! Co mpartime nt marketing
~:n "i
Z,O'3
i
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.
lista anqajatilo r care au functii de conducere ~i nurnarul totat de anqajati pe care ii are fiecare dintre ei in subordine (0 persoana cu functie de conducere are in subordine angajatii din compartimentul pe care iI conduce ~ i din l oate compa rtimenlele subor donate acestuia ). 3. a re~ ea de distributie a produselor unei firme are a organizare pirarnidala in care fiecare dintre aqentii cornerciali are in subordine al\i agenli comerciali. In functie de vanzari, fiecare agent comercial prirneste un punctaj . Un agent comerc ial care are i n subordine ~ i alti aqenti comerciali cumuleaza la punctajul propriu sl punctajele agen\ilor comer ciali din subordine. Scrieti un program care sa afiseze urrnatoarele informafii: a. punctajullotal al retelei: b. care este subordonatul direct al unui agent comercial (al carui nume se precizeaza de la tastatura) care are punctajul eel mai ma re ~ i care este acesl punclaj . b.
Afi~al i
~i
305
111 fo rma ticii
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.
0
Arbori binari Sunt arbori cu radaciml , la care ordinul fiecarui nod nu trebuie sa fie ma i mare de 2.
VIA. Arborclc binar 2.8.4 .1. Definitia arborelui binar 5 e nurneste arbore binar un arbore cu radi:1cina pozitlona! ca re are proprietat ea ca fiecare nod are eel mult do; descendent; directi (s u cceso ri).
Torrninoloqie: -) Cei doi succesor i ai unui nod (daca exista) se numesc succesor stan q (s ubarbore stanq) ~i s ucce s or dre pt (s ubarbore dropt) - arborele A, din figura 66 . Caracteristici :
A,
Radacina
-) Deoarece , oricare ar fi un nod al arborelui , el nu
are mai mult de doi descendenti directi, ordinul unui nod dintr-un arbore binar poate fi 0 (nod termi nal), 1 (unul dintre subarbori este vid) sau 2. -) Definitia arborelui binar este 0 definitie recurs iva . Exista' un nod privilegiat - numit nod'radacina, iar celelalte nodur i (daca exists) sunt repartizate Tn doua grupuri disjuncte si, fiecare dintre aceste grupuri formeaza, la randul sau, un arbore binar.
No durilc tcnninalc (frunze)
m
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
Implementarea struetnrilor de date
Cu 3 noduri, eticheta te cu A, B si C, se obtin 30 de arbori binari diteriti. Exista trei moduri de a alege radacina . Pentru un nod radacina ales, S8 pot obtme zece arbori binari diferlti - in total S8 vor obtine 3x10=30 arbor! binari diferiti, in figura 68 sunt prezentati 6 dintre arborii binari care au radacina in nodul A. Se nurneste arboro binar stictun arbore care are proprietatea ca fi ecar e nod, cu exceptia no dnrilor te rmina le, are exact doi descendenti tsuccesori).
. As Exemp lu - Arborele binar As din figura 69 Propozitla 17 Un arbore binar strict, care are n noduri terminale, are in total 2xn-1 noduri. Demonstratie - Notam cu k numarul de nivele din arbore, cu Xk , Xk.1 , ... , X2, X1 , nurnarul de noduri termina le de pe fiecare nivel , ~i cu Yk , Yk-1 , ... , Y2, Y1, nurnarul de noduri de pe fiecare nivel (cu exceptia nivelului 0 , pe care se qases te radacina) s! cu N - numarul total de noduri din arbore (N = Yk + Yk .1 + · · · +Y2 +Y1 +1 ) , cu n - num arul total de noduri ter minale (n = Xk+ Xk .1 + ... + X2+X 1) . Nivelul k contine numai nod uri terminal e, ~i Yk = Xk . Pentru fiecare alt nive l exista relatia Yi = YH'1/2 + Xi Arborele fiind strict, Yi+1/2 este un nurnar intreg , deoarece pe fiecare nivel exista un numar par de nod uri. Adunand relatiile. obtinem : Yk = Xk 2 Yk-1 = Yk/2 + Xk_1 Yk-2 = Yk_1/2 + Xk_2 Y2
Y1
= Y3f2 + X2 = Y2/2 + X1
Rezulta ca: N:: 1+Yk+Yk_1 + ... +Y2+Y1+YO= 1 +2 X(Xk+ Xk.1 + . . +X2+X1) :: 2xn+1
Fig .69
7
Propozrtia 16.Un arbore binar strict are un nurnar impar de nod ur i. Demcnstratle - Pe fiecare nivel k+1 , pentru fiecare nod de pe nivelu! k , exista cate doi descendenti sau nici un descendent. Rezulta ca pe tlecare nivel, cu exceptia nivelului 0, exista un nurnar par de noduri. Numarui total de noduri va f impar, deoarece la aceste noduri S8 adauqa s! nodul
radacina
4
Se numeste arbore binar echilibratun arbore binar care are proprietatea ca diferenta dintre Inaltirnlle celor do i subarbori ai ori carui nod este cel mult 1.
Fig . 70
A, Exemplu - Arbo rele A, din figura 70. Se numeste arbore binarperfect echilibrat un arbore binar care are proprietatea ca diferenta dintre nurnarul nodurilor celor doi subarbori ai oricarui nod este cel mult 1.
1
2
4
A 1Q Exemplu - Arborele A 10 din figura 71
6 Fig . 71 Proprietate. Un arbore binar cu n noduri este perfect echilibrat daca subarbo rele stanq are [nl2] noduri, iar subarborele drept are n-[n/2]-1 noduri. Se nurneste arbore binar complet un arbore binar strict care are toate nodurile tenninale pe acelasi nivel.
A u Exemplu - Arborele A" din figura 72
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.
....
.
4
7 Fig , 72
.
Pk - Pe nivelul k exista Zk nod uri .. Pk+1 - Con siderand propozitia Pk adeva rata, trebuie sa dernonstrarn eel pe nivelul k+1 exista Zk+1 noduri, Daca niveluJ k+1 aparune arborelui, atunci pe acest nivel exista cate doi descendenti pentru k;;;2k 1 fiecare nod de pe nivelul k , in total 2xZ ' + noduri. Considerand ca arborele are k nivelun ~i ca numarul de noduri de pe nivelul k este n , numarul total de noduri din arbo re se obtine adunand nodurile de pe cele k ruvelun: 2° + 2 1 + 2 2 + ... + Zk = Zk+1_ 1;;; 2x(Zk) - 1:; 2xn -1
Se numeste arbore binar aproape c omplet un arbore binar complet pana la penultimul nivel, la care completarea cu noduri, pe ultimul nivel, se la ce de la stanqa la dreapta.
[ SmdlillJl. de
ClllZ
t
7J A,2
4
Exemplu - Arborele A 12 din figura 73
8
Scop: identificarea colectti lor de date care pot Ii reprezentate prin arbori binari. Enunt ul p ro bleme i 1. Trebuie sa S8 organizeze un campionat de meciuri de base /let oumince se organizeaza un me ci. Ech ipele care vor juca in prim a etepe se trag la sotti. Sa se realizeze pla nificarea meciurilor §i sa se de termine numetut de duminici in care se va oestesure cempionetut (figLira 74). Fina l Campio natul are 0 structure ierarhica, iar relatiite dintre componente pot fi repreSe mifinala zentate cu ajutorul unu i arbore binar, In / care cele c oua echipe care joac a sunt nodur ile. Nodurile terminale sunt echipele liceelo r, iar celelalte noduri reprezinta cate 0 A Be 0 E F G H echipa care a castiqat in meciul etapei Fi g. 74 anterioare. Radacina arborelui este echipa care ca~ti ga finala. Deoa rece 0 echipa castiqa toare se desemneaza in urma unui rneci jucat , nodurile care nu sunt terminate reprezinta meciuri juca te, iar nodul radacina corespunde mec iului final. A rcele reprezinta relatia de participare a unei echipe la un meci. Arbore le meciurilor este un arboro binar strict (la un meci participa doua echipe). Daca arborele meciurilor este un arbore bin ar compt e! si la cam pionat participa n echipe , vor fi n nodur i term inale si arborele va avea 2 xn ~1 noduri. Nurnarul de meciuri care se vor juca este dat de diferenta dintre nurnarul total de noduri ale arbo relui si nurnarul de noduri terminale , adica n-t rneciu ri, iar campiona tul se va destas ura in n~1 duminici.
intte ech ipele mei multor licee . Nutne tul de echipe este n . in fiecare
~
'"
~rti~ 2rti~ ~rti~ 2rti~
Enuntul pro blemei 2. Sa se reprezinte modul in care se evalueaz8 0 expresie eritmetic« .
a
exp resie aritrnetica este fermata din operanzi (constante si variabile), operatori aritrnetici (+, -, I, • ~i A - pentru ridicar ea la putere ) si paranteze . in evaluarea expresiei aritme-
308
lmplcm cn tarca str ncturilor dc datc
lice S8 resp ecta prio ritatea operatorilor aritmetici. Op eratorii aritm etici sun t o perato ri b.inar i care nu su nt toti comutati vi (operatorii pentru scadere, l rnpartire si ridicare la putere nu sunt comutativi). Daca notam operanzii cu x ~i y ~i operatorul cu OP t atunci expresiei E = x op y putem sa-i asociem arborele binar din figura 75, in care radacina este operatorul o p , subarFi g. 75 bore Ie stanq este primul operand - x , iar subarborele drept este al doile a operand - y . Daca expresia coniine un singur operand , acestu ia i S8 poate asocia un arbore binar cu un singu r nod - nodul radacina - in care se memorea z8 ope randul. Pentru a putea reprezenta 0 expresie care este fer mata cu un operator unar (de exemplu, E=-x), vom transforma exp resia astfel ln cat sa contina un operator binar (in exemplu, E=O-x). Expresia are 0 structura ierarhica, iar relatiile dintre componente pot f reprezentate cu ajutorul unui arbore binar, in care operanzii si operatorii sunt nodurile. Nodurile terminale sunt operanzii, iar celelalte noduri reprezinta operatorii. Radacin a arborelui este operatorul care se evalueaza ultirnu l. Subarborele stanq ,i subarborele drept ai radacin ii reprezmta expresiile carora Ii se aplica ultirnul operand . Radacina fiecarui subarbore va reprezenta operatorul care se aplica pe cele doua expresi i reprezentate prin subarborii + Fi g. 76 stang , i drept ai sai, Arcele reprezinta relatia de participare a unei expresii la operatorul din nodul parinte: ca prim operand sau ca al doilea operand . Arborele expresiei este un arb ore bi nar strict (un operator leaqa doi operanzi ). Daca expresia contine n operan zi, arborele va avea n noduri terminale . Fiind un arbore binar strict. va avea 2xn -1 noduri . Nurnarul de operatori este dat de diferenta dintre numarul total de noduri y ale arborelui si nurnarut de noduri terminale, adica n-1 operatori. Arbore le expresiei nu este un arbo re ec hilibrat. Arborele binar din figura 76 este arborele expresiei aritmetice:
•
.
_
l'.. = :'!x
( _ ., 2+ 4 x y )
z +y
x
_
+-
~,
-<3 ~~.1>-
y
Oesenati 5 arbori binari cu trei noduri (etichetate cu A, B si C) diferiti, al\ii cecat cei din figura 69. 1. Desenati arb orele genealogic al st rarnosi lo r unei persoane pana la nivelul stra-strabunici. Radac ina este persoana pentru care se i ntocmeste arbo rele genealogic. Fiecare nod are doi descendenti : mama tata . Ce tip de arbore binar este? Cornparati acest arbore cu arborele genealogic al descendentilor (arborele filiatiei). 2. Desenati arborele campionatu lui de baschet pentru 7 echipe. Ce fel de arbore binar este?
,i
3. Desenati arborele binar al expresiei
,
;1
~ + h + 7 x (:1 _
c- d
b)
1
2.8.4 .2. Implementarea arborelui binar Implementarea structurilor de date de tip arbore binar se poate face: a. static - folosind vectori ; b. dinamic - folosind pointeri.
a) Implementarea statica a arborelui binar
Fi g. 77
Exista dou a metode de im plementare st at ic a a arborilo r binari (se folose ste arborele
.A13. binar An din din figura 77).
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.
Pentru arborele A ' 3 din figura 77 cei doi vectorl sunt: Nodul i . 1 2 3 4 5 6 2 31 14 1 6 0 'I 5 0 I 0 sl [i] dr[i] O 0 8
~If-'--'-
Observa t ie. Din cei doi vectori puteti obtine urrnatoarele inforrnatii: -7 eticheta nodului radacina r - nodul i pentru care, oricare ar f md ice le j , s l m",i si d rDl;t:i (nodul a ca rui eticheta nu ex ista nici In vectorul st, nici in vectorul dr); -7 etichetele nodurilor terminale - nod uriIe i pentru care sl [i] +dr[i] =O; -7 eticheta pa rinte 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.
Observatio. Din vectorul tata puteti obt ine urrnatoarele lnformatii: -7 etiche ta nodului rad acina r - Indicele i pentru care tal a[i]=O ; -7 etichetele nodurilor te rm inate - nod uri Ie i a carer eticheta nu exista in vectorul tata; -7 eticheta pari nte lui unu i nod i - ta la[i] ; -7 etichetele fiilor unui nod i - fiu l stanq: indicele j pentru care l alam=i si fiim=-1, iar liu l drept: indicele j pentru care l alam=i ~ i fiim =1; -7 eticheta Iratelui unui nod i - indicele j pentru care la ta [i] =ta ta m. Ohservatie Datorita defin itiei arborilor binar i, algoritmii utilizati pentru pre lucrarea lor pot folosi tehnica recurs ivitatil (definitia recurs iva - a arborilor binari) ~i strate gia divide et impera (fiecare nod nu are decat doi descendenti - prelucrarea unui nod se descomp une In doua subprobleme: prelucrarea subarborelui stanq ~i pre lucrarea subarborelui drept, urrnata de compunerea celor doua solutii) .
Exe mple - daca pentru arborele binar se foloseste implementarea statica , pentru a construi algoritmi recursivi cu strategia divide et irnpera se utillzeaza vectorii st ~i dr .
310
Implementarea struct urilor de date
lnaltlmea arborelui binar int max (i n t x , int y) {if (x>y) return X i else return y ; ) i n t h( i n t i) {if (st_[i] ~~O && dt[i] ±±OI return 0; else return l~nax(h(st[iJ! , h (dr [ l] I !;) void main () {int r ; . .. cout-och (r) ;
. ..
Nurnarul de "frunze u din arborele binar int f runza (i n t {return st [ i ] +d r' l i l±±O;} int
nr~ . fr{ i n t
i)
(if {frun za( i)) return 1 ; else
if
(st[i]~~OI
return nr_frunze (dr-[ll) ; e lse
}
if
( dr[ i] ~ ±OI
r-et.ur-n nr f
r-unz e t s t til) ;
else
return nr j dst[iJ )+nrjr(dr[i]) ; } void main ( )
{int r;
2. 3. 4. 5.
.. . cout« n r _fr (r) ;
... }
1. Scriet i un program care sa furnizeze urrnatoare le inforrnatii despre un arbore binar: nodul radacina, nodurile terminale , nodurile cu exact un fiu, nodurile cu exact doi fii, nodurile frati si ina l\imea . lnforrnatiile despre arbore (nurnarul de noduri ~i cei doi vectori) se vor citi dintr-un fisle r, Arbo rele este implementat: a. cu vectorii i n care 58 mernorea za cei doi succesori ai unui nod; b. cu vectorii i n care se rnernoreaza filiatia nodurilor. Scrieti un prog ram care citeste dintr-un fisier nurnarul de noduri si vectorii st sl dr ai unui arbore binar. Sa se reprezinte arborele priri vectorii tata si f ii. Scrieti un program care citeste dintr-un fisier nurnarul de noduri ~i vectorii tata ~i fii ai unui arbore binar. Sa se reprez inte arborele prin vectorii st si d r. Scrieti un program care citeste dintr-un fisier numaru l de noduri si vectorii st ~i dr ai unui arbore binar. Sa se verifice daca arborele binar este un arbore binar strict. Scrieti un program care citeste dintr-un fisier numarul de noduri ~i vecto rii st ~i dr ai unui arbore binar. Sa se verifice daca este un arbore binar perfect echilibrat sau un arbore binar echilibrat.
b) Implementarea dinarnica a arborelui binar Se face prin definirea unui tip de data pentru un nod din arbore (tipul nod) ~i a adresei unui nod (un pointer catre tipul de data nod - nod' ). Tipul de data este definit ca 0 inregist rare care contine 3 categorii de carnpuri: -7 lnformatia utila - poate fi cornpusa din mai multe carnpuri «tip> i n f o); -7 adresa subarborelui stanq - (nod * s .....-+ S este adresa radacmi! subarborelui stanq), -7 adresa subarborelui drept - (nod *d .....-+ d este adresa radacinii subarborelui drept). nod {
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).
Regula. fntotdeauna este reprezentat subarborele stanq si apoi subarborele drept. Daca un nod nu are un succesor , succesorul va fi considerat arborele vid.
Se numoste arbore vid un arbore care are adresa NULL
311
I II fo rmaticii
ExempluJ 1 - Pentru un arbore binar pe care-l construim pentru campionatul de meciuri de baschet intre echipe le rna; multor licee , informatia utila poate fi fermata din mai multe carnpuri: numele echipei (n_ e), numele liceului (n_ 1) ~ i eticheta nodului (n r): s tru c t
n od {char n _ e [ 1 5 J, n_ l [1 5] i in t n .r : nod «e , * d i } * r i
Exemplul 2 - Pentru exem plele urrnatoare, inforrnatia utila va fi fermata numai din eticheta ~ 9? 1..( nodului: struct n od t i n t nr ; , ~ _T:I l-, -.-TI=" '- rt ::"11
4 INULL I.
nod *s , *d ; } ;
nod *r;
1
-----
3 INU L L INUL~5 INULLI NULL
in figura 78 este pre zentata implementa rea dinamica a arborelui A 13 din figura 77 .
1
Fig . 78
7 I N U L L I N U ~8..J-. I N U LL I
I
9 INULL INULL I
Algoritmul pentru crearea unui arbore binar Agoritmu l pentru cr ear ea un ui arbore bin ar implementat dinamic foloseste strategia di vide et impera prin descompunerea problemei in trei subprobleme: 1. crearea nodului radacina (cazu l de baza) ; 2. crearea subarborelui sta nq: 3. crearea subarboret ui drept. Descompunerea problemei co ntinua pana can e subarborele care S8 cre eaza este arborele vid. Combin are a so lutiilo r se face prin legarea nodulu i radacina de cei doi subar bori.
Daca datele S8 citesc de la tastatura. pentru a evidentia eel nodul care se cree aza este radac l na unui arbore vid , in carnpul pen tru etic heta se introduce v aloa rea 0 (care marcheaza lipsa de informatii pentru acel nod). De exernplu, pentru a crea arborele din figura 79. se introduc in ordine. de la tastatura. etichetele: 1 2 3 0 0 6 7 0 0 8 9 0 0 0 4 0 S 0 O. Algoritmul pentru crearea arborelui binar este: PAS1. Se citest e informatia utila din nod. PAS2 . Daca nodul nu contine inforrnatie utila, at unci se creeaza arborele vid; alttel : PAS3 . Se creeaza un nod radacina prin alocarea unei zone de mernorie. PAS4. Se atribuie , carnp ului cu informatie din nod. info rmat ia citita . PASS. Se creeaza subarborele stan q. PAS6. Se creeaza subarborele drept. Subprogramul care creeaza un arbore binar poate fi implementat ca functie procedurala sau ca functle operand . Functia proc adurala voi d c rea r e (nod *& r) {i n t n ; c ou t « " E:: i c h e 1: a nod : " ; cin» r:. ; if (n~~O) r~NULL ; else {r = new nod ; r ->nr=n ; c reare (r ->s) ; c r ea re{r ->d) ; »)
Functie operand nod * cr-ee r e () ( i nt n ; nod *r; cou ti-oC'E t. L c h e t a nod :
if
"; cin» n;
(n==O) re t urn NULL; el se {r = new nod i r ->nr=n i
r - >s =c r e a r e ( ) ; r - >d=cre a r e ( } ; r e t ur n r ; }}
312
I mplementarea st ru eturil or de date
vo id main ()
v o i d ma in ( )
{c r ear c t r'j
{r e cree rer j,
;
cou t .c-C'R e d a c Ln a> "
cout« " Ra d a ci n a "" " « r - >n r ; . .. }
Exempl e - Functii, implemen tate recursiv tolosind strategia di vide et impera , prin care S 8 prelucre aza arbori binari. Inattimea arborelui binar Nurnarul de "frunze" ale arborelui binar int max( i n t X, i n t y } {if (z>yl return X;
int fru nz a (n od * r }
e1 sa r e t u r n y ; } in t h ( n o d e r )
int nr:...}r(nod *r) {if Cr==NULL) retu rn 0 ; els e if ( f r unza(r)) re tu rn 1 ; else return nr.:...fr(r->s) +nr~fr(r ->d) ;
(if
(r ~ =NOLL) return 0 ; els e return 1+max(h(r ->s) ,h(r ->d)) ; } Copierea unui arbore binar
nod *c ornb {int 11 ,110d *s, n od *d ) {n o d * C i C = n ew n o d ; c ->nr=n ; c -c- a-s s , c -c-de d : re t u r n c r} nod *c o p i e (n o d *c ) {i f (c= =NULL ) r etu rn NULL; else r eturn com b tc-c-nr rc opie f c;->s ), cop.Ie (c - :>d ) } ; } v o i d main( )
{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'
cout«" Ni v e l u l : "; cin» k ; n .ive L (r , 0 , k ); }
(return r ->s==NULL
&&
r ->d==NULL; }
Compararea a doi arbori binari int eqe Lj nod * r l , n e d * .1 2 ) ( if (r l ==NULL) retu r n r 2"='= NULL; else if
(r 2 = = NUL L ) retu r n 0 ;
el se retu rn
&& ega l( r l ->s , r2-> s) && egal(rl-> d ,r2->d) ; }
rl - > n r "=' ~ r 2 ~ > n r
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 )
cout« "A fast gasit " ; else ccut.cc vtfu a r o st. gas it " ; }
2.8.4.3. Algoritmi pentru parcurgerea unui arbore binar Parcurgerea unui arbore binar se poate face prin: -7 algorilmu l de parcurgere in lalime (Ia tel ca la graturi); -7 algorilm i de parcurgere in adancirne (specifici arborilor binari): -7 algorilmul RSD (t raversarea in preordinc) ; -7 algorilmul SRD (traversarea i n inordine), -7 algorilmul SDR (traversarea in postordin e) Observatls Algoritmii pentru parcurgerea unui arbore binar pot fi folositi pentru a prelucra info rrnatiile din noduri.
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); cout«endl; . . .
voi d rsd (nod {i f ( r ! =NULL)
*r )
{c out« r- >n r « " ".
J
rsd ( r - > s) ; r sd ( r - >d) ; ) ) voi d ma i n () ( . . . r sd(r) ; cout«endl;
. . .}
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 )
cou t « r';" >n r« " ".
srd(dr[i] ) ; )
v o id main () { . . . s r d (r) ; c o u t«end 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) ;
cout« i « " "; }
{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
=
( " a rbore . txt ", ios: : o u t ) ; void salva r e(nod * r ) {if (r != NULL)
fstream
( f«
r- > ~r«"
11.
r s d (:::- ->s ) ; r sd (:::- ->d ) ; }
e lse :'«0« " ";}
fstream g { " a r b o r e. txt " , i o s : :in ) ; nod * r e s t a u r a r e {)
t int n ; ned * r; g »n ; i f ( ~~=O~ r eturn NULL; els e { r = n ew ~ od ; r - >n r =n;
r - >s =r e s t a urare {};
314 void ma i n () { . .. sa l v a r e ( r ) i
Implcm enta rcu st r uctu rilor de date r- >d =re s t aurare ( ) ; • . . }
r e t urn r ; } }
vo id ma in() { .. _r = restua rare ( r ) ;
_. _ }
1. Scrieti cate un subprogram pentru urmatoarele metode de parcurgere a arborilor binari: RDS (radacina, subarbore crept. subarbore stang) , DRS (subarbore drept, radacina, suba rbore stanq) ~ i DSR (suba rbore drept, subarbore stanq , radacina). 2. Scrieti un program care citeste succesiunea nodu rilor afisa te prin parcurgerea SDR si prin parcurgerea RSD ~ i afiseaza etichetele nodurilor prin parcurgerea RSD . 3. Scrieti 0 functie iterativa pentru metoda de parcurgere RSD a arborilor bina ri. 4. Scrieti 0 functie care afisea za numa rut nivelului cu cele mai multe frunze .
sa verifice daca un arbore binar este perfect echilibrat. 6. Scrieti un program care sa furnizeze urrnatoarele informafii desp re un arbore binar: nodul radac ina, nodurile terminale, noduri le cu exact un fiu, nodurile cu exact doi fii, nodu rile frati ~ i Ina ltirnea. Arborele binar este implementat dinam ic ~i creare a lui se face prin introducerea informati ilor din noduri de la tastatura . 7. Scrieti un program care creea za un arbore binar irnplementat dinarn ic prin citirea etichetelor dintr-un fisier text (etichetele sunt scrise pe un rand , despartite prin spatiu , i n ordinea in care ar fi fost introduse de la tastatura ) si care verifica daca arborele binar este un arbore binar strict. 8. in nodurile unui arbore binar sunt memorate numere i ntregi care nu sunt distincte. Scrieti un program care creeaza un arbore binar implementat dinarnic pnn citirea numere lor dintr-un fisier text (numerele sunt scrise pe un rand. despartite prin spatiu , in ordinea i n care ar f fost introduse de la tastatura) :;;i care creeaza 0 tista dublu inla ntuita care sa cantina numai numerele distincte si, pentru fiecare nurnar, de cate on apare i n arbore, 9. in nodurile unui arbore binar sunt mem arate numere int regi care nu sunt distincte. Scrieti un program care creeaza un arbore binar implementat dinamic prin citirea numere lor din tr-un fisie r text l?i care creeaza 0 lista simpla, ordonata desc rescator, care sa cantina numai nume rele distincte . 10.f n nodurile unui arbo re binar sunt memorate numere naturale . Scrieti un program care sa realizeze urmatoarele: a. Creeaza arborele binar (implementat dinam ic) prin introducerea numerelor de la tastatura . b. Catculeaza suma numerelor pare din nodurile term inale. c. Calculeaza suma nume relor poz itive din noduril e care au exac t doi succesori . d. Determina nurnarul cu valoarea cea mai mare ~i de cate on apare in nadurile arborelui. e. Creeaza 0 lista sirnplu inl antuita cu numerele din nodurile arborelui care au ultima citra 5 sau 3. f . Afise aza pe ecran nume rele de pe un nivel k (k se citeste de la tastatura). g. Salveaza. intr-un fisier text , nume rele de pe fiecare nivel (numerele de pe acelasi nivel vor fi sense pe un rand, separate prin spatiu), h. Creeaza un arbo re cu aceeasi structura arborescen ta ca eel creat la punctul (a) dar care difera de eJ prin informatia din nodu ri: daca in prirnul arbo re nurnarul este par , i n al doilea arbore este inlocuit cu suma cifrelor sale, iar cac a in primul arbo re nurnarul este impar, in a! doilea arbore este in locuit cu inversul lui. 5. Scrieti 0 functie care
315
Informatica
2.8.4.4. Ap licat ii practice 1. Construiti arborele genealogic al stramosilor familiei pima la nivelul stra-strabunici (parintii directi ai fieca rei persoane). Se va lua ca nod radacina persoa na pentru care S8 i ntocmeste arborele. in fiecare nod S8 va memora nume le unei persoane (mama sau tat al persoanei din nodul parinte). lnformatiile despre arbore se citesc dintr-un fisier text, astfel: de pe prirnul rand, nurnarul de noduri ale arborelui, de pe urm atoa rele doua randuri vecl orii st ~i dr, ~i de pe al patrulea rand , i n ordinea etichelelor, nume le memorate in noduri. Scrieti un program care, pentru un nume citil de la tas tatura, sa afiseze numele parintilor ;;i num ele bun icilor persoanei respective. 2. Construni arborele campi onatulu i de meciur i de baschet. i n fiecare nod se vor pastra urrnatoarel e inforrnatii : eticheta nodului, numele celor doua echipe, scorul fiecarei echipe si data la care s-a jucat meciul. in nodurile terminale vor fi pastrate numai num ele echipelor. Scrieti un program care sa asigure urrnatoarea functie: oupa fiecare meci, se va cop leta inforrnatia i n fiecare nod : data la care s-a jucat meci ul ~i scorul; pe baza scorului , i n nodu l parinte va fi scris numele echipei castiqatoare. Dup a fiecare exec utie a prog ramului, arborele trebuie salvat intr-un fisier, de unde trebuie read us la urmatoarea executie.
2.8.5. Arborele binar de cautare 2.8.5.1. Def init ia arborelui binar de cautare Terminologie: ~
Se nurnes te cheie un camp din inforrnatia utila a nodului care poate fi folosit pentru a identifica unic 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 .
Ex emplu - Arbo rele binar A ' 4 din figura 79.
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.
2.8.5.2 . Algoritmi pentru prelucrarea unui arbore binar de cautare Pentru prelucrarea unui arbore binar de cautare se pot folosi urmatorii algoritm i: ~ Algoritmul pentru creare, ~ Algoritmii pentru parcurgere , ~ Algoritmii pentru actuallzare.
At 4
.,
316
Imp lcmclltarca struerurllor de dare
Algoritmul pentru crearea unui arbore binar de cautare Crearea unui arbore binar de cautare S8 face prin adauqarea fiecaru i nod ca nod terminal, in
pozitia corespunzatoa re, astfel incat arborele
sa
nu-si piarda proprietatea din deflnitie.
Cau tarea nodului la care S8 va adauqa ca succesor nodul termina l ~i ce fel de succesor va fi
(stanq sau drept)
S8
face cu ajutorul unui pointer care va indica nodul curent care
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)
if ( n
void main () {int n : r = NULL ; cout« " Nu ma :.-: " . cin» n;
void creare(nod * &r , in t TI ) {if (r '=NU L L)
i f (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 ; }
}
Observatie. inal1imea arborelui binar de cautare dep in de de ordi nea in ca re se introduc valo rile ch eil .
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-..
a . 3, 6, 2,7, 8,1 , 5,4 , 0; b. 7, 3, 1, 2, 8, 5, 4, 6, 0;
c.
1, 2, 3, 4, 5, 6, 7, 8, O.
Algoritmi pentru parcurgerea unui arbore binar de cautare Pentru parcurgerea arborilor binari de cautare arbore binar.
S8
folosesc algoritmii de parcurgere a unui
Obscrvatii 1. Prin parcurqerea arbore!ui cu al goritm ul SROcheile sunt afisate i n ordine crescatoa re 2. Prin parcurgerea arborelui eu algoritmul DRScheile sunt afisate in ordine dcscrcscatoare 3. Cheia cu vatoaroa maxima se gase;;te i n nodul eel mai din stanqa, iar cautarea sa se face parcurqand arbore le numa i pe leqatura cu succesoru l stanq, pom ind din radacina. 4. Cheia cu valoarca minima se gase~te i n nodul eel mai din dreapta, iar cautarea sa se face parcu rqanc arbore le numai pe leqatura cu succesorul drep t, pornind din radacina. Valoarea minima Valoarea maxima Implemen tare recu rs iva in t min (n o d * r ) i n t max ( nod * r ) {i f (r -> s ! =NUL L) {i f (r -> d' ~ NULLJ retu r n min (r- >s j ; return ma x(r ->d ) ; else r e t urn r - >nr ; } e l se r e tu r n r ->n r ; } v oid mai n () v oi d main () {
...
{
couti-ocend.l-oc't bti .n'i m :
in t min (nod * r )
{whi l e
( r ->s != NULL) r= ;:- >s ;
r eturn r - >nr ; } v oid main() (
" < x mi.n (r) ;
.. .
cout«endl« "r"':a x im: "
... }
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 : "
( ,
... }
.. .
cou t<.<.e ndl<.<. "1'I;a x i m: "
5. Oeoa rece in tre nad urile arborelui binar de cautare este stabilita a relatie de ordine. cautareauns! anumite ehei S8 face rapid prin meca nismul cautarii binare (se cauta i n una din cele doua submultirni de valori - subarborele stanq sau subarborele drept). Cautarea nodu lui se face cu ajutorul unui pointer, care porneste din nodul radacina si care va indica nadul curent care se analizeaza. Painterul va avansa prin succesarul stanq sau suceesarul drept al nodul ui curent, i n functie de rezultatul comp aratiei dintre
318
ImplcllIcllla rca struct u ri lur dc date
valoarea citita pen tru che ie ~i valoarea cheii din nod ul curent. Avansarea continua pana cand se gas8l?te un nod care contine chela cantata sau pana S8 ajunge la un arbore vid (cazul i n care nu exis ta cheia cantata i n arbore) - figura 80.
min
..
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.
i
nod *c a u t a (no d *r ,i n t k) {if (r=NULL
J
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 )
i f (r- >n r > k ) r= r.-> s i
i f (r-c-nrc-k) return C3uta( r ->s , 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 ;
' "
cout« "Che i a cautata : " ; c i n » k ; if (cnuta(r , k) ! ~NULL) oou cocv.s-a gasit " ; else c cutx-cvtcu s -a gasit " ; .. . }
.. .
c ou t-oc '< Ch e .i.a cautata : "; c i n» k ;
if (cauta{r ,k) !=NULL} cccccc vs - e gasit " ; else cou'coc '' Nu s -a gasit " ; . .. }
Algoritmi pentru actualizarea unui arbore bin ar de c a u t are in arborii binari de cautare se pot executa urrnatoarele operatii de actualizare: -j. inserarea unu i nod ; ~ sterqerea unni nod
~~ ~ ~
..
in urma acestor operatii de actualizare, arborele trebuie sa -si pastreze ca litatea de arbo re binar de ca utare.
Algo ritmul pentru inscrarea unui nod Cautarea pozit iei in care se insereaza nodul se face cu ajutorul unu i pointe r, care porneste din nodul radacina si care va indica nodu l curent care se ananzeaza. Point erul va avansa prin succesorul stanq sau succesorul drept al nod ului curent, i n fun ctie de rezu ltatul cornparatiei dintre valoar ea citita pentru chela care se insereaza si valoarea che ii din nodul curent. Avansarea continua pima cane se g ase~te un nod care contin e a cheie egal a cu cheia care se inser eaza (cazul in care nodul nu se poate insera, deoarece mai exista a cheie cu acee asi valoare in arbore) sau pima cand, i n nodul curent, succesorul pe care avan seaza pointerul este un arbore vid. Daca s-a ajuns la arborele vid, inseamn a ca valoarea chei i care se insereaza nu mai exista i n arbare - ~ i cheia se adau qa ca succ esor al nodului curent , drept sau stanq , in functie de valoarea cheii care se insereaza !?i de valoarea cheii din nodul curent. Variabila r este pointerul catre nodul care se insereaza. in varianta iterativa, variab ila c este pointeru l catre nodul curent, iar variabila logica x se foloseste pent ru a sti daca in arbore s-a gasit cheia care se insereaza (este initializata cu valoarea 1, presupunandu-se ca nu mai exista chela in arbore).
319
I n f ormat i ca
PAS1. Se citeste cheia k a nodului care S8 insereaza . PAS2 . Se lnitializea za pointerul r cu adresa radac inii. PAS3 . cat timp nu s-a ajuns la arbore vid si nu s-a gasit cheia care S8 insereaza executa: PAS4 . Dac a nodu l curent are cheia egala cu k , atunci se afisea za mesa jul "Cheia existe ", S8 atribuie lui x valoarea 0 si S8 trece la Pas ul 6. PASS. Dad ; nod ul curent are cheia mai mica decal k , at u nc i poin terul avanseaza la subarborele stanq : alttel , pointerul avanseaza la subarbo rele drept si S8 revine la Pasul 3. PAS6. Dac a nu s-a gasit In arbore cheia care S8 insereaza (x<>O), at unc i: PAS? Se creeaza un nod prin alocarea unei zone de memorie. PAS8 . Se atribuie , carnpului cu inforrnatie din nod, informatia care S8 insereaza . PAS9 . Se atribuie , succesori lor nodului , arborele vid. PAS10.Dac a nodul curent c are chei a mai mica decat k , at un c i nodul care S 8 insereaza este succesorul drept; altfel, nodul care S8 insereaza este succesorul stanq .
Valoarea pentru cheie este unica Valoarea pentru cheie nu este unica Implementare recursi va void i n s e ra r e (n o d *&r, i nt k) void inserarelnod * &r , i n t k) {if
(r'~NULL)
if (r'->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)
inserar e(r->s ,k) ; e lse inserare (r->d ,k) ; e l se { r = new nod ; r->nr=k ; r'->s~NULL ; r->d=NULL ; }} v o i d ma i n () {in t k , . . . cou't-oc''Che La care se msereaae : 11; c in» k; i n s e r a r e (r, k) ; . . . }
{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) ;
e l s e {r ='n ew nod ; r,->nr= k ; r'->s~NULL ;
r~ > d~NULL;}}
vo i d ma i n( } {int k : cout« "Chei a care s e inserea za : cin» k; inserare(r , k) ; . . . }
11 .
Implementare it erativ a void Lnsc rcr-etnod e r , int k ) void i h s era r e (h o d * r,int k ) {int %=1; nod *c ; tin t x =l ; nod * c; while (r !=NULL && x ) while (r!=NULL && x ) i f ( r - >n r ="" k ) i f {r-'>nr="""k) {r - >f r e c v+ + ; x ~O ; } ( c o ut« " Ch e i a exista " « e n d l ; else x ~O ; ) if (x-c-n.r> k) {c = r ; r=r->s ; } else else {c =r; r =r - >d;) if (r:->nr>k) Lc e r , r =r'->s ; } if (x ) else {c = r ; r=r ->d; } { r ~new nod ; r->n r ~k ; if (x ) r ->s =NULL ; r->d= NUL L ; {r =new nod ; r->nr=k ; if (p->nr>k) c ->s=r; r->s =NULL ; r ->d ~ NULL ; else c-c-d-er r j j if (c->nr>k) c ->s=r ; void main () else c ~>d=r ; } } voi d main () t int k : ccccccvcne t e car-e se i n se r e aza: "; { i n t k ; . .. cin» k; mserare tr , k} ; . .. } cout«" Ch e i a care se .irrse.r'eaza : 11 . c in» k; inserare( r , k) ; ... }
320
Implementarea strncturilor de date
Algoritmul pentru sterqerea unui nod
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.
o
~
l;>tergere nod terminal k=1. P ->S= NULLi del ete ql ;
p---. 5
q,---. l'
' 7
l;>tergere nod terminat k=7. p ->d=NULL; de lete cr2 i
1
-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
l;>tergere nod eu dol Iii: k-7. q-> i n f o = r - > in f o ; p - > s =p- > s - >d ; d e l ete r ' Fig. 83
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.
lise ccpi a za .i.nf o r mat i a Ilg'as it i n n ociu Lccu r e n t
u ti li§.
di n
rrodu L
p~c - > s; delete c ; c =p ; } } /Is e $ t erge Dodu1 gas i t ca nod ca r e a r e numai s ucc es o r dr ept
void s t erge r e (no d *&r, irit k ) {nod 'kC ; if ( r! =NULL) if (r ..; >n r = =k) Iidacas "': ag a si t nodulc a r e t c e bu.L e s t e r s if (r"':>s=~NULL && r ->s"N'""NULL) I idaca est e nod t ermin a l (delete r ; r =NULL ; } else if { r~> s~ =;NULLr / / oe ca e s te nod ca re a re nlillla i 's ucce soz- drept {c=r- >d; delete r ; r = c ; } else i f (r -e-d NULL ) //daca. c s t c nod care a r e r usne f euccesor s tang { c ~ r - > s; de lete r ; r ~ c ; } else sterge n od(r r r -> s) ; I /daca a re ambii succes ori else I idacami s - ag a sitpodlllcare t .reb u i.e s t.e r s if (r->tu·
Tmclt -_ 11 _+1 .... 2
322
Im plcm enta r ca structurilor de date
In caz ul arborel ui binar de cauta re, dimensiunea datelor nu este n , ci nurnarul de niveluri ale arborelui de cautare (sau lnaltirnea lui). lnal\imea fiind cu 1 mai mica decat nurnarul de nive!u ri parcurse (S8 considera :;;i nivelu l radacinii), In cazul arborelui bina r de cautare: h+2 Tlll~d = -2-
Ordinul de complexitate al algoritmului este Oth) Rezulta ca timpul consumat pentru operatiile de prelucrare a arborilo r binari de cautare este direct proportional cu i nalfim ea arbore lui h . Propozitia 20
inal\imea unui arbore binar cu n noduri poate lua valori i nt re 1092(n)-1 ~i n-1. Demcnstratle. Notam cu h Inaltimea arbcrelui binar cu n noduri. Arbor ele binar are cea mai mare tna'time (h_ m a x ) atunei cand este degenerat (nodurile sunt distribuite cate unul pe fiecare nive! cu exceptia nodului terminal, ordinul fiecarui nod este 1). Rezulta ca h_max =n-1 ~i hs n-t Arborele binar are cea mai mica Inaltime (h_ min) atunc i cand este comp let (toate noduri le termin ate se qasesc pe acelasi nivel-:- ~ i ordinul fiecarui nod, cu exceptia nodurilor term inale, este 2). In acest caz, pe fiecare nivel i vor fi t noduri, iar nurnaru ! n de noduri va f ega! cu Z h_ mm +1_ 1. Rezulta ca n+1 =
2h_mio+l . i h_m in+1 = lo g2(n+1). Din ultima eqalitate rezulta ca h ~ 1092(n)-1 .
Eficienta algoritmului de prelucrare a arborilor binari depinde de modul in care a fost creat arborele. Daca el are Inaltirnea maxima (arborele binar degenerat, in care fiecare nod nu are decat un succesor), ordinul de complexitate al algoritmului va fi O(n) si este egal cu cel al algoritmului de cautare secventia'a intr-o structura de date liniara. Daca el are Inaltim ea minima (arborele complet sau aproape complet), ordinul de complexitate al algoritmului va fi 0(1092n).
2.
3. 4. 5.
6.
1. Cornparati, din punct de vedere al eficientei, algoritmii recursivi si iterativi pentru determinarea minimului, respectiv a maximului, intr-un arbore binar de cautare. Care dintre variante este mai eflcienta? Pentru arbo rele binar A '4 din figura 79, cate operatii de deplasare in structura de date se executa pentru a determina minimul? Daca valorile din arbore ar fi fost memorate intr-o structura liniara, cate operatii de deplasare s-ar fi executat pentru a determina minimul? Care dintre structurile de date este mai eficienta? Scrieti 0 functie care sa creeze un arbore binar de cautare perfect echilibrat. Scrieti 0 functie care sa verifice daca un arbore binar este un arbore binar de cautare. In nodurile unui arbore binar sunt memorate numaratorul si numitoru l unor fractii distincte. Sa se simplifice fractiile din arbore, iar daca in urma sirnplifica rii rezulta un nurnar int reg, sa se elimine din arbore. in nodurile unui arbore binar sunt memorate numere intregi . Se citeste de la tastatura un numar intreg x. Sa se caute in arbore nodul cheia x si daca se qaseste , sa se afiseze fratele sau - precizandu -se daca este fratele stanq sau fratele drept. Sa se afiseze un mesa] de informare daca nu se gase$te cheia x in arbore sau daca nodul nu are Frate.
2.8.5,3. Aplicatii practice 1. Un text contine cuvinte care se pot repeta. Textul este memorat intr-un fisler text. Scrieti un program care sa citeasca textul din fisier ~i care sa afiseze cuvinte le din text, ordonate alfabetic , ~ i frecventa lor de aparitie in text. 2. Realizati 0 agenda de telefon cu ajutorul unui arbore binar de cautare. in fiecare nod se vor pastra urrnatoarele inforrnatii; numele $i prenumele persoanei, nurnarul (numerele de telefon) si adresa de e-mail. Scrieti un program care sa permits adauqa rea de noi persoane in agenda , eliminarea unor persoane si cautarea unei persoane pentru a afla numarul de telefon si adresa de e-mail,
323
Inform a tica
2.8.6. Ansamblul Heap 2.8.6.1. Definitia ansamblului Heap Se numeste ansamblu Heap un arbors bi nar care indeplineste urrnatoarote conditl i: (1) es te un arbore aproape complet; (2) i n orice pe reche de nod uri tata-fiu cheil e sunt intr-o relatie de ordine prestabilita . Exemplu . i n figura 84 este prezent at ansamblul Hea p A 15 i n nodurile caruia sunt me morate numere natura le, relatia de ordine fiind : daca in nodu l tata este un nurnar impar, in nodul fiu nu poate fi decat tot un nurna r impar Numerele sense in exteriorul nodurilor, reprezlnta indici pentru numerotarea nodurilor.
:J.;>'
Ats
"'j' jii'
7
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
2
Heap minim sau Heap maxi m) pot exista chei cu aceeasl valoare. 5 7 intr-un ansamblu Heap min im cheia din orice nod este 1 mai mica sau eqala cu chei le tuturor nodurilor din eei doi subarbori ai ~a ': iar i n nodul radacina se gase'?te cheia (18: Fig. 86 cea mal mica din arbore . -7 lntr-un ansamblu Heap maxim cheia din orice nod este mai mare sau ega la cu cheile tuturor nodurilor din eel doi suba rbori a! sal, iar in nodul radacina se gase ~t e cheia cea mai mare din arbore .
-7 Un ansamblu Heap poate fi folosil pentru a implement a 0 coada de prioritati (de aici ii vine ~i de numire a de arbore de selocti e). deoarece - prin extrag erea cheilor prin nodul radac ina - se extrag datele i n conformitate cu relatia de ordine prestabilita . Pentru ans amblul Heap A15 din figura 85 , ordinea de extragere a datelor esle : mai l ntai num erele pare 'Ii apoi numerel e impare . in ansambl ul Heap A t 6 din figura 86 extragerea nodurilor se face in ordi nea descrescatoare a etiche telor, iar in ansam blul Heap A 17 din figura 86 extragerea nodurilor se face In ordinea crescatoa re a etichetelor. Proprictate : Ansamblul Heap are 0 proprietate foa rte irnportanta (pe care 0 rnosteneste de la arb orii binari cornp leti): daca nodurile arbore lui se numeroteaza cu indici, in ordinea parcurgerii In la\ime (ca In figura 84), intre indicii parintelui, al subarborelui stang 'Ii al subarb orelui drept - exista urrnatoare le relatii:
-7 Parintele nodu lui cu indicele i are indicele [~] .
Ats
Au
324
Implcmcnta rca st ru ct ur ilor dc datc -7 Fiul stanq al parln telui cu indicele i are indicele 2xi. -7 Fiul drept al parinte lui cu indicele 1are indice le 2x i+ I .
Aceasta proprietate a arbor ilor cornp leti si aproape cornplet i ne perm ite sa irnplementam static ansamblul Heap , cu ajutorul unui vector v. -7 Radaclna arborelui are eticheta v [1]. -7 Fiul stanq al nodulu i cu eticheta v[i] este nodul cu eticheta v[2 'i] . -7 Fiul drept al nodu lui cu eticheta v [i] este nodul cu eticheta v[2 'i+1] vectorul
Ind ic e A 16
v pentru
An A"
1 2 2 25
2 10
3 20
3
4
5
6
7
18 5 18
20 10 11
3 9
5 15 9
9 11 10
15
8 11 18 5
9 15 20
3
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
-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.
2.8.6.2. Algoritmi pentru prelucrarea unui ansamblu Heap Pentru prelucrarea unui ansamblu Heap se pot folosi urmatorii algoritm i: -7 Algoritmu l pentru crearea ansamb lului Heap, -7 Algoritmul pentru inserarea unui nod , -7 Algoritmul pent ru extragerea unui nod . in urma acestor operat ii de prelucrare, arborele trebui e s a-s! p ast reze c alitate a de ansa mb lu Heap. i n algoritmi i pentru prelucra rea unui ansamblu Heap S8 va folos i implementarea statica a ansamb lului cu ajutorul vectorulu i. Daca lungimea fizica a vecto rului este NMAX , nurna rut de noduri n ale ansamblului Heap nu trebu ie sa fie mai mare decat NMAX -1. Deoarece vectoru l Heap 58 con struieste pe baza mecani smului de leqatura parinte-fii Intre indici, etichetele ansam blului Heap 58 vor memora in vector lnce pa nd eu indicele 1.
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.
i
fst ream f( "heap .txt " , i o s : :in ); int const N11'AX=100 ; int \' [NMAX ] , n : void c r e a re~h eap() {i n t i , j , a u x ; f »n ;
//c h e i le s e c i t e ec dinLL$ier
i f (:o<=NMAX -l) {f » v [ l ] ;
fo r ( j=2 ;j<=n ;j++) ( f »v [j ] ; i=j ; wh i le (i>l) if (v [iJ>=v [i / 2 J ) {a uxev Li ] , v [ i ] = v [ i/ 2 ]; v[i!2] =au x ; i = i ! 2 ; ) else i=l ; } ) els e cout«" Nu se p oa t e c.re a - arborele a r e rnai rnu.Lt e n c du ri decat l u n gi me a f i zic a a vect o r u l~ i r ' « e n d l ; ) void e f i.s a r et ) {for l i n t i =Li <=tl ;i ++ ) cou t-oc v I i j c-c" ";} vo id ma in () {cr e n r e _ h e a p ( ) () ; a f i s a r e (} ; }
A l g o r it m ul p e n t r u inserarea unui nod ill ansa m b l u l Heap Prin adauqarea unu i nou nod, lungimea loqica a vectoru lui creste cu 1 $i trebuie sa se verifice sa nu depaseasca lungimea fizica a vectorului. Prin inserarea unui nod , arbore le trebuie sa-si pastreze cal itatea de ansamblu Heap, adica sa alba proprietatile : (1) Sa fie un arb ore aproape com plet. In arbore, nodu! S8 va adauqa pe ultimul nivel, imediat la dreapta nodului existent Daca ultimul nivel este cornplet, nodul se va adauqa
326
Im plementa rea st ructurllo r de date pe urrnatorul nivel, ca succesor sti ng al nodului din extremitatea stanqa de pe nivelul ante rior. lnsearnna ca i n vector S8 va adauq a noua cheie imediat dupa ultimul element
(2) in orice pereche de noduri tata-fiu cheile trebuie sa fie In relatla de ord ine prestabllita: Daca in arbore S8 adauqa un nod in poz itia precizata, este pos ibil ca el sa nu fie cu parintele sau in relatia de ordin e prestabilita - si inforrnat.a trebui e s a S8 propag e din ace st no d catre radacina, la fel ca la algoritm ul de creare . lnsearnna ca , in vector,
ultimul element va fi considerat element curent - si cheia mernorata in ele S8 va campara cu chela rnernorata in parinte. Daca nu respecta relatia de ordine, S8 interschirnba cheia nodului curent cu cheia parintelui, iar parintele devine nod curent. Propagarea cheii continua pana cand intre elementul curent !?i parintele sau este respectata relatla de ardine, sau pana cand radacina ajunge sa fie element curent. voi d ada uga ()
//pent ru a n s amb Lu I Heap Max i m
t int x , i ; i f (n ==NKlI.X-l)
ccu t c-cv n u
cse
mai poa t.e a d e uqe n o clu l " « e n d l ;
e l se
{c out« "c h e i a = " ; cin» x ; n+ + ; v [n)= x ; i =n ; while if
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 ; }
Algorilmul pentru exlragerea unui nod din ansamblul Heap Ansamblul Heap, fiind a coada de prioritati, prima intormatie care se prelucrea ., j este cea din nodul radacina . Extragerea unui nod din ansamblul Heap inseamna de fapt prelucrarea informatiei din nodul radacina si eliminarea acestui nod din arbore. Pentru ca arborele sa-si pastreze calitatea de ansamb lu Heap, dupa eliminarea nodului radacina trebuie sa alba pro prietatil e: (1) Sa fie un arbore aproa pe com pl et. in searnna ca trebuie sa dispara din arbore nodul eel mai din dreapta de pe ultimul nivel. Daca din arbore dis pare nodul din dreapta de pe ultirnul nivel, nu trebuie sa dispara din arbore si informatia din acest nod - din arbor e trebui e sa dispara intorrnatia din nodul radaci na. De aceea, in nodul radacin a este adusa inforrnatia din ultimul nod. in vecto r, cheia din ultimul element va fi salvata in primu l elemen t. dupa care , este eliminat ultimu l element prin decrementarea lung imii logice a vectorului . (2) in arice pereche de noduri tara -flu cheile trebuie sa fie in relatia de o rdine prestabilita. Daca in nodul radacina este adusa inforrnatia din ultimul nod, este foarte probabil sa nu mai fie respectata relatia de ordine lntre nodul radacina si fiii sai. Solutia este de a propaga inforrnatia adusa in radacina, catre nivelurile inferioare, pan a cand este Indeplinita relatia de ordine intre nodul in care a ajuns inforrnatia si fiii sai in algoritmul pentru eliminarea nodului din ansamb lul Heap se foloseste variabila ; pentru indicele nodului curent , iar variabi!a j - pentru indicele nodului fiu al ncdului curent. PAS1 . Se oreiucreaza cheia din radacina (elementul v [l ]) . PAS2 . Se copiaza In radacina cheia din ultimul nod (elementul v (n] ) si se micsoreaza cu 1 lungimea lcqica a vectorului. PAS3. Se initializeaza nc dul curent cu nodul radacina (indice!e i are valoarea 1). PAS4. Cal lim p nodul curent face parte din arbore (elementul cu indicele i face parte din vector ) exec uta :
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
//pen t r e a n samb l ul Heap Maxim
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
(~
; . . . o ou t-c -C' Cne i a c e a mai me re e s t c "
Observatie. Daca S8 extrag din arbore toate nodurile si se afiseaza cheile nodurilor extrase, cheile vor fi afisate i n relatia de ordine prestabiiita pentru ansamblul Heap . Complexitatea algoritmilor de prelucrare a ansamb luri lor Heap
in algoritm ul de creare a unui ansamblu Heap, se parcurge secvential vectorul pentru adaugarea celor n elemente. Complexi tatea parcurgeril secventiate este O(n) . Pentru fiecare element adauqa t la vector, cheia nodului trebuie adusa i n pozitia corespunz atoare din ansamblul Heap. Cazul cel mal defavorabil este atunci cand chela se propaqa de pe nivelul pe care a fast adauqata, pana la nivelul radacinii, nurnarul de cornparatii executate fiind egaI cu inaltirnea h a arborelui la acel moment (care ia valori de la 0 pana la Ig2n), iar cornplexitatea algoritmului de propagare a unui nod de pe nivelul cu Inaltirnea h pima in radacina va fi 0 (lg2n) . Rezulta ca, in algoritmul de creare, complexltatea este O(n) x 0(lg2n) ; 0(n xlg2n). Algo ritmul de inserare a unui nod are complexita tea 0 (lg2n) - cazul cel mal defavorabil fiind atuncl cand cheia se propaqa de pe ultimul nivel pana in radacina. Algoritm ul de ad auqa re a unui nod are complexitatea 0(lg2n) - cazul cel mai defavorabil fiind atunci cane cheia se propaqa din radacina pana la uttimul nivel.
2.8.6.3. Aigoritmul HeapSort Oaca un vector este organizat ca ansamblu Heap , nodu rile vor fi extrase in ordinea precizata prin relatia de ordine asoclata arborelui. Acea sta caracteristica a ans ambluri lor Hea p, sta la baza algoritmu lui de sortare HeapS ort . Daca fiecare element eliminat este adus dupa ultimul element din vect orul rarnas dupa extragerea lui, in vectorul obtinut, chelle vor fi ordonate invers dec at prin relatia de ord ine prestabilita i n ansamblul Heap. Astfel:
328
I mplem en ta r ea structurilo r de date
-7 Daca vectorul era organizat ca un ansamblu Heap Maxim , va fi ordon at descrescator. ~
Daca vecto rul era organi zat ca un ansamblu He ap Minim , va fi ordonat crescator,
1
2
3
4
S
Cheia maxima din n noduri 1 2 3 4
n-2
n-l
n
n -l
n
=~ Ch eia ma xim a din n-1 noduri
1
2
3
4
n- 2
n -l
n
Ch eia maxim a din 2 nod uri Algor itmu l este: PAS1 . Se creeaza vectoru l care urrneaza sa fie soriat ca un vector care irnplernenteaza un ansamblu Heap . PAS2. Se salvea za lungimea logica a vector ului. PAS3. Se inltializeaza nodul curent cu ultimul nod (indicele i are valoarea n) . PAS4. Cat timp mai exista nod uri de extras din ansamblul Heap executa PASS. Se elirnina nodul din arbore ~i se salveaza in nodul curent. ] PAS6. Nodul curent dev ine ultimul nod din ansamblul ramas dupa eliminare (se decrementeaza cu 1 indicele nodului cure nt) ~i se revine la Pasu l 4 .
i
. . . / / d ate l e $i s truc t ur i l e de date d e clar a t e g lob a l v o i d crea r e_ he ap () { . . . } vo id afi~."are ( ) { } i nt e Li.m i .na () { } void HeapSbr t() ( in t i t j=n ; fo r (.1=n ;i>1;i - -) v li l ee Li mdna tl:
n =j ; ) voi d main( ) {c r e a r e _ h e a p ( }; HeapSort() ; a f i s a r e( ) ; cout«endl;} 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
A lg oritm ul de s ortare a unui vector folosind metoda HeapSort presupune organizarea
vecto-
rului ca un ansamblu Heap - complexitatea 0(nxlg2n), urmata de sortarea ansamblu lui Heap complexitatea 0 (nxlg2n). Rezutta ca in algoritmul de sortare prin metoda HeapSort , complexitatea este 0 (n xlg2n)+0(nxlg2n) = 0(n xlg2n+n xlg2n) = 0 (2xn xlg 2n)= 0(nxlg2n) Se citesc din fisierul BAC .TXT mai multe sirurl de numere naturale nenu le, starsitul fiecarui sir fiind marcat de 0 valo a re 0 (ca re nu S8 considera CEI face parte din vreun sir). :;3tiind ca fiecare dintre sirur i este un sir strict
I nform a fic a
329
crescator si ca i n total sunt eel mult 5000 de numer e, scrieti un program care sa realizeze afisare a tuturor numerelor nenule distincte din fisier, in odinea crescatoare a valorilor lor. a. Descrieti doua metode de rezoivare, una dintre metode fiind eficien ta ca timp de executare. b. Scrieti un program coresp unzator metodei eficiente descrise. (Bacalaureat - Simular e 2004)
2.8.6.4. Aplicatii practice 1. Mai multe vehic ule parcurg acetasi traseu. Fiecare vehicul este caracteriz at de un identificator , timpul de pornire, timpu l de sosire ~i timpul de parcurgere a traseului (care se calculeaza din diferen ta celor doi timpi). Scrieti un program care sa mem oreze aceste inforrnatii intr-un ansamblu heap ~i care sa asigure urrn atoarele functii; ada uqarea unui nod (un vehicul care a sosit) si afisarea inforrnatiilor despre vehicule , in ordinea cresca tc are a timpului de parcurs. 2. Produsul realizat de 0 sectie a unei fabrici este cerut de mai multi clien ti. Fiecare client este caracterizat de nume , nu ma r de telefon, data la care trebuie Iivrat produsul l?i cantitatea corn andata. Ce rerile sunt onorate in ordinea cale ndaristica a datelor de livrare ~i
i n functie de cantitatea dispcn ibila in stoc. Scrieti un prog ram care sa perrnita i ntre-
tine rea z ilnica a acest ei structuri de date, prin urrna toarele operatii: a. adauq area de noi comenzi; b. afis area listei de comenzi care trebuie onorate In ziua respectiv e ~ i salvarea ei Int r-un
fisier text (data calendaristica si stoeul de produse la i neeputul zilei se citesc de la c.
tas tatura); stocul la sfarsit ul zilei , dupa ce au fast onorate come nzile.
[ JE"V'S1]:\Ulaur-
5.
Arborele este un graf fara cicluri , minimal cu aceast a prop rietate . Arborele partial de cost minim deterrnina drumuri le de lungime minima dintre oricare doua noduri dintr-un graf conex. in algoritmul lui Kruska l pentru const ruirea APM , se porneste de la un arbore partia l care cont ine nodul radacina. intr-un arbore cu rad acina , implementarea cu referi nte ascend ente Ioloseste doi vectori: unul pentru a me mora nodurile terminale ~ i altul pentru a memora parintii nodurilor terminate . Algoritmul de parcurge re in latime a unui arbore cu radaci na prelucreaza into rmat ia
6.
in functie de rela tiile de subordonare dintre noduri. Arborele binar este un arbore cu radacina, in care fiecare nod are eel mult doi succesori.
7.
Un arbore binar strict este un arbore echi libral.
8. 9.
Un arbore vid este un arbore in care nodul radaci na nu are succesori. intr-un arbore binar de ca utare , cheia or icarui nod este mai mare deca l chelle succesorilor lui.
10. Pentru a sorta crescato r un vecto r cu algoritmul HeapSort , vectorul trebuie sa implementeze un arbore binar in care , pentru fiecare nod, cheia din succesorul stang este
330
Im plcrncntarca structurilor de da te
mai mica decat cheia din nod . iar chela din succesorul drept este rnai mare deca t cheia din nod. 11. Tntr-un ansamblu Heap , cheile nodurilor trebuie sa fie distincte.
Alcqeti : 1. Grice graf neorientat cu n nod uri ~ i n-1 rnuchii: a. este aciclic si neconex b. este conex daca si numai daca este aciclic c. este un arbo re d . este conex si conf ine un ciclu (Bacalaureat - Simulare 2003 ) 2. Nurnarul de muchii ale unui arbo re cu 9 noduri este: a. 9 b. 7 c. 8 d . 10
3. Nurnarul maxim de noduri terminale ale unui arbore liber cu 15 noduri este : a.15 b. 14 c.12 d.10 4. Numarul maxim de nodu ri terminale ale unui arbore cu radacina cu 15 noduri este: a.15 b.1 4 c.12 d.10 5. Nurnarul maxim de no duri terminale ale unui arbore binar cu 15 noduri este:
a. 6
b. 7
c. 5
d. 4
6. Se considers un arbore cu urrnatoarele propr ietati : radacina este nodul 1 (considerat de nivel 1) ~i fiecare nod i (cu hi$3) allat pe nive lul j are ca descendenti nodurile i+j si i+2 ' j . Nodu rile i (cu i>3) sunt nodur i terminate (frunze). Stabiliti care dintre vectorii urrnatori este vectorul de tali (sau de predecesori) corespun zator arbo relu i: a. 0 1 2 2 1 3 3 b. 0 -1 1 -1 -1 1 1 c. 0 1 1 2 3 2 3 d. 0 1 1 2 2 3 3 (Bacalaureat - Simu lare 2003) 7. Se cons idera arborele din ligura alaturata . Care dintre noduri tr~b.ui: ales ca radacina astfel lncat lnaltirnea arborelui sa fie ~ 2 3 4 minima. a. 7 b. 3 c. 5 d. 6 5 6 7 (Bacalaureat - Sesiunea specials 2003) 8. Un arbare are 14 naduri. Atat radacina . cat 9i fiecare dintre nadurile neterm inale au ce l mu lt 3 descendenti directi. Inal~jmea maxima a arbarelu i (nurnarul maxim de much ii ce leaqa radacina de 0 trunza ) este: a. 4 b. 13 c. 5 d. 3 (Bacalaureat - Ses iunea specia la 2003) 9. Memararea unui arbore cu ajutarul matr icei de adiacenta a grafului este 0 metoda : a. eficie nta
b . nee ficienta
c. incorecta d . recornandabila (Bacalaureat - Sesiunea specia la 2003 )
10.5e conside ra arborele din figura A2B. Definim i naltimea arbo relui ca fiind nurnarul maxim de muchii care torrneaz a un lant care une ste radacina de un nod termin al. Care este l naltimea maxima a arborelui cu radacina ce se poate obtine aleqand ca radacin» unu l dintre nodu ri? a. 5 b. 3 c. 6 d. 7 (Bacalaureat - Sesiunea iunie-iulie 2003 ) 11.5e cons idera un arbore cu radacina in care arice nod care nu este term inal are exact 3 descende nti directi. Atu nci, nurna rul de noduri term inale (frunze) poate fi:
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
pe nivelul i are exac t i+ 1 descend ent! directi, cu exceptia noduril or de pe nivel ul 4 care sunt noduri term inale. Numarul de noduri terminale (frunze) sunt: a. 24 b. 120 c. 6 d. 30 (Bacalaureat - Sesiunea august 2003 ) 13.Se considera un arbore. Despr e un lant care uneste doua noduri distincte n, si nz se poate afirma: b. este unic daca ~i numai daca n- sau n2e ste terminal a . e ste unic oricare ar fi "1~i "1 d. este unie daca ~i numai daca n, sau "2 este radacin a C. nu este unic oricare ar fi "1~ i "2 (Bacalaureat - Sesiunea august 2003) 14. Stabili\i care dintre grafurile ataturate ~ ~ este arbore : a. b. (Bacalaureat - Simul are 2004)
---.)t:rc. -..-
c. 3 40334 1 1
16.Numarul de noduri terminale ale arborelui este: a. 6 b. 4 c. 5
.
%
Urrnatorii 4 item i se refers la arborele cu radacina cu 8 noduri, cu much iile [1.7], [1,8]. [3,1J, [3,4], [3,5], [4,2], [4 ,6] si cu radacina in nodul cu eticheta 3.
15.Vectorul tata al arborelui este: a. 340 334 1 2 b. 330 43 4 1 1
d
d. 34 3 34 1 1 0 d. 3
17 .inal\imea ma xima pe care 0 poate a vea , schirnbandu-se nodul , radacina este :
a. 6
c. 4
b. 5
d. 3
18 .Daca S8 ia ca radacina nodul cu eticheta 2, Inaltirnea arborelui este:
a. 5
c. 4
b. 2
ts. Nurnaru' de componente conexe care extremitate in nodul cu etiche ta 3 este :
a. 3
S8
d. 3
obtin daca
S8
elirnina muchiile care au
c. 2
b. 4
0
d. 1
Urmato rii 5 itemi 58 retera Ia arborele cu radacina cu 8 noduri care are vect orul tata: 2 0 2 1 1 1 3 3. 20.Numarul de noduri terminale ale arborelu i este: a. 3 b. 4 c. 5
d. 2
21.Numarul de lanturi de lungime 3 este : a. 3 b. 4
d. 6
c. 5
22.Numarul de lanturi de lungime 2 care pornesc din radaci na este : a. 2 b. 4 c. 3
d. 5
23.Numarul de nivele ale arbore lui este: a. 2 b. 3
d. 5
24.Fiii nodulu i 3 sunt: a. 4, 5 6
b. 1. 2
c. 4 c. 7, 8
25.Un arbore binar strict cu 4 ncdu ri terminate are in total a. 5 noduri b. 7 noduri c. 9 noduri 26.Un arbore binar strict are:
d . 2. 7.8 d . 10 noduri
332
Irnplemc nta r ea structnrilo r de date
a . un numar par de nod uri c. un numar par de muchii
b. un numar impar de noduri d. un numar impar de muchii
27.Se considera arborele din figura alaturata . Stabiliti ce fel de arbore nu este: a. arbore binar c . ansamblu Heap
b . arbore de cautere d. arbore strict
28.Se considera arborele din figura de la problma anterioara. Stabilit i ce fer de arbore nu este: a . arbore echilibrat c . arbo re aproape complet
3
b . arbore comp let d . arbore strict
10
29. Un arbore binar strict cu 4 noduri termina te are in total : a. 4 muchii b. muchii c. 8 muchii d. 9 muchii Urrnatorii 5 itemi S 8 refera la arborele binar din fjgura alatur ata: r este un pointer catre radacina, iar p si q . doi pointeri catre un nod oarecare : 30.Alege1i varianta corecta pentru a afisa cheia 15: a. cout« r- >d - >d >- > i n f o; b. c. p = r -> s ->d ; cout« p- >d - > i n f o; d.
cout« r - >s - >s >- >i n r o ; p =r ->s->d ; c o u t «p->info ;
31.Daca se executa instructiunea: p =r - >s ->d ->d ; pointe rul p va indica che ia: a. 21 b. 20 c. 18 d . 25 sz .u rmatoarea secventa de instructiuni : per -c-d -c-d , p""V-> s; q'"'"new nod ; q ->info=5 ; q ->s""'NULI. ;
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 ;
succesor stanq al nodului cu cheia 30; succeso r drept al nodului cu chela 30; succesor stanq al nodului cu cheia 19; succesor crept al nodului cu cheia 19;
33.Urrnatoarea secventa de instructiuni: for {p= r ; p - >s !=NULL i P=P- >S) ; q~n ew nod ; q-> i nfo=20 ; q->s =NULL; q->s o=NULL; p->s=q ; realizeaz a: a. adauqa nodul cu cheia 20 ca succesor stanq al nodului cu cheia 25; b. adauqa nodul cu cheia 20 ca succesor drept al nodului cu cheia 25; c. acauqa nodul cu cheia 20 ca succesor stanq al nodului cu cheia 21; d . adauqa nodul cu cheia 20 ca succesor drept al nodului cu che ia 21; 34.Urmatoarea secventa de instructiuni : for
(p~ L; p ->d- >j! ~NULL ;p=p->j) ;
realizeaza: a. elimina nodul cu cheia 21; c. elirnina nodul cu cheia 25;
q - p -od . p - >d 'NULL;
dispose q ;
b. elimina nodul cu chela 18; d.
elirnina nodu l cu cheia 30;
Miniproiecte: 1. Pentru evidenta elevilor din clasa, se pastreaza urrnatoarele inforrnatii: nurnarul de ordine din catalog. numele si prenumele, mediile semestriale ~i media anuala la disciplina informatica. Reallzati a aplicatie care sa asigure urmatoarele functii: a. adauqarea unui nou elev;
Informatica
333
b. elirninare a unui elev; c. modificarea mediei unui elev: d. afisarea elevi lor eu med iile (semestriale, respectiv anuale), in ordinea descrescatoare a rnediilor ,
e. afisarea elevilor eu mediile (semestriale, respectiv anuale) cuprinse intre doua valori care se citesc de la tastatura . 2. lntr-o biblioteca, pentru fiecare carte se pastreaza urmatoarele lntormatii: codu l cartli, titlul, autorul, numarul total de exemplare ,i nurnarul de exemplare disponibi le la un moment dat. Realiza~i a aplicatie care sa asigure urmatoarele functii: a. reqasirea unei carti, du pa autor, pentru a afisa nurnarul de exemplare disponibile; b. adauqare a unui nou titlu: c. ad auqa rea de noi exemplare, pentru titlurile existente; d. modificarea nurnarului total de exemplare (In cazul distrugerii unora dintre ele): e. modificarea nurnarului de exemplare disponibile, in cazul in care 0 carte este imprumu tata sau tnapoiata: t. afisarea cartilor pentru care nu mai exists exemplars disponibile; g. afisarea In ordine afabetica a autorilor.
3. Pentru fi ecare articol dintr-o magazie, S8 pastreaza urmatoarele informafii: codul articolului (este unic pentru fiecare articol), denumirea articclului, unitatea de rnasura si cantitatea din stoc. Realizati a aplicatie pentru gestianarea magaziei - care sa asigure urrnatoarele fu nctii: a. adauqarea unui nou articol; b. sterqerea unui articol; c. introducerea de la tasta tura a can titatii intrate, dintr-un articol precizat prin cod , ~ i actualizarea stocului; d. introducerea de la tastura a cantitatii iesite, dintr-un articol preeizat prin cod , si cu aetualizarea stoeului; e. afisarea articolelor care au stoeul pe 0; f. afisarea stocului unui articol al carui cod se introduce de la tastatura ; g. afisarea . In ordinea codurilor, a stoeurilor din fieeare artico l.
Cup rins I. Tchnici de proprnnuu-c ••....•. ... ... .... ...... ... .............••.......•................. ..•..••....••....••. 3 1.1. Analiza algoritmilor 3 1.2. Metode de construire a algoritmilor 5 .. 6 1.3. Metoda backtracking .. 1.3.1. Descrierea metodei backtracking 6 1.3.2. Implementarea metode i backt racking 10 .. 14 1.3.3. Probleme rezolvabile prin metoda backt racking. 1.3.3.1. Generarea perrnuta rilor . .. 15 1.3.3.2. Generarea produsu lui cartezian 17 1.3.3.3. Generarea ara njamente lor .. 20 1.3.3.4. Generarea combinarilor .. 22 1.3.3.5. Ge nera rea tuturor partitiilor unui nurnar natura l 24 1.3.3.6. Generarea tuturo r partitillor une i rnultirni 27 1.3.3.7 . Generarea tuturo r functiilor surject ive 28 .. 30 1.3.3.8. Problema celor n dame . 1.3.3 .9. Pa rcurgerea tablei de sah cu un cal., . 31 1.3.3.10. Generarea tuturo r posibilitatior de iesire din labirint .. 34 .4 0 1.4. Metoda " Divide ot Impera" 1.4.1 . Descrierea metode i "Divide et Impera" .4 0 1.4.2. Implementarea metode i "Divide et Impe ra".. .. .. 41 .. .4 8 1.4.3. Cautarea binara , 1.4.4. Sortarea rapida (QuickSort) .. 50 1.4.5. Sortarea prin interclasare (MergeSort) . .. 53 1.4.6. Prob lema turnurilor din Hano i 54 1.4.7. Generarea mode le!or fracta le 56 1.5. Metoda greedy 59 1.5.1. Desc rierea metode i greedy .. . 59 1.5.2. Implementarea metode i greedy. . 61 1.6. Metoda proqramarii dinamice . . 70 1.6.1. Descrierea metodei proqrarna rii dinamice 70 1.6.2. Impleme ntarea metodei proqrarnarii dinamice ..73 1.7. Compararea metodclor de construire a algoritmilor 83 Evaluare .. 85 2 . Irnplcmcntarca structurilor de dale 90 2.1. Tipuri de date specifice pentru adrcsarea memoriei 90 2.2. Tipul de data pointer 91 2.2.1. Declarararea va ribilelei de tip point er 92 .. 92 2.2.2 . Constante de tip adresa ., 2.2.3. Ope rator i pentru variabile de tp pointe r 94 2.2.3 .1. Operatorii specifici.. . 94 2.2.3 .2. Ope ratorul de atribuire 97 2.2.3 .3. Operatorii aritmetici 100 2.2.3.4. Operatorii relation ali .. 101 2.3. Tipul de data referinta 102 2.4 . Alocarea dinamica a memorici 106 2.5 . Clasificarca structurilor de date 109 2.6. Lista liniara 113 .. 115 2.6.1. Implem entarea dina rnica a listelor in limba jul C++ . 2.62 . Clasificarea listelor 117 2.6.3. Algoritmi pentru prelucrarea liste!or simplu i nlantuite 118 2.6 .3.1. lnitia lizarea listei 118 2.6.3.2. Crearea liste i 118
2.6.3.3. Adauqarea primului nod la lista . . 118 2.6.3.4. Adauq area unui nod la tista 119 2.6.3.5. Parcurgerea listei . 121 121 2.6.3.6. Cautarea unui nod in lista 2.6.3.7. Eliminarea unui nod din lista 122 2 6.3.8. Eliberarea spatiutul de memo rie ocupat de lista 123 2.6.3.9. Liste ordonate 124 2.6.3.10. Preluc rarea listelor simplu Inlantuite .. 127 2 6.4. Algoritmi pentru prelucra rea listelor circula re simplu lnlantuite. . 137 2 .6A .1. Crearea listei ... 137 2.6A .2 . Parcurgerea listei .. . 138 2.6A .3. Elimi narea unui nod din lista 138 2.6.5. Algor itmi pentru prelucrarea listelor dublu lnlantuite 140 2.6.5.1. Adauqarea primului nod la lista 140 2.6.5.2. Adauq area unui nod la Iista ....... . 140 2.6.5.3. Parcurgerea listei 141 2 .6 .5A . Eliminarea unui nod din lista 14 1 2.6.6. Algoritmi pentru prelucrarea stivelor 145 2.6.6.1. lnitializarea stivei ... 145 2.6.6 2. Adauqarea unui nod la stiva ., .. 146 2.6.6 .3. Extragerea unui nod din stiva .. . ... 146 2.6 .6A . Prelucra rea stivei .... .... .. 146 2.6.7. Algoritmi pen tru prelucrare a cozilor 148 2.6.7.1. lnitiafizarea cozii 149 2.6.7.2 . Adauqarea unui nod la coaca 149 2.6.7.3. Extragerea unui nod din cc ada . 149 2 .6 .7 A . Prelucrarea cozii 149 2.6.8. Aplicatli practice 151 Evalu ar e .. 152 2.7. Graful 159 2.7.1. Defin itia matematica a grafului .. . 159 2.7.2. Graful neorientat .. 160 2.7. 2.1. Terminologie .... . 160 2.7.2.2. Gradul unui nod al grafului neorientat 162 2.7.2.3. $ irul grafic 164 2.7.3. Graful orient at 165 2.7.3.1. Termi nologie .. 165 2.7.3.2. Grade le unui nod al grafului orientat .. 167 2.7A . Reprezentarea si implementarea grafu lui 169 2 .7 A .1 . Reprezentarea prin matricea de adiacenta . 169 2.7 A .2 . Rep rezentarea prin matricea de incidenta . .. 175 2.7 A. 3. Reprezentarea prin lista muchiilor (arcelor) . . . 182 2.7 AA . Reprezentarea prin lista de adiacenta (Iistele vecini lor) 187 2.7 A .5. Aplicatii practice . .. 197 2.7.5. Gra furi spec iale. .. 20 1 2.7.5.1. Graful nuL 20 1 2.7 .5.2. Graful comple!.. ........ . 20 1 2.7.6. Grafu ri derivat e dintr-u n graf 203 2.7.6 .1. Graful parjial........... . 203 2.7.6.2. Subgraful 207 2.7.6.3. Graful complementar 211 2 .7 A .4 . Ap licatii practice .' 212
...
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
I: - 19S1 - 01: - 1: £6 ' 8£6 NaSI 6 - 19S1 - or - 1:£6 NaSI
-:»
"
-, 0,
·'