Sunteți pe pagina 1din 6

Ministerul Educaiei i Tineretului al Republicii Moldova

Universitatea Tehnic a Moldovei

RAPORT
Lucrare de laborator Nr.2 si 3
la Matematica Discret

A efectuat:
A verificat:

Chiinu 2014

LUCRAREA DE LABORATOR Nr. 2


1. SCOPUL LUCRRII:
Studierea algoritmilor de cutare n graf i a diferitor forme de pstrare i prelucrare a datelor.
Elaborarea procedurii de cutare n adncime.
2. NOTE DE CURS

Structuri de date: liste


Fiecare tip de list definete o mulime de iruri finite de elemente de tipul declarat. Numrul de elemente care
se numete lungimea listei poate varia pentru diferite liste de acelai tip. Lista care nu conine nici un element
se va numi vid. Pentru list sunt definite noiunile nceputul, sfritul listei i respectiv primul i ultimul
element, de asemenea elementul curent ca i predecesorul i succesorul elementului curent. Element curent se
numete acel unic element care este accesibil la momentul dat.

Structuri de date : fire de ateptare


Firele de ateptare (FA, rnd, coad, ir de ateptare) se vor folosi pentru a realiza algoritmul de prelucrare a
elementelor listei n conformitate cu care elementele vor fi eliminate din list n ordinea n care au fost incluse
n ea (primul sosit - primul servit).
Operaiile de baz cu firele de ateptare:

Formarea unui FA vid;


Verificare dac FA nu este vid;
Alegerea primului element cu eliminarea lui din FA;
Introducerea unei valori noi n calitate de ultim element al FA.

Structuri de date - arbori


Se va defini o mulime de structuri fiecare din care va consta dintr-un obiect de baz numit vrf sau rdcina
arborelui dat i o list de elemente din mulimea definit, care (elementele) se vor numi subarbori ai arborelui
dat. Arborele pentru care lista subarborilor este vid se va numi arbore trivial, iar rdcina lui - frunz.
Rdcina arborelui se va numi tatl vrfurilor care servesc drept rdcini pentru subarbori; aceste vrfuri se
vor mai numi copiii rdcinii arborelui: rdcina primului subarbore se va numi fiul cel mai mare, iar rdcina
fiecrui subarbore urmtor n list se va numi frate.
Operaiile de baz pentru arbori vor fi:

Formarea unui arbore trivial;


Alegerea sau nlocuirea rdcinii arborelui;
Alegerea sau nlocuirea listei rdcinilor subarborilor;
Operaiile de baz care sunt valabile pentru liste.

Cutare n adncime
La cutarea n adncime (parcurgerea unui graf n sens direct, n preordine) vrfurile grafului vor fi vizitate n
conformitate cu urmtoarea procedur recursiv:
mai nti va fi vizitat rdcina arborelui q, apoi, dac rdcina arborelui nu este frunz - pentru fiecare fiu
p al rdcinii q ne vom adresa recursiv procedurii de parcurgere n adncime pentru a vizita vrfurile tuturor
subarborilor cu rdcina p ordonate ca fii ai lui q.
3. SARCINA DE BAZ
1. Elaborai procedura cutrii n adncime ntr-un graf arbitrar;
2. Elaborai un program cu urmtoarele posibiliti:

introducerea grafului n calculator,


parcurgerea grafului n adncime,
vizualizarea rezultatelor la display i imprimant.

LUCRAREA DE LABORATOR Nr. 3


TEMA: ALGORITMUL DE CUTARE N LRGIME
1. SCOPUL LUCRRII:

Studierea algoritmului de cutare n lrgime;


Elaborarea programului de cutare n lrgime.
2. NOTE DE CURS

Algoritmul de cutare n lrgime


Parcurgerea grafului n lrgime, ca i parcurgerea n adncime, va garanta vizitarea fiecrui vrf al grafului
exact o singur dat, ns principiul va fi altul. Dup vizitarea vrfului iniial, de la care va ncepe cutarea n
lrgime, vor fi vizitate toate vrfurile adiacente cu vrful dat, apoi toate vrfurile adiacente cu aceste ultime
vrfuri .a.m.d. pn vor fi vizitate toate vrfurile grafului. Evident, este necesar ca graful s fie conex.
Aceast modalitate de parcurgere a grafului (n lrgime sau postordine), care mai este adesea numit
parcurgere n ordine orizontal, realizeaz parcurgerea vrfurilor de la stnga la dreapta, nivel dup nivel.
Vom nota c procedura parcurgerii grafului n lrgime permite s realizm arborele de cutare i n acelai
timp s construim acest arbore. Cu alte cuvinte, se va rezolva problema determinrii unei rezolvri sub forma
vectorului (a1, a2,...) de lungime necunoscut, dac este cunoscut c exist o rezolvare finit a problemei.
Algoritmul pentru cazul general este analogic cu cel pentru un graf n form de arbore cu o mic modificare
care const n aceea c fiecare vrf vizitat va fi marcat pentru a exclude ciclarea algoritmului.
3. SARCINA DE BAZ
1. Elaborai procedura care va realiza algoritmul de parcurgere a grafului n lrgime;
2. Folosind procedurile din lucrrile precedente, elaborai programul care va permite:
introducerea grafului n calculator;
parcurgerea grafului n lrgime;
extragerea datelor la display i printer.

Listingul programului:
#include <conio.h>
#include <stdlib.h>
#include <stdlib.h>
int main()
{
int i,j,k,l,n,s,x,y,h;
char ch;

static int a[30][20],b[30];


L1:system("cls");
printf("\n\t");
printf("Introduceti numarul de virfuri ale arborelui : ");
scanf("%i",&n);
printf("\n\t");
printf("Introduceti lista de adiacenta :\n\n ");

for(i=0;i<n;i++)
{
printf("\r%2i|",i+1);
scanf("%i",&a[i][0]);
for(j=1;j<n+1;j++)
if(a[i][j-1]!=0) scanf("%i",&a[i][j]);
else break;}
for(i=0;i<n;i++) b[i]=i+1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(a[i][j]!=0)
if(b[a[i][j]-1]!=0&&0<a[i][j]&&a[i][j]<=n) b[a[i][j]-1]=0;
else goto l2; // Eror!
else break;
for(i=0,x=0;x<n;x++)
if(b[x]!=0) {b[0]=x+1; i++;}
if(i>1) goto l2; // Eror!
x=y=0;
printf("\n\n\r");
printf("*************************\n\n\n");
printf("Parcurgerea in largime :\n\r");
printf("\n %d,",b[0]);
for(i=1;i<n;i++)
{ if(a[b[x]-1][y]==0) {x++; y=0; i--;}
else {b[i]=a[b[x]-1][y]; y++;
printf(" %d,",b[i]);
if(i%15==0) printf("\n");
}
}
goto l4;
l2:printf("\n\n\t\t\t");
printf("Eroare!");
goto l3;
l4:printf("\n\n\n\r");
printf("*************************\n\n\n");
printf("Rezultatul parcurgerii in adincime:\n");
i=b[0]-1;j=s=h=0;
printf("\n %d,",b[0]);
while(h<n-1)
{k=i;
if(a[k][j]!=0)
{ printf(" %i,",a[k][j]);
i=a[k][j]-1;
}
l1:if(a[k][j]==0)
{ if(s==0)l=k+1;
if(s==1)l=x+1;
for(x=0;x<n;x++)
for(y=0;y<n+1;y++)
{ if(a[x][y]==l&&a[x][y+1]!=0)
{ printf(" %i,",a[x][y+1]);
i=a[x][y+1]-1;
s=0;
goto l5; }
if(a[x][y]==l&&a[x][y+1]==0)
{ s=1;goto l1;}
}
}
l5:h++;
if(h%15==0) printf("\n");
}
l3:
printf("\n\n\n");
printf("*************************");
printf("\n\n\n");

printf("Reincarcarea programului - Enter \n\n");


printf("Iesirea din program
- Esc");
while(1)
{ ch=getch();
if(ch==27) exit(0);
if(ch==13) goto L1; }}

Graful introdus:

Rezultatele obtinute:

Concluzie:
Cautarea in largime si in adincime in arbori duce la vizitarea tuturor virfurilor acestuia
depistind nodul solicitat insa in ordine diferita ceea ce duce la aplicarea in practica a
celei mai eficiente metode pentru fiecare caz in parte

S-ar putea să vă placă și