Sunteți pe pagina 1din 19

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

Raport
pentru lucrarea de laborator nr. 1 la Matematica Discret

Tema: Pstrarea Grafului n Memoria


Calculatorului

Efectuat: Cervac Petru


Verificat: Dohotaru Leonid
Chiinu 2016

Sarcina de Lucru:
Se d un graf G = (X,F), unde X este mulimeade vrfuri : X = {x1,x2,x3,x4,x5,x7,x8},
F: X P(X).

Mersul Lucrrii:

1.

Se cere a doua form analitic G = (X,U), unde U este mulimea de


arce.

U= {(x1,x2), (x1,x3), (x1,x4), (x2,x5), (x3,x4), (x3,x6), (x4,x6), (x4,x7), (x5,x8), (x6,x5), (x6,x8),(x7,x6)};

2.

Se cere reprezentarea grafic (geometric).


X2

X1

X4

X3

X5

X6

X7

X8

3.

Matricea de inciden.

4.

Matricea de Adiacen.

5.

Lista de Adiacen.

6.

Grade exterioare, interioare i gradele vrfurilor.

X1:
X2:
X3:
X4:
X5:
X6:
X7:
X8:

7.

g (x1)=0;
g (x2)=1;
g (x3)=1;
g (x4)=2;
g (x5)=2;
g (x6)=3;
g (x7)=1;
g (x8)=2;

g(x1)=3;
g(x2)=1;
g(x3)=2;
g(x4)=2;
g(x5)=1;
g(x6)=2;
g(x7)=1;
g(x8)=0;

Clasificarea vrfurilor: iniiale, finale, intermediare, izolate.

8.

g+(x1)=2;
g+(x2)=1;
g+(x3)=2;
g+(x4)=2;
g+(x5)=1;
g+(x6)=2;
g+(x7)=2;
g+(x8)=0;

Iniiale: X1;
Finale: X8;
Intermediare: X2,X3,X4,X5,X6,X7;
Izolate: ----

Bucle.
n graful respectiv nu sunt prezent bucle.
4

9.

Vrfuri adiacente cu X5.


Vrfurile adiacente cu X5 sunt: X8.

10.

Vrfuri incidente cu X4.

Vrfurile incidente cu X4 sunt: X1.

11.
Subgrafurile G1 = (X1,U1) i G2 = (X2,U2), unde X1 = { x1, x2, x3, x4},
X2 = { x5, x6, x7, x8}.

G1:
X2

X1

X4

X3

G2:
X5

X6

X7

X8
5

Listingul Programului:
#include "stdio.h"
#include "stdlib.h"
#include <conio.h>
#include <windows.h>
typedef __int8 int8;
void afismatrad(int8 A[21][21],int virf){
int k=(virf+1)*3;
printf("%c",201);
for(int i=1;i<k;i++){
if(i%3==0) printf("%c",203);
else
printf("%c",205);
}
printf("%c\n",187);
printf("%c A%c",186,186);
for(int i=1;i<=virf;i++)
printf("%2d%c",i,186);
for(int i=1;i<=virf;i++){
printf("\n%c",204);
for(int j=1;j<k;j++){
if(j%3==0) printf("%c",206);
else
printf("%c",205);
}
printf("%c\n",185);
printf("%c%2d%c",186,i,186);
for(int j=1;j<=virf;j++)
printf("%2d%c",A[i][j],186);
}
printf("\n%c",200);
for(int j=1;j<k;j++){
if(j%3==0) printf("%c",202);
else
printf("%c",205);
6

}
printf("%c\n",188);
}
void intrmatrad(int8 A[21][21]){
puts("Ati ales sa introduceti o matrice de adiacenta");
Sleep(1000);
int n,k;
int i,j;
do{
system("cls");
puts("introduceti numarul de virfuri ale grafului:");
scanf("%d",&n);
}while((n<=0)||(n>20));
A[0][0]=n;
int8 r[]="Regula: A[i][j]=1 u(i,j)-arc\n
A[i][j]=0
u(i,j)-nu este arc\n";
for(i=1;i<=n;i++){
system("cls");
afismatrad(A,n);
printf("\aIntroduceti legaturile cu virful %d\n\n",i);
Sleep(1000);
for(j=1;j<=n;j++){
system("cls");
afismatrad(A,n);
puts(r);
printf("a[%d][%d]=",i,j);
scanf("%d",&k);
if((k<0)||(k>1)){
puts("\aeroare"); getch();
j--;
}
else A[i][j]=k;
}
}
system("cls");
afismatrad(A,n);
7

puts("Matricea de incidenta a fost introdusa cu


succes");Sleep(500);
}
void afismatrin(int B[420][21], int n, int u){
int k=n*3;
printf("%c%c%c%c%c%c",201,205,205,205,205,203);
for(int i=1;i<k;i++){
if(i%3==0) printf("%c",203);
else
printf("%c",205);
}
printf("%c\n",187);
printf("%c B%c",186,186);
for(int i=1;i<=n;i++)
printf("%2d%c",i,186);
printf("\n");
for(int i=1;i<=u;i++){
printf("%c%c%c%c%c
%c",204,205,205,205,205,206);
for(int i=1;i<k;i++){
if(i%3==0) printf("%c",206);
else
printf("%c",205);
}
printf("%c\n",185);
printf("%c%4d%c",186,i,186);
for(int j=1;j<=n;j++)
printf("%2d%c",B[i][j],186);
printf("\n");
}
printf("%c%c%c%c%c%c",200,205,205,205,205,202);
for(int i=1;i<k;i++){
if(i%3==0) printf("%c",202);
else
printf("%c",205);
}
printf("%c\n",188);
}
void intrmatrin(int B[420][21]){
puts("Ati ales sa introduceti o matrice de incidenta");
8

Sleep(1000);
int n;
puts("introduceti numarul de virfuri ale grafului:");
do{
system("cls");
puts("introduceti numarul de virfuri ale grafului:");
scanf("%d",&n);
}while((n<=0)||(n>20));
int u;
int max=0;
for(int i=1;i<n;i++)
max+=i;
max*=2;
char r[]="Regula: B[i][j]=-1: u(i) iese din virful
x(j)\nB[i][j]= 0, u(i) nu este incident cu x(j)\nB[i][j]= 1, u(i)
intra in virful x(j)\nB[i][j]= 2, u(i) bucla in virful x(j)\n";
do{
system("cls");
printf("Dati numarul de arce:");
scanf("%d",&u);
}while((u<=0)||(u>max));
B[0][0]=n;B[0][1]=u;
system("cls");
int8 a,b;
for(int i=1;i<=u;i++){
a=0;b=0;
for(int j=1;j<=n;j++){
afismatrin(B,n,u);
puts(r);
printf("B[%d][%d]=",i,j);
scanf("%d",&B[i][j]);
if(B[i][j]<-1){
puts("\aEroare!!! Ati incalcat regula");
getch();
B[i][j]=0;
j--;
goto et1;
9

}
if(B[i][j]==-1){
if(a==0) a=j;
else{
puts("\aEroare!!! -1 a fost deja introdus
pentru acest virf");
getch();
B[i][j]=0;
j--;
goto et1;
}
}
if(B[i][j]==1){
if(b==0) b=j;
else{
puts("\aEroare!!! 1 a fost deja introdus
pentru acest virf");
getch();
B[i][j]=0;
j--;
goto et1;
}
}
if(B[i][j]>1){
if((a==0)&&(b==0)){
for(int i1=1; i1<i;i1++)
if(B[i1][j]>1){
printf("\aEroare!!! acesta bucla
se repeta pe pozitia %d\n se va repeta introducerea
acestui arc",i1);
B[i][j]=0;
i--;
goto et3;
}
printf("\aAti introdus o bucla, se trece
la virful urmator");
et3:
10

getch();
system("cls");
goto et2;

}
else{
puts("\aEroare!!! nu aveti dreptul.");
getch();
B[i][j]=0;
j--;
}
}
et1:
if((a!=0)&&(b!=0)){
for(int i1=1;i1<i;i1++){
if((B[i1][a]==-1)&&(B[i1][b]==1)){
printf("\aEroare!!! acest arc se
repeta pe pozitia %d\n se va repeta introducerea acestui
arc",i1);
B[i][a]=0;B[i][b]=0;
i--;
goto et4;
}
}
puts("\aarcul a fost introdus. Se trece la
arcul urmator");
et4:
getch();
system("cls");
goto et2;
}
if(j==n){
puts("\aEroare!!! Arcul va fi introdus inca o
data");
getch();
B[i][a]=0;B[i][b]=0;
i--;
}
11

system("cls");

}
et2:;

}
puts("Matricea de incidenta a fost introdusa cu
succes");Sleep(500);
}
void afislistad(int8 A[21][21],int8 n){
int k,u;
if((n<3))k=6;
else{
if((n<10))k=n*2+1;
else k=18+(n-9)*3+1;
}
printf("%c%c%c%c%c%c",201,205,205,205,205,203);
for(int i=0;i<k;i++)
printf("%c",205);
printf("%c\n",187);
printf("%cx(j)%c",186,186);
printf("F(x,j)");
for(int i=1;i<=k-6;i++)
printf(" ");
printf("%c\n",186);
for(int i=1;i<=n;i++){
printf("%c%c%c%c%c
%c",204,205,205,205,205,206);
for(int i=0;i<k;i++)
printf("%c",205);
printf("%c\n",185);
printf("%c%4d%c",186,i,186);
u=2;
for(int j=1;j<=n;j++){
if(A[i][j]!=0){
if((j<10))u+=2;
else u+=3;
printf("%d,",j);
}
12

}
printf("0");
for(int q=u;q<=k;q++)
printf(" ");
printf("%c\n",186);

}
printf("%c%c%c%c%c%c",200,205,205,205,205,202);
for(int i=0;i<k;i++)
printf("%c",205);
printf("%c\n",188);
}
void intrlistad(int8 A[21][21]){
puts("Ati ales sa introduceti o lista de adiacenta");
Sleep(1000);
int n,k,v;
do{
system("cls");
puts("Dati numarul de virfuri ale grafului");
scanf("%d",&n);
}while((n<=0)||(n>20));
A[0][0]=n;
for(int i=1; i<=n;i++){
k=0;
do{
system("cls");
afislistad(A,n);
printf("Introduceti legaturile cu virful %d:\n",i);
puts("in caz contrar tastati 0");
scanf("%d",&v);
if((v<0)||(v>n)){
puts("\agraful nu contine acest virf");
getch();
continue;
}
if(v!=0){
A[i][v]=1;
k++;
13

}
if(k==n) break;
}while(v!=0);
printf("\a");
}
puts("lista de adiacenta a fost introdusa cu
succes");Sleep(500);
}
void transfAB(int8 A[21][21], int B[420][21]){
for(int i=0;i<420;i++)
for(int j=0;j<21;j++)
B[i][j]=0;
B[0][0]=A[0][0];
int u=0;
for(int i=1;i<=A[0][0];i++)
for(int j=1;j<=A[0][0];j++)
if(A[i][j]==1){
u++;
if(i==j) B[u][i]=2;
else{
B[u][i]=-1;
B[u][j]=1;
}
}
B[0][1]=u;
}
void transfBA(int8 A[21][21], int B[420][21]){
int i1,j1;
int j,i;
for(int i=0;i<21;i++)
for(int j=0;j<21;j++)
A[i][j]=0;
for ( i=1;i<=B[0][1];i++){
i1=0;j1=0;
for(j=1;j<=B[0][0];j++){
switch(B[i][j]){
case 0: break;
14

case -1:i1=j; break;


case 1:j1=j; break;
default:A[j][j]=1;

}
printf("\n");
A[i1][j1]=1;

}
A[0][0]=B[0][0];

}
void introducerea(int8 A[21][21], int B[420][21]){
FILE *f2;
char *alg=(char*)malloc(2);
char *s=(char*)malloc(88);
int i;
for(int i=0;i<21;i++)
for(int j=0;j<21;j++)
A[i][j]=0;
for(int i=1;i<400;i++)
for(int j=1;j<51;j++)
B[i][j]=0;
f2=fopen("txt/introducerea.txt","r");
do{
system("cls"); rewind(f2);
printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c
%c%c%c%c%c%c%c
%c\n",205,205,205,205,205,205,205,205,205,205,205,205,
205,205,205,205,205,205,205,205,205,205,205);
while(fgets(s,80,f2)!=NULL)
printf(s);
printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c
%c%c%c%c%c%c%c
%c\n",205,205,205,205,205,205,205,205,205,205,205,205,
205,205,205,205,205,205,205,205,205,205,205);
printf("?:");
*alg=getch();
system("cls");
15

i=*(alg);
switch(i){
case 49:intrmatrad(A);goto et2;
case 50:intrmatrin(B);goto et2;
case 51:intrlistad(A);goto et2;
case 27:goto et2;
}
}while(1);
et2:
fclose(f2);
}
void afisarea(int8 A[21][21], int B[420][21]){
if((A[0][0]==0)&&(B[0][0]==0)){
puts("\aEroare!!! nu este nici un graf spre
afisare");
getch();
return;
}
char *alg=(char*)malloc(2);
char *s=(char*)malloc(88);
int i;
FILE *f2=fopen("txt/afisarea.txt","r");
printf("A[0][0]=%d",A[0][0]);
printf("B[0][0]=%d",B[0][0]);
printf("B[0][1]=%d",B[0][1]);
do{
system("cls"); rewind(f2);
printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c
%c%c%c%c%c%c%c
%c\n",205,205,205,205,205,205,205,205,205,205,205,205,
205,205,205,205,205,205,205,205,205,205,205);
while(fgets(s,80,f2)!=NULL)
printf(s);
printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c
%c%c%c%c%c%c%c
%c\n",205,205,205,205,205,205,205,205,205,205,205,205,
205,205,205,205,205,205,205,205,205,205,205);
16

printf("?:");
*alg=getch();
system("cls");
i=*(alg);
switch(i){
case 49:
if(A[0][0]!=0) afismatrad(A,A[0][0]);
else{
transfBA(A,B);
afismatrad(A,A[0][0]);
}
getch();goto et2;
case 50:
if(B[0][0]!=0) afismatrin(B,B[0][0],B[0][1]);
else{
transfAB(A,B);
afismatrin(B,B[0][0],B[0][1]);
}
getch();goto et2;
case 51:
if(A[0][0]!=0) afislistad(A,A[0][0]);
else{
transfBA(A,B);
afislistad(A,A[0][0]);
}
getch();goto et2;
case 27:goto et2;
}
}while(1);
et2:
fclose(f2);

}
int main(){
int8 A[21][21];A[0][0]=0;
int B[420][21];B[0][0]=0;
char *alg=(char*)malloc(2);
char *s=(char*)malloc(88);
17

int8 i;
FILE *f1=fopen("txt/meniu.txt","r");
printf("\n\n\n\n\n\n\n\n\t\t\t\t\t\t\t^^^^^^^^^\n");
printf("\t\t\t\t\t\t\t^^SALUT^^\n\t\t\t\t\t\t\t^^^^^^^^^\n\t
\t\t\t\t
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\
t\t\t\t\t ^^Tastati un buton pentru a continua^^\n");
printf("\t\t\t\t\t
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\
n\n\n\n\n\n\n\n\n\n\n\n\n\n");
system("pause");
do{
system("cls");
printf("\n\n\t\t\t\t\tAlegeti metoda de introducere a
grafului:\n\n\n");
rewind(f1);
printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c
%c%c%c%c%c%c%c
%c\n",205,205,205,205,205,205,205,205,205,205,205,205,
205,205,205,205,205,205,205,205,205,205,205);
while(fgets(s,80,f1)!=NULL)
printf(s);
printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c
%c%c%c%c%c%c%c
%c\n",205,205,205,205,205,205,205,205,205,205,205,205,
205,205,205,205,205,205,205,205,205,205,205);
printf("?:");
*alg=getch();
system("cls");
i=*(alg);
switch(i){
case 49: introducerea(A,B);goto et2;
case 50: afisarea(A,B);goto et2;
case 27: goto et1;
default: goto et2;
}
18

et2:;
}while(1);
et1:
fclose(f1);
return 0;

Concluzie:
n aceast lucrare de laborator am fcut cunotin cu diferite modaliti de reprezentare
a grafului n memoria calculatorului:Matricea de adiacen, Matricea de inciden,Lista
de adiacen. Am elaborat un program care permite utilizatorului s introduc un graf
aleator n una din cele 3 forme i s-l afieze n una din cele 3 forme. Efectund analiz
asupra programului am ajuns la concluzia c cea mai eficient form de pstrare a
grafului n memoria calculatorului este lista de adiacen. Matricea de inciden necesit
31.25 Kbaii. Matricea de adiacen i lista de adiacn utilizeaz cte aproximativ 1
Kbait fiecare. Matricea de inciden este mai uor accesibil utilizatorului care nu
cunoate formele de reprezentare a grafului n memoria calculatorului. Ciclul de
verificri al corectitudinii introducerii listei de adiacen este mai mic fa de cel
echivalent pentru matricea de inciden, astefel programul are un timp de execuie mai
redus fa de alte forme.

19

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