Sunteți pe pagina 1din 7

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei

Facultatea Calculatoare Informatica si Microelectronica

Departamentul ISA

RAPORT
Lucrarea de laborator nr.1
La Matematici Speciale

Tema: Pastrarea grafului in memoria calculatorului

A efectuat:
st. gr. AI-171 Crusnevschi Stanislav

A verificat:
dr., conf.univ. Tiholaz Tatiana

Chişinău 2018
1. SCOPUL LUCRĂRII:
 Studierea metodelor de definire a unui graf: matrice de incidenţă, matrice de adiacenţă,
liste;
 Elaborarea unor proceduri de introducere, extragere şi transformare a diferitor forme de
reprezentare internă a grafurilor cu scoaterea rezultatelor la display şi imprimantă.

2. TEORIE
Metode de reprezentare a grafului
Există trei metode de bază de definire a unui graf:
1. Matricea de incidenţă;
2. Matricea de adiacenţă;
3. Lista de adiacenţă (incidenţă).
Vom face cunoştinţă cu fiecare dintre aceste metode.
Matricea de incidenţă
Este o matrice de tipul mxn, în care m este numărul de muchii sau arce (pentru un graf
orientat), iar n este numărul vârfurilor. La intersecţia liniei i cu coloana j se vor considera
valori de 0 sau 1 în conformitate cu următoarea regulă:
 1 - dacă muchia i este incidentă cu vârful j (dacă arcul i "intră" în vârful j în cazul
unui graf orientat);
 0 - dacă muchia (arcul) i şi vârful j nu sunt incidente;
 -1 - numai pentru grafuri orientate, dacă arcul i "iese" din vârful j.
Este uşor de observat că această metodă este de o eficacitate mică în sensul utilizării
memoriei calculatorului: fiecare linie conţine doar două elemente diferite de zero (o muchie
poate fi incidentă cu nu mai mult de două vârfuri).
Matricea de adiacenţă
Este o matrice pătrată nxn, aici n este numărul de vârfuri. Fiecare element poate fi 0, dacă
vârfurile respective nu sunt adiacente, sau 1, în caz contrar. Pentru un graf fără bucle putem
observa următoarele:
 diagonala principală este formată numai din zerouri;
 pentru grafuri neorientate matricea este simetrică faţă de diagonala principală.
Lista de adiacenţă şi lista de incidenţă
Lista de adiacenţă este o listă cu n linii (după numărul de vârfuri n), în linia cu numărul i vor
fi scrise numerele vârfurilor adiacente cu vârful i.
Lista de incidenţă se defineşte analogic cu deosebirea că în linia i vor fi scrise numerele
muchiilor (arcelor) incidente cu vârful i.
Se dă graful:

3 4
3

2 5

Matricea de adiacență
X1 X X3 X4 X5 1 3_0
2 2 1_4_0
X 0 0 1 0 0 3 2_4_0
1 Matricea de incidență
4 0
X 1 X10 0 X2 1 X3
0 X4 X5 5 2_4_0
d+ d-
2U 1 -1 0 1 0 0 X1 1 1
XU2 0 11 0 -11 0 0 0 0 X2 2 2
3U 3 0 -1 0 1 0 X3 Lista de adiacență 1 2
XU4 0 00 0 10 0 -1 0 0 X4 3 0
4U 5 0 0 -1 1 0 X5 0 2
XU6 0 10 0 11 0 0 0 -1
5U 7 0 0 0 1 -1

G={X,E}
E={(1,3),(2,1),(2,4),(3,2),(3,4),(5,2),(5,4)}
X={1,2,3,4,5}

Codul programului:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct list
{ unsigned inf;
struct list *next;
}G;

int M_i[100][100],m,n,i,j,k,c;
char M_a[100][100],c1;
G *L_a[100],*v,*p;
void main()
{
void Afis_L(void);
void Afis_M(char x);

printf("Alegem metoda de defenire a grafului\r\n");


printf(" 1. Matricea de incidenta;\r\n");
printf(" 2. Matricea de adiacenta;\r\n");
printf(" 3. Lista de adiacenta;\r\n");
if (scanf("%i",&c)!=1) exit(-1);
switch (c)
{case 1:
printf("Dati numarul de muchii:");scanf("%i",&m);
printf("Dati numarul de virfuri:");scanf("%i",&n);
puts("Dati elementele matricei de incidenta:\r\n");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%i",&M_i[i][j]);
break;
case 2:printf("Dati dimensiunea matricei de adiacenta:");scanf("%i",&n);
puts("Dati elementele matricei de adiacenta:\r\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%i",&M_a[i][j]);
break;
case 3:printf("Dati numarul de virfuri al listei de adiacenta:");
scanf("%i",&n);
puts("Dati elementele listei de adiacenta:\r\n");
for(i=0;i<n;i++)
{ v=NULL;
printf("%i- ",i+1);
scanf("%i",&k);
while(k)
{p=(G*)malloc(sizeof(G));
p->inf=k;p->next=v;
v=p;
scanf("%i",&k);
}
L_a[i]=v;
} break;
}
puts("Indicati directia de transformare:\r\n");
puts(" 1. Matricea de adiacenta >>>>>>>>> Lista de adiacenta\r\n");
puts(" 2. Lista de adiacenta >>>>>>>>> Matricea de adiacenta\r\n");
puts(" 3. Matricea de incidenta >>>>>>>>> Lista de adiacenta\r\n");
puts(" 4. Lista de adiacenta >>>>>>>>> Matricea de incidenta\r\n");
c=getch();
switch (c)
{case 4:for(i=0;i<n;i++)
{ v=NULL;
for(j=0;j<n;j++)
if(M_a[i][j]){ p=(G*)malloc(sizeof(G));
p->inf=j+1;p->next=v;v=p;
}
L_a[i]=v;
}Afis_L();break;
case 5:for(i=0;i<n;i++)
for(j=0;j<n;j++)
M_a[i][j]=0;
for(i=0;i<n;i++) }
{ v=L_a[i];
while(v!=NULL)
{++M_a[i][v->inf-1];
v=v->next;
}
}Afis_M('a');break;
case 6:for(j=0;j<n;j++)
{v=NULL;
for(i=0;i<m;i++)
if(M_i[i][j]==-1)
{for(k=0;k<n;k++)
if(M_i[i][k]==1){p=(G*)malloc(sizeof(G));
p->inf=k+1;p->next=v;v=p;}
}
L_a[j]=v;
}Afis_L();break;
case 7:for(i=0;i<n;i++)
for(j=0;j<n;j++)
M_i[i][j]=0;
for(k=i=0;i<n;i++)
{ v=L_a[i];
while(v!=NULL)
{M_i[k][i]=-1;
M_i[k][v->inf-1]=1;
v=v->next;++k;
}
}m=k;Afis_M('i');break;

}
getch();
}
void Afis_L(void)
{ for(i=0;i<n;i++)
{ v=L_a[i];
printf("%i-",i+1);
while(v!=NULL)
{printf("%i ",v->inf);
v=v->next;
}printf("0\r\n");
}
}
void Afis_M(char x)
{ if (x=='a') {for(i=0;i<n;i++,puts("\n"))
for(j=0;j<n;j++)
printf("%i ",M_a[i][j]);
}
if (x=='i') {for(i=0;i<m;i++,puts("\n"))
for(j=0;j<n;j++)
printf("%2i ",M_i[i][j]);
}

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