al Republicii Moldova
RAPORT
despre lucrarea de laborator Nr. 2
la Matematica speciala
A efectuat:
st. gr. CR-191 Trifan Petru
A verificat:
Lector univ. Lisnic Inga
Chişinău – 2020
SCOPUL LUCRĂRII:
SARCINA DE BAZĂ
1. Elaboraţi procedura care va realiza algoritmul de parcurgere a grafului în lărgime și adîncime;
2. Folosind procedurile din lucrările precedente, elaboraţi programul care va permite:
ÎNTREBĂRI DE CONTROL
1. În ce constă parcurgerea arborelui şi a grafului în lărgime și adîncime?
2. Care este diferenţa dintre parcurgerea în lărgime a unui arbore şi a unui graf arbitrar?
3. Ce fel de structuri de date se vor utiliza în algoritmul de căutare în lărgime și adîncime?
4. Exemplificaţi algoritmul căutării în lărgime și adîncime.
1.
Parcurgerea în lăţime
Parcurgerea în lățime (Breadth-first Search - BFS) presupune vizitarea nodurilor în următoarea
ordine:
nodul sursă (considerat a fi pe nivelul 0)
vecinii nodului sursă (aceștia constituind nivelul 1)
vecinii încă nevizitați ai nodurilor de pe nivelul 1 (aceștia constituind nivelul
2)
vecinii încă nevizitați ai nodurilor de pe nivelul 2
s.a.m.d.
Caracteristica esențială a acestui tip de parcurgere este, deci, că se preferă explorarea în lățime,
a nodurilor de pe același nivel (aceeași depărtare față de sursă) în detrimentul celei în adâncime,
a nodurilor de pe nivelul următor.
Parcurgerea în adâncime
Parcurgerea în adâncime (Depth-First Search - DFS) presupune explorarea nodurilor în
următoarea ordine:
nodul sursă
primul vecin nevizitat al nodului sursă (îl vom numi V1)
primul vecin nevizitat al lui V1 (îl vom numi V2)
primul vecin nevizitat al lui V2
s.a.m.d.
în momentul în care am epuizat vecinii unui nod Vn, continuăm cu următorul
vecin nevizitat al nodului anterior, Vn-1
Așadar, spre deosebire de BFS, acest tip de parcurgere pune prioritate pe explorarea în
adâncime (la distanțe tot mai mari față de nodul sursă), în detrimentul celei în lățime (pe
același nivel).
Codul programului:
#include<stdio.h>
#include<conio.h>
int mA[20][20];
int vizitat[20];
int coada[20];
int i,n,m,j,pl,x,y,u;
printf("%d",pl);
vizitat[pl]=1;
for(j=1;j<=n;j++)
{
if((mA[pl][j]==1) && (vizitat[j]==0))
{
DFS(j);
}
}
int main()
{
for(i=1;i<=n;i++)
{
vizitat[i]=0;
}
printf("Da-ti nodul din care doriti sa incepti parcurgerea\r\n");
scanf("%d",&pl);
printf("Dati nr de noduri\r\n"); scanf("%d",&n);
printf("Da-ti nr de arce\r\n"); scanf("%d",&m);
printf("Da-ti arcele\r\n");
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
mA[x][y]=1; mA[y][x]=1;
}
printf("Pa-");
DFS(pl); printf("\r\n");
for(i=1;i<=n;i++)
{
vizitat[i]=0;
}
vizitat[pl]=1;
coada[1]=pl;
u=1;
BFS(1);
printf("Pl-");
for(i=1;i<=n;i++)
{
printf("%d",coada[i]);
}
return 0;
}
Concluzie:
La lucrarea de laborator cu tema:” Parcurgerea grafului in largime si
adincime.”,am studiat algoritmii de căutare în graf şi diferite forme de păstrare şi
prelucrare a datelor, am elaborat proceduri de căutare în adâncime si lărgime.