Documente Academic
Documente Profesional
Documente Cultură
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
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
f>>i>>j;
}
fclose(f);