Sunteți pe pagina 1din 6

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

Moldova

Universitatea Tehnică a Moldovei

RAPORT
Lucrarea de laborator nr. 2
la Matematica Discretă
Tema: Algoritmul de căutare în adâncime.

A efectuat: st. gr. TI-224, Lungu Constantin

A verificat: Vladimir Melnic

UTM, Chișinău 2023


Lucrare de laborator Nr. 2
Tema: Algoritmul de căutare în adâncime.
1. Scopul lucrării:
1. Studierea algoritmilor de căutare în graf şi a diferitor forme de păstrare şi prelucrare a
datelor.
2. Elaborarea procedurii de căutare în adâncime.
2. Sarcina:
1. Elaborați procedura căutării în adâncime într-un graf.
2. Elaboraţi un program cu următoarele posibilităţi:
• introducerea grafului în calculator;
• parcurgerea grafului în adâncime;
• vizualizarea rezultatelor la display;
3. Întrebări de control:
1. Definiţi noţiunea de parcurgere a grafului în adâncime.
2. Exemplificaţi utilizarea algoritmului de căutare în adâncime.
Rezolvare:
1. Codul:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// declaram variabilele globale


bool **A;//matricea de adiacență a grafului
int v;// numărul total de vârfuri din graf
int a = 0;
int v1;//varful din care se va începe parcurgerea
int viz[100] = {0};// vectorul care reține informația despre vizitarea sau nevizitarea
fiecărui varf

// functia Adiacenta initializeaza matricea de adiacenta a grafului


void Adiacenta()
{
int i;
int j;
int x;
int y;

// alocam memorie pentru matricea de adiacenta


A = malloc (sizeof (bool **) * (v + 1));

for (i = 0; i <= v; i++)


{
*(A + i) = malloc (sizeof (bool *) * (v + 1));
}

// initializam matricea de adiacenta cu false (nu exista arce intre varfuri)


for (i = 1; i <= v; i++)
{
for (j = 1; j <= v; j++)
{
A[i][j] = false;
}
}

// introducem arcele dintre varfuri


printf ("Introduceti arcurile:\n");
do
{
scanf ("%d%d", &x, &y);
A[x][y] = true;
printf("Tastati 0 0 pentru a finaliza.\n");
a++;
} while (x != 0);
// afisam matricea de adiacenta
printf ("Matricea de adiacenta:\n");
for (i = 1; i <= v; i++)
{
for (j = 1; j <= v; j++)
{
printf ("%d ", A[i][j]);
}
printf ("\n");
}
}

// functia Adancime implementeaza algoritmul de parcurgere in adancime


void Adancime(int v1, int v)
{
viz[v1] = 1;
printf("%d ", v1);
for(int i = 0; i <= v; i++)
{
// daca exista un arc intre varful v1 si varful i, si varful i nu a fost vizitat inca
if(A[v1][i] == 1 && viz[i] == 0)
{
Adancime(i, v); // apelam recursiv functia Adancime pentru varful i
}
}
}

// functia main
int main ()
{
// citim numarul de varfuri din graf
printf ("Introduceti numarul de varfuri din graf:\n");
scanf ("%d", &v);

// initializam matricea de adiacenta si afisam matricea


Adiacenta();

// citim varful de la care sa incepem parcurgerea in adancime


printf("\nIntroduceti din ce varf doriti sa efectuati parcurgerea in adancime: ");
scanf("%d", &v1);
printf("\nParcurgerea grafului in adancime din varful %d: ", v1);

// apelam functia Adancime pentru parcurgerea in adancime


Adancime(v1, v);

return 0;
}
2. Poza cu executarea codului:
3. Concluzie:

In urma acestui laborator am efectuat un program cu ajutorul caruia putem parcurge in adancime
un graf introdus la tastatura, cu ajutorul matricei de adiacenta. La căutarea în adâncime
(parcurgerea unui graf în sens direct, în preordine) vârfurile grafului vor fi vizitate în
conformitate cu următoarea procedură recursivă: mai întâi va fi vizitată rădăcina arborelui , apoi,
dacă rădăcina arborelui nu este frunză - pentru fiecare fiu al rădăcinii ne vom adresa recursiv
procedurii de parcurgere în adâncime pentru a vizita vârfurile tuturor subarborilor cu rădăcina
ordonate ca fii ai lui. În cazul utilizării unei stive pentru păstrarea drumului curent pe arbore,
drum care începe din rădăcina arborelui şi se termină cu vârful vizitat în momentul dat.

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