REPREZENTAREA GRAFURILOR ORIENTATE

 

Listele de adiacenta

 

Reprezentarea in calculator a unui graf se poate face utilizand listele de adiacenta a varfurilor, adica pentru fiecare varf se alcatuieste lista varfurilor adiacente cu el.

 

Fie graful din figura urmatoare:

Lista vecinilor varfului 5:  3, 4 (noduri adiacente)

 

Pentru intreg graful vom avea mai multe liste :

 

Varful 1 :

 

Varful 2 :

 

Varful 3 :

 

Varful 4 :

 

Varful 5 :

 

 Varful 6

 

Ordinea varfurilor in cadrul unei liste nu este importanta

 

Pentru a genera o astfel de lista vom defini tipul nod :

struct nod {int nd;
                nod *next;};

Toate listele se vor memora utilizand un vector de liste :

nod *L[20];

Datele de intrare : numarul de varfuri si arcele se vor citi din fisier :

O solutie de implementare este urmatoarea :

#include<conio.h>

#include<fstream.h>

struct nod

 {int nd;

  nod *next;};

 

nod *L[20];

 

void afisare(int nr_nod) //afiseaza lista vecinilorvarfuluii nr_nod

{nod *p=L[nr_nod];

if(p!=0)

      {cout<<"lista vecinilor lui "<<nr_nod<<endl;

       nod *c=p;

       while(c)

            {cout<<c->nd<<" ";

             c=c->next;}

       cout<<endl;}

}

 

void main()

{fstream f;int i,j,n;

 nod  *p,*q;

 

f.open("graf.txt",ios::in); //citirea datelor din fisier

clrscr();

f>>n;

while(f>>i>>j)

  {p=new nod;  //se adauga j in lista vecinilor lui i 

   p->nd=j;

   p->next=L[i];

   L[i]=p;

      }

f.close();

 

cout<<endl<<"listele de adiacente ";

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

    afisare(i);

 getch();

}

 

Observatie : In exemplul anterior adaugarea unui nou element in lista se face inainte celorlalte din lista corespunzatoare.

Aceste doua moduri de reprezentare (prin matrice de adiacenta si prin liste de vecini) se folosesc dupa natura problemei. Adica, daca in problema se doreste un acces frecvent la arce, atunci se va folosi matricea de adiacenta; daca numarul de arce care se reprezinta este mult mai mic dect nxn, este de preferat sa se folosesca listele de adiacenta, pentru a se face economie de memorie.

Probleme propuse :

1.      Sa se memoreze un graf orientat utilizand  liste de adiacente. Parcurgand listele de adiacenta rezolvati urmatoarele cerinte :

a.       Sa se determine daca graful contine varfuri izolate

b.      Sa se determine gradul unui nod citit de la tastatura

c.       Sa se determine varful cu cel mai mare grad

d.      Sa se determine daca nodurile x si y sunt adiacente

e.       Sa se verifice daca graful este regulat

f.        Sa se determine daca graful este complet