Sunteți pe pagina 1din 18

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei

Raport
Lucrarea de laborator Nr.1
la Matematica Discreta

Pastrarea grafurilor in memoria calculatorului

A efectuat: st. gr. RM-201 Cojocaru


Alexandra
A verificat: conf. univ.
Gorban Maria
Chişinău, 2021
Lucrare de laborator Nr.1
Un graf G este o pereche (X, T) unde X este o mulţime de elemente numite vârfuri sau
noduri, iar T este o aplicaţie a lui X pe mulţimea părţilor sale. Vom nota graful G = (X,
T). Deci dacă x ∈ X, atunci T(x) ⊂ X. Dacă x, y ∈ X şi y ∈ T(x), perechea u = (x, y) se
numeşte arc al grafului G, cu x extremitatea iniţială (originea) arcului u, iar y este
extremitatea finală a lui u.
Notând prin U = {(x, y) | x ∈ X, y ∈ T(x)} putem da o altă expresie a grafului şi anume
G = (X, U).

Moduri de definire a unui graf


Matricea de adiacenta:
Anxn; n=|X|

Matricea de incidenta:
G=(X,U)
|X|=n
|U|=m
Bnxm

Lista de adiacenta:
G=(X,F)
Xi Fxi
x1 xi,xj, xk,0
x2 ..........
.
.
.
xn ..........
Listing-ul programului
//afisare

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

void granita(int n)

{int i;

printf("М");

for (i=0;i<n;i++) {printf("НННО");}

printf("ННН№\n");

void antet_mat_adiac(int n, char a)

{int i,j;

printf("Й");

for (i=0;i<n;i++) {printf("НННЛ");}

printf("ННН»\n");

printf("є %c є",a);

for (i=0;i<n;i++) {printf("x%2dє",i+1);}

printf("\n");

void afis_mat_adiac(int **mat, int n)

{int i,j;

antet_mat_adiac(n,'A');

for (i=0;i<n; i++){

granita(n);

printf("єx%2dє",i+1);

for (j=0;j<n;j++){printf(" %d є",mat[i][j]);}

printf("\n");

printf("И");
for (i=0;i<n;i++) {printf("НННК");}

printf("НННј\n");

//-------------matricea de adiacenta------------------------------

void afis_mat_inc(int **mat, int n, int m)

{int i, j;

antet_mat_adiac(n,'B');

for (i=0;i<m; i++){

granita(n);

printf("єU%2dє",i+1);

for (j=0;j<n;j++){printf(" %2dє",mat[i][j]);}

printf("\n");

printf("И");

for (i=0;i<n;i++) {printf("НННК");}

printf("НННј\n");

//---------------Matricea de incidenta-------------

void antet_list_adiac(int n)

{int i, pin=0, dupa=0;

printf("ЙНННЛ");

for (i=0;i<n;i++) {printf("ННН");}

printf("ННН»\n");

printf("є Xiє");

pin=((3*(n+1))-3)/2;

dupa=((n+1)*3)-3-pin;

for (i=0;i<pin;i++) printf(" ");

printf("Fxi");

for (i=0;i<dupa; i++) printf(" ");


printf("є\n");

void granita_list(int n)

{int i;

printf("МНННО");

for (i=0;i<n+1;i++) {printf("ННН");}

printf("№\n");

void afis_list_adiac(int **list, int n)

{int i,j,test=0;

antet_list_adiac(n);

for (i=0;i<n;i++){

granita_list(n);

printf("єx%2dє",i+1); test=0;

for (j=0;j<n+1;j++) {

if (list[i][j]!=0) printf("%2d,",list[i][j]);

if ((list[i][j]==0)&&(test==0)) {test++; printf(" 0 ");} else

{if ((list[i][j]==0)&&(test!=0)) {printf(" ");}

printf("є\n");

printf("ИНННК");

for (i=0;i<n+1;i++) {printf("ННН");}

printf("ј\n");

//--------------lista de adiacenta----------
//functions

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

int ** elib (int**a, int n)

{int i;

for (i=0;i<n;i++) {free(a[i]);}

free(a); return(NULL);

int ferifymem(int **a, char str[],int n)

{int i;

if (a) {printf("%s a fost definita deja...\n",str);

puts("Doriti redefinirea ei?(1-da/0-nu)");

scanf("%d",&i);

if (i==1) {a=elib(a,n);return 1;}

if (i==0) return 0;

return 1;

void zerografiere(int **a, int n, int m)

{int i,j;

for (i=0;i<n; i++)

{ for(j=0;j<m;j++)

a[i][j]=0;

}
}

int** aloc(int n, int m)

{int **a;

int i;

a=(int**) malloc (n*sizeof(*a));

if (a==NULL) {return a;}

for (i=0;i<n;i++) {

a[i]=(int*) malloc (m*sizeof(int));

if (a[i]==NULL) {return NULL;} }

return a; }

int input_mat_adiac(int **a,int n)

{int m=0;

int i, j,temp;

for (i=0; i<n;i++) {

for (j=0;j<n;j++) {

printf("x%d->x%d:",i+1,j+1);

scanf("%d",&temp);

while ((temp!=1)&&(temp!=0)) {puts("Introduceti o valoare corecta (0/1)");

scanf("%d",&temp); }

if (temp==1) m++;

a[i][j]=temp; } }

return m;

int contr_linie_inc(int **a, int m, int n)

{int result;

int i,test=0, doi=0, minus=0;

for (i=0;i<n; i++){

if (a[m][i]!=0) test=test+abs(a[m][i]);
if (a[m][i]==2) doi++;

if (a[m][i]==-1) minus++; }

if (test==0) return 0;

if (test==2) {

if (doi==1) return 1;

if ((doi==0)&&(minus==1)) return 1;

if (minus>1) return 5;

if ((doi==0)&&(minus==0)) return 7;

} else

if (test<2) {

if (minus==0) return 2;

if(minus==1) return 3;}

else

if (test>2){

if(doi>1) return 4;

if(minus>1) return 5;

if ((doi==1)&&(minus>0)) return 6;

if ((doi==1)&&(minus==0)) return 8;}

return 0;}

void linie_mat_inc(int **a, int m, int n)

{int i,temp,test;

do {

for (i=0; i<n;i++) {

printf("x%d: \n",i+1);

scanf("%d", &temp);

while ((temp!=0)&&(temp!=1)&&(temp!=-1)&&(temp!=2))

{ puts("Introduceti o valoare corecta (-1/0/1/2)");

scanf("%d",&temp);

a[m][i]=temp;}
test=contr_linie_inc(a,m,n);

if (test==0) puts("Nu a fost introdus arcul, incercati din nou...");

if (test==2) puts("Arcul nu este adiacent exterior cu nici un virf, incercati din nou...");

if (test==3) puts("Arcul nu este adiacent interior cu nici un virf, incercati din nou...");

if(test==4) puts("Sunt prea multe bucle, incercati din nou");

if(test==5) puts("Arcul are prea multe virfuri adiacente exterioare, incercati din nou...");

if(test==7) puts("Arcul are prea multe virfuri adiacente interioare, incercati din nou...");

if(test==6) puts("Exista o bucla, sunt prea multe virfuri adiacente exterioare, incercati din
nou...");

if(test==8) puts("Exista o bucla, sunt prea multe virfuri adiacente interioare, incercati din
nou...");

} while(test!=1);

int repeta_linie(int **d, int n,int k)

{int i,j,a,b,c,test=0;

for (i=0; i<n;i++){

if (d[k][i]==2) c=i;

if (d[k][i]==-1) a=i;

if (d[k][i]==1) b=i;}

for (j=0;j<k;j++)

for(i=0;i<n;i++) {

if (d[j][i]==2&&i==c) return 1;

if (d[j][i]==-1&&i==a) test++;

if (d[j][i]==1&&i==b) test++;}

if (test==2) return 1;

return 0;

void input_mat_inc(int **a, int n, int m)

{int i,j,test;

for (i=0; i<m; i++) {


printf("Dati valorile pentru U%d:\n",i+1);

linie_mat_inc(a,i,n);

test=repeta_linie(a,n,i);

if (test==1) {puts("Arcul se repeta, mai introduceti-l inca o data..."); i--;}

}}

int control(int **a, int n, int curent,int temp)

{int i;

if (temp==0) return 1;

if ((temp>=0)&&(temp<=n)){

for (i=0;i<n;i++) {

if (temp==a[curent][i]) return 0;} };

return 1; }

int input_lis_adiac(int **a, int n)

{int i,j=0,m=0, temp, test;

for (i=0; i<n;i++) {j=0;

printf("x%d:",i+1);

do {

scanf("%d",&temp);

while ((temp<0)||(temp>n)) {printf("Introduceti o valoare corecta (0..%d)\n",n);

scanf("%d",&temp); }

test=control(a,n,i,temp);

while(test!=1) {printf("Valoarea %d a mai fost introdusa... introduceti alta valoare\n",temp);

scanf("%d", &temp);test=control(a,n,i,temp);}

a[i][j]=temp; if (temp!=0) m++;

j++;} while ((temp!=0)&&(j!=n));

return m;

}
void mat_adiac_list_adiac(int **mat, int **list, int n)

{int i,j,ind=0;

for (i=0; i<n;i++) {

ind=0;

for (j=0; j<n;j++) {

if (mat[i][j]==1) {list[i][ind]=j+1;ind++;}

}}}

void list_adiac_mat_inc(int **list, int **mat, int n)

{int i,j, ind=0;

for (i=0; i<n;i++){

for (j=0; j<n; j++) {

if (list[i][j]!=0) {

if (list[i][j]==(i+1)) mat[ind][i]=2;

if (list[i][j]!=(i+1)) {

mat[ind][i]=-1;

mat[ind][(list[i][j])-1]=1;

ind++;

}}}}

void mat_inc_adiac(int **inc, int**adiac, int n, int m)

{int i,j, lin=0, col=0,test=0;

for (j=0; j<m;j++) {

lin=0;col=0; test=0;

for (i=0; i<n; i++) {

if (inc[j][i]==2) {adiac[i][i]=1;}

if (inc[j][i]==-1) {lin=i;test=1;}

if (inc[j][i]==1) {col=i; test=1;}}

if (test==1) adiac[lin][col]=1;

}}
#include"lab1/fundiscr.cpp"

#include"lab1/afisare.cpp"

int main()

{int **matinc=NULL, **matadiac=NULL, **listadiac=NULL;

int n=0, m=0;

int nr,temp;

goto definire;

Again:

while (1) {

textcolor(11);

clrscr();

cprintf(" *****Meniu****");cprintf("\r\n");

cprintf(" 1. Definirea grafului");cprintf("\r\n");

cprintf(" 2. Afisarea grafului"); cprintf("\r\n");

cprintf(" 0. Iesire");cprintf("\r\n");

scanf("%d", &nr);

switch(nr) { //afisare

definire:

case 1:textcolor(10);clrscr();

cprintf(" ***Alegeti modul de definire***");cprintf("\r\n");

cprintf(" 1. Matricea de adiacenta");cprintf("\r\n");

cprintf(" 2. Matricea de incidenta");cprintf("\r\n");

cprintf(" 3. Lista de adiacenta");cprintf("\r\n");

scanf("%d", &nr);

switch(nr) {

case 1:

temp=ferifymem(matadiac,"Matricea de adiacenta",n);

if (temp==0) {puts("Nu s-a dorit introducerea.."); getch();break;}


clrscr();

puts("Dati numarul de virfuri");

virfuri1:

scanf("%d", &n); if(n<2) {puts("Dati numarul de virfuri n>1"); goto virfuri1;}

matadiac=aloc(n,n);

if (!matadiac) {puts("Nu a fost alocata memorie pentru Matrice, lucrul va fi intrerupt...");

getch(); break;}

zerografiere(matadiac,n,n);

m=input_mat_adiac(matadiac,n);

puts("Matricea de adiacenta a fost introdusa...");

printf("S-au format %d arcuri\n",m);

getch();

listadiac=aloc(n,n+1);

if (!listadiac) {puts("Lista de adiacenta nu va fi disponibila, lucrul va fi intrerupt...");

getch(); break;}

zerografiere(listadiac,n,n+1);

mat_adiac_list_adiac(matadiac,listadiac,n);

matinc=aloc(m,n);

if (!matinc){puts("Matricea de incidenta nu va disponibila, lucrul va fi


intrerupt...");getch();break;}

zerografiere(matinc,m,n);

list_adiac_mat_inc(listadiac,matinc,n);

break;

case 2:

temp=ferifymem(matinc,"Matricea de incidenta",m);

if (temp==0) {puts("Nu s-a dorit introducerea.."); getch();break;}

clrscr();

puts("Dati numarul de virfuri");


virfuri2:

scanf("%d", &n); if(n<2) {puts("Dati numarul de virfuri n>1"); goto virfuri2;}

arce:

puts("Dati numarul de arce"); scanf("%d", &m);

if(n==2&&m>4) {puts("Ati introdus un numar prea mare de arce, incercati din


nou...");getch();goto arce;}

if(m>n*2+n) {puts("Ati introdus un numar prea mare de arce, incercati din nou..."); getch();
goto arce;}

matinc=aloc(m,n);

if (!matinc) {puts("Nu a fost alocata memorie pentru Matrice, lucrul va fi intrerupt...");

getch();

break;}

zerografiere(matinc,m,n);

input_mat_inc(matinc,n,m);

puts("Matricea de incidenta a fost introdusa corect"); getch();

matadiac=aloc(n,n);

if (!matadiac){puts("Matricea de adiacenta nu va disponibila, lucrul nu va


continua...");getch();break;}

zerografiere(matadiac,n,n);

mat_inc_adiac(matinc,matadiac,n,m);

listadiac=aloc(n,n+1);

if (!listadiac) {puts("Lista de adiacenta nu va fi disponibila, lucrul va fi intrerupt...");getch();


break;}

zerografiere(listadiac,n,n+1);

mat_adiac_list_adiac(matadiac,listadiac,n);

break;

case 3:

temp=ferifymem(listadiac,"Lista de adiacenta",n);

if (temp==0) {puts("Nu s-a dorit introducerea.."); getch();break;}

clrscr();
puts("Dati numarul de virfuri");

virfuri3:

scanf("%d",&n); if(n<2) {puts("Dati numarul de virfuri n>1"); goto virfuri3;}

listadiac=aloc(n,n+1);

if (!listadiac) {puts("Nu a fost alocata memorie pentru Lista, lucrul va fi intrerupt...");

getch(); break;}

zerografiere(listadiac,n,n+1);

m=input_lis_adiac(listadiac,n);

printf("Lista de adiacenta a fost introdusa, sau obtinut %d arcuri",m);

matinc=aloc(m,n);

if (!matinc){puts("Matricea de incidenta nu va disponibila, lucrul nu va


continua...");getch();break;}

zerografiere(matinc,m,n);

list_adiac_mat_inc(listadiac,matinc,n);

matadiac=aloc(n,n);

if (!matadiac){puts("Matricea de adiacenta nu va disponibila, lucrul nu va


continua...");getch();break;}

zerografiere(matadiac,n,n);

mat_inc_adiac(matinc,matadiac,n,m);

getch();break;

} break;

case 0: if(listadiac!=NULL) listadiac=elib(listadiac,n);

if (matinc!=NULL) matinc=elib(matinc,m);

if (matadiac!=NULL) matadiac=elib(matadiac,n);

return 1;

case 2:
while (1) {

textcolor(13); clrscr();// afisare

cprintf(" ***Alegeti modul de afisare***");cprintf("\r\n");

cprintf(" 1. Matricea de adiacenta");cprintf("\r\n");

cprintf(" 2. Matricea de incidenta");cprintf("\r\n");

cprintf(" 3. Lista de adiacenta");cprintf("\r\n");

cprintf(" 4. Inapoi");cprintf("\r\n");

scanf("%d", &nr);

switch(nr) {

case 1:

if (!matadiac) {puts("Matricea nu a fost definita, definiti-o intii de toate..."); getch(); break;}

clrscr();

puts(" Matricea de adiacenta");

afis_mat_adiac(matadiac,n);

getch();

break;

case 2:

if (!matinc) {puts("Matricea nu a fost definita, definiti-o intii de toate..."); getch(); break;}

clrscr();

puts(" Matricea de incidenta");

afis_mat_inc(matinc,n,m);

getch();

break;

case 3:

if (!listadiac) {puts("Lista nu a fost definita, definiti-o intii de toate..."); getch(); break;}

clrscr();

puts(" Lista de adiacenta");

afis_list_adiac(listadiac,n);

getch();
break;

case 4:goto Again;}

}//while(1)

} }}

Concluzii: Efectuind lucrarea de laborator propusa m-am aprofundat in


cunoasterea modurilor de definire a grafurilor prin matricea de adiacenta,
matricea de incidenta si lista de adiacenta, si in realizarea algoritmilor
pentru introducerea convertirea si afisarea lor.

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