Sunteți pe pagina 1din 4

PARCURGEREA IN LATIME(BF BREADTH FIRST)

Algoritmul de parcurgere a grafului in latime folosind o coada este:

-initial toate nodurile se considera nevizitate;

-se citeste nodul de plecare, care se considera vizitat si se trece in coada pe prima pozitie;

-se trec in coada toate nodurile nevizitate pana in prezent si sunt adiacente cu nodul de plecare(odata
cu trecerea lor in coada se marcheaza ca fiind vizitate);

-se trece la urmatorul element din coada, care ia rolul nodului de plecare si se reia pasul anterior;

….

-algoritmul se termina dupa ce sunt parcurse toate elementele din coada

#include<iostream.h>

int a[20][20],coada[20], viz[20];

int i, n, j, u,p,pl;

void main() {

cout<<”n=”; cin >>n; //nr noduri

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)cin>> a[i][j]

for (i=1; i<=n; i++) viz[i]=0;

cout<<”dati nodul de plecare:”; cin>>pl;

viz[pl]=1; coada[1]=pl; p=1;u=1;

while(p<=u){ for(j=1;j<=n;j++)

if((a[coada[p]][j]==1)&&(viz[j]==0)) {

u++;coada[u]=j;

viz[j]=1;}

p++;}

for(i=1; i<=u;i++)

cout<<coada[i]<<” “;}
PARCURGEREA IN LATIME –RECURSIV

Comentarii la functia parc_latime:

-are un parametru formal, i, care reprezinta pozitia curenta la care s-a ajuns in coada;

-procedeaza astfel:

-se parcurg nodurile grafului, cu j: Daca j este adiacent cu nodul curent din coada si j este
nevizitat se adauga la coada si se marcheaza ca fiind vizitat;

-daca mai sunt elemente in coada se trece la urmatorul si se reapeleaza functia

#include<iostream.h>

int a[20][20],coada[20], viz[20];

int i, n, j, u, pl, m, x, y;

void parc_latime(int i)

{for(j=1;j<=n;j++)

if((a[coada[i]][j]==1)&&(viz[j]==0)) {

u++; coada[u]=j; viz[j]=1;}

if(i<=u) parc_latime(i+1);}

void main() {

cout<<”n=”; cin >>n; //nr noduri

cout<<”m=”; cin>>m; // nr muchii

for(i=1;i<=m;i++){cout<<”x y “; cin>>x>>y;

a[x][y]=1; a[y][x]=1;}

for (i=1; i<=n; i++) viz[i]=0;

cout<<”dati nodul de plecare:”; cin>>pl;

viz[pl]=1; coada[1]=pl; u=1;

parc_latime(1);

for(i=1; i<=u;i++)

cout<<coada[i]<<” “;}
PARCURGEREA IN adancime (DF DEPTH FIRST)–RECURSIV

Comentarii la functia parc_adancime:

-are un parametru formal (nodul curent, asupra caruia se aplica);

-procedeaza astfel:

=afiseaza nodul asupra caruia se aplica si-l marcheaza ca fiind vizitat;

=pentru fiecare vecin nevizitat de-al nodului curent - se autoapeleaza

#include<conio.h>

#include<iostream.h>

int a[20][20], viz[20], i, n, j, pl, m, x, y;

void parc_adancime(int pl)

{cout<<pl<<” “;

viz[pl]=1;

for(int j=1;j<=n;j++)

if((a[pl][j]==1)&&(viz[j]==0))

parc_adancime(j);}

void main() {

cout<<”n=”; cin >>n; //nr noduri

cout<<”m=”; cin>>m; // nr muchii

for(i=1;i<=m;i++){cout<<”x y “; cin>>x>>y;

a[x][y]=1; a[y][x]=1;}

for (i=1; i<=n; i++) viz[i]=0;

cout<<”dati nodul de plecare:”; cin>>pl;

parc_adancime(pl);
\\verificati daca graful e conex

int ok=0;

for (i=1; i<=n; i++) if(viz[i]==0)ok=1;

if(ok)cout<<”nu e conex”;

else cout<<”e conex”;

\\numarati componentele conexe

int nr=0;

for (i=1; i<=n; i++) if(viz[i]==0){nr++;parc_adancime(i);}

cout<<”nr comp conexe”<<nr;

Afiseaza continutul componentelor si numarul lor:

#include<iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int a[20][20],n, viz[20];
void parc_adancime(int pl)
{cout<<pl<<" ";viz[pl]=1;
for(int j=1;j<=n;j++)
if((a[pl][j]==1)&&(viz[j]==0))
parc_adancime(j);
}
int main() {int i,j,nr=0;
f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>a[i][j];
for (i=1; i<=n; i++) if(viz[i]==0){nr++; cout<<"componenta "<<nr<<": ";
parc_adancime(i);
cout<<endl;}
cout<<endl<<"nr comp conexe = "<<nr;
return 0;}

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