Documente Academic
Documente Profesional
Documente Cultură
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:
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
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);
}