Parcurgerea grafurilor in adancime (depth first)

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 x1, se exploreaza primul nod adiacent lui fie acesta x2 , se trece apoi la primul nod adiacent cu x2 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,

se obtine 1,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)

se obtine 1,2,3

In continuare ar trebui sa se parcurga vecinul lui 3 nevizitat : 4

se obtine 1, 2, 3, 4

 

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 .

SE obtine : 1, 2, 3, 4 , 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();} 

 

Aplicatii :

1.Sa se parcurga graful in adancime pornind pe rand de la toate varfurile

2. Sa se determine daca pornind de la nodul x se poate ajunge la nodul y

3. Sa se determine daca se poate parcurge pornind de la un nod tot graful