Sunteți pe pagina 1din 2

Reprezentarea grafurilor prin liste de adiacenta

A. Grafuri neorientate

Pentru fiecare nod i{1,2,……,n} formăm lista vecinilor lui i. Aceasta cuprinde
toate nodurile care sunt extremităţi ale muchiilor ce trec prin nodul i. Pentru graful
G=(X,U) din figura următoare, lista vecinilor este:

nodul lista vecinilor


1 2,3,4
2 1,3
3 1,2
4 1

Observăm că fiecare linie i din listele vecinilor conţine indicii coloanelor pe care se
găsesc valori de 1 în linia i a matricei de adiacenţă. Acestă metodă de reprezentare se
implementează elegant utilizând alocarea dinamică a memoriei prin intermediul listelor
înlănţuite.
Vom utiliza un tablou de n pointeri, fiecare element din acest tablou memorând
adresa de început a listei vecinilor unui nod. Funcţia următoare ilustrează modul de
construire a listelor de adiacenţă alocate dinamic. Dintr-un fişier text se citesc numărul n
de noduri şi apoi perechi de vârfuri reprezentând muchiile grafului. Deoarece graful este
neorientat, în cazul unei muchii (x,y), nodul x se va adăuga în lista vecinilor lui y, iar
nodul y se va adăuga în lista vecinilor lui x. S-au precizat şi declaraţiile globale ale
tipurilor de date necesare pentru implementarea listelor de adiacenţă alocate dinamic.
#include<iostream.h>
#include<fstream.h>
typedef struct nod{
int inf;
nod *urm;
}AD;
AD *L[N]; //listele vecinilor
void citire()
{
int i,j; AD *x;
ifstream f(„in.txt”);
f>>n; //numarul de varfuri
for(i=1;i<=n;i++) //aloca adrese pentru listele vecinilor
{
L[i]=new AD; L[i]->urm=0;
}
while(!feof(f))
{ f>>i>>j;
//adaug j in lista vecinilor lui i
x=new AD; x->inf=j; x->urm=L[i]->urm; L[i]->urm=x;
//adaug i in lista vecinilor lui j
x=new AD; x->inf=i; x->urm=L[j]->urm; L[j]->urm=x;
}
fclose(f);}
B. Grafuri orientate

Pentru fiecare nod xG se construiesc două


liste ale vecinilor săi:
- L+(x)  lista vecinilor succesori;
conţine nodurile ce sunt extremităţi
finale ale arcelor ce ies din nodul x
- L-(x)  lista vecinilor predecesori;
conţine nodurile ce sunt extremităţi
iniţiale ale arcelor ce intră în nodul x

Pentru graful considerat, cele două liste au


următoarea structură:

Nodul x L+(x) L-(x)


1  2
2 1,3,4 4
3 4 2
4 2 2.3

Se observă că L+(x) este ansamblul mulţimilor  +(x) pentru x={1,2,…,n}, iar L-(x) este
ansamblul mulţimilor  -(x) pentru x={1,2,…,n}.
#include<iostream.h>
#include<fstream.h>
typedef struct nod{
int inf;
nod *urm;
}AD; //descrierea unui element din lista
AD *L[N]; //listele vecinilor
void citire()
{
int i,j; AD *x;
ifstream f(„in.txt”);
f>>n; //numarul de varfuri
for(i=1;i<=n;i++) //aloca adrese pentru listele vecinilor
{
L[i]=new AD; L[i]->urm=0;
}

while(!feof(f))
{
f>>i>>j;
//adaug j in lista vecinilor lui i
x=new AD; x->inf=j; x->urm=L[i]->urm; L[i]->urm=x;
}
fclose(f);
}

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