You are on page 1of 6

Ministerul Educaţiei, Culturii și Cercetării al Republicii

Moldova

Universitatea Tehnică a Moldovei

Departamentul Informatică și Ingineria Sistemelor

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

Tema: Algoritmul de căutare în lărgime

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:

➢ introducerea grafului în memoria calculator;


➢ parcurgerea grafului în lărgime;
➢ vizualizarea rezultatelor la display;
3. Întrebări de control:
1. În ce constă parcurgerea arborelui şi a grafului în lărgime?
Parcurgerea în lărgime este un algoritm de căutare într-un graf sau un arbore, care începe cu
nodul de start și explorează toți vecinii acestuia la o anumită distanță înainte de a se muta la
următoarea distanță.

În mod similar cu parcurgerea în adâncime, parcurgerea în lărgime începe cu un nod de start și


vizitează toți vecinii acestuia. Diferența constă în faptul că, în loc să se adâncească cât mai mult
în graf, algoritmul parcurge graful la o anumită distanță înainte de a se muta la următoarea
distanță.

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.

4.Codul programului în limbajul C:


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

int **alocare(int n)
{
int **A = (int **)malloc(sizeof(int) * n);

for (int i = 0; i < n; i++)


{
A[i] = (int *)malloc(sizeof(int) * n);
}
return A;
}

int vizitat[10] = {0};


void adancime(int nodStart, int **matriceaDeAdiacenta, int n)
{

int front = -1;


int rear = -1;
int coada[10];

coada[++rear] = nodStart;
++front;
vizitat[nodStart] = 1;

while (rear >= front)


{

nodStart = coada[front++];
printf("%d->", nodStart + 1);

for (int i = 0; i < n; i++)


{
if (matriceaDeAdiacenta[nodStart][i] && vizitat[i] == 0)
{
coada[++rear] = i;
vizitat[i] = 1;
}
}
}
}
void main()
{
int count = 0;
int n, m, a, b, f, o;
printf("\n Introduceti numarul de virfuri:");
scanf("%d", &n);
printf("Introducei numarul de muchii:");
scanf("%d", &m);
int **matriceaDeAdiacenta = alocare(n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= n; j++)
{
matriceaDeAdiacenta[i][j] = 0;
}
}

printf("\nIntroduceti datele muchiilor:\n");


for (int k = 0; k < m; k++)
{
printf("\nMuchia %d", k + 1);
printf("\nIntroduceti nodul din care porneste:");
scanf("%d", &a);
printf("\nIntroduceti nodul spre care duce:");
scanf("%d", &b);
if (a > n || b > n)
printf("\nNu exista asa numere:\n");
else
{

matriceaDeAdiacenta[a - 1][b - 1] = 1;
matriceaDeAdiacenta[b - 1][a - 1] = 1;
}
}

printf("\nIntroduceti nodul din care doriti sa porniti ");


scanf("%d", &f);
adancime(f - 1, matriceaDeAdiacenta, n);
getch();
}
5.Rezultatele:
6.Concluzie:
În concluzie, lucrarea de laborator cu tema "Algoritmul de căutare în lărgime" a avut ca scop
studierea algoritmului de căutare în lărgime și elaborarea unui program de căutare în lărgime.
Sarcina a constat în elaborarea procedurii pentru algoritmul de parcurgere a grafului în lărgime și
în dezvoltarea unui program care să permită introducerea grafului în memoria calculatorului,
parcurgerea grafului în lărgime și vizualizarea rezultatelor la display.

În cadrul lucrării, am aprofundat conceptele legate de parcurgerea în lărgime a unui graf și am


învățat cum să implementăm acest algoritm folosind structuri de date precum coada. Am
dezvoltat un program care să permită utilizatorului să introducă graful în calculator, să parcurgă
graful în lărgime și să vizualizeze rezultatele la display.

Această lucrare ne-a ajutat să ne îmbunătățim abilitățile de programare și de înțelegere a


algoritmilor de căutare în graf. Am învățat că parcurgerea în lărgime poate fi utilă în diverse
aplicații precum căutarea celor mai scurte drumuri între două puncte sau găsirea componentelor
conexe ale unui graf.

You might also like