Sunteți pe pagina 1din 14

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

Referat
Lucrarea de laborator nr.1
la Matematica Discret

A efectuat:
st. gr. AI-161 D.Dolgan

A verificat: I.Lisnic

Chiinu -2017
Lucrarea de laborator Nr. 1

Tema:Pastrarea grafurilor in memoria calculatorului

Scopul lucrarii: Studierea metodelor de definire a unui graf:matrice de incidenta, matrice de adiacenta,liste.
Elaborarea unor procedure de introducere, extragere si transformare a diferitelor forme de reprezentare
interna a grafurilor cu scoaterea rezultatelor la display si imprimanta.
Consideratii Teoretice:
Anul 1736 este considerat pe buna dreptate de inceput pentru teoria grafurilor. In acel an L. Euler a
rezolvat problema despre podurile din Konigsberg,stabilind criteriul de existent in grafuri a unui circuit
special,denumit astazi ciclu ciclu Euler.Avindusi inceputurile in rezolvarea unor jocuri distractive.astazi
teoria grafurilor s-a transformat intr-un aparat simplu si accesibil, care permite rezolvarea unui cerc larg de
probleme. Sub forma de grafuri pot fi reprezentate sisteme de drumuri si circuite electrice, harti geografice si
molecule chimice, relatii dintre oameni si grupuri de oameni.
Teoria grafurilor a devenit o parte componenta a aparatului matematic al ciberneticii,limbajul
matematicii discrete.
Def. Grafului
Se numeste graf ansamblu format dintr-o multime finite X si o aplicatie F a lui X in X. Se noteaza
G=(X,F). Numarul elementelor multimilor X determina ordinal grafului finit. Daca card X=n, graful
G=(X,F) se numeste graf finit de ordinul n. Elementele multimii X se numesc varfurile grafului. Geometric,
varfurile unui graf le reprezentam prin puncte sau cerculete. Perechea de varfuri (x,y) se numeste arc varful
x se numeste originea sau extremitatea initiala a arcului (x,y) iar varful y se numeste extremitatea finala sau
terminal. Un arc (x,y) il reprezentam geometric printr-o sageata orientate de la varful x la varful y.
Daca un varf nu este extremitatea nici unui arc el se numeste varf izolat, iar daca este extremitatea a
mai mult de doua arce- nod. Un arc (x,y) pentru care extremitatea initiala coincide cu cea finala se numeste
bucla.Arcele unui graf le mai notam si cu u1,u2,..., iar multimea arcelor grafului o noatam cu U.
Doua arce se numesc adiacente daca sunt distncte si au o extremitate comuna.Doua varfuri se numesc
adiacente daca sunt distinct si sunt unite prtr-un arc.
Un arc (x,y) se spune ca este incident cu virful x spre exterior si este incident cu varful y spre
interior.
Exista 3 metode de baza de definire a unui graf:
1. Matricea de incidenta;
2. Matricea de adiacenta;
3. Lista de adiacenta(incidenta).
Vom lua cunostinta cu fiecare dintre aceste metode.

Matricea de inciden
Este o matrice de tipul mxn, n care m este numrul de muchii sau arce (pentru un graf orientat), iar n este
numrul vrfurilor. La intersecia liniei i cu coloana j se vor considera valori de 0 sau 1 n conformitate cu
urmtoarea regul:
1 - dac muchia i este incident cu vrful j (dac arcul i "intr" n vrful j n cazul unui graf orientat);
0 - dac muchia (arcul) i i vrful j nu sunt incidente;
-1 - numai pentru grafuri orientate, dac arcul i "iese" din vrful j.
Este uor de observat c aceast metod este de o eficacitate mic n sensul utilizrii memoriei
calculatorului: fiecare linie conine doar dou elemente diferite de zero (o muchie poate fi incident cu nu
mai mult de dou vrfuri).
Matricea de adiacen
Este o matrice ptrat nxn, aici n este numrul de vrfuri. Fiecare element poate fi 0, dac vrfurile
respective nu sunt adiacente, sau 1, n caz contrar. Pentru un graf fr bucle putem observa urmtoarele:
diagonala principal este format numai din zerouri;
pentru grafuri neorientate matricea este simetric fa de diagonala principal.
1
Dup cum este lesne de observat i n acest caz memoria calculatorului este utilizat nu prea eficace din care
cauz matricea de adiacen ca i matricea de inciden se vor utiliza de obicei doar n cazul n care se va
rezolva o problem concret pentru care reprezentarea grafului n aceast form aduce unele faciliti
algoritmului respectiv.Pentru pstrarea grafurilor n memoria calculatorului (n deosebi, memoria extern) se
va utiliza una din posibilitile de mai jos.
Lista de adiacen i lista de inciden
Lista de adiacen este o list cu n linii (dup numrul de vrfuri n), n linia cu numrul i vor fi scrise
numerele vrfurilor adiacente cu vrful i.
Lista de inciden se definete analogic cu deosebirea c n linia i vor fi scrise numerele muchiilor (arcelor)
incidente cu vrful i.
Reprezentarea grafurilor prin intermediul acestor liste permite utilizarea mai eficace a memoriei
calculatorului, ns aceste forme sunt mai complicate att n realizare, ct i n timpul procesrii. Pentru a lua
n consideraie lungimea variabil a liniilor vor fi utilizate variabile dinamice i pointeri.

Exemplu am graf cu 5 varfuri si 7 arce ( vezi fig1)

X1 u3 X2

u6 u7

u2 u1

X5 u4 X4

u5
X3

Fig.1 Reprezentarea grafica a grafului G

Xi F(xi) MA x1 x2 x3 x4 x5 x1 x2 x3 x4 x5
MI
x1 2,0 x1 0 1 0 0 0
x2 4,0 x2 0 0 0 1 0 u1 0 1 0 0 -1
x3 2,4,0 x3 0 1 0 1 0 u2 1 0 0 0 -1
x4 0 x4 0 0 0 0 0
x5 1,2,3,0 x5 1 1 1 0 0 u3 -1 1 0 0 0
Fig.1 Lista Fig.2 Matricea de adiacenta u4 0 0 1 0 -1
u5 0 0 -1 1 0
u6 0 1 -1 0 0
u7 0 -1 0 1 0
Fig.3 Matricea de incidenta

2
Sarcina de baza
1. Elaboram procedura introducerii unui graf n memoria calculatorului n form de matrice de
inciden, matrice de adiacen i list de adiacen cu posibiliti de analiz a corectitudinii.
2. Elaboram proceduri de transformare dintr-o form de reprezentare n alta.
3. Folosind procedurile menionate elaboram programul care va permite:
introducerea grafului reprezentat sub oricare din cele trei forme cu posibiliti de corecie a datelor;
pstrarea grafului n memoria extern n form de list de adiacen;
extragerea informaiei ntr-una din cele trei forme la imprimant i display(pentru detail vezi anexe)

Concluzia
In urma efectuarii lucrarii date unde am studiat metodele de definire a unui graf: in matrice
adiacenta,matrice de incedinta si lista,am elaborat un procedeu de introducere, afisare si extragere a unei din
metodele mentionate mai sus prin programul C++.am observat cu usurinta editarea grafului prin metoda
listei de adecianta(incidenta).Prin orice metoda de definire a grafului putem usor sa obitnem metoda grafica
a grafului.

Bibliografie
1. Conspectul la matematica discreta predat de dr.conf.univ Gh.Ceban
2. Matematica discreta in inginerie indrumar de laborator Chisinau 1999

3
Programul in C
Textul Programului:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define L 100

int matr_incid[L][L],n,m;
int matr_adiac[L][L];
int list_adiac[L][L];

void meniu_principal();
void meniu_introducere();
void meniu_afisare();
void meniu_modificare();

void introducerea_matr_incid();
void transfer_matri_matra();
void transfer_matra_lista();
void introducerea_matr_adiac();
void transfer_matra_matri();
void introducerea_list_adiac();
void transfer_lista_matra();

void afisarea_matr_incid();
void afisarea_matr_adiac();
void afisarea_list_adiac();

void adaugarea_virf();
void stergerea_virf();
void adaugarea_arc();
void stergerea_arc();

int main()
{
system("cls");
meniu_principal();
return 0;
}
void meniu_principal()
{ FILE *fp;
char optiunea,ch;

fp=fopen("meniu_principal.txt","r");
system("cls");
while ((ch=fgetc(fp))!=EOF)
printf ("%c",ch);

optiunea=getch();
switch(optiunea)
{
case'1':meniu_introducere();break;
4
case'2':meniu_afisare();break;
case'3':meniu_modificare();break;
case'0':exit(0);break;
default:printf("\n\n Ati ales o optiune gresita!!!Apasati orice tasta
pentru a alege alta..");getch();
}

}
void meniu_introducere()
{FILE *fp;
char optiunea,ch;

fp=fopen("meniu_introducere.txt","r");
system("cls");
while ((ch=fgetc(fp))!=EOF)
printf ("%c",ch);

optiunea=getch();
switch(optiunea)
{
case'1':introducerea_matr_incid();break;
case'2':introducerea_matr_adiac();break;
case'3':introducerea_list_adiac();break;
case'4':meniu_principal();break;
case'0':exit(0);break;
default:printf("\n\nAti ales o optiune gresita!!! Apasati
orice tasta pentru a alege alta");getch();

}}

void meniu_afisare()
{
char optiunea;
do{
system("cls");
printf("\n\n\n\n"
"\n IN CE FORMA DRITI SA AFISEZE GRAFUL"
"\n\n 1.Matricea de incidenta"
"\n\n 2.Matricea de adiacenta"
"\n\n 3.Lista de adiacenta"
"\n\n "
"\n\n 4.Modificarea grafului"
"\n\n 5.Meniul principal"
"\n\n "
"\n\n 0.Iesire "
"\n\n Alegeti optiunea");
optiunea=getch();
switch(optiunea)
{
case'1':afisarea_matr_incid();break;
case'2':afisarea_matr_adiac();break;
case'3':afisarea_list_adiac();break;
case'4':meniu_modificare();break;
case'5':meniu_principal();break;
case'0':exit(0);break;
default:printf("\n\nAti ales optiune gresita!!!Apasati orice tasta pentru a
alege alta");getch();
5
}
}while(1);
}
void meniu_modificare()
{
char optiunea;
do{
system("cls");
printf("\n\n\n\n"
"\n CE MODIFICARI DORITI SA EFECTUATI"
"\n\n 1.Adaugarea unui virf"
"\n\n 2.Stergerea unui virf"
"\n\n 3.Adaugarea unui arc"
"\n\n 4.Stergerea unui arc"
"\n\n "
"\n\n 5.Meniu principal"
"\n\n "
"\n\n 0.iesire "
"\n\n Alegeti optiunea:");
optiunea=getch();
switch(optiunea)
{
case'1':adaugarea_virf();break;
case'2':stergerea_virf();break;
case'3':adaugarea_arc();break;
case'4':stergerea_arc();break;
case'5':meniu_principal();break;
case'0':exit(0);break;
default:printf("\n\nAti ales o optiune gresita!!!Apasati orice
tasta pentru a alege alta optiune");

}
}while(1);
}

/***********Introducerea grafului************/
void introducerea_matr_incid()
{
system("cls");
int i,j,p;

printf("\nDati nr de virfuri=");
scanf("%d",&n);
printf("\nDati nr de arce=");
scanf("%d",&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
matr_incid[i][j]=0;
printf("\n\n\t\tIntroduceti Matricea de Incidenta\n\n");
for(i=1;i<=m;i++)
{
system("cls");
printf("Avem %d virfuri si %d arce \n\n\n",n,m);
printf("\t\tDati coordonatele arcului %d:",i);
printf("\n\nDati virful din care iese arcul:");
scanf("%d",&j);
printf("\n\nDati virful in care pleaca arcul:");
scanf("%d",&p);
if(j==p)
6
matr_incid[i][j]=2;
else
{
matr_incid[i][j]=-1;
matr_incid[i][p]=1;
}
}
transfer_matri_matra();
transfer_matra_lista();
printf("\n\nApasati orice tasta pentru a continua");
getch();
meniu_afisare();
}

void transfer_matri_matra()
{
int i,j,i1,j1;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
matr_adiac[i][j]=0;
for(i=1;i<=m;i++)
{

for(j=1;j<=n;j++)
{
if(matr_incid[i][j]==-1)
i1=j;
if(matr_incid[i][j]>0)
j1=j;}

if(i1>0)
matr_adiac[i1][j1]=1;
else matr_adiac[i1][j1]=1;
}
}
void transfer_matra_lista()
{
int i,j,p;

for (i=1;i<=n;i++)
for(j=1;j<=n;j++)
list_adiac[i][j]=0;
for(i=1;i<=n;i++)
{
p=1;
for(j=1;j<=n;j++)
if(matr_adiac[i][j]==1)
list_adiac[i][p++]=j;
}
}
void introducerea_matr_adiac()
{
system("cls");
int i,j,k,p;
printf("\nDati nr de virfuri=");
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
matr_adiac[i][j]=0;
7
for(i=1;i<=n;i++)
{
system("cls");
printf("Avem %d virfuri \n\n\n",n);
printf("\n\n\tIntroduceti Matricea de adiacenta:");
printf("Cite arce pleaca din %d virf:",i);
scanf("%d",&j);

for (k=1;k<=j;k++)
{
printf("\n Dati virful din care pleaca arcul:");
scanf("%d",&p);
matr_adiac[i][p]=1;
}

}
transfer_matra_lista();
transfer_matra_matri();
printf("\n\nApasati orice tasta pentru a continua");
getch();

meniu_afisare();
}

void transfer_matra_matri()
{
int i,j,k=1;
for(i=0;i<=m;i++)
for(j=0;j<=n;j++)
matr_incid[i][j]=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(matr_adiac[i][j]!=0)
if(i==j)
matr_incid[k++][i]=2;
else
{
matr_incid[k][i]=-1;
matr_incid[k++][j]=1;
}
m=k-1;
}
void introducerea_list_adiac()
{
system("cls");
int i,j,k;
printf("\nDati nr de virfuri=");
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
list_adiac[i][j]=0;

j=1;
for(i=1;i<=n;i++)
{
system("cls");
printf("Avem %d virfuri",n);
printf("\n\n\t\t Introduceti lista de adiacenta:\n\n");
j=1;
8
k=1;
while(k!=0)
{
printf("\nIntroduceti %d element a liniei %d:",j,i);
scanf("%d",&k);
list_adiac[i][j++]=k;
}
}
transfer_lista_matra();
transfer_matra_matri();
printf("\n\nApasati orice tasta pentru a continua...");
getch();
meniu_afisare();
}
void transfer_lista_matra()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
matr_adiac[i][j]=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(list_adiac[i][j]!=0)
matr_adiac[i][list_adiac[i][j]]=1;
}

/** **********Afisarea Grafului ************ 88 */


void afisarea_matr_incid()
{
system("cls");
int i,j;
printf("\n\t\tMatricea de incidenta: \n\n\n");
printf(" ");
for(i=1;i<=n;i++)
printf("x%-2d",i);
for(i=1;i<=m;i++)
{
printf("\nu%-3d|",i);
for(j=1;j<=n;j++)
printf("%-3d",matr_incid[i][j]);}
getch();
meniu_afisare();

void afisarea_matr_adiac()
{
system("cls");
int i,j;
printf("\n\t\tmatricea de adiacenta:\n\n\n");
printf(" ");
for(i=1;i<=n;i++)
printf("x%-2d",i);
for(i=1;i<=n;i++)
{
printf("\nx%-3d",i);
for(j=1;j<=n;j++)
printf("%-3d",matr_adiac[i][j]);

9
}
getch();
meniu_afisare();
}
void afisarea_list_adiac()
{
system("cls");

int i,j;
printf("\n\t\t Lista de adiacenta:\n\n\n");
for(i=1;i<=n;i++)
{
printf("\n%2d|",i);
for(j=1;j<=n;j++)
if(list_adiac[i][j]==0)
{
printf("%2d",list_adiac[i][j]);
break;
}
else printf("%2d",list_adiac[i][j]);
}
getch();
meniu_afisare();
}

/* ********Modificarea grafului******** */
void adaugarea_virf()
{
system("cls");
int i,j,k,i1,j1;
n++;
printf("\n Cite arce doriti sa adaugati pentru noul virf:");
scanf("%d",&k);
m=m+k;
for(i=1;i<=n;i++)
{
matr_adiac[i][n]=0;
matr_adiac[n][i]=0;
}
for(i=1;i<=k;i++)
{
printf("\n Din care virf iese arcul:");
scanf("%d",&i1);
printf("\n\nIn care virf pleaca arcul:");
scanf("%d",&j1);
matr_adiac[i1][j1]=1;}

transfer_matra_lista();
transfer_matra_matri();
printf("\n\nApasati orice tasta pentru a continua");
getch();
meniu_modificare();
}

void stergerea_virf()
{
system("cls");
int i,j,k;
printf("\nCare virf doriti sa stergeti:");
10
scanf("%d",&k);
for(i=k+1;i<=n;i++)
for(j=1;j<=n;j++)
matr_adiac[i-1][j]=matr_adiac[i][j];
for(i=k+1;i<=n;i++)
for(j=1;j<=n;j++)
matr_adiac[j][i-1]=matr_adiac[j][i];
n--;

transfer_matra_lista();
transfer_matra_matri();
printf("\n\nApasati orice tasta pentru a continua");
getch();
meniu_modificare();
}

void adaugarea_arc()
{
system("cls");
int i1,j1;
printf("\t\tAdaugarea arcelor\n\n\n\n");
printf("\nDin care virf iese arcul:");
scanf("%d",&i1);
printf ("\nIn care virf intra arcul:");
scanf("%d",&j1);
matr_adiac[i1][j1]=1;

transfer_matra_lista();
transfer_matra_matri();
printf("\n\nApasati orice tasta pentru a continua");
getch();
meniu_modificare();
}
void stergerea_arc()
{
system("cls");
int i1,j1;
printf("\t\tStergerea arcelor\n\n\n\n");
printf("\n Din care virf iese arcul:");
scanf("%d",&i1);
printf("\n\nIn care virf pleaca arcul");
scanf("%d",&j1);
matr_adiac[i1][j1]=0;
transfer_matra_lista();
transfer_matra_matri();
printf("\n\nApasati orice tasta pentru a continua");
getch();
meniu_modificare();
}

Meniu

11
12
Fig.4 Graful in forma de lista de adiacenta

13