Sunteți pe pagina 1din 14

Ministerul Educației al Republicii Moldova

Universitatea Tehnică a Moldovei


Matematica Discretă

Lucrare de laborator
№1

Tema: Păstrarea grafurilor în memoria calculatorului

A elaborat: st. grupei C-152 Ursan Andrian

A verificat: Doc.conf.univ. Dohotaru Leonid

Chișinău 2016
VARIANTA 11

1.Scopul lucrării
Studierea metodelor de definire a unui graf: matricea de incidență, matricea de adiacență,
liste, atît și extragerea și transformarea a diferitor forme de reprezentare a grafurilor cu afișarea
rezultatelor pe monitor.

2.Sarcina
Se dă graful G(F, X)  X={x1, x2, x3, x4, x5, x6, x7, x8}
Se solicită:
a) a doua formă analitică
b) reprezentarea grafică(geometrică)
c) matricea de incidență
d) matricea de adiacență
e) lista de adiacență
f) gradele exterioare, inferioare și a gradele vîrfurilor
g) clasificarea vîrfurilor: inițiale, finale, intermediare, izolate
h) buclele
i) vîrfurile adiacente cu vîrful x5
j) arcele incidente cu x4
k) subgrafurile G1=(X1, U1) și G2=(X2, U2) unde X1={x1, x2, x3, x4},
X2={x5, x6, x7, x8}

3. Sarcina de bază
De reprezentat matricea de adiacență, incidență și lista de adiacență, cu ajutorul unui
program elaborat la calculator.
Sînt date vîrfurile
F(x1)={x4, x2, x3} F(x5)={x3, x6, x8}
F(x2)={x4, x5} F(x6)={x8}
F(x3)={x7} F(x7)={x6}
F(x4)={x3, x6} F(x8)=Ø
A 2-a formă analitică
G=(X,U)
X={x1, x2, x3, x4, x5, x6, x7, x8}
U={(x1, x4); (x1, x2); (x1, x3); (x2, x4); (x2, x5); (x3, x7); (x4, x3); (x4, x6); (x5, x3); (x5, x6);
(x5, x8); (x6, x8); (x7, x6) }

Reprezentarea grafică (geometrică)

X1

X2

X3

X8

X4

X7

X5

X6

Matricea de incidență
B x1 x2 x3 x4 x5 x6 x7 x8
U1 -1 1 0 0 0 0 0 0
U2 -1 0 1 0 0 0 0 0
U3 -1 0 0 1 0 0 0 0
U4 0 -1 0 1 0 0 0 0
U5 0 -1 0 0 1 0 0 0
U6 0 0 -1 0 0 0 1 0
U7 0 0 1 -1 0 0 0 0
U8 0 0 0 -1 0 1 0 0
U9 0 0 1 0 -1 0 0 0
U10 0 0 0 0 -1 1 0 0
U11 0 0 0 0 0 -1 0 1
U12 0 0 0 0 0 1 -1 0
U13 0 0 0 0 -1 0 0 1

Matricea de adiacență

A x1 x2 x3 x4 x5 x6 x7 x8
x1 0 1 1 0 0 0 0 0
x2 0 0 0 1 1 0 0 0
x3 0 0 0 0 0 0 1 0
x4 0 0 1 0 0 1 0 0
x5 0 0 1 0 0 1 0 0
x6 0 0 0 0 0 0 0 1
x7 0 0 0 0 0 1 0 0
x8 0 0 0 0 0 0 0 0

Lista de adiacență

xj F(x)
x1 2, 3, 4, 0
x2 4, 5, 0
x3 7, 0
x4 3, 6, 0
x5 3, 6, 8, 0
x6 8, 0
x7 6, 0
x8 0
Gradele exterioare Gradele interioare
g+(x1)=3 g+(x5)=3 g-(x1)=0 g-(x5)=1
g+(x2)=2 g+(x6)=1 g-(x2)=1 g-(x6)=3
g+(x3)=1 g+(x7)=1 g-(x3)=3 g-(x7)=1
g+(x4)=2 g+(x8)=0 g-(x4)=2 g-(x8)=2

Gradele vîrfurilor
g+(xn)+g-(xn)=g(xn)
g(x1)=3 g(x5)=4
g(x2)=3 g(x6)=4
g(x3)=4 g(x7)=2
g(x4)=4 g(x8)=2

Clasificarea vîrfurilor
 vîrfuri inițiale – x1
 vîrfuri finale – x8
 vîrfuri intermediare – x2, x3, x4, x5, x6, x7
 vîrfuri izolate – nu există

Bucle
Bucle nu există

Vîrfurile adiacente cu vîrful x5


Vîrfurle adiacent este: x2

Arcele incidente cu vîrful x4


Arcele incidente sunt: (x4, x3); (x4, x6); (x1, x4); (x2, x4)

Subgrafurile:
G1=(X1,U1)
X1=(x1, x2, x3, x4)

X1

X2

X3
G2=(X2,U2)
X=(x5, x6, x7, x8)

X8

X7

X5

X6

Sarcina de bază:

Programul efectuat

#include<iostream>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<string.h>
#include<Windows.h>
using namespace std;

void desenare_tablou(int n);


void masivToUnidimensional(int masiv[][100],int index[100],int n,int
uni[100]);
void pereki_arcuri(int uni_index[100],int suma,int index[100]);
void showMeniu();
void afiseazaMatriceIncidenta(int masiv[][100],int suma,int index[100],int
n);
void afisareLista(int masiv[][100],int n,int index[100]);
void afiseazaMatriceAdiacenta(int n,int index[100],int masiv[][100]);

int main()
{
int i,j,k,l,n,x;
int nr_inter;
int index[100];
int suma;
int masiv[100][100];

suma=0;
system("color 0E");
cout<<"Introduceti numarul de virfuri: ";
cin>>n;

for (i=1,k=0,l=0;i<=n;i++,k++,l++)
{
cout<<"Introduceti numarul de virfuri cu care interactioneaza virful
"<<i<<": ";
cin>>nr_inter;
if (nr_inter >n)
{
cout<<"\nEroare:Numarul introdus de dumneavoastra este incorect, mai
incercati odata\n\n";
i--;
k--;
l--;
}
else
{
suma+=nr_inter;
cout<<i<<"| ";
for (j=0;j<nr_inter;j++)
{
cin>>masiv[k][j];
cout<<' ';
}
index[l]=j;
}
}
cout<<"\n\tAfisare Lista de adiacenta introdusa de utilizator\n";
afisareLista(masiv,n,index);
do
{
showMeniu();
cin>>x;
switch(x)
{
case 0:
{
cout<<"\nIesire din program.....";
}break;
case 1:
{
cout<<"\n\t\tAfisare matrice de incidenta:\n\n";
afiseazaMatriceIncidenta(masiv,suma,index,n);
}break;
case 2:
{
cout<<"\n\t\tAfisare matrice adiacenta\n\n";
afiseazaMatriceAdiacenta(n,index,masiv);
}break;
case 3:
{
cout<<"\n\t\tAfisare lista de adiacenta\n\n";
afisareLista(masiv,n,index);
}break;
case 4:
{
system("cls");
}break;
default:
cout<<"\nNumarul\\simboul introdus nu este in meniu\n";
}
}while (x != 0);

_getch();
return 0;
}

void desenare_tablou(int n)
{
int i;
cout<<"\n\t";
for (i=1;i<=n;i++)
{
cout<<"X"<<i<<"\t";
}
cout<<endl<<endl;
}

void masivToUnidimensional(int masiv[][100],int index[100],int n,int


uni[100])
{
int i,j,k,m,x;

for (i=0,k=0,x=0;i<n;i++,k++)
{
m=index[k];
for (j=0;j<m;j++)
{
uni[x]=masiv[i][j];
x++;
}
}
}

void pereki_arcuri(int uni_index[100],int suma,int index[100])


{
int i,m,k,x,a,j;
x=0;
for (i=0,k=0,a=1;i<suma;i++,k++,a++)
{
m=index[k];
for (j=0;j<m;j++)
{
uni_index[x]=a;
x++;
}
}
}

void showMeniu()
{
cout<<"\n\t\tMeniu\n";
cout<<"\t---------------------------\n";
cout<<"\tAlegeti comanda respectiva:\n\n";
cout<<"\t[1] Pentru afisarea matricei de incidenta.\n";
cout<<"\t[2] Pentru afisarea matricei de adiacenta.\n";
cout<<"\t[3] Pentru afisarea listei de adiacenta.\n";
cout<<"\t[4] Pentru curatarea ecranului.\n\n";
cout<<"\t[0] Iesire din programa.\n\n";
cout<<"\ncomanda>> ";
}

void afiseazaMatriceIncidenta(int masiv[][100],int suma,int index[100],int


n)
{
int masiv_incidenta[200][100];
int i,j,k,m;
int a,b;
int kontor;
int uni[200];
int uni_index[100];
kontor=0;
for (i=0,a=1,k=0;i<n;i++,k++,a++)
{
m=index[k];
for (j=0;j<m;j++)
{
b=masiv[i][j];
if (a == b)
{
masiv_incidenta[kontor][i]=2;
kontor++;
}
else
{
masiv_incidenta[kontor][i]=-1;
masiv_incidenta[kontor][b-1]=1;
kontor++;
}
}
}
for (i=0;i<suma;i++)
{
for (j=0;j<n;j++)
{
if (masiv_incidenta[i][j] != -1 && masiv_incidenta[i][j] != 2 &&
masiv_incidenta[i][j] != 1)
{
masiv_incidenta[i][j]=0;
}
}
}
masivToUnidimensional(masiv,index,n,uni);
pereki_arcuri(uni_index,suma,index);

desenare_tablou(n);
for (i=0,a=0,b=0;i<suma;i++,b++,a++)
{
cout<<uni_index[a]<<','<<uni[b]<<"\t";
for (j=0;j<n;j++)
{
cout<<masiv_incidenta[i][j]<<"\t";
}
cout<<endl;
}
}

void afisareLista(int masiv[][100],int n,int index[100])


{
int i,j,k,m;
for (i=0,k=0;i<n;i++,k++)
{
m=index[k];
cout<<i+1<<"| ";
for (j=0;j<m;j++)
{
cout<<masiv[i][j]<<' ';
}
cout<<endl;
}
}

void afiseazaMatriceAdiacenta(int n,int index[100],int masiv[][100])


{
int matrice_adiacenta[100][100];
int i,j,k,m,x;

desenare_tablou(n);
for (i=0,k=0;i<n;i++,k++)
{
m=index[k];
for (j=0;j<m;j++)
{
x=masiv[i][j];
matrice_adiacenta[i][x-1]=1;
}
}

for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
if (matrice_adiacenta[i][j] != 1)
{
matrice_adiacenta[i][j]=0;
}
}
}

for (i=0;i<n;i++)
{
cout<<"X"<<i+1<<"\t";
for (j=0;j<n;j++)
{
cout<<matrice_adiacenta[i][j];
cout<<"\t";
}
cout<<endl;
}
}

Rezultatul obținut în urma rulării programului


Screenshot-uri (consolă)

Introducerea datelor:
Meniul principal

Fig. №1

Matricea de incidență
Fig. №2
Matricea de adiacență

Fig. №3

Lista de adiacență

Fig. №4

Concluzii:
Efectuind aceasta lucrare de laborator am obtinut competente si cunostinte noi in

domeniul memorarii grafului in calculator. Am incercat sa creez un program care sa

indeplineasca scopul propus cu o exactitate cit mai mare. Am inteles ca obiectele de

studiu ale matematicii discrete sunt foarte interesante si necesare pentru ca ele cu

adevarat faciliteaza gindirea logica, necesara in programare.

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