Sunteți pe pagina 1din 2

Reprezentarea grafurilor prin liste de adiacenta

A. Grafuri neorientate
Pentru fiecare nod i{1,2,,n} formm lista vecinilor lui i. Aceasta cuprinde
toate nodurile care sunt extremiti ale muchiilor ce trec prin nodul i. Pentru graful
G=(X,U) din figura urmtoare, lista vecinilor este:
nodul

lista vecinilor

1
2
3
4

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

Observm c fiecare linie i din listele vecinilor conine indicii coloanelor pe care se
gsesc valori de 1 n linia i a matricei de adiacen. Acest metod de reprezentare se
implementeaz elegant utiliznd alocarea dinamic a memoriei prin intermediul listelor
nlnuite.
Vom utiliza un tablou de n pointeri, fiecare element din acest tablou memornd
adresa de nceput a listei vecinilor unui nod. Funcia urmtoare ilustreaz modul de
construire a listelor de adiacen alocate dinamic. Dintr-un fiier text se citesc numrul n
de noduri i apoi perechi de vrfuri reprezentnd muchiile grafului. Deoarece graful este
neorientat, n cazul unei muchii (x,y), nodul x se va aduga n lista vecinilor lui y, iar
nodul y se va aduga n lista vecinilor lui x. S-au precizat i declaraiile 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 xG se construiesc dou


liste ale vecinilor si:
- L+(x) lista vecinilor succesori;
conine nodurile ce sunt extremiti
finale ale arcelor ce ies din nodul x
- L-(x) lista vecinilor predecesori;
conine nodurile ce sunt extremiti
iniiale ale arcelor ce intr n nodul x
Pentru graful considerat, cele dou liste au
urmtoarea structur:
Nodul x
1
2
3
4

L+(x)

1,3,4
4
2

L-(x)
2
4
2
2.3

Se observ c L+(x) este ansamblul mulimilor +(x) pentru x={1,2,,n}, iar L-(x) este
ansamblul mulimilor -(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