Professional Documents
Culture Documents
Lab 3 Lungu
Lab 3 Lungu
Moldova
RAPORT
Lucrarea de laborator nr.1
la Matematica discreta
A efectuat:
gr.TI-224 Lungu Constantin
A verificat:
Asis.univ. V.Melnic
Lucrarea de laborator nr.3
1. Scopul lucrării:
1. Studierea algoritmului de căutare în lărgime;
2. Elaborarea programului de căutare în lărgime.
2. Sarcina:
1. Elaboraţi procedura care va realiza algoritmul de parcurgere a grafului în
lărgime.
2. Folosind procedurile din lucrările precedente, elaboraţi programul care va
permite:
Parcurgerea în lărgime începe prin marcarea nodului de start ca vizitat și adăugarea acestuia într-
o coadă. Apoi, se scoate primul nod din coadă și se vizitează toți vecinii săi nevizitați,
adăugându-i pe aceștia în coadă. Se repetă procesul pentru fiecare nod din coadă până când se
ajunge la toate nodurile din graf.
Această metodă asigură că toți vecinii unui nod sunt vizitați înainte de a se muta la vecinii
vecinilor lor. Parcurgerea în lărgime este utilă pentru problemele de căutare a celei mai scurte căi
între două noduri sau pentru determinarea tuturor nodurilor care sunt la o anumită distanță față
de un nod de start.
2. Care este diferenţa dintre parcurgerea în lărgime a unui arbore şi a unui graf
arbitrar?
Parcurgerea în lărgime a unui arbore şi a unui graf arbitrar sunt două concepte similare, dar
există câteva diferențe importante între cele două.
În primul rând, un arbore este un graf conex fără cicluri, în timp ce un graf arbitrar poate avea
cicluri și poate să nu fie conex. În ceea ce privește parcurgerea în lărgime, această diferență
în structură înseamnă că în cazul unui arbore nu este nevoie să se verifice dacă un nod a fost
deja vizitat sau nu, deoarece un nod poate fi vizitat o singură dată. Pe de altă parte, în cazul
unui graf arbitrar, este important să se verifice dacă un nod a fost deja vizitat pentru a evita
buclele infinite.
În al doilea rând, parcurgerea în lărgime a unui arbore este mai simplă decât cea a unui graf
arbitrar, deoarece în cazul unui arbore toți vecinii unui nod sunt accesibili prin legături
directe, în timp ce în cazul unui graf arbitrar, vecinii unui nod pot fi la diferite distanțe, ceea
ce înseamnă că este necesar să se țină evidența distanței pentru fiecare nod în parte.
În general, parcurgerea în lărgime este utilizată mai des în cazul grafurilor arbitrar, deoarece
acestea sunt mai complexe decât arborii și necesită o abordare mai sofisticată pentru a fi
parcurși în mod eficient.
3. Ce fel de structuri de date se vor utiliza în algoritmul de căutare în lărgime?
În algoritmul de căutare în lărgime (BFS), se utilizează o coadă (queue) pentru a reține nodurile
care trebuie vizitate în continuare. În general, se pot utiliza diferite implementări ale cozii pentru
a implementa BFS, cum ar fi:
O coadă simplă (simple queue): Aceasta este implementarea cea mai simplă a cozii, în care noile
elemente sunt adăugate la sfârșitul cozii, iar elementele vechi sunt eliminate din începutul cozii.
O coadă cu prioritate (priority queue): În această implementare, nodurile sunt sortate în funcție
de o anumită prioritate și apoi adăugate în coadă. Acest lucru poate fi util pentru a vizita nodurile
într-o anumită ordine, de exemplu, în funcție de distanța față de nodul de start.
O coadă cu mai multe puncte de intrare (multi-frontier queue): Aceasta este o implementare
specială a cozii, în care putem adăuga elemente la începutul și/sau sfârșitul cozii. Acest lucru
poate fi util atunci când trebuie să vizităm noduri multiple în același timp, cum ar fi în cazul mai
multor noduri de start.
În plus față de coadă, în algoritmul BFS se poate utiliza și un vector sau o listă pentru a păstra
starea nodurilor (vizitat sau nevizitat) și pentru a păstra ordinea de vizitare a nodurilor.
int **alocare(int n)
{
int **A = (int **)malloc(sizeof(int) * n);
coada[++rear] = nodStart;
++front;
vizitat[nodStart] = 1;
nodStart = coada[front++];
printf("%d->", nodStart + 1);
matriceaDeAdiacenta[a - 1][b - 1] = 1;
matriceaDeAdiacenta[b - 1][a - 1] = 1;
}
}