REPREZENTAREA GRAFURILOR NEORIENTATE

 

Listele de adiacenta a nodurilor

 

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 nodului 3: 2, 4, 5 (noduri adiacente)

Nodul 6 nu are vecini (este izolat)

Pentru intreg graful vom avea mai multe liste :

 

Nodul 1 :

 

Nodul 2 :

 

Nodul 3 :

 

Nodul 4 :

 

Nodul 5 :

 

 

 

Ordinea nodurilor 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 noduri si muchiile 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 vecinilor nodului nr_nod

{nod *p=L[nr_nod];

if(p==0)

    cout<<nr_nod<<" este izolat "<<endl;

else

  {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;

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

   q->nd=i;

   q->next=L[j];

   L[j]=q;

   }

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 muchii, atunci se va folosi matricea de adiacenta; daca numarul de muchii 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 neorientat utilizand  liste de adiacente. Parcurgand listele de adiacenta rezolvati urmatoarele cerinte :

a.       Sa se determine daca graful contine noduri izolate

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

c.       Sa se determine nodul 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

g.       Sa se genereze matricea de adiacenta a grafului

2.      Sa se determine daca n liste citite de la tastatura pot reprezenta un graf. In caz afirmativ sa se afiseze muchiile.