Programarea Calculatoarelor Limbajul PASCAL

  • Upload
    36

  • View
    275

  • Download
    1

Embed Size (px)

Citation preview

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    1/221

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    2/221

    Cuprins

    1. Tipuri dinamice de date. Lucrul cu adrese ...................................................... 3

    2. Structura de list n limbajul Pascal ................................................................ 15

    3. Grafuri. Implementri n limbajul Pascal ........................................................ 28

    4. Structuri arborescente ...................................................................................... 48

    5. Algoritmi recursivi. Metodele divide et imperai backtracking............ 73

    6. Reprezentarea vizual a datelor ....................................................................... 92

    7. Tehnici speciale n Pascal .................................................................................... 123

    8. Prelucrarea etichetelor de fiier i a altor informaii externe

    memorate n discuri .................................................................................................. 143

    9. Unele aspecte tehnice referitoare la prelucrarea fiierelor .................... 162

    10. Obiecte n Pascal ................................................................................................. 174

    Anexa 1 Unitatea DOS .......................................................................................... 208

    Anexa 2 Unitatea CRT .......................................................................................... 215

    Anexa 3 Erori de execuie ................................................................................... 217

    Bibliografie ................................................................................................................. 221

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    3/221

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    4/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    paragraf, poate fi reprezentat ca o valoare pe 16 bii. n calculul adresei fizice pe20 bii, se aplic urmtoarea relaie: segment*16+offset, unde segment i offsetdesemneaz coninutul registrelor de segment (un numr de paragraf), respectiv dedeplasare. Adresele din segmentul curent se numescapropiate (near), iar cele din afara

    acestuia sunt ndeprtate (far). Accesul la o adres apropiat presupune doarschimbarea coninutului registrului de deplasare, n timp ce pentru o adres ndeprtattrebuie schimbat att valoarea registrului de segment, ct i a celui de deplasare.

    n unitatea System sunt definite funciile Seg(Var x):WORD, Ofs(VARx):WORD care furnizeaz adresa de segment i deplasarea variabilei, procedurii saufunciei x. n Pascal exist tipul de date pointer, memorat pe dou cuvinte, n carecuvntul superior (high) conine partea de segment, iar cuvntul inferior (low) pe cea dedeplasare asociate unei adrese. Pentru a se putea exemplifica modul de lucru cu

    adrese, se precizeaz faptul c:

    tipul pointer se definete prin construcia de forma^tip; adresarea indirect a unei variabilei se definete prin construcia identificator^; referirea adresei unei variabile se definete prin construcia @identificator.

    Programatorul trebuie s fac distincie ntre adresa i coninutul uneivariabile, precum i ntre adresarea directi cea indirect. n exemplul de mai jos,liniile surs numerotate de la 1 la 8 se genereaz urmtoarele tipuri de adresare: 1, 2,4:adresare direct pentru ambii operanzi i lucru cu coninut; 3: adresare directpentru pai a, lucru cu coninut pentru pai cu adresa a; 5: adresare direct pentru c

    i indirect pentru pa, lucru cu coninut; 6, 7, 8: adresare indirect i lucru cuconinut. De remarcat cpa este de tip pointer, pa^ este de tip REAL iar@a esteadresa a (are configuraie de pointer).

    n sintaxa @identificator, identificatorse refer la o variabil, procedur saufuncie. Efectul referirii @identificatoreste similar celui obinut prin funcia Addrdefinit n unitatea System astfel: Addr(VAR x):pointer, unde x este variabil,funcie sau procedur. Folosirea referirii identificator^ presupune existena uneiadrese valide n variabila identificator.

    Exemplu:1.1.VAR a,b,c:REAL; {Se rezerv cte 6 octei pentru fiecare variabil}

    pa,pb:^REAL; {Se rezerv cte 4 octei pentru fiecare variabil}BEGIN

    a:=20; {Se atribuie valoarea 20 variabilei de adresa a} 1b:=a; {Se atribuie variabilei de adresa b, coninutul variabilei

    de adresa a} 2pa:=@a; {Se atribuie variabilei de adresa pa, adresa a} 3

    pb:=pa; {Se atribuie variabilei de adresa pb, coninutul variabilei deadresa pa} 4

    c:=pa^; {Se atribuie variabilei c, coninutul variabilei a crei adreseste memorat n pa; aceasta este adresare indirect prin pa.Lui c i se atribuie coninutul lui a (20)} 5

    4

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    5/221

    Tipuri dinamice de date. Lucrul cu adrese

    WriteLn( 'Valoarea ',pb^:10:2,');

    {Se scrie continutul variabilei a carei adresa este n pb } 6WriteLn( 'Adresa fizica a lui A : ,seg(pb^),':',ofs(pb^));

    {Se scrie adresa a, sub forma segment:deplasare} 7

    WriteLn( 'Adresa fizica a lui PB:',seg(pb),':',ofs(pb)); {Se scrie adresa pb, sub forma segment:deplasare} 8

    1.2 Structura memoriei la execuia unui program

    Dup ncrcarea programului executabil, memoria aferent lui se structureazn urmtoarele regiuni (segmente): segmentul prefix program, regiunea de cod,segmentul de date, stiva i zona heap (figura 1.1). Pentru adresarea acestora, unitateacentral de prelucrare folosete registre specializate (tabelul 1.1), la unele dintre eleexistnd acces direct (vezi tipul Registers din unitatea DOS, anexa 1) sau indirect dinprograme Pascal.

    Tabelul 1.1 Registre de segment /deplasare i funcii standard asociate

    Tipul segmentului Registrul desegment

    Registrul dedeplasare

    Seg:Ofs

    Segment de cod CS (CSeg) IP CS:IP

    Segment de date DS (DSeg) SI DS:SI

    Segment de stiv SS (SSeg) SP (SPtr) SS:SP (SSeg:SPtr)

    Observaie: Cseg, DSeg, SSeg, SPtr sunt funcii de tip WORD, nu au parametri isunt definite n unitatea System.

    Segmentul prefix al programului(PSP) este o zon de 256 de octei constituitde MS-DOS la ncrcarea n memorie a fiierului de tip .EXE. El conine informaiinecesare sistemului de operare pentru a transfera controlul ctre program, respectivpentru a returna controlul ctre sistemul de operare la ncheierea execuiei acestuia.Adresa de segment este memorat n variabila public PrefixSeg, de tip WORD,definit n unitatea System.

    Regiunea de cod este constituit din mai multe segmente de cod: unul

    corespunznd programului principal, respectiv cte unul pentru fiecare unitate referit nprogram. Primul segment de cod este cel asociat programului principal, urmat de celeale unitilor, n ordinea invers specificrilor din clauza USES. Ultimul segment decod, introdus implicit n orice program executabil, corespunde unitii System, careconine biblioteca de subprograme standard referite la momentul execuiei (Run-timelibrary). n absena clauzei USES, zona de cod va conine dou segmente: cel alprogramului principal i cel al unitii System. Codul poate fi mprit ntr-un numroarecare de segmente, singura limitare fiind dat de memoria disponibil. Registrul CS

    5

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    6/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    conine adresa de start a instruciunilor programului, iar registrul IP (registru pointer alinstruciunilor) precizeaz adresa urmtoarei instruciuni de executat. Programele Pascalnu au acces la registrul IP, dar valoarea curent a registrului CS poate fi obinut cufuncia CSeg. Adresa de nceput a zonei de cod este CSeg:0000. Coninutul registrului

    CS se poate modifica pe parcursul execuiei, depinznd de faptul c instruciunileexecutate sunt din programul principal sau din una dintre uniti.

    Segment cod program principal

    (Limita superioar a memoriei RAM convenionale)

    HeapPtr

    HeapOrg

    SSeg:SPtr

    SSeg:0000

    DSeg:0000

    CSeg:0000PrefixSeg:0000

    Heap

    Stiva

    Date

    Cod

    Zona neutilizat n heap

    Zona neutilizat n stiva

    Variabile globale

    Constante cu tip

    Unitatea System

    Uniti specificate nclauza USES

    Exemplu:

    USES Crt,A,B,C;

    Segment cod Crt

    Segment cod A

    Segment cod B

    Segment cod C

    Program Segment Prefix (PSP)

    Variabile dinamice curent alocate n heap

    Date nregistrate n stiva

    Con inut

    fiier

    .EXE

    Fig. 1.1 Harta memoriei la execuia unui program Pascal

    Segmentul de date este unic i conine constantele cu tip urmate de variabileleglobale. Atunci cnd necesarul de memorie pentru datele interne depete 64Ko,trebuie s se recurg la folosirea unor tehnici adecvate (memorarea datelor n heap saupe medii externe, folosirea compactrii etc.). Registrul DS conine adresa de nceput asegmentului de date i nu se modific pe parcursului execuiei. SI reprezintregistrulindex al sursei, folosit pentru a puncta (a indexa) o dat n cadrul segmentului de date.Pentru instruciunile asupra irurilor de caractere, registrul SI puncteaz pe operandulsurs, n timp ce un alt registru, index al destinaiei (DI), puncteaz operanduldestinaie. Funcia DSeg returneaz valoarea curent a registrului DS. Registrele SIiDI pot fi accesate indirect, printr-un apel la o ntrerupere. Adresa de nceput asegmentului de date este DSeg:0000.

    6

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    7/221

    Tipuri dinamice de date. Lucrul cu adrese

    Segmentul de stiv, ca i cel de date, poate avea maximum 64Ko, reducn-du-se la unul singur. Stiva este folosit n lucrul cu subprograme pentru memorareaparametrilor formali, variabilelor locale i adreselor de revenire. Registrul SS conineadresa de nceput a stivei i nu se modific pe parcursul execuiei.Registrul pointer al

    stivei (SP) precizeaz deplasarea curent n cadrul stivei. Funcia SSeg returneazvaloarea registrului SS, iarSPtr returneaz valoarea curent a registrului SP. n cadrulstivei, alocarea spaiului se face ncepnd de la adrese mai mari spre adrese mai mici.Adresa curent este definit de SS:SP sau, conform celor precizate anterior, deSSeg:SPtr.

    Zona variabilelor dinamice poate corespunde ntregii memorii convenionalea calculatorului, rmas disponibil dup ncrcarea programului. n heap se memoreazvariabilele dinamice, buffer-ele pentru structuri de reacoperire i pentru lucrul n modul

    grafic. Adresa de nceput a zonei heap este dat de variabila public HeapOrg, iaradresa curent este dat de variabila HeapPtr, ambele de tippointer, definite n unitateaSystem. Alocarea variabilelor ncepe de la adrese mai mici ctre adrese mai mari,spaiul maxim ce poate fi alocat unei variabile neputnd depi 64Ko (strict riguros,65520 octei), ca urmare a limitrilor impuse mecanismului de adresare a memoriei.Dup modul lor de funcionare, stiva i heap-ul pot fi asimilate cu dou stive aezatespate n spate.

    Programatorul poate controla repartizarea memoriei disponibile ntre stiv i

    heap n faza de execuie cu directiva de compilare {$M}, care are urmtoarea formsintactic:{$M StackSize,HeapMin,HeapMax}

    StackSize trebuie s fie un ntreg din domeniul 1024 (1Ko) la 65520 (64 Ko),prin care se specific mrimea segmentului de stiv. HeapMin i HeapMax specificdimensiunea minim, respectiv maxim a heap-ului, teoretic cu valori ntre 0 i 640 Ko.Riguros, HeapMin poate avea valori de la 0 la 655360, iarHeapMax trebuie s fie ndomeniul de la HeapMin la 655360. Valorile implicite pentru aceti parametri dealocare sunt {$M 16384,0,655360}.

    Rezult c dimensiunea implicit a stivei este de 16 Ko, iar zona de heap seextinde, teoretic, n tot spaiul rmas liber n memoria convenional. Practic, dindimensiunea de 640 Ko trebuie sczut, pe lng spaiul ocupat de programul nsui, celcorespunztor componentelor sistemului de operare rezidente n memorie pe parcursulexecuiei.

    1.3 Tipuri dinamice de date

    n Pascal se opereaz cu dou tipuri de date dinamice - referini pointer -primele fiind "cu tip" iar celelalte "fr tip".

    Tipul referin are sintaxa: tip_referin=^tip_de_baz;. Simbolul ^ aresemnificaia de "indirect". Datorit asocierii cu un tip de baz, variabilele tip_referinse mai numesc i variabile cu referin legat. La compilare, pentru astfel de variabile,se vor rezerva n segmentul de date dou cuvinte i la referirea lor se vor genera

    7

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    8/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    instruciuni cod main conform tipului de baz, dar cu adresare indirect. nainte dereferire, n variabilele de tip_referin trebuie s se ncarce adresele variabilelor de tipultip_de_baz. Declararea unui tip referin permite referirea anterior declarrii tipului debaz. Astfel, urmtoarea secven de declarri este corect: TYPE pointer_a=^vector;

    vector=ARRAY[1..20] OF REAL;Construcia sintactic a referirii unei variabile dinamice depinde decaracteristicile tipului su de baz: este de forma identificator^ n cazul tipurilornestructurate sau celor structurate care permit referirea global (STRING, RECORD iSET); conine prefixul identificator^, urmat de elementele specifice modului dereferire a componentelor, n cazul tipurilor structurate care permit referirea pecomponente (ARRAY, STRING i RECORD). Aceste posibiliti de referire suntilustrate n programulAlocare_dinamic_1.

    Tipul pointereste desemnat prin cuvntul rezervat pointer. Variabilele de tippointer pot fi denumite variabile cu referin liber, deoarece pot fi folosite lamemorarea adreselor pentru variabile de orice tip. Tehnica de lucru cu astfel de variabileeste asemntoare celei prezentate la tipul referin. Utilizarea efectiv presupune i nacest caz o asociere explicit cu un anumit tip de baz, dar soluia folosit este diferit.La tipul referin, asocierea se face prin declarare, iar n cazul tipuluipointerasocierease realizeaz la utilizare, prin diverse tehnici. O posibilitate este asigurat de referinatypecasting (transfer de tip), care are forma general: tip(variabil), unde tip este un tip

    standard sau declarat anterior de utilizator iar variabil poate fi cu/fr tip sau oreferin prin pointer, de forma variabil_pointer^.Din punct de vedere fizic, variabilele de tip referin_legat i pointer

    memoreaz adrese sub forma segment:offset. De aceea, n limbajul curent despecialitate, ambele tipuri se definesc prin termenul pointer. Urmtorul exempluevalueaz expresia e:=a+b, folosind adresarea indirect pentru toate variabilele (a i eprin referin_cu_tip iarb prinpointer):

    VAR

    a,b,e:REAL;pa,pe:^REAL;pb:POINTER;BEGINpa:=addr(a); pb:=@b; pe:=@e;Write(A=); ReadLn(pa^);Write(B=); ReadLn(REAL(pb^));pe^:=pa^+REAL(pb^);WriteLn(E= ,pe^:8:2))END.

    Variabilele pointer (referin saupointer) pot fi puse n relaie cu operatorii = i< >. Dou variabile vor fi egale dac au componentele segment, respectiv offsetegale.De remarcat faptul c dou variabile de tip pointer care indic aceeai adres pot fineegale, deoarece le difer componentele. Variabilele pointer pot fi folosite n atribuiri.Att n relaii ct i n atribuiri sunt definite urmtoarele clase de compatibilitate: tipulreferin este compatibil cu orice alt tip dinamic; dou variabile de tip referin suntcompatibile dac sunt de acelai tip.Observaie:pai pb nu sunt de acelai tip dac sunt declarate astfel: pa:^real; pb:^real.

    8

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    9/221

    Tipuri dinamice de date. Lucrul cu adrese

    Ele sunt de acelai tip dac sunt declarate astfel: pa,pb:^real.Este definit o constant simbolic (nil) cu semnificaie de valoare nul a

    tipului dinamic (valoarea nil nu puncteaz o zon de memorie).

    1.4 Utilizarea zonei heap

    Noiunea de dinamic este strns legat de utilizarea zonei de memorie heap(dei tipul dinamic poate fi asociat variabilelor memorate n orice component amemoriei principale). n unitatea System sunt definite urmtoarele variabile de tip

    pointer, care pot fi folosite n gestionarea zonei heap: HeapOrg, HeapPtr, HeapEnd,HeapError, FreeList.

    HeapOrg puncteaz pe adresa de nceput a zonei heap, iarHeapEnd d adresade sfrit a heap-ului. HeapPtr conine urmtoarea adresa disponibil din heap. Eaestevariabila prin care se gestioneaz fiecare nou alocare, punctnd pe prima adresdisponibil din heap. Toate procedurile de alocare (New, GetMem, Mark) lucreaz cuaceast variabil. HeapError corespunde adresei rutinei de tratare a erorilor de alocarepentru variabile dinamice. FreeList servete la gestiunea blocurilor devenite libere n

    interiorul heap-ului, punctnd pe primul bloc liber n heap, care puncteaz pe al doilea.a.m.d. Ultimul bloc liber puncteaz pe vrful heap-ului, adic pe locaia dat deHeapPtr, asigurndu-se astfel posibilitatea realocrii acestor spaii. Dac n interiorulheap-ului nu exist blocuri libere, atunci FreeList va fi egal cu HeapPtr.

    De asemenea, n unitatea System sunt definite o serie de proceduri i funciicare pot fi utilizate n lucrul cu variabilele dinamice. Procedurile GetMem(p,n),FreeMem(p,n), respectiv New(p)i Dispose(p) se folosesc pentru a aloca/elibera unbloc a crui adres este dat de variabila pointer sau referin, p.

    Deoarece zona heap este limitat, iar alocarea i eliberarea dinamicdetermin alternana unor zone libere cu cele ocupate, este necesar cunoatereaspaiului disponibil i a spaiului contiguu maxim disponibil. n acest scop pot fifolosite funciile (fr argumente, cu rezultat de tip LONGINT) MemAvail (pentruspaiul total disponibil) i MaxAvail (pentru spaiul contiguu maxim disponibil).Iniial, rezultatul furnizat de MemAvail corespunde dimensiunii totale a heap-ului, carepoate fi obinut i prin aplicarea formulei (Seg(HeapEnd^)-Seg(HeapOrg^))*16,ntruct adresele de nceput i de sfrit ale heap-ului sunt exprimate ca numere de

    paragraf. De asemenea, aceast dimensiune coincide iniial cu cea furnizat de funciaMaxAvail, care precizeaz cel mai lung bloc de locaii de memorie contigue disponibilen heap. Se poate determina dac spaiul disponibil este contiguu, pe baza expresieirelaionale MemAvail = MaxAvail. Dimensiunea n octei ocupat de o variabilpoate fi obinut cu funcia SizeOf(VAR x):WORD, unde x este identificator devariabil. Se poate stabili dac spaiul disponibil este acoperitor pentru o variabil deun anumit tip, scriind o relaie de forma MaxAvail >= SizeOf(tip).

    Alocarea i eliberarea zonelor pentru variabile referin_legat se face cu

    9

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    10/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    procedurile New, respectiv Dispose, definite n unitatea System astfel: New(VARp:pointer), Dispose(VAR p:pointer). Procedura New rezerv n heap o zon dememorie de lungime egal cu cea indicat de tipul de baz i ncarc n variabila padresa acestei zone.

    Exemplu:

    1.2.VAR

    px:^INTEGER;{La compilare se rezerva 4 octeti in segmentul de date}BEGIN

    New(px); {La executie se rezerva 2 octeti si se incarca adresa zonei rezervate inpx}

    px^:=21; {Se memoreaza valoarea 21 in zona de tip INTEGER din heap}Dispose(px); {Se elibereaza spatiul rezervat in heap}

    De remarcat c exist dou niveluri de rezervare: static (corespunztoare luipx) i dinamic (datorat procedurii New(px), care rezerv variabil n heap, nconformitate cu tipul de baz). Din punct de vedere fizic, operaia realizeaz memorarean variabila p a valorii HeapPtri avansarea acesteia din urm cu lungimea specifictipului de baz. Dac nu exist o zon contigu disponibil de lungime mai mare sau

    egal cu cea necesar, se genereaz eroare de execuie. Procedura Dispose elibereazzona alocat variabilei. Urmtorea alocare se poate face pe spaiul eliberat, dac esteacoperitor ca lungime. Fizic, se reface n HeapPtr valoarea de dinaintea alocrii prinNew.

    n programulAlocare_dinamic_1 se ilustreaz prin exemple simple alocarea ieliberarea spaiului din heap,precum i referirile globale i pe componente pentruvariabile dinamice ale cror tipuri de baz sunt nestructurate sau structurate. La execuiaprogramului, pe lng afiarea mesajelor care ilustreaz corectitudinea folosirii tehnicii

    de lucru cu variabile dinamice, se remarc revenirea n final, dup eliberarea tuturorzonelor alocate, la dimensiunea iniial a heap-ului.Prin posibilitatea de generare a unor succesiuni de valori de acelai tip, de la

    simpla alocare dinamic de spaiu pentru o singur valoare a unei variabile se poatetrece la realizarea unor structuri dinamice de date. Acest lucru este posibil pe bazanlnuirii succesiunilor de valori, ca urmare a includerii la fiecare element al structurii adou pri: o parte de informaii, corespunznd valorii propriu-zise a elementului; oparte de legtur, care va conine adresa urmtorului element.

    Fr a se urmri, n acest context, abordarea problematicii implementriistructurilor de date complexe (liste, stive, cozi, arbori binari etc.), n programulAlocare_dinamic_2 se prezint realizarea unei liste nlnuite pentru memorarea nheap a unui vector. Aplicaia are n vedere memorarea n heap a unui vector de maridimensiuni, cu elemente de tip ntreg. Pentru fiecare element se construiete o structurde tip RECORD, n forma asociat tipului element. Pentru simplificare, se cereutilizatorului s precizeze numrul total de valori i valoarea de start, elementele fiindgenerate automat, ca numere ntregi consecutive. Dup construire se reia traversarea

    10

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    11/221

    Tipuri dinamice de date. Lucrul cu adrese

    listei, cu afiarea pe monitor a elementelor vectorului.Prin procedura New(leg) se va aloca o zon de memorie de dimensiunea unei

    date de tipul element, iar n variabila de tip legse va memora adresa de nceput a acesteizone. Zona de memorie a crei adres este coninut n variabila de tip legva fi referit

    prin indirectare, folosind o construcie sintactic format din - sau ncepnd cu -variabila de tip leg .

    PROGRAM Alocare_dinamica_1;USES Crt;TYPEpv=^v;v=ARRAY[1..100] OF INTEGER;ps=^s;s=STRING[120];pm=^m;

    m=SET OF CHAR;pc=^CHAR;pa=^a;a=RECORD

    nume:STRING[15];nota:ARRAY[1..5] OF 1..10;

    end;VARlegv:pv; legs:ps; legm:pm; legc:pc; lega:pa;

    BEGINClrScr;

    WriteLn('Adresa de inceput heap: ',Seg(HeapOrg^),':',Ofs(HeapOrg^));Writeln('Adresa de sfirsit heap: ',

    Seg(HeapEnd^),':',Ofs(HeapEnd^));WriteLn('Valoare pointer heap: ',

    Seg(HeapPtr^),':',Ofs(HeapPtr^));WriteLn('Dimensiune totala heap: ',MemAvail);{Rezultat echivalent: (Seg(HeapEnd^)-Seg(HeapOrg^))*16 }WriteLn('Bloc maxim in heap: ',MaxAvail);New(legv);WriteLn('Memorie alocata in heap: ',SizeOf(legv^));WriteLn('Memorie libera in heap: ',MemAvail);

    legv^[1]:=1;WriteLn('v[1]=',legv^[1]);Dispose(legv);WriteLn('Memorie libera in heap: ',MemAvail);New(legs); legs^:='PASCAL';WriteLn('Al treilea caracter din sir este ',legs^[3]);New(legm); legm^:=['a'..'c'];IF 'c' IN legm^ THEN Writeln('Litera "c" apartine multimii');New(legc); legc^:=#65; Writeln('Caracter atribuit: ',legc^);New(lega); lega^.nume:='POPESCU ION'; lega^.nota[2]:=10;WriteLn('Studentul ',lega^.nume,' are nota ',lega^.nota[2], '

    la disciplina a doua');Dispose(lega); Dispose(legs); Dispose(legc); Dispose(legm);WriteLn('Memorie libera in heap: ',MemAvail);

    END.

    Din analiza programului Alocare_dinamic_2 se pot desprinde cteva dincerinele impuse programatorului n construirea i prelucrarea structurilor dinamice.Astfel, pentru a face posibil traversarea ulterioar, se memoreaz n variabila de tipreferininceput adresa primului element. La construirea unui nou element, inclusiv aprimului, cmpul de legtur urm (de tip referin) este iniializat cu valoarea nil; la

    11

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    12/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    traversarea ulterioar, regsirea unei valori nil corespunde identificrii ultimuluielement din list. Pentru toate elementele, ncepnd cu al doilea, construirea presupunerevenirea la elementul anterior, a crui informaie de legtur trebuie s puncteze peelementul nou construit. Aceast balansare este asigurat prin jocul variabilelor de tip

    referincurent, respectiv urmtor.

    PROGRAM Alocare_dinamica_2;

    leg=^element;

    element=RECORD

    v:INTEGER;

    urm:leg;

    END;

    VAR

    inceput,curent,urmator: leg;

    n,vi,i:INTEGER;

    BEGIN

    Write('Nr. de elemente si valoare de inceput: ');ReadLn(n,vi);

    New(inceput);

    inceput^.v:=vi;

    inceput^.urm:=nil;

    WriteLn('S-a creat elementul 1 = ',inceput^.v);

    curent:=inceput;

    FOR i:=2 TO n DO

    BEGINNew(urmator);

    urmator^.v:=curent^.v+1;

    urmator^.urm:=nil;

    WriteLn('S-a creat elementul ',i,' = ',urmator^.v);

    curent^.urm:=urmator;

    curent:=urmator

    END;

    i:=1;

    curent:=inceput;

    WHILE curent^.urm nil DOBEGIN

    WriteLn('v[',i,']: ',curent^.v);

    curent:=curent^.urm;

    Inc(i)

    END;

    Writeln('v[',i,']: ',curent^.v)

    END.

    Alocarea i eliberarea zonelor pentru variabile de tip pointerserealizeaz cu

    procedurile GetMem, respectiv FreeMem, definite n unitatea System astfel:GetMem(VAR p:pointer; l:WORD), FreeMem(VAR p:pointer; l:WORD). Efectulacestora este asemntor procedurilor Newi Dispose, cu precizarea c este necesarspecificarea lungimii, care nu poate fi dedus implicit, neexistnd un tip de baz. Unexemplu simplu de folosire a variabilelor pointer din heap este ilustrat n programulAlocare_dinamic_3.

    PROGRAM Alocare_dinamica_3;

    12

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    13/221

    Tipuri dinamice de date. Lucrul cu adrese

    VARp: POINTER;

    BEGINGetMem(p,6);REAL(p^):=5.25;WriteLn(REAL(p^):4:2);

    FreeMem(p,6)END.

    Relund exemplul propus prin programul Alocare_dinamic_2, trecerea lafolosirea variabilelor pointer presupune unele adaptri, ilustrate n programulAlocare_dinamic_4. Din program se constat c aplicarea tehnicii de typecastingpermite att referirea global, ct i pe componente, ilustrat n acest caz pentrucmpurile unui articol. Spaiul alocat la un apel al procedurii GetMem corespundedimensiunii articolului (6 octei).

    PROGRAM Alocare_dinamica_4;TYPEelement=RECORD

    v:INTEGER; urm:POINTER;END;

    VARinceput,curent,urmator: POINTER;n,vi,i : INTEGER;

    BEGINWrite('Nr. de elemente si valoare de inceput: ');ReadLn(n,vi);GetMem(inceput,6);element(inceput^).v:=vi;element(inceput^).urm:=nil;WriteLn('S-a creat elementul 1 = ',element(inceput^).v);curent:=inceput;FOR i:=2 TO n DOBEGINGetMem(urmator,6);element(urmator^).v:=element(curent^).v+1;element(urmator^).urm:=nil;

    WriteLn('S-a creat elementul ',i,' ='element(urmator^).v);

    element(curent^).urm:=urmator;curent:=urmator

    END;i:=1;curent:=inceput;WHILE element(curent^).urm nil DOBEGINWriteLn('v[',i,']: ',element(curent^).v);curent:=element(curent^).urm;

    Inc(i)END;Writeln('v[',i,']: ',element(curent^).v)

    END.

    Ca alternative ale procedurilor New, GetMem, respectiv Dispose,FreeMem, pot fi folosite procedurile Marki Release, definite n unitatea Systemastfel: Mark(VAR p:pointer), Release(VAR p:pointer). Procedura Markmemoreaz n variabila p valoarea din HeapPtr, iar procedura Release depune n

    13

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    14/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    variabila HeapPtr coninutul variabilei p. Folosirea n pereche a procedurilorMarki Release ofer posibilitatea ca, dup diverse alocri, s se restabileasc valoareavariabilei HeapPtr cu valoarea memorat prin Mark. Apelul Release(HeapOrg)aduce HeapPtr pe nceputul zonei heap (elibereaz zona).

    n exemplul urmtor, se memoreaz n y adresa de la un moment dat a luiHeapPtr (fie ea a), se modificHeapPtr prin rezervarea a 12 octei (pentru x2, x3),se reface coninutul lui HeapPtr cu adresa a, ceea ce nseamn cx3^ se rezerv laaceast adres (n locul variabilei x2^).

    VARx1,x2,x3.x4:^REAL;y:POINTER;

    BEGINNew(x1); x1^:12;

    Mark(y); {Memorarea valorii HeapPtr in Y}New(x2); x2^:=10;New(x3); x3^:=34;

    Release(y); {Reincarcarea valorii din Y in Heapptr}New(x4); x4:=46; {Se va memora peste valoare 10 din x2}

    14

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    15/221

    Unul din principalele atribute ale datelor este structura sau modul deorganizare care le caracterizeaz. Structurile rezult prin gruparea ntr-un anumitmod a coleciilor de date primitive. Exemple de structuri de date sunt: tablourile,mulimile, nregistrrile. n continuare vor fi prezentate noi tipuri de organizri, ianume: listele simplu i dublu nlnuite i cazurile particulare cunoscute sub numelede stive i cozi.

    2.1 Noiuni introductive

    Un tip de structur de date poate fi gndit logic, fcnd abstracie de modulparticular n care datele sunt reprezentate n memoria calculatorului. El se reprezintparticularizat prin diverse implementri din limbajele de programare.

    Specificarea unui anume tip de organizare pentru datele procesate de un

    program presupune definirea mulimii de valori permise pe care o variabil sauparametru aparinnd acestui tip de date le poate avea, precum i a mulimii deoperaii care pot fi efectuate cu astfel de date. Eficiena unei scheme de prelucrare adatelor este determinat n mare msur de tipurile particulare de date utilizate.

    Limbajul de programare Pascal ofer suficient flexibilitate pentrureprezentarea unor tipuri complexe de date, dar controlul corectitudinii modului ncare sunt utilizate revine programatorului. Structurile de date Pascal pentrureprezentarea coleciilor de date pot fi clasificate n structuri statice i dinamice.

    Structurile statice cuprind: array,setifile pentru reprezentareadatelor de acelai tip(omogene) i record, pentru reprezentarea datelor eterogene. Structurile dinamice seconstruiesc pe baza tipurilor de date Pascal referin legat i referin liber(desemnat prin tipul predefinitpointer).

    Definirea unei date reprezentat printr-o structur static presupune alocareaunui spaiu de memorie de dimensiune invariabil pe durata evoluiei programului, ntimp ce dimensiunea unei date reprezentat prin intermediul unei structuri dinamicepoate fi modificat pe durata execuiei.

    STRUCTURA DE LISTN LIMBAJUL PASCAL

    15

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    16/221

    Programarea calculatoarelor - Tehnica programrii n limbajul Pascal

    Pentru anumite clase de probleme, structurile statice de date nu numai c nusunt suficiente, dar se dovedesc chiar imposibil de folosit, datorit limitrilor la caresunt supuse. n primul rnd, spaiul de memorie aferent unor astfel de date sedefinete i se rezerv n momentul compilrii programului (rezervare static), la o

    dimensiune maxim (cuprinztoare). Acest spaiu nu poate fi disponibilizat i nicimprit cu alte date, chiar dac nu este n ntregime utilizat n anumite momente aleexecuiei programului. n al doilea rnd, componentele structurilor statice ocuplocuri prestabilite n spaiul rezervat, determinate de relaia de ordonare specificfiecrei structuri. n al treilea rnd, limbajul definete operaiile admise cu valorilecomponentelor, potrivit tipului de baz al structurii, astfel nct numrul maxim iordinea componentelor structurii nu pot fi modificate.

    n aceste condiii, structurile statice sunt dificil de utilizat n rezolvareaproblemelor care prelucreaz mulimi de date pentru care numrul i ordineacomponentelor se modific frecvent n timpul execuiei programului. Pentru astfel desituaii, exist posibilitatea utilizrii datelor de tip dinamic, crora li se pot aloca ielibera zone de memorie pe parcursul execuiei programului.

    2.2 Structura de list

    Organizarea de tip list corespunde unei structurri lineare a datelor, lanivelul fiecrei componente dispunndu-se de informaie suficient pentruidentificarea urmtoarei componente a coleciei. Datele dintr-o colecie astfelstructurat sunt referite de obicei prin termenii de noduri, celule, componente etc.

    Reprezentarea unei liste n limbajul Pascal poate fi realizat prin intermediulstructurii de date array, ordinea componentelor fiind dat de ordinea pe domeniulvalorilor corespunztoare indexrii i, n consecin, urmtoarea component esteimplicit specificat. Memorarea unei mulimi de date {d1, d2,, dn} prin intermediulunei structuri statice poate fi realizat n limbajul Pascal utiliznd un masivunidimensional.

    Definirea tipului de date Pascal pentru memorarea ca list a datelor {d1,

    d2,, dn} este:const max=500;type lst=array[1..max] of tip_informatie;

    unde nmax i tip_informatie este numele tipului de date Pascal utilizat pentrumemorarea fiecrei date din mulimea {d1, d2,, dn}. Dac lista este variabila detip lst utilizat pentru memorarea coleciei {d1, d2,, dn}, atunci data di estememorat n componenta lista[i], ni1 .

    16

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    17/221

    Structura de list n limbajul Pascal

    Dezavantajele majore n utilizarea reprezentrii statice rezid n volumul decalcule necesare efecturii operaiilor de inserie/eliminare de noduri i n necesitateapstrrii unei zone de memorie alocat, indiferent de lungimea efectiv a listei.Aceste dezavantaje sunt eliminate prin opiunea de utilizare a structurilor dinamice.

    Componentele unei liste dinamice sunt eterogene, fiecare nod coninnd o parte deinformaie i cmpuri de legtur care permit identificarea celulelor vecine.Cmpurile de legtur sunt reprezentate de date de tip referin (adres). n cazullistelor cu un singur cmp de legtur (simplu nlnuite), valoarea cmpului indicadresa nodului urmtor, n timp ce, n cazul listelor cu dubl legtur (dublunlnuite), valorile memorate n cmpurile de legtur sunt adresele componentelorcare preced i, respectiv, urmeaz celulei. n ambele situaii, cmpul de legturpentru indicarea celulei urmtoare corespunztor ultimei componente a listei are

    valoarea nil n cazul listelor deschise (lineare) i respectiv indic adresa primeicomponente din list n cazul listelor nchise (circulare).Se presupune c mulimea de date {d1, d2,, dn} este memorat ca list

    linear. Convenional, structura rezultat poate fi reprezentat grafic fie prin a) (listsimplu nlnuit), fie prin b) (list dublu nlnuit), unde simbolul

    desemneaz valoarea nil a cmpului de legtur (figura 2.1). n cazul n carepentru memorarea datelor {d1, d2,, dn} se dorete utilizarea unei structuri de listcircular, reprezentarea grafic este dat n figura 2.2.

    dn dn-1 d1d2

    C

    Fig. 2.1 Liste lineare

    d1d2dn-1dn

    C

    b)

    a)

    Declarrile tipurilor de date Pascal pentru definirea structurilor de listedinamice simplu i, respectiv, dublu nlnuite sunt:

    a) List simplu nlnuittype lista=^nod;

    nod=recordinf:tip_informatie;leg: lista;

    end;

    b) List dublu nlnuittype lista=^nod;

    nod=recordinf:tip_informatie;st,dr: lista;

    end;unde tip_informatie este numele tipului de date Pascal utilizat pentru memorareafiecrei date din mulimea{d1, d2,, dn}.

    17

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    18/221

    Programarea calculatoarelor - Tehnica programrii n limbajul Pascal

    dn dn-1 d1d2

    a) ultim

    Fig. 2.2 Liste circulare

    d1d2dn-1dn

    ultimb)

    2.3 Operaii primitive asupra listelor

    Accesul la informaia stocat ntr-o variabil de tip list revine efectund una

    sau mai multe dintre operaiile primitive: regsirea nodului (dac exist) care

    corespunde unei chei date (condiie impus asupra valorii cmpului de informaie),

    inserarea unei noi componente n list, eliminarea componentei (componentelor) cu

    proprietatea c valorile cmpurilor de informaie satisfac o anumit cerin inlocuirea cmpului de informaie corespunztor unei componente printr-o informaie

    dat.

    Accesarea componentelor unei liste reprezentat printr-o structur static

    poate fi realizat att secvenial, ct i direct, utiliznd valorile indicelui considerat

    pentru indexare, n timp ce accesarea componentelor unei liste dinamice se

    realizeaz, de regul, numai secvenial, ncepnd cu prima componenti continund

    cu urmtoarele, pe baza valorilor cmpurilor de legtur. Convenional, numim capal listei dinamice pointerul a crui valoare este adresa primei componente a listei.

    1. Parcurgerea integral a datelor memorate ntr-o list. Se presupune c

    declarrile de tip pentru definirea structurilor de liste menionate anterior sunt

    globale, relativ la procedurile descrise n continuare.

    18

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    19/221

    Structura de list n limbajul Pascal

    a)Lista reprezentat prin structur static (masiv unidimensional)procedure parcurgere1(var l:lst; n:word);var i:word;begin

    for i:=1 to n doprelucrare(l[i]);

    end;

    b)Lista reprezentat prin structur dinamic simplu nlnuitprocedure parcurgere2( var cap:lista);var p:lista;begin

    p:=cap;

    while(pnil) dobeginprelucrare(p^.inf);p:=p^.leg;end;

    end;

    c) Lista reprezentat prin structur dinamic dublu nlnuitprocedure parcurgere3( var cap:lista);var p:lista;begin

    p:=cap;while(pnil) do

    beginprelucrare(p^.inf);

    p:=p^.dr;end;

    end;

    2.Regsirea unei date d ntr-o colecie memorat ntr-o listn continuare se presupune c funcia egal(a,b:tip_informatie):boolean

    returneaz valoarea true dacai b coincid, altfel returneazfalse. Funciile Pascalexista1, exista2 i exista3 calculeaz valoarea true, dac data d se afl n coleciamemorat n lista dat ca argument, altfel calculeaz valoareafalse.

    a)Lista reprezentat prin structur static (masiv unidimensional)function exista1(l:lst; n:word; d:tip_informatie):boolean;var i:word;

    c:boolean;begin

    c:=false;

    i:=1;while(i

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    20/221

    Programarea calculatoarelor - Tehnica programrii n limbajul Pascal

    c:boolean;begin

    p:=cap;c:=false;while(pnil)and(not c) do

    if egal(d,p^.inf) then c:=true

    else p:=p^.leg;exista2:=c;

    end;

    c)Lista reprezentat prin structur dinamic dublu nlnuitfunction exista3(cap:lista;d:tip_informatie):boolean;

    var p:lista;

    c:boolean;

    beginp:=cap;

    c:=false;

    while(pnil)and(not c) do

    if egal(d,p^.inf) then c:=true

    else p:=p^.dr;

    exista3:=c;

    end;

    3.Inserarea unei date, d, ntr-o list

    Includerea unei noi componente ntr-o list poate fi realizat, n funcie decerinele problemei particulare, la nceputul listei, dup ultima component din list,naintea/dup o component cu proprietatea c valoarea cmpului de infor-maie ndeplinete o anumit condiie. Presupunem c funcia condiie((a,b:tip_informatie):boolean calculeaz valoarea true dac a i b verific condiiaformulat pentru inserare, altfel calculeaz valoarea false. De asemenea, proceduraatribuie(var destinatie:tip_informatie; sursa:tip_informatie) realizeaz copierea datei

    sursa n destinatie.Deoarece prin inserarea unei componente se poate ajunge la depireaspaiului disponibil de memorie, este necesar verificarea prealabil a posibilitiirealizrii operaiei (dac se poate aloca spaiu de memorie pentru componenta deinserat). n cazul listelor reprezentate prin structuri statice, aceast verificare va firealizat prin compararea lungimii efective n a listei cu dimensiunea declaratmax.n cazul listelor dinamice, este utilizat funcia Pascal predefinit MaxAvail, carecalculeaz lungimea maxim a zonelor nealocate contigue din memoria Heap.

    Valoarea returnat pentru parametrul test este true, dac inserarea a fost posibil,altfel estefalse.

    De exemplu, inserarea la nceputul listei decurge astfel:

    a) Lista reprezentat prin structur static (masiv unidimensional)procedure inserare_la_inceput1(var l:lst; var n:word;d:tip_informatie;var test:boolean);

    20

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    21/221

    Structura de list n limbajul Pascal

    var i:word;begintest:=true;if n=max then test:=falseelse

    begin

    for i:=n downto 1 do atribuie(l[i+1],l[i]);atribuie(l[1],d);

    n:=n+1;

    end;end;

    b) Lista reprezentat prin structur dinamic simplu nlnuit

    procedure inserare_la_inceput2(varcap:lista;d:tip_informatie;var test:boolean);

    var p:lista;begintest:=true;if MaxAvail

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    22/221

    Programarea calculatoarelor - Tehnica programrii n limbajul Pascal

    d:tip_informatie;begintest:=true;if n>max then test:=falseelse

    begin

    i:=1;while(i

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    23/221

    Structura de list n limbajul Pascal

    for i:=1 to n-1 do atribuie(l[i],l[i+1]);n:=n-1;

    end;end;

    b) Lista reprezentat prin structur dinamic simplu nlnuit

    procedure elimina_prima2(var cap:lista;var d:tip_informatie;vartest:boolean);

    var p:lista;begintest:=true;if cap=nil then test:=falseelse

    beginp:=cap;cap:=cap^.leg;

    atribuie(d,p^.inf);dispose(p);end;

    end;

    c) Lista reprezentat prin structur dinamic dublu nlnuit

    procedure elimina_prima3(var cap:lista;var d:tip_informatie;vartest:boolean);var p:lista;begin

    test:=true;if cap=nil then test:=falseelse

    beginp:=cap;

    cap:=cap^.dr;cap^.st:=nil;atribuie(d,p^.inf);dispose(p);end;

    end;

    2.4 Liste circulare

    n anumite cazuri, este preferabil renunarea la structura de tip linear alistelori utilizarea unei legturi de la ultima component ctre capul listei, rezultndceea ce se numete list circular (figura 2.2).

    Avantajul utilizrii acestui tip de structur este posibilitatea de accesaredintr-un element al listei a oricrui alt element. n continuare sunt prezentate module

    pentru realizarea unor operaii de baz n lucrul cu liste circulare.

    typetip_informatie=string;clista=^nod;nod=recordinf:tip_informatie;leg:clista;end;

    23

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    24/221

    Programarea calculatoarelor - Tehnica programrii n limbajul Pascal

    procedure atribuie(var d:tip_informatie;s:tip_informatie);begind:=s;end;

    procedure inserare_la_inceput(var

    ultim:clista;d:tip_informatie;var test:boolean);var

    p:clista;

    cap:clista;begin

    test:=true;if MaxAvail

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    25/221

    Structura de list n limbajul Pascal

    begintest:=true;if ultim=nil then test:=falseelse

    begincap:=ultim^.leg;

    atribuie(d,cap^.inf);if cap=ultim then

    begin

    dispose(ultim);ultim:=nil;end

    elsebeginultim^.leg:=cap^.leg;dispose(cap);end;

    end;end;

    procedure elimina_la_sfarsit(var ultim:clista;vard:tip_informatie;var test:boolean);var

    p:clista;cap:clista;

    begintest:=true;if ultim=nil then test:=falseelse

    begincap:=ultim^.leg;atribuie(d,ultim^.inf);if cap=ultim then

    begindispose(ultim);ultim:=nil;end

    elsebeginp:=cap;

    while(p^.legultim) do p:=p^.leg;p^.leg:=cap;dispose(ultim);ultim:=pend;

    end;end;procedure afisare(ultim:clista);var p,cap:clista;beginif ultim=nil then writeln('Lista vida')else

    begincap:=ultim^.leg;p:=cap;repeat

    write(p^.inf,' ');

    p:=p^.leg;until p=cap;writeln;end;

    end;

    25

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    26/221

    Programarea calculatoarelor - Tehnica programrii n limbajul Pascal

    2.5 Stive i cozi

    Accesul la informaia memorat ntr-o list linear pentru efectuareaoperaiilor de inserare i eliminare este permis la oricare dintre componentelecoleciei. Aa dup cum a rezultat n 2.3, identificarea poziiei n care trebuieefectuat inserarea/eliminarea presupune iniierea unei secvene de operaii decutare, ceea ce determin creterea timpului de lucru. Pe de alt parte, o mulime deaplicaii pot fi modelate utiliznd liste lineare n care introducerea i, respectiv,

    eliminarea informaiilor sunt permise numai la capete. Astfel au fost definite tipurilede list stiv i coad, care impun un tip de organizare a aplicrii operaiilor deinserare i eliminare.

    StivaSe numete stiv o list organizat astfel nct operaiile de inserare i

    eliminare sunt permise numai la prima component. Acest mod de organizarecorespunde unei gestiuni LIFO (Last In First Out) a informaiei stocate.

    Modelul corespunde unei stive de cri. Adugarea unei noi cri n stiv se

    face deasupra primei cri, iar extragerea este posibil numai pentru prima carte.Operaiile de inserare i eliminare ntr-o stiv pot fi descrise prin intermediulprocedurilor inserare_la_inceput1, inserare_la_inceput2, elimina_prima1,elimina_prima2. Operaiile elementare pentru gestiunea informaiei memorate ntr-ostiv sunt:

    - push(S,d,test) inserarea informaiei dn stiva S;- pop(d,S,test) preluarea cu eliminare a informaiei memorate n prima

    celul a stivei S;

    - top(d,S,test) preluarea fr eliminare a informaiei deinute de primacomponent a stivei S.Parametrul testreturneaztrue dac operaia este posibil, altfelfalse.

    CoadaSe numete coad o list organizat astfel nct operaia de inserare este

    permis la ultima component, iar operaia de eliminare este permis numai la primacomponent. Acest mod de organizare corespunde unei gestiuni FIFO (First In First

    Out) a informaiei stocate.Modelul corespunde unei cozi de ateptare la un magazin. O nou persoanse aaz la coad dup ultimul cumprtor, iar persoana care i achit nota de plat(primul cumprtor) prsete coada.

    Implementarea unei liste coad poate fi efectuat att printr-o structurstatic (masiv unidimensional), ct i printr-o structur dinamic de tip list. nscopul eficientizrii operaiilor de inserare/extragere, n cazul implementrii cozilorprin structuri dinamice lineare, este necesar utilizarea a dou informaii: adresa

    26

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    27/221

    Structura de list n limbajul Pascal

    primei componente i adresa ultimei componente. Aceste informaii pot fi meninuteexplicit prin utilizarea a doi pointeri sau prin utilizarea unui pointeri a unei structuride list circular.

    1. Operaiile de inserare i eliminare pentru list coad reprezentat staticsunt descrise de procedurile inserare_la_sfarsit1i eliminare_la_inceputprezentaten cadrul seciunii 2.3.

    2.Reprezentarea unei liste coad printr-o structur dinamic circularutilizeaz o singur variabil adres, ultim, pentru referirea ultimei componente alistei. Operaiile de inserare i eliminare sunt descrise de procedurile inserare_coadai eliminare_coada.

    procedure inserare_coada(var ultim:lista; d:tip_informatie; vartest:boolean);

    var p:lista;begin

    test:=true;if MaxAvail

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    28/221

    Grafurile sunt structuri de date cu aplicaii n multe domenii ale prelucrrii

    automate a datelor, algoritmii pentru reprezentarea i prelucrarea grafurilor fiindconsiderai fundamentali n acest domeniu.

    n cadrul seciunii 3.1 sunt prezentate principalele caracteristici alegrafurilor, precum i modalitile uzuale de reprezentare a structurii de graf. ncontinuare sunt descrise tehnicile de parcurgere a grafurilor n lime i n adncime.Verificarea conexitii i calculul drumurilor n grafuri sunt tratate n seciunea 3.3

    3.1 Definiii, caracteristici i reprezentri ale grafurilor

    Definiia 3.1.1. Un graf(sau un graf neorientat) este o structur G=(V,E),unde V este o mulime nevid, iar E este o submulime (posibil vid) a mulimiiperechilor neordonate cu componente distincte din V.

    Obiectele mulimii V se numesc vrfuri, iar obiectele mulimii E se numescmuchii. Dac eE, uvv)(u,e == , se spune c muchia e are ca extremiti u,v sauc muchia e este determinat de vrfurile ui v. Dac e=uvE se spune c vrfurileu, v sunt incidente cu muchia e.

    Definiia 3.1.2. Fie G = (V,E) graf. Vrfurile u, v sunt adiacente n G dacuvE.

    Definiia 3.1.3. Graful G = (V,E) estefinit, dac V este o mulime finit.

    n cadrul acestui capitol vor fi considerate n exclusivitate grafurile finite,chiar dac acest lucru nu va fi precizat n mod explicit.

    Definiia 3.1.4. Fie Gi =(Vi,Ei), i=1,2 grafuri. G2 este un subgrafal grafuluiG1 dac 12 VV i 12 EE . Dac G2 este un subgraf al lui G1, G2 este un grafparialal lui G1 dac V2=V1.

    GRAFURI. IMPLEMENTRIN LIMBAJUL PASCAL

    28

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    29/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    Definiia 3.1.5. Un digrafeste o structur D = (V,E), unde V este o mulime

    nevid de obiecte numite convenional vrfuri, iar E este o mulime (posibil vid) de

    perechi ordonate cu componente elemente distincte din V. Convenional, elementele

    mulimii E sunt numite arce sau muchii ordonate.

    Terminologia utilizat relativ la digrafuri este similar celei corespunztoare

    grafurilor.

    Definiia 3.1.6. Se numete graf ponderat o structur (V,E,W), unde G =

    = (V,E) este graf, W funcie, ( ) ,0E:W . Funcia W este numitponderei eaasociaz fiecrei muchii a grafului un cost/ctig al parcurgerii ei.

    Definiia 3.1.7. Fie G=(V,E) un graf, u,vV.

    Secvena de vrfuri : u0, u1,..,un este un u-v drum dac u0=u, un=v, uiui+1E

    pentru toi i, ni0 .

    Moduri de reprezentare a grafurilor

    Cea mai simpl reprezentare a unui graf este cea intuitiv, grafic; fiecare

    vrf este figurat printr-un punct, iar muchiile sunt reprezentate prin segmentele de

    dreapt, orientate (n cazul digrafurilor) sau nu i etichetate (n cazul grafurilor

    ponderate) sau nu, avnd ca extremiti punctele corespunztoare vrfurilor care le

    determin.

    Exemple:3.1. Fie G = (V, E) graf, cu V = {1, 2, 3, 4, 5}, E = {(1,2),(1,3),(2,5),(3,5)}.O posibil reprezentare grafic este:

    1

    2

    4

    35

    29

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    30/221

    Grafuri. Implementri n limbajul Pascal

    3.2. Fie D = (V, E) digraf, cu V = {1, 2, 3, 4, 5}, E = {(1,2),(1,3),(2,5),(3,5),(1,5)}. Digraful poate fi reprezentat grafic astfel:

    3.3. Fie G = (V, E, W) graf ponderat, cu V = {1, 2, 3, 4}, E ={(1,2),(1,3),(2,4),(3,4)}, W((1,2))=5, W((1,3))=1, W((2,4))=2, W((1,4))=7. Oposibil reprezentare grafic este:

    Dei acest mod de reprezentare este foarte comod i sugestiv, n special ncazul grafurilor cu numr mic de vrfuri, pentru prelucrri cu ajutorul calculatoruluisunt necesare reprezentri prin intermediul structurilor de date.

    O modalitate de reprezentare este cea prin matrice de adiacen. DacG=(V,E) este graf sau digraf cu nV = , atunci matricea de adiacen AMnxn({0,1})

    are componentele:

    =altfel

    jidacij

    ,0

    Ev,v,1a ,

    1

    2 4

    35

    1

    5 1

    2 37

    2

    4

    30

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    31/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    unde vi, vj reprezint cel de-al i-lea, respectiv cel de-alj-lea nod din V. Se observ c,n cazul unui graf neorientat, matricea de adiacen este simetric -

    jiij aa,n,1j,i == (perechile de vrfuri ce caracterizeaz muchiile sunt

    neordonate, deci dac uvE, atunci i vuE), n timp ce, n cazul unui digraf, esteposibil ca ,Ev,v ji Ev,v ji , deci aij aji.

    Exemplu:3.4. Graful din exemplul 3.1 i digraful din exemplul 3.2 sunt reprezentate

    prin matricele de adiacen:

    =

    00110

    00000

    10001 10001

    00110

    A pentru 3.1,

    =

    00000

    00000

    10000 10000

    10110

    A pentru 3.2

    n cazul grafurilor ponderate, reprezentarea matriceal este asemntoarecelei prezentate anterior. Matricea ponderilor unui graf ponderat G = (V, E, W),

    nV = , W Mnxn((0, )) are componentele:

    =

    altfel,

    Ev,vdac,)v,v(Ww

    jiji

    j,i ,

    unde vi, vj reprezint cel de-al i-lea, respectiv cel de-alj-lea nod din V, =0dac ponderea are semnificaia de ctig, respectiv = n cazul n care se doretereprezentarea costurilor ca ponderi ale grafului.

    Exemplu:3.5. Presupunnd c ponderile reprezint costuri, matricea de reprezentare a

    grafului din exemplul 3.3. este:

    =

    27

    1

    25

    715

    W .

    Reinnd numai informaia util, i anume existena unei muchii ntre douvrfuri i eventual valoarea ponderii ei, se obine reprezentarea tabelar, maieconomic din punctul de vedere al spaiului de memorare. n cazul n care existvrfuri izolate n graf (ce nu sunt incidente cu nici o muchie), atunci este necesarpstrarea acestora ntr-un vector suplimentar. Mulimea muchiilor se memoreaz

    31

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    32/221

    Grafuri. Implementri n limbajul Pascal

    ntr-o matrice cu E linii i 2 coloane dac graful nu este ponderat, respectiv cu

    3 coloane, dac graful este ponderat. n primele dou coloane se scriu perechile devrfuri ce determin muchiile, n cazul grafurilor ponderate cea de-a treia coloanconine valoarea ponderii muchiei respective.

    Exemple:3.6. Graful din exemplul 3.1 poate fi reprezentat astfel: deoarece 4 este vrf

    izolat, vectorul suplimentar este VS = (4), pentru reprezentarea muchiilor fiind

    utilizat matricea

    =

    53

    52

    31

    21

    A

    3.7. Digraful din exemplul 3.2 poate fi reprezentat astfel: deoarece 4 estevrf izolat, vectorul suplimentar este VS = ( 4), arcele fiind reprezentate prin

    =

    53

    52

    51

    31

    21

    A

    O alt reprezentare este prin intermediul listelor. Reprezentarea permiteutilizarea economic a spaiului de memorare i, n anumite cazuri, implementri maieficiente pentru anumite clase de algoritmi. Vrfurile grafului se memoreaz ntr-olist, fiecare celul a listei avnd o legtur ctre lista vecinilor acelui vrf (vrfurile

    din graf adiacente cu vrful corespunztor acelei celule i indicat ca informaie util).n situaia n care graful nu este ponderat, el se reprezint printr-o list de

    liste, i anume: nodurile grafului se trec ntr-o list L_nod, fiecare celul avndstructura

    informaie legtur vecini legtur nod urmtorunde:

    cmpul informaie conine identificatorul nodului; legtur vecini reprezint pointer ctre capul listei vecinilor; legtur nod urmtorconine adresa urmtoarei celule din lista

    L_nod.

    Un graf ponderat poate fi reprezentat n mod similar, cu diferena c fiecarecelul din lista vecinilor conine i ponderea muchiei respective (muchia care are caextremiti vrful referit prin identificatorul de nod din lista vecinilor i respectivvrful indicat de informaia acelei celule din L_nod ce conine adresa primuluielement al listei vecinilor).

    32

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    33/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    3.2 Modaliti de parcurgere a grafurilor

    Parcurgerea unui graf reprezint o modalitate de vizitare a tuturor vrfurilor

    grafului, fiecare vrf fiind vizitat o singur dat. n acest paragraf sunt prezentatedou modaliti de parcurgere a grafurilor neorientate.

    Ambele metode de parcurgere presupun selectarea unui vrf iniial v0. Prinaplicarea acestor metode sunt identificate numai vrfurile grafului cu proprietatea cexist cel puin un drum de la vrful iniial ctre acel vrf. Grafurile cu proprietateac oricare dou vrfuri sunt conectate printr-un drum se numesc conexe i suntprezentate n 3.3. Dac graful este conex, atunci prin aplicarea metodelor deparcurgere vor fi identificate toate vrfurile grafului.

    3.2.1 Metoda de parcurgere BF (Breadth First)

    Ideea traversrii BF este de parcurgere n lime a grafului, n sensul cvrfurile grafului sunt prelucrate n ordinea cresctoare a distanelor la vrfuliniial. Prin distan se nelege numrul de muchii din drumul identificat la acelmoment de la vrful iniial ctre acel vrf. La momentul iniial, vrful curent este v0.

    Deoarece vrful curent la fiecare moment trebuie s fie unul aflat la distan minimde v0, se poate proceda n modul urmtor: iniial lui v0 i se asociaz valoarea 0 ifiecrui vrf diferit de v0 i se asociaz valoarea 1. Dac valoarea asociat vrfuluicurent este m, atunci fiecruia dintre vecinii acestuia de valoare 1 i se asociazvaloarea m+1. Se observ c dac dup ce toate vrfurile de valoare m au fostconsiderate i nici unui vrf nu i-a fost recalculat valoarea, atunci toate vrfurileconectate cu v0 au fost gsite, deci calculul se ncheie.

    Exemple:3.8 Fie graful:

    i v0=1.

    1

    2 3

    4 6

    5 7

    33

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    34/221

    Grafuri. Implementri n limbajul Pascal

    Valorile calculate prin aplicarea metodei prezentate sunt:

    vrfm

    1 2 3 4 5 6 7

    0 0 -1 -1 -1 -1 -1 -11 0 1 1 -1 1 -1 12 0 1 1 2 1 2 1

    0 1 1 2 1 2 1Ordinea de vizitare a vrfurilor: 1,2,3,5,7,4,6.

    3.9. Fie graful:

    i v0=1.Se observ c vrfurile 8, 9 i 10 nu sunt conectate cu vrful iniial.Valorile rezultate prin aplicarea metodei sunt:

    vrf

    m

    1 2 3 4 5 6 7 8 9 10

    0 0 -1 -1 -1 -1 -1 -1 -1 -1 -11 0 1 1 -1 1 -1 1 -1 -1 -12 0 1 1 2 1 2 1 -1 -1 -1

    0 1 1 2 1 2 1 -1 -1 -1Ordinea de vizitare a vrfurilor este 1,2,3,5,7,4,6.

    Se observ c valorile lui m calculate n final reprezint numrul de muchii

    corespunztor celui mai scurt drum care conecteaz vrful iniial cu vrful respectiv,pentru vrfurile neconectate cu v0 valoarea lui m rezultat la terminarea calcululuieste 1.

    O implementare diferit, dar urmnd aceeai idee, rezult prin utilizareaurmtoarelor structuri de date:

    A matricea de adiacen a grafului; o structur de tip coad, C, n care sunt introduse vrfurile ce urmeaz a fi

    vizitate i procesate (n sensul cercetrii vecinilor lor);

    1 82 3

    4 6 9 10

    75

    34

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    35/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    Un vectorc cu n componente, unde:

    daci a fost introdus n coad

    =,0

    ,1ci

    altfel

    i n este numrul vrfurilor grafului.Componentele vectorului c vor fi iniializate cu valoarea 0.Descrierea metodei este: se iniializeaz coada Ccu vrful v0; ct timp coada este nevid, se extrage un vrfi din coad, se viziteaz, apoi

    se introduc n coad numai vecinii acestuia care nu au fost deja introdui (adic toatevrfurile kavnd proprietatea c c[k]=0 i a[i,k]=1). Vrfurile i ce au fost introdusen coad sunt marcate: i introdus n coad, c[i]=1.

    n continuare este prezentat un program Pascal pentru parcurgerea n lime aunui graf. Vrfurile grafului sunt numerotate de la 1 pn la n, parcurgerea ncepndcu vrful numerotat cu 1. Graful este reprezentat prin matricea de adiacen.Structura de coad este implementat ca o list simplu nlnuit, procedurilepushipop realiznd introducerea, respectiv extragerea unui element din coad.

    uses crt;type

    ptcoada=^coada;

    coada=recordinf:byte;leg:ptcoada;

    end;

    varprim,ultim:ptcoada;

    c:array[1..20] of byte;a:array[1..20,1..20] of byte;i,j,k,n:byte;

    procedure push(var p,u:ptcoada;i:byte);var a:ptcoada;begin

    new(a); a^.inf:=i; a^.leg:=nil;if p=nil then

    beginp:=a; u:=a;end

    else beginu^.leg:=a;u:=a;end;

    end;

    procedure pop(var p,u:ptcoada;var i:byte);var a:ptcoada;beginif pnil then

    begini:=p^.inf; a:=p; p:=p^.leg;dispose(a);if p=nil then u:=nil;end;

    35

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    36/221

    Grafuri. Implementri n limbajul Pascal

    end;

    begin {program principal}clrscr;write('Numarul de varfuri:');readln(n);

    writeln('Matricea de adiacenta');for i:=1 to n do

    for j:=1 to n dobeginwrite('a[',i,',',j,']=');readln(a[i,j]);end;

    for i:=2 to n do c[i]:=0;readln;clrscr;writeln('Incepem parcurgerea de la nodul 1');c[1]:=1;prim:=nil;ultim:=nil;push(prim,ultim,1);while primnil do

    beginpop(prim,ultim,i);write(i,' ');for k:=1 to n do

    if (a[i,k]=1)and(c[k]=0) thenbeginc[k]:=1;push(prim,ultim,k);

    end;end;

    readln;end.

    3.2.2 Metoda de parcurgere DF (Depth First)

    Ideea metodei DF revine la parcurgerea n adncime a grafurilor, n sensul

    c, la fiecare moment, dac M este mulimea vrfurilor vizitate de procedur, pentruvizitarea vecinilor este considerat unul din vrfurile din M cu proprietatea clungimea drumului calculat pn la vrful iniial v0este maxim.

    Implementarea metodei poate fi realizat n mai multe moduri, pentrumeninerea mulimii vrfurilor grafului disponibilizate pn la momentul curent fiindutilizat o structur de date de tip stiv, S.

    La momentul iniial se introduce n stiv v0. La fiecare pas, se preia cutergere ca vrf curent vrful stivei Si se introduc n stiv vecinii nc nevizitai ai

    vrfului curent. Un vrf se marcheaz ca vizitat n momentul introducerii lui n S.Calculul continu pn cnd este efectuat un acces de preluare din stivi se constatc S este vid. Pentru gestiunea vrfurilor vizitate, se utilizeaz un vector c cun componente, unde n reprezint numrul vrfurilor grafului i, la fiecare moment,componentele sunt:

    36

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    37/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    =altfel0

    vizitatfostadac1

    ,

    i,ci

    Componentele vectorului c vor fi iniializate cu valoarea 0.

    Exemple:3.10. Pentru graful:

    i v0 = 1, ordinea n care sunt vizitate vrfurile este: 1, 2, 3, 4, 6, 7, 5.

    3.11. Pentru graful

    i v0 = 1, ordinea n care sunt vizitate vrfurile este: 1, 2, 3, 4, 6, 7, 5. Vrfurile 8, 9 i10 nu sunt vizitate de procedur, pentru c nu sunt conectate de vrful iniial selectat.

    O variant de implementare a metodei DF rezult prin gestionarea stivei Sdup cum urmeaz. Iniial vrful v0 este unicul component al lui S. La fiecare etapse preia, frtergere, ca vrf curent vrful stivei. Se introduce n stiv unul dintrevecinii vrfului curent nc nevizitat. Vizitarea unui vrf revine la introducerea lui nS. Dac vrful curent nu are vecini nc nevizitai, atunci este eliminat din stiv i

    1

    2 3

    4 6

    5 7

    1 8

    2 3

    4 6 9 10

    75

    37

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    38/221

    Grafuri. Implementri n limbajul Pascal

    este efectuat un nou acces de preluare a noului vrf al stivei ca vrf curent. Calcululse ncheie n momentul n care este efectuat un acces de preluare a vrfului stivei cavrf curent i se constat cSeste vid. Evident, nici n cazul acestei variante nu vorfi vizitate vrfurile care nu sunt conectate cu vrful ales iniial.

    3.3 Drumuri n grafuri. Conexitate

    3.3.1 Drumuri; definiii

    Una dintre cele mai importante proprieti ale grafurilor o constituieposibilitatea de accesare, prin intermediul unei secvene de muchii (arce), dintr-unvrf dat a oricrui alt vrf al grafului, proprietate cunoscut sub numele de conexitatesau conexiune. Aa dup cum a rezultat n 3.2., dac G=(V,E) este un graf conex,atunci pentru orice vrf iniial v0 considerat, metodele BF i DF permit vizitareatuturor vrfurilor din V.

    Definiia 3.3.1. Fie G=(V,E) un graf, u,vV. Secvena de vrfuri: u0, u1,..,un este un u-v drum dac u0=u, un=v, uiui+1E pentru toi i, ni0 .Lungimea drumului, notat l(),este egal cu n. Convenional, se numete trivial, undrum cu l()=0.

    Definiia 3.3.2. Fie : u0, u1,..,un un drum n graful G=(V,E). este un drumnchis dac u0=un; n caz contrar, este deschis. Drumul este elementar dacoricare dou vrfuri din sunt distincte, cu excepia, eventual, a extremitilor.Drumul esteproces dac, pentru orice 1nji0 , uiui+1 ujuj+1.

    Evident, orice drum elementar este un proces.

    Definiia 3.3.3. Fie : u0, u1,..,un un drum n graful G = (V,E). : v0, v1,..,vm

    este un subdrum al lui dac este un drum i pentru oricej, mj0 , existi,ni0 , astfel nct ui = vj.Evident, orice drum cu lungime cel puin 1 conine cel puin un drum

    elementar cu aceleai extremiti.

    ntr-adevr, dac : u0, u1,..,un nu este elementar, atunci existnji0

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    39/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    =

    =

    +

    +

    nj,0idac,u...uu...uu

    0jdac,u...uu

    0idac,u...uu

    :

    n1ji10

    i10

    n1jj

    '

    este, de asemenea, un u0-un drum. Aplicnd n continuare eliminarea duplicatelor

    vrfurilor n modul descris, rezult n final un u0-un drum elementar.

    3.3.2 Matricea existenei drumurilor; algoritmul Roy-Warshall

    Fie G=(V,E) un graf, nV = . Dac A este matricea de adiacen asociat

    grafului, atunci, pentru orice p1, )p(ija este numrul vi-vj drumurilor distincte de

    lungimep din graful G, unde ( ))p(ijp aA = .Definiia 3.3.4. Fie Mn({0,1)} mulimea matricelor de dimensiuni nxn,

    componentele fiind elemente din mulimea {0,1}. PeMn({0,1)}se definesc operaiile

    binare, notate i , astfel: pentru orice A=(aij), B=(bij) din Mn({0,1)},A B=(cij), A B=(dij), unde

    nj,i1 ,

    cij=max{aij, bij}

    dij=max{min{aik, bkj}, nk1 }.

    Dac A=(aij) Mn({0,1)}, se noteaz 1k;aA)k(

    ijk

    = secvena de

    matrice definit prin:( )

    2k,AAA,AA)1k(k1

    ==

    .

    Dac A este matricea de adiacen a unui graf G=(V,E), atunci pentru fiecare

    k, 1nk1 ,

    =altfel,0

    klungimedejlailadedrumexistdac,1a

    )k(ij

    )1n()2()1(AAAM

    = se numete matricea existenei drumurilor

    n graful G. Semnificaia componentelor matricei M este:

    =altfel,1

    Gndrumvvexistnudac,0m,nj,i1

    ji

    ij

    39

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    40/221

    Grafuri. Implementri n limbajul Pascal

    Exemplu:3.12. Pentru graful:

    =

    =

    =

    =

    1111

    1111

    1111

    1111

    1111

    1111

    1101

    1111

    1111

    1111

    1110

    1101

    0101

    1001

    0001

    1110

    32M,A,A,A

    Calculul matricei existenei drumurilor permite verificarea faptului c ungraf dat este conex: graful este conex dac i numai dac toate componentelematriceiMsunt egale cu 1.

    AlgoritmulRoy-Warshall calculeaz matricea existenei drumurilor ntr-ungraf G cu n vrfuri.

    procedure Roy_Warshall (a,n,m);

    i,j,k:integer;do-for i=1,n,1

    do-for j=1,n,1mij=aij;

    do-for j=1,n,1do-for i=1,n,1

    if mij =1 thendo-for k=1,n,1

    if mik

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    41/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    Datele de intrare sunt: n, numrul de noduri i A, matricea de adiacencorespunztoare grafului. Matricea Mcalculat de algoritm constituie ieirea i estematricea existenei drumurilor n graful G.

    3.3.3 Componente conexe ale unui graf

    Definiia 3.3.5. Fie G=(V,E) graf netrivial. Vrfurile u,v V sunt conectatedac exist un u-v drum n G.

    Definiia 3.3.6. Dac G este un graf, atunci o component conex a lui G esteun subgraf conex al lui G, maximal n raport cu proprietatea de conexitate.

    Evident, un graf este conex daci numai dac numrul componentelor saleconexe este 1. Mulimile vrfurilor corespunztoare oricror dou componenteconexe distincte sunt disjuncte. Mulimile vrfurilor corespunztoare componentelorconexe ale unui graf formeaz o partiie a mulimii vrfurilor grafului.

    Multe aplicaii modelate n termeni de grafuri impun determinareacomponentelor conexe corespunztoare unui graf dat. Problema poate fi rezolvat nmodul urmtor: se selecteaz un vrf al grafului, se determin componenta conexcare-l conine; dac exist vrfuri care nu aparin componentei conexe determinate,

    se alege unul dintre acele vrfuri cruia i se determin componenta conex care-lconine; n continuare, se repet procedeul pn cnd au fost gsite toatecomponentele conexe ale grafului.

    Pentru G=(V,E), nV = , n 1 i v0 V, paii algoritmului pentru

    determinarea componentei conexe care conine un vrf v0 dat sunt:

    Pasul 1: V0={v0}; E0= ; i=0;Pasul 2: repetPas 3 pn cnd Vi=Vi-1i Ei=Ei-1Pasul 3: i=i+1;

    { }

    { };ecuincidentu,Vu,Ee/eEE

    ;Euv,Vu,Vv/vVV

    1i1ii

    1i1ii

    =

    =

    Ieirea este G1=(Vi,Ei), componenta conex din care face parte v0.

    Exemplu:

    3.13. Pentru graful1 2 7 3

    4 5 8 6

    41

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    42/221

    Grafuri. Implementri n limbajul Pascal

    Aplicarea algoritmului descris, pentru v0=1, determin urmtoarea evoluie:

    i Vi Eii=0 {1}

    i=1 {1,2,4} {(1,2),(1,4)}i=2 {1,2,4,7,5} {(1,2),(1,4),(2,7),(4,5),(4,7)}i=3 {1,2,4,7,5,8} {(1,2),(1,4),(2,7),(4,5),(4,7),(5,8),(7,8)}i=4 {1,2,4,7,5,8} {(1,2),(1,4),(2,7),(4,5),(4,7),(5,8),(7,8)}

    3.3.4 Drumuri de cost minim

    Definiia 3.3.7. Fie G=(V, E, w) un graf ponderat. Costul drumului: u1, u2,..,un, notat L(), este definit prin:

    ( ) ( )

    =+=

    1n

    1i1ii u,uwL .

    Pentru orice ui v vrfuri conectate n G, u v, w-distana ntre u i v, notatD(u,v), este definit prin:

    ( ) ( ){ }uvD,Lminv,uD = , unde Duv desemneaz mulimea tuturor u-v

    drumurilor elementare din G. Dac uvD este astfel nct D(u,v)=L(), drumul se numete de cost minim.

    Cu toate c este utilizat termenul de w-distan, n general D nu este odistan n sensul matematic al cuvntului.

    n particular, dac funcia pondere asociaz valoarea 1 fiecrei muchii agrafului, atunci, pentru fiecare pereche de vrfuri distincte ale grafului, costul D(u,v)este lungimea celui mai scurt drum ntre cele dou vrfuri. n acest caz, D este o

    distan pe mulimea vrfurilor.Dat fiind interesul pentru determinarea w-distanelori a drumurilor de costminim n cadrul aplicaiilor modelate pe grafuri, n continuare vor fi prezentaialgoritmi pentru rezolvarea acestor probleme.

    Algoritmul Dijkstra

    Algoritmul a fost propus de E. W. Dijkstra pentru determinarea w-distanelorD(u0,v) i a cte unui u0-v drum de cost minim pentru fiecare vrf vu0 ntr-un graf

    ponderat, unde u0 este prestabilit.Fie (V,E,w) graf conex ponderat, u0V, SV, u0S. Se noteaz S\VS = i

    ( ) ( ) Sx;x,uDminS,uD 00 = . Fie vS astfel nct D(u0,v)=D(u0,S ), : u0,u1,,upv este un u0-v drum de cost minim. Evident, 0ip uiS i

    : u0, u1,,up,un u0- up drum de cost minim. De asemenea,

    ( ) Euv,Sv,Su);uv(wu,uDminS,uD 00 += .

    42

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    43/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    Dac xS, yS astfel nct ( ) ( ) )xy(wx,uDS,uD 00 += , rezult( ) ( ) )xy(wx,uDy,uD 00 += . Pentru determinarea unui drum u0-v, cel mai ieftin,

    algoritmul consider o etichetare dinamic a vrfurilor grafului. Eticheta vrfului v

    este (L(v),u), unde L(v) este lungimea celui mai ieftin drum u0-v determinat pn lamomentul respectiv i u este predecesorul lui v pe un astfel de drum.

    Pentru (V,E,w) graf conex ponderat, nV = i u0V, calculul implicat de

    algoritmul Dijkstra poate fi descris astfel:Pasul 1: i=0; S0={u0}; L(u0)=0, L(v)= pentru toi vV, vu0. Dac n=1

    atunci stop

    Pasul 2: Pentru toi v iS , dac L(v)>L(ui)+w(uiv), atunci L(v)=L(ui)+w(uiv)i eticheteaz v cu (L(v),ui).

    Pasul 3: Se determin d=min{L(v), v iS } i se alege ui+1 iS astfel nctL(ui+1)=d.

    Pasul 4: Si+1=Si {ui+1}Pasul 5: i=i+1. Dac i=n-1, atunci stop. Altfel, reia Pasul 2.

    Evident, dac (V,E,w) este graf ponderat neconex, atunci, pentru u0V,algoritmul lui Dijkstra permite determinarea w-distanelor D(u0,v) i a cte unui u0-vdrum de cost minim pentru toate vrfurile v din componenta conex creia i aparineu0.

    Exemplu:

    3.14. Fie graful ponderat1

    5 19

    2 3

    2 165

    54

    43

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    44/221

    Grafuri. Implementri n limbajul Pascal

    Considernd u0=1, etapele n aplicarea algoritmului Dijkstra sunt:

    P1: i=0; S0={1}; L(1)=0, L(i)= pentru toi 5,2i = .

    P2: 0S ={2,3,4,5}, u0=1

    L(2)= >L(1)+5=5 L(2)=5, eticheteaz 2 cu 1L(3)= >L(1)+1=1 L(3)=1, eticheteaz 3 cu 1L(4)= >L(1)+9=9 L(4)=9, eticheteaz 4 cu 1L(5)= , w(1,5)= , deci L(5) nu se modific

    P3: selecteaz u1=3, L(3)=1, cea mai mic dintre w-distanele calculate la P2P4: S1={1,3}P5: i=i+1=1 4, reia P2

    P2: 1S ={2,4,5}, u1=3Nu se modific nici o eticheti nici o w-distan (w(3,i)= , pentru

    toi i din 1S )P3: selecteaz u2=2, L(2)=5, cea mai mic dintre w-distanele calculate la P2P4: S2={1,3,2}P5: i=i+1=2 4, reia P2

    P2: 2S ={4,5}, u2=2L(4)= 9>L(2)+2=7 L(4)=7, eticheteaz 4 cu 2L(5)= >L(2)+16=21, eticheteaz 5 cu 2

    P3: selecteaz u3=4, L(4)=7, cea mai mic dintre w-distanele calculate la P2P4: S3={1,3,2,4}P5: i=i+1=3 4, reia P2

    P2: 3S ={5}, u3=4L(5)= 21>L(4)+5=12, eticheteaz 5 cu 4P3: selecteaz u4=5, L(5)=12, cea mai mic dintre w-distanele calculate laP2P4: S3={1,3,2,4,5}P5: i=i+1=4, stop.Algoritmul calculeaz urmtoarele rezultate:

    Vrful v pn la care secalculeaz w-distana 1 2 3 4 5

    D(1,v), eticheta lui v 0, 1 5, 1 1, 1 7, 2 12, 4

    Drumurile de cost minim de la vrful 1 la fiecare dintre vrfurile grafului sestabilesc pe baza sistemului de etichete astfel: drumul de la 1 la un vrf v este dat de:v1, eticheta lui v, v2 eticheta lui v1 .a.m.d., pn se ajunge la eticheta 1.

    44

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    45/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    Astfel, v0-drumurile de cost minim sunt:pn la 2: 2,1;pn la 3: 3,1;pn la 4: 4,2,1;

    pn la 5: 5,4,2,1.

    Programul Pascal pentru algoritmul Dijkstra, graful ponderat fiindreprezentat sub form tabelar, este prezentat n continuare.

    Variabilele folosite n program au urmtoarele semnificaii:- v: numrul de vrfuri ale grafului;- m: numrul de muchii din graf;- s: mulimea Si la momentul curent;- t: mulimea iS la momentul curent;- l: vectorul componentelor L din etichetele ataate vrfurilor;- dr: vectorul componentelor de tip vrf din etichetele ataate vrfurilor.uses crt;var a:array[1..200,1..3] of integer;

    s,dr,t,l:array[1..20] of integer;i,j,k,p,v1,u,c,d:integer;m,v:integer;

    begin

    clrscr;readln(v);readln(m);for i:=1 to m do

    for j:=1 to 3 dobeginwrite('a[',i,',',j,']=');readln(a[i,j]);end;

    i:=1;s[1]:=1;v1:=1;for j:=2 to v do

    begint[j-1]:=j; l[j]:=maxint;end;

    l[1]:=0;for k:=1 to v-1 do

    beginfor j:=1 to v-i do

    beginu:=1;while((t[j]a[u,1])or(v1a[u,2]))and

    ((t[j]a[u,2])or(v1a[u,1]))and(u

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    46/221

    Grafuri. Implementri n limbajul Pascal

    v1:=t[j];end;

    inc(i);s[i]:=v1;u:=1;while(udij+ djk thendik=dij+ djk;

    endif;enddo;

    endif;enddo;

    enddo;

    46

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    47/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    end;

    Matricea D calculat de algoritm este a w-distanelor D(u,v) n grafulponderat conex (V,E,w); pentru orice nj,i1

    =

    altfel,

    conectatesuntv,v),v,v(Ddjiji

    ij

    ntr-adevr, procedura calculeaz dinamic w-distana ntre oricare douvrfuri i i k, astfel: dac exist un i-k drum ce trece prin j ( nj1 ), cu costulcorespunztor (dij+ djk) inferior costului curent (dik), atunci noul drum de la i la kviaj este de cost mai mic dect cel al drumului vechi, deci w-distana ntre ii ktrebuiereactualizat la dij+ djk.

    Algoritmul Yen

    Pentru calculul tuturor w-distanelor ntr-un graf ponderat, algoritmul propusde Yen rezolv problema ntr-o manier mai eficient dect algoritmul Roy-Floyd,din punctul de vedere al volumului operaiilor. Fie (V,E,w) un graf ponderat, Wmatricea ponderilor. Pentru determinarea w-distanelor de la vrful vk fixat lacelelalte vrfuri ale grafului, algoritmul Yen iniiaz urmtoarele operaii:

    Pasul 1: D = WPasul 2: i = 1; (k) = 0, b(k) = 0; (j)=0, pentru toi nj1 , j kPasul 3: Calculeaz min{dkj; nj1 , (j)=1}; determin j0 astfel nct

    (j0) = 1 i0kj

    d = min{dkj; nj1 , (j) = 1}

    B(j0) =0kj

    d , (j0) = 0

    d[k,j] = min{d[k,j],d[k,j0]+d[j0,j]}, pentru toi j, nj1

    i=i+1

    Pasul 4: Dac i

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    48/221

    n clasa grafurilor conexe, structurile cele mai simple, dar care apar cel maifrecvent n aplicaii, sunt cele arborescente (arbori). n acest capitol sunt prezentate

    principalele caracteristici ale arborilor, algoritmi pentru calculul arborelui parial decost minim, arbori direcionai, arbori cu rdcini arbori binari. Pe lng operaiileprimitive asupra arborilor cutarea unei informaii, inserarea unui nod, extragereaunui nod i metode de parcurgere, sunt prezentate dou clase importante de arboribinari, i anume arbori de sortare i arbori de structur.

    4.1 Grafuri de tip arbore

    4.1.1 Definiii i caracterizri ale grafurilor de tip arbore

    Definiia 4.1.1. Graful G este arbore dac G este aciclic i conex.Definiia 4.1.2. Fie G=(V,E) graf arbore. Subgraful H=(V1,E1) al lui G este

    un subarbore al lui G dac H este graf arbore.

    Exemple:

    4.1. Graful

    este arbore, deoarece pentru orice pereche de vrfuri i,j, 1 i,j 6, ij, exist un i-jdrum i graful nu conine cicluri.

    1 3

    4 25

    STRUCTURI ARBORESCENTE

    48

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    49/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    4.2. Graful

    nu este arbore deoarece este conex, dar drumul

    :1,4,3,2,1 este un ciclu.4.3. Graful

    nu este arbore deoarece are dou componente conexe {1,2,3,4,5,6}, {7,8}.

    Proprietatea unui graf de a fi arbore poate fi verificat prin algoritmi care

    testeaz calitile de conexitate i aciclicitate. Verificarea proprietii unui graf de a fiarbore poate fi realizati pe baza urmtoarelor proprieti:

    Proprietatea 1.: Un graf G=(V,E), cu mE,nV == este de tip arbore dac

    i numai dac G este aciclic i n=m+1. Cu alte cuvinte, problema revine la

    verificarea aciclicitii grafului i a relaiei existente ntre numrul vrfurilor i

    numrul muchiilor grafului.

    Proprietatea 2: Un graf G=(V,E), cu mE,nV == este de tip arbore daci numai dac G este conex i n=m+1.

    Fie G=(V,E) un graf. Urmtoarele afirmaii sunt echivalente:

    1.G este graf arbore;2.G este graf conex minimal (oriare ar fi eE, prin eliminarea muchiei

    e graful rezultat nu este conex);

    1 3

    4 2

    56

    1 3 7

    4 2

    5

    6 8

    49

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    50/221

    Structuri arborescente

    3.G este graf aciclic maximal (prin adugarea unei noi muchii n grafrezult cel puin un ciclu).

    Definiia 4.1.3. Un graf orientat D=(V,E), cu proprietatea c pentru

    ,Ev,u Ev,u , atunci vuE se numete graf asimetric. Digraful D este

    simetric dac ,Ev,u uvE, daci numai dac vuE.

    Definiia 4.1.4. Fie D=(V,E) digraf netrivial. Graful G=(V,E), unde

    E={uv/ uvE sau vuE} se numetesuportal digrafului D.

    Definiia 4.1.5. Un arbore direcionat este un graf orientat asimetric cu

    proprietatea c graful suport corespunztor lui este graf arbore. Arborele direcionatT=(V,E) este cu rdcin dac exist rV astfel nct, pentru orice uV, u r, exist

    r-u drum n T. Vrful rse numete rdcina arborelui direcionat T.

    Definiia 4.1.6. Dac T=(V,E) este arbore direcionat, atunci T1=(V1,E1)

    este subarbore al lui T dac V1V, E1E i T1 este arbore direcionat.

    Deoarece graful suport al unui arbore direcionat este aciclic, rezult c

    pentru orice uV, u r, r-u drumul n T este unic. De asemenea, un arbore

    direcionat are cel mult o rdcin. n consecin, pentru orice uV, u r, distana de

    la rdcin la vrful u este egal cu numrul de muchii ale r-u drumului n T.

    Exemple:

    4.4. Arborele direcionat

    este cu rdcin (vrful reste rdcina arborelui).

    uw x

    t r y

    v z

    50

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    51/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    4.5. Arborele direcionat

    nu are rdcin.

    4.6. Arborele

    este un subarbore cu rdcinx al arborelui din exemplul 4.5

    4.1.2 Arbori orientai; reprezentri i parcurgeriDefiniia 4.1.7. Un arbore orientateste un arbore direcionat cu rdcin.Deoarece un arbore orientat este un caz particular de digraf, pentru

    reprezentarea unui arbore orientat poate fi utilizat oricare din modalitile prezentaten 3.1. n plus, existi posibilitatea obinerii unor reprezentri mai eficiente pentruacest tip de graf.

    Una dintre modaliti este reprezentarea FIU-FRATE, care const nnumerotarea convenional a vrfurilor grafului i reinerea, pentru fiecare vrf i alarborelui, a urmtoarelor informaii:

    - FIU(i), care reprezint numrul ataat primului descendent al vrfului i;- FRATE(i), care reprezint numrul ataat vrfului descendent al tatlui

    vrfului ii care urmeaz imediat lui i;- INF(i), care reprezint informaia ataat vrfului i (de obicei valoarea i).

    Pentru reprezentarea arborelui se rein rdcina i numrul nodurilor.Absena fiului, respectiv a fratelui unui vrf, este marcat printr-o valoarediferit de numerele ataate vrfurilor (de obicei valoarea 0).

    u v

    x

    y

    z w

    y w

    x

    v

    51

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    52/221

    Structuri arborescente

    Exemplu:

    4.7. Arborele orientat

    este reprezentat astfel:N=15 (numrul nodurilor arborelui)R=1 (rdcina), FIU=(2,5,7,9,0,10,0,0,13,0,0,0,0,0,0)

    fiul lui 1 este 2 vrful 9 are fiul 13FRATE=(0,3,4,0,6,0,8,0,0,11,12,0,14,15,0)

    vrful 1 nu are frate vrful 14 are fratele 15

    Utiliznd structurile de date dinamice pentru arbori orientai, se obine oreprezentare descris n continuare. Presupunnd c fiecare vrf al arborelui are celmult n descendeni, fiecrui vrf i este ataat structura:

    vector de legturi ctre descendenii vrfuluiidentificatorul vrfuluilegtur ctre fiul 1

    legtur ctre fiul n

    Dac un vrf are p

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    53/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    O parcurgere revine la aplicarea sistematic a unei reguli de vizitare avrfurilor grafului. Cele mai uzuale reguli de parcurgere a arborilor orientai suntprezentate n continuare.

    A. Parcurgerea n A-preordineIniial vrful curent este rdcina arborelui. Se viziteaz vrful curent i sunt

    identificai descendenii lui. Se aplic aceeai regul de vizitare pentru arborii care auca rdcini descendenii vrfului curent, arborii fiind vizitai n ordinea dat denumerele ataate vrfurilor rdcin corespunztoare.

    Exemplu:

    4.8. Pentru arborele orientat din exemplul 4.7, prin aplicarea parcurgerii nA-preordine, rezult: 1,2,5,6,10,11,12,3,7,8,4,9,13,14,15.

    Pentru un arbore reprezentat FIU-FRATE, implementarea parcurgerii nA-preordine se bazeaz pe urmtoarea procedur recursiv, avnd ca parametru deintrare rdcina arborelui curent (vrful curent n momentul apelului).

    procedure A_preordine (R);if R0 then

    vizit (R);A_preordine(FIU[R]);A_preordine(FRATE[R]);

    endif;end;

    B. Parcurgerea A-postordineRegula de vizitare a vrfurilor n parcurgerea n A-postordine difer de cea nA-preordine numai prin faptul c rdcina fiecrui arbore este vizitat dup ce au fost

    vizitate toate celelalte vrfuri ale arborelui.

    Exemplu:

    4.9. Pentru arborele orientat din exemplul 4.7, ordinea de vizitare a vrfuriloreste: 5,10,11,12,6,2,7,8,3,13,14,15,9,4,1.

    Pentru arbori reprezentai prin structuri de date arborescente, implementarea

    parcurgerii n A-postordine poate fi obinut pe baza urmtoarei proceduri recursive.Unicul parametru (de intrare) reprezint rdcina arborelui curent n momentulapelului.

    procedure A_postordine (R);if Rnil then

    do-for i=1,n,1A_postordine(R^.leg[i]);

    53

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    54/221

    Structuri arborescente

    enddo;vizit (R);

    endif;end;

    Procedurile A-preordine i A-postordine sunt variante de parcurgeri nadncime, fiind prioritare vrfurile aflate la distan maxim fa de rdcinaarborelui iniial.

    C. Parcurgerea pe niveluriDefiniia 4.1.8. Un vrf v al unui arbore orientat cu rdcin r se afl pe

    nivelul i al arborelui, dac distana de la vrf la rdcin (lungimea r-v drumului) esteegal cu i. Rdcina arborelui este de nivel 0.Parcurgerea unui arbore orientat pe niveluri const n vizitarea vrfurilor sale

    n ordinea cresctoare a distanelor fa de rdcin.

    Exemplu:

    4.10. Pentru arborele din exemplul 4.7, prin aplicarea parcurgerii pe niveluri,rezult: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15.

    Implementarea parcurgerii pe niveluri se bazeaz pe utilizarea unei structuride coadC. La momentul iniial, rdcina arborelui este unicul element din C. Attatimp ct coada este nevid, se extrage (cu tergere) un vrf din C, este vizitat i suntintrodui n coad descendenii si. Calculul se ncheie n momentul n care, latentativa de extragere a unui vrf din C, se constatC=.

    Parcurgerea pe niveluri este realizat de urmtoarea procedur care are caparametri de intrare reprezentarea FIU-FRATE a grafului. Procedurile push i pop

    realizeaz operaiile de acces introducere-extragere n C.

    procedure parcurgere_pe_niveluri(R,FIU,FRATE,n)C:ptcoada;C=nil;push(C,R);while Cnil do

    pop(C,v);VIZIT(v);

    v=FIU[v];while v0 do

    push(C,v);v=FRATE[v];endwhile;

    endwhile;end;

    54

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    55/221

    Programarea calculatoarelor Tehnica programrii n limbajul Pascal

    Exemplu

    4.11. Pentru arborele de la exemplul 4.7, evoluia algoritmului este:

    C

    tt=1 1t=2 2 3 4t=3 3 4 5 6t=4 4 5 6 7 8t=5 5 6 7 8 9t=6 6 7 8 9t=7 7 8 9 10 11 12

    t=8 8 9 10 11 12t=9 9 10 11 12t=10 10 11 12 13 14 15t=11 11 12 13 14 15t=12 12 13 14 15t=13 13 14 15t=14 14 15t=15 15t=16

    deci vrfurile sunt vizitate n ordinea: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15.

    Metoda BF pentru parcurgerea grafurilor este o generalizare a tehnicii deparcurgere pe niveluri a arborilor orientai. O alternativ de implementare aparcurgerii pe niveluri poate fi descris prin intermediul procedurilor recursive frai

    i parc. Coada C este o variabil global i este iniializat cu rdcina arborelui.Parcurgerea este obinut prin apelulparc(C).

    procedure frai(v);if v0 then

    push(C,v);frai(FRATE[v];endif;end;

    procedure parc;if Cnil then

    pop(C,v);VIZIT(v);frai(FIU[v]); parc;

    endif;end;

    55

  • 7/22/2019 Programarea Calculatoarelor Limbajul PASCAL

    56/221

    Structuri arborescente

    4.1.3 Arbori pariali; algoritmul Kruskal

    Definiia 4.1.9. Fie G graf. Subgraful parial H este un arbore parial al lui Gdac H este graf arbore.

    Definiia 4.1.10. Fie (V,E,w) un graf ponderat conex. Dac T=(V,E0) este unarbore parial al grafului G=(V,E), ponderea arborelui T este definit prin:

    W(T)= 0Ee

    )e(w .

    Definiia 4.1.11. Fie T(G) mulimea arborilor pariali corespunztori grafuluiG. T0T(G) este arbore parial minim pentru G dac W(T0)=min{W(T); TT(G)}.

    Dac G este graf finit, atunci T(G) este mulime finit, deci orice graf finitponderat i conex are cel puin un arbore parial minim.

    Pentru calculul unui arbore parial minim sunt cunoscui mai muli algoritmi.n continuare este prezentat algoritmul Kruskal pentru determinarea unui arboreparial minim al unui graf ponderat conex G=(V,E,w).

    Pasul 1: i=1; E0=Pasul 2: Determin mulimeaR={e/eE \ Ei-1 astfel nct graful (V,Ei-1 {e}) este aciclic}Dac R=, atunci stop;

    altfel, selecteaz eiR cu w(ei)=min{w(e), eR};Ei=Ei-1 {ei}

    Pasul 3: i=i+1 i reia pasul 2.

    Structura (V,Ei-1) calculat de procedur este arbore parial minim al grafuluiconex ponderat G.

    Ideea algoritmului Kruskal revine la alegerea i includerea n mulimea de

    muchii curente a unei muchii de cost minim nc neselectate i astfel nct s nuformeze un ciclu cu muchiile selectate la etapele precedente. Algoritmul se ncheieatunci cnd nici o alegere nu mai este posibil. Aplicarea metodei la grafuri neconexecalculeaz o mulime de arbori pariali minimi, cte un arbore pentru fiecarecomponent conex.

    Pentru implementarea algoritmului Kruskal, graful conex ponderat estereprezentat sub form tabelar, muchiile fiind ordonate cresctor dup ponderi.Muchiile selectate de algoritm pot fi meninute, de asemenea, ntr-o structur

    tabelar, sau d