Sunteți pe pagina 1din 10

Parcurgerea grafurilor in adancime (depth first)

Badiu Alexandru Alin


Grupa 311 AB
Parcurgerea unui graf in adancime se face prin utilizarea
stivei (alocate implicit prin subprograme recursive).
Pentru fiecare nod se parcurge primul dintre vecinii lui
neparcursi inca
Dupa vizitarea nodului initial x
1
, se exploreaza primul
nod adiacent lui fie acesta x
2
, se trece apoi la primul nod
adiacent cu x
2
si care nu a fost parcurs inca , s.a.m.d.
Fiecare nod se parcurge cel mult odata (daca graful nu
este conex nu se vor putea parcurge toate nodurile)
De exemplul pentru garful din figura de mai jos, se va
proceda in felul urmator:
se porneste din nodul 1, (se poate incepe de la oricare alt
nod)


se exploreaza in vontinuare primul vecin al acestuia
acestuia : nodul 2,


dupa care din 2 se exploreaza un nod adiacent cu acesta
si care nu a fost vizitat : 3.( Nodul 1 nu se mai viziteaza
odata)

In continuare ar trebui sa se parcurga vecinul lui 3
nevizitat : 4
SE obtine : .
Pentru nodul 4 ar trebui sa se parcurga primul sau vecin
neparcurs (nodul 1 dar acesta a fost deja parcurs. Si nodul
3 a fost parcurs. Din 4 nu mai avem ce vizita si se trece
la nivelul anterior din stiva, la nodul 3 :
1, 2, 3, 4 Se parcurge vecinul sau nevizitat, nodul 5 .
Nodul 3 nu mai are vecini nevizitati si se trece pe nivelul
anterior din stiva, nodul 2 : 1, 2, 3, 4 , 5. Nici acesta nu
mai are vecini nevizitati si se trece pe nivelul anterior la
nodul 1 : 1, 2, 3, 4 , 5. Cum nici acesta nu mai are vecini
nevizitati se incheie algoritmul.
Nodul 6 ramane nevizitat.

Algoritmul
-Graful se va memora utilizand matricea de adiacenta
a[10][10]
-pentru a nu parcurge un nod de doua ori se va folosi un vector
boolean vizcare va retine :
- viz[k]=0 daca nodul k nu a fost vizitat
inca
- viz[k]=1 daca nodul k a fost vizitat
-ca si la parcurgerea in latime vecinii unui nod se cauta pe
linia acestui nod : daca a[nod][k]=1 inseamna ca nodurile nod
si k sunt adiacente. Pentru ca nodul k sa fie fie parcurs trebuie
ca nodul sa nu fi fost vizitat : viz[k]=0

#include<fstream.h>
#include<conio.h>
int a[20][20],n,m,viz[100],gasit;

void dfmr(int nod)
{
cout<<nod<<" ";
viz[nod]=1;
for(int k=1;k<=n;k++)
if(a[nod][k]==1&&viz[k]==0)
dfmr(k);
}

void main()
{int x,y,j;
fstream f;
clrscr();
f.open("graf.txt",ios::in);
if(f)
cout<<"ok!"<<endl;
else
cout<<"eroare la deschidere de fisier!";
f>>n>>m;
for(int i=1;i<=m;i++)
{f>>x>>y;
a[x][y]=a[y][x]=1;}
cout<<endl<<"matricea de
adiacente"<<endl;
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;}
cout<<endl<<"parcurgere in adancime
incepand de la varful 1"<<endl;
dfmr(1);

getch();}

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