Sunteți pe pagina 1din 8

Ministerul nvmntului a Republicii Moldova

Universitatea Tehnic a Moldovei

Raport
La Disciplina Matematica Discreta

Tema

Laboratorul numarul 3-4


:ALGORITMUL DE CUTARE N LRGIME SI
ADNCIME

A efectuat :
Studentul grupei SI-141

Cucu Eugeniu

A verificat :
Profesor

Veronica Bagrin

Chisinau 2015
1

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.

Studierea algoritmului de cutare n lrgime;

Elaborarea programului de cutare n lrgime.

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: stive


Stiva se utilizeaz pentru a realiza algoritmul de prelucrare a elementelor dup principiul "ultimul sosit primul prelucrat" (LIFO).
Operaiile de baz cu stivele sunt urmtoarele:

Formarea unei stive vide;

Verificare la vid;

Alegerea elementului din topul stivei cu sau fr eliminare;

Introducerea unui element nou n topul stivei.


2

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.

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.
Algoritmul de mai jos realizeaz parcurgerea n lrgime cu ajutorul a dou fire de ateptare O1 i O2.
Se vor forma dou fire de ateptare vide O1 i O2;
Introduce rdcina n FA O1;
WHILE cel puin unul din firele de ateptare O1 sau O2 nu va fi vid DO
IF O1 nu este vid THEN
BEGIN
fie p vrful din topul FA O1;
viziteaz vrful p eliminndu-l din O1;
viziteaz pe toi fiii lui p n FA O2, ncepnd cu cel mai mare;
END
ELSE
n calitate de O1 se va lua FA O2, care nu este vid,
3

iar n calitate de O2 se va lua FA vid O1;

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.
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.
n cazul utilizrii unei stive pentru pstrarea drumului curent pe arbore, drum care ncepe din rdcina
arborelui i se termin cu vrful vizitat n momentul dat, poate fi realizat un algoritm nerecursiv de
forma:
Viziteaz rdcina arborelui i introdu-o n stiva vid S;
WHILE stiva S nu este vid DO
BEGIN
fie p - vrful din topul stivei S;
IF fiii vrfului p nc nu au fost vizitai
THEN viziteaz fiul mai mare al lui p i introduce-l n S
ELSE BEGIN
elimin vrful p din stiva S
IF p are frai THEN viziteaz pe fratele lui p i introduce-l n stiva S
END
END

Acest algoritm poate fi modificat pentru a putea fi utilizat la parcurgerea tuturor vrfurilor unui graf
arbitrar. n algoritmul de mai jos se va presupune c este stabilit o relaie de ordine pe mulimea tuturor
vrfurilor grafului, iar mulimea vrfurilor adiacente cu un vrf arbitrar al grafului este de asemenea
ordonat:
WHILE va exista cel puin un vrf care nu a fost vizitat DO
BEGIN
fie p - primul din vrfurile nevizitate;
viziteaz vrful p i introduce-l n stiva vid S;
4

WHILE stiva S nu este vid DO


BEGIN
fie p - vrful din topul stivei S;
IF m vrfuri ale lui p sunt vrfuri adiacente nevizitate
THEN BEGIN
fie z primul vrf nevizitat din vrfurile adiacente cu p;
parcurge muchia (p,z), viziteaz vrful z i introduce-l n stiva S;
END
ELSE elimin vrful p din stiva S
END
END

n cazul n care se va lucra cu un graf conex arbitrar cu relaia de ordine lips, nu va mai avea
importan ordinea de parcurgere a vrfurilor. Propunem un algoritm care utilizeaz mai larg
posibilitile stivei, cea ce face programul mai efectiv n sensul diminurii timpului de calcul necesar.
De exemplu, acest algoritm n varianta recursiv este pe larg utilizat n programele de selectare global
n subdirectori (cazul programelor antivirus).
Introdu n stiv vrful iniial i marcheaz-l;
WHILE stiva nu este vid DO
BEGIN
extrage un vrf din stiv;
IF exist vrfuri nemarcate adiacente cu vrful extras
THEN marcheaz-le i introduce-le n stiv;
END

3. SARCINA DE BAZ
1. Elaborai procedura cutrii n adncime ntr-un graf arbitrar (vezi anexaA si B);
2. Elaborai procedura care va realiza algoritmul de parcurgere a grafului n lrgime;
3. Elaborai un program cu urmtoarele posibiliti:

introducerea grafului n calculator,

parcurgerea grafului n adncime,

parcurgerea grafului n lrgime;

vizualizarea rezultatelor la display i imprimant.

ANEXA
4.Listing-ul programului
#include
#include
#include
#include

<iostream>
<conio.h>
<stdio.h>
<stdlib.h>

using namespace std;


int tab_a[10][10],c_a[20],viz_a[10],tab_l[10][10],c_l[20],viz_l[10];
int n,m,prim_a,ultim_a,varf_a,prim_l,ultim_l,varf_l,nd;
void bf_recursiv() //parcurgerea in latime
{
int k;
if(prim_l<=ultim_l)
{
varf_l=c_l[prim_l];
for(k=1;k<=n;k++)
if(tab_l[varf_l][k]==1 && viz_l[k]==0) //il adaug pe k in coada daca este vecin pt.
varf si nu a fost vizitat
{
ultim_l++;
c_l[ultim_l]=k;
viz_l[k]=1;
}
prim_l++;
bf_recursiv();
}
}
void parc_latime()
{
int i;
prim_l=ultim_l=1;
viz_l[nd]=1;
c_l[prim_l]=nd;
bf_recursiv();
for(i=1;i<=ultim_l;i++)//afisarea cozii
cout<<c_l[i]<<" ";
}
void parc_adancime(int nd)
{
int j;
cout<<nd<<" ";
viz_a[nd]=1;
for(j=0;j<=n;j++)
{
if((tab_a[nd][j]==1) && (viz_a[j]==0))
parc_adancime(j);
}
}
void print()
{
int i,j;
cout<<"Matricea de adiacenta"<<endl; // afisare matrice de adiacenta
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<tab_l[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int ans,com,g,o;
int x,y,i;

cout<<"Dati numarul de noduri"<<endl<<">";


cin>>n;
cout<<"Dati numarul de conexiuni intre noduri"<<endl<<">";
cin>>m;
system("cls");
for(i=1;i<=m;i++)
{
cout<<"X>";
cin>>x;
cout<<"Y>";
cin>>y;
system("cls");
tab_a[x][y]=1;
tab_l[x][y]=1;
}
cout<<"Matria a fost adaugata cu succes!"<<endl;
for(i=0;i<=n;i++)
viz_l[i]=0;
cout<<"Doriti sa afisati matricea de adiacenta?(1/0)"<<endl;
cin>>o;
if(o == 1)
print();
while(1)
{
while(g)
{
g=0;
system("cls");
cout<<"1.Parcurgerea in latime"<<endl;
cout<<"2.Parcurgerea in adincime"<<endl;
cout<<"3.Iesire"<<endl;
cout<<endl<<"Dati comanda"<<endl<<">";
cin>>ans;
if(ans == 1)
{
cout<<endl<<"Dati virful de pornire"<<endl<<">";
cin>>nd;
for(i=0;i<=n;i++)
viz_a[i]=0;
parc_latime();
system("pause");
g=1;
}
else if(ans == 2)
{
cout<<endl<<"Dati virful de pornire"<<endl<<">";
cin>>nd;
for(i=0;i<=n;i++)
viz_l[i]=0;
parc_adancime(nd);
system("pause");
g=1;
}
else if(ans == 3)
{
cout<<"La revedere"<<endl;
system("pause");
exit(0);
}
else
{
cout<<"Apasati doar 1,2,3!!!";
system("pause");
g=1;
}
}
}
getchar();

5.Concluzie
Efecuand aceasta lucrare de laborator,am obtinut practica de lucru metodele de reprezentare ale
grafului,si metodele lui de stocare in memoria calculatorului.
Pe parcursul lucrarii, am ajuns la concluzia ca cea mai simpla metoda de introducere a grafului de la
tastatura este lista adiacenta, care piermite utilizatorului sa aleaga cu usurinta virfurile necesare,de
asemenea aceasta metoda utilizeaza si cel mai putin din memoria calculatorului.
Dupa parerea mea, cel mai usor putem desena graful,daca ne orientam dupa matricea de incidenta,insa
ea ocupa un volum mai mare din memoria calculatorului.
6.Bibliografie
1.Conspectul de matematica discreta predat de V.Bagrin
2.Conspectul de SDA predat de dr.conf.univ. Kulev M.