Documente Academic
Documente Profesional
Documente Cultură
Departamentul ISA
Lucrare de laborator
La Matematica Discretă
A verificat profesorul:
Chisinau 2018
Cuprins
1. Scopul lucrării---------------------------------------------------------------------- 3
2. Sarcina de bază -------------------------------------------------------------------- 3
3. Teorie -------------------------------------------------------------------------------- 3
4. Exemplu de graf care ne va servi ca exemplu la testarea programului 6
5. Verificarea programului --------------------------------------------------------- 8
6. Codul programului -------------------------------------------------------------- 15
7. Concluzie ---------------------------------------------------------------------------59
1. Scopul lucrării
2. Sarcina de bază
introducerea grafului reprezentat sub oricare forma din cele trei forme cu posibilități de
corecție a datelor.
păstrarea grafului în memoria externă în formă de lista de adiacență.
extragerea informației într-una dintre cele trei forme la imprimantă și display.
3. Teorie
Arcele unui graf le mai notăm şi cu e1, e2,..., iar mulţimea arcelor grafului o notăm cu E,iar
vîrfurile le notăm şi cu x1, x2,..., iar mulţimea vîrfurilor grafului notăm cu X.
Așadar un graf poate fi reprezentat sub forma unei figuri geometrice alcătuite din puncte
(care corespund vârfurilor) și din linii drepte sau curbe care unesc aceste puncte (care
corespund muchiilor sau arcelor).
Două arce se zic adiacente dacă sunt distincte şi au o extremitate comună. Două vârfuri se
zic adiacente dacă sunt distincte şi sunt unite printr-un arc. Un arc (x,y) se spune că este incident
cu vârful x spre exterior şi este incident cu vârful y spre interior.
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ţă).
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.
x1 x2 x3 x4 x5 x6 x7
e1 -1 0 1 0 0 0 0
e2 -1 0 0 1 0 0 0
e3 0 0 0 -1 0 0 1
e4 0 0 -1 0 0 0 1
e5 0 -1 1 0 0 0 0
e6 0 -1 0 0 1 0 0
e7 0 -1 0 0 0 1 0
e8 0 0 -1 0 0 1 0
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:
x1 0 0 1 1 0 0 0
x2 0 0 1 0 1 1 0
x3 0 0 0 0 0 1 1
x4 0 0 0 0 0 0 1
x5 0 0 0 0 0 0 0
x6 0 0 0 0 0 0 0
x7 0 0 0 0 0 0 0
După cum este 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 facilităţi algoritmului respectiv.
Pentru păstrarea grafurilor în memoria calculatorului (în deosebi, memoria externă) se va utiliza
una din posibilităţile de mai jos.
Lista de adiacenţă
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.
Reprezentarea grafurilor prin intermediul acestor liste permite utilizarea mai eficace a memoriei
calculatorului, însă aceste forme sunt mai complicate atât în realizare, cât şi în timpul procesării.
4. Exemplu de graf care ne va servi ca exemplu la testarea
programului.
1 e1
2
e3 e2
3 e4
e5 4
5
Matrice adiacentă:
x1 x2 x3 x4 x5
x1 0 1 0 1 0
x2 0 0 0 0 1
x3 0 0 0 1 0
x4 0 0 0 0 0
x5 0 0 1 0 0
Matrice incidentă:
x1 x2 x3 x4 x5
e1 -1 1 0 0 0
e2 0 -1 0 0 1
e3 -1 0 0 1 0
e4 0 0 1 0 -1
e5 0 0 -1 1 0
Listă adiacentă:
1 - 2, 4, 0
2 – 5, 0
3 – 4, 0
4–0
5 – 3, 0
x1 x2 x3 x4 x5
e1 -1 1 0 0 0
e2 -1 0 0 1 0
e3 0 -1 0 0 1
e4 0 0 -1 1 0
e5 0 0 1 0 -1
5. Verificarea programului
(Fig. 5)
(Fig. 6)
3. Redactarea grafului. (Fig. 7)
(Fig. 7)
(Fig. 8)
(Fig. 9)
6. Convertirea grafului în toate tipurile. (Fig. 10)
(Fig. 10)
7. Introducerea unei matrice incidente și convertirea în toate
variantele posibile. (Fig. 11), (Fig. 12)
(Fig. 11)
(Fig. 12)
8. Introducerea unei matrice adiacente și convertirea în toate
variantele posibile. (Fig. 13), (Fig. 14)
(Fig. 13)
(Fig. 14)
9. Introducerea unei liste adiacente și convertirea în toate
variantele posibile. (Fig. 15), (Fig. 16), (Fig. 17)
(Fig. 15)
(Fig. 16)
(Fig. 17)
6. Codul programului
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#define maxsize 64
#define VIRF_MAX 10
void main() {
// switch
MatrAdiacenta_Graf_Matr;
int graf[ARC_MAX][2];
int graf_matrice_incidenta[ARC_MAX][VIRF_MAX];
int graf_matrice_adiacenta[VIRF_MAX][VIRF_MAX];
int matrice_incidenta[ARC_MAX][VIRF_MAX];
int mi_graf[ARC_MAX][2];
int mi_matrice_adiacenta[VIRF_MAX][VIRF_MAX];
int matrice_adiacenta[ARC_MAX][VIRF_MAX];
int ma_graf[ARC_MAX][2];
int ma_matrice_incidenta[ARC_MAX][VIRF_MAX];
int lista_adiacenta[VIRF_MAX][ARC_MAX];
int la_graf[ARC_MAX][2];
int la_matrice_adiacenta[VIRF_MAX][VIRF_MAX];
int la_matrice_incidenta[VIRF_MAX][VIRF_MAX];
int i = 0, j = 0, v = 0, n = 0, cont = 0;
int k;
char pause;
int la_to_all;
int stDup;
int l_arc;
while(1){
graf_matrice_incidenta[i][j] = 0;
// 0 0 0 0 0 0 0 0 0 graf matrice_adiacenta
graf_matrice_adiacenta[i][j] = 0;
matrice_adiacenta[i][j] = 0;
matrice_incidenta[i][j] = 0;
mi_matrice_adiacenta[i][j] = 0;
ma_matrice_incidenta[i][j] = 0;
lista_adiacenta[i][j] = 0;
"~~~\n\n"); // sleep(1);
printf("\t[1]. Graf.\n");
scanf("%d", &optiune);
// switch principal
switch (optiune) {
case 1:
// system("cls");
printf("\t\t Graf\n\n");
// nr virfuri
scanf("%d", &virf_count);
// nr arce
scanf("%d", &arc_count);
printf(
scanf("%d", &virf_count);
// nr arce
scanf("%d", &arc_count);
// introducem arcele
printf("Introduceti arcele:\n");
scanf("%d", &graf[i][0]);
printf("Virful %d intrare : ", i + 1);
scanf("%d", &graf[i][1]);
i--;
graf[i][1] == graf[j][1]) {
memcpy(
&graf[j][0],
&graf[j + 1][0],
(arc_count - j) * 8);
memset(&graf[--arc_count][0], 0, 8);
printf(
}
printf("Graful introdus este:\n");
printf("\n");
scanf("%d", &rasp);
switch (rasp) {
case 1:
scanf("%d", &grafRed);
switch (grafRed) {
case 1:
scanf("%d", &graf[i][0]);
printf("Virful %d intrare : ", i + 1);
scanf("%d", &graf[i][1]);
i--;
arc_count++;
contZ=0;
graf[i][1] == graf[j][1]) {
contZ++;
if(contZ!=0)
scanf("%d", &stDup);
switch(stDup){
case 1:
graf[i][1] == graf[j][1]) {
memcpy(
&graf[j][0],
&graf[j + 1][0],
(arc_count - j) * 8);
memset(&graf[--arc_count][0], 0, 8);
printf(
break;
case 2:
scanf("%d", &graf[i][1]);
i--;
arc_count++;
graf[i][1] == graf[j][1]) {
memcpy(
&graf[j][0],
&graf[j + 1][0],
(arc_count - j) * 8);
memset(&graf[--arc_count][0], 0, 8);
printf(
}
}
break;
default:
case 2:
printf("\n");
scanf("%d", &grafLineDel);
if(grafLineDel>arc_count || grafLineDel<=0){
scanf("%d", &grafLineDel);
arc_count--;
printf("\n");
}
break;
case 3:
printf("\n");
scanf("%d", &virfAdd);
scanf("%d", &arcAdd);
scanf("%d", &graf[i][0]);
scanf("%d", &graf[i][1]);
i--;
printf("\n");
contZ=0;
graf[i][1] == graf[j][1]) {
contZ++;
if(contZ!=0)
scanf("%d", &stDup);
switch(stDup){
case 1:
for (u = 0; u < 10; u++) {
graf[i][1] == graf[j][1]) {
memcpy(
&graf[j][0],
&graf[j + 1][0],
(arc_count - j) * 8);
memset(&graf[--arc_count][0], 0, 8);
printf(
break;
printf("\n");
}
break;
case 4:
printf("\n");
scanf("%d", &virfDel);
"nou.");
scanf("%d", &virfDel);
if (graf[i][j] == virfDel) {
graf[n1][m1] =
graf[n1 + 1][m1];
arc_count--;
}
}
printf("\n");
break;
break;
default:
}}
scanf("%d", &graf_to_matrice);
printf("\n\n\n");
switch (graf_to_matrice) {
case 1:
for (i = 0; i < arc_count; i++)
if (graf[i][0] == graf[i][1])
graf_matrice_incidenta[i][graf[i][0] - 1] = 2;
else {
graf_matrice_incidenta[i][graf[i][0] - 1] = -1;
graf_matrice_incidenta[i][graf[i][1] - 1] = 1;
// numere sus
printf("\n");
// line----
printf("--------");
printf("\n");
// afisare matrice in
printf("%4d\t", graf_matrice_incidenta[i][j]);
printf("\n");
printf("\n\n\n\n\n\n\n\n");
break;
//-------------------------------Case 2------------------
case 2:
for (i = 0; i < arc_count; i++)
graf_matrice_adiacenta[graf[i][0] - 1][graf[i][1] - 1] = 1;
fputs("\t", stdout);
printf("\n");
printf("--------");
printf("\n");
printf("%3d:\t", i + 1);
printf("%4d\t", graf_matrice_adiacenta[i][j]);
printf("\n");
break;
//-----------------------------Case 3-----------------------
case 3:
printf("Lista adiacenta.\n\n");
if (graf[i][0] > n)
n = graf[i][0];
}
for (i = 0; i < n; ++i) {
if (i + 1 == graf[j][0])
printf("%d,", graf[j][1]);
if (j == arc_count - 1)
printf("%d\n", 0);
printf("\n");
break;
//---------------------------Case
//4--------------------------------------
case 4:
// incident
if (graf[i][0] == graf[i][1])
graf_matrice_incidenta[i][graf[i][0] - 1] = 2;
else {
graf_matrice_incidenta[i][graf[i][0] - 1] = -1;
graf_matrice_incidenta[i][graf[i][1] - 1] = 1;
// numere sus
// line----
printf("--------");
printf("\n");
// afisare matrice in
printf("%4d\t", graf_matrice_incidenta[i][j]);
printf("\n");
// adiacent
graf_matrice_adiacenta[graf[i][0] - 1][graf[i][1] - 1] = 1;
fputs("\t", stdout);
printf("%3d:\t", j + 1);
printf("\n");
printf("--------");
printf("\n");
printf("%3d:\t", i + 1);
printf("%4d\t", graf_matrice_adiacenta[i][j]);
printf("\n");
if (graf[i][0] > n)
n = graf[i][0];
if (i + 1 == graf[j][0])
printf("%d,", graf[j][1]);
if (j == arc_count - 1)
printf("%d\n", 0);
printf("\n");
break;
default:
break;
case 2:
arc_count = 0;
virf_count = 0;
printf("\t\tMatricea de incidenta.\n");
virf_count = 0;
arc_count = 0;
scanf("%d", &virf_count);
scanf("%d", &arc_count);
scanf("%d", &matrice_incidenta[i][j]);
if (matrice_incidenta[i][j] != 0 &&
matrice_incidenta[i][j] != 1 &&
matrice_incidenta[i][j] != -1 &&
matrice_incidenta[i][j] != 2) {
printf(
i + 1,
j + 1);
scanf("%d", &matrice_incidenta[i][j]);
scanf("%d", &MatrIncidenta_Graf_Matr);
switch (MatrIncidenta_Graf_Matr) {
case 1:
// system("cls");
printf("\nGraf.\n");
switch (matrice_incidenta[i][j]) {
case 2:
mi_graf[i][0] = j;
mi_graf[i][1] = j;
break;
case -1:
mi_graf[i][0] = j;
break;
case 1:
mi_graf[i][1] = j;
break;
printf("\n");
break;
case 2:
printf("\nMatrice adiaceta.\n");
switch (matrice_incidenta[i][j]) {
case 2:
mi_graf[i][0] = j;
mi_graf[i][1] = j;
break;
case -1:
mi_graf[i][0] = j;
break;
case 1:
mi_graf[i][1] = j;
break;
mi_matrice_adiacenta[mi_graf[i][0]][mi_graf[i][1]] = 1;
fputs("\t", stdout);
printf("\n");
printf("--------");
printf("\n");
for (i = 0; i < virf_count; i++) {
printf("%3d:\t", i + 1);
printf("%4d\t", mi_matrice_adiacenta[i][j]);
printf("\n");
break;
case 3:
printf("\nLista adiacenta.\n");
switch (matrice_incidenta[i][j]) {
case 2:
mi_graf[i][0] = j + 1;
mi_graf[i][1] = j + 1;
break;
case -1:
mi_graf[i][0] = j + 1;
break;
case 1:
mi_graf[i][1] = j + 1;
break;
n = 0;
if (mi_graf[i][0] > n)
n = mi_graf[i][0];
if (i + 1 == mi_graf[j][0])
printf("%d,", mi_graf[j][1]);
if (j == arc_count - 1)
printf("%d\n", 0);
printf("\n");
break;
case 4:
printf("\nGraf\n");
switch (matrice_incidenta[i][j]) {
case 2:
mi_graf[i][0] = j;
mi_graf[i][1] = j;
break;
case -1:
mi_graf[i][0] = j;
break;
case 1:
mi_graf[i][1] = j;
break;
printf(
"[%d]. (%d,%d)\t",
i + 1,
mi_graf[i][0] + 1,
mi_graf[i][1] + 1);
printf("\n");
printf("\nMatrice adiaceta.\n");
switch (matrice_incidenta[i][j]) {
case 2:
mi_graf[i][0] = j;
mi_graf[i][1] = j;
break;
case -1:
mi_graf[i][0] = j;
break;
case 1:
mi_graf[i][1] = j;
break;
printf("\n");
for (i = 0; i < arc_count; i++)
mi_matrice_adiacenta[mi_graf[i][0]][mi_graf[i][1]] = 1;
fputs("\t", stdout);
printf("\n");
printf("--------");
printf("\n");
printf("%3d:\t", i + 1);
printf("%4d\t", mi_matrice_adiacenta[i][j]);
printf("\n");
printf("\nLista adiacenta.\n");
switch (matrice_incidenta[i][j]) {
case 2:
mi_graf[i][0] = j + 1;
mi_graf[i][1] = j + 1;
break;
case -1:
mi_graf[i][0] = j + 1;
break;
case 1:
mi_graf[i][1] = j + 1;
break;
n = 0;
if (mi_graf[i][0] > n)
n = mi_graf[i][0];
if (i + 1 == mi_graf[j][0])
printf("%d,", mi_graf[j][1]);
if (j == arc_count - 1)
printf("%d\n", 0);
printf("\n");
break;
/*------------------------------------------------------------------------------*/
case 3:
printf("\t\tMatricea de adiacenta.\n");
printf("Introduceti numarul de virfuri: ");
scanf("%d", &virf_count);
scanf("%d", &matrice_adiacenta[i][j]);
scanf("%d", &MatrAdiacenta_Graf_Matr);
switch (MatrAdiacenta_Graf_Matr) {
case 1:
printf("\n Graf.\n");
arc_count = 0;
if (matrice_adiacenta[i][j]) {
ma_graf[arc_count][0] = i;
ma_graf[arc_count][1] = j;
arc_count++;
printf("\n");
break;
case 2:
if (matrice_adiacenta[i][j]) {
ma_graf[arc_count][0] = i;
ma_graf[arc_count][1] = j;
arc_count++;
printf("\n");
if (ma_graf[i][0] == ma_graf[i][1])
ma_matrice_incidenta[i][ma_graf[i][0]] = 2;
else {
ma_matrice_incidenta[i][ma_graf[i][0]] = -1;
ma_matrice_incidenta[i][ma_graf[i][1]] = 1;
// numere sus
// line----
printf("--------");
printf("\n");
// afisare matrice in
printf("%4d\t", ma_matrice_incidenta[i][j]);
printf("\n");
break;
case 3:
printf("\nLista adicenta.\n");
arc_count = 0;
if (matrice_adiacenta[i][j]) {
ma_graf[arc_count][0] = i + 1;
ma_graf[arc_count][1] = j + 1;
arc_count++;
printf("\n");
n = 0;
if (ma_graf[i][0] > n)
n = ma_graf[i][0];
if (i + 1 == ma_graf[j][0])
printf("%d,", ma_graf[j][1]);
if (j == arc_count - 1)
printf("%d\n", 0);
printf("\n");
break;
case 4:
printf("\n Graf.\n");
arc_count = 0;
if (matrice_adiacenta[i][j]) {
ma_graf[arc_count][0] = i;
ma_graf[arc_count][1] = j;
arc_count++;
printf("\n");
printf("\nMatrice incidenta.\n");
if (ma_graf[i][0] == ma_graf[i][1])
ma_matrice_incidenta[i][ma_graf[i][0]] = 2;
else {
ma_matrice_incidenta[i][ma_graf[i][0]] = -1;
ma_matrice_incidenta[i][ma_graf[i][1]] = 1;
// numere sus
printf("\n");
// line----
printf("--------");
printf("\n");
// afisare matrice in
printf("%4d\t", ma_matrice_incidenta[i][j]);
printf("\nLista adicenta.\n");
arc_count = 0;
if (matrice_adiacenta[i][j]) {
ma_graf[arc_count][0] = i + 1;
ma_graf[arc_count][1] = j + 1;
arc_count++;
printf("\n");
n = 0;
if (ma_graf[i][0] > n)
n = ma_graf[i][0];
if (i + 1 == ma_graf[j][0])
printf("%d,", ma_graf[j][1]);
if (j == arc_count - 1)
printf("%d\n", 0);
}
}
printf("\n");
break;
break;
/*-------------------------------------------*/
case 4:
// system("cls");
printf("Lista de adiacenta.\n");
arc_count = 0;
virf_count = 0;
scanf("%d", &virf_count);
l_arc++;
scanf("%d", &lista_adiacenta[i][j]);
printf(
"autotmat.\n",
lista_adiacenta[i][j]);
scanf("%d", &lista_adiacenta[i][j]);
}
if (!lista_adiacenta[i][j]) {
l_arc--;
break;
if (lista_adiacenta[i][j] != 0) {
printf("%d,", lista_adiacenta[i][j]);
} else {
printf("%d\n", 0);
break;
printf("\n\n");
k = 0;
la_graf[k][0] = i + 1;
la_graf[k][1] = lista_adiacenta[i][j];
++k;
}
for (int i = 0; i < l_arc; i++) {
la_graf[i][1] == la_graf[j][1]) {
contZ++;
if(contZ!=0)
scanf("%d", &stDup);
switch(stDup){
case 1:
la_graf[i][1] == la_graf[j][1]) {
memcpy(
&la_graf[j][0],
&la_graf[j + 1][0],
(l_arc - j) * 8);
memset(&la_graf[--l_arc][0], 0, 8);
printf(
if (la_graf[i][0] > n)
n = la_graf[i][0];
if (i + 1 == la_graf[j][0])
printf("%d,", la_graf[j][1]);
if (j == l_arc - 1)
printf("%d\n", 0);
printf("\n");
break;
default:
printf("Lista nu a fost redactata. \n\n");
}}
printf("\n");
scanf("%d", &la_to_all);
switch (la_to_all) {
case 1:
printf("\n");
break;
case 2:
k = 0;
la_graf[k][0] = i + 1;
la_graf[k][1] = lista_adiacenta[i][j];
++k;
}
if (la_graf[i][0] == la_graf[i][1])
la_matrice_incidenta[i][la_graf[i][0] - 1] = 2;
else {
la_matrice_incidenta[i][la_graf[i][0] - 1] = -1;
la_matrice_incidenta[i][la_graf[i][1] - 1] = 1;
// numere sus
printf("\n");
// line----
printf("--------");
printf("\n");
// afisare matrice in
printf("%4d\t", la_matrice_incidenta[i][j]);
printf("\n");
break;
case 3:
printf("Lista adiacenta.\n");
k = 0;
la_graf[k][0] = i + 1;
la_graf[k][1] = lista_adiacenta[i][j];
++k;
la_matrice_adiacenta[la_graf[i][0] - 1][la_graf[i][1] - 1] = 1;
fputs("\t", stdout);
printf("\n");
printf("--------");
printf("\n");
printf("%3d:\t", i + 1);
printf("%4d\t", la_matrice_adiacenta[i][j]);
printf("\n");
}
break;
case 4:
printf("\n\n");
k = 0;
la_graf[k][0] = i + 1;
la_graf[k][1] = lista_adiacenta[i][j];
++k;
printf("\n");
la_graf[k][0] = i + 1;
la_graf[k][1] = lista_adiacenta[i][j];
++k;
if (la_graf[i][0] == la_graf[i][1])
la_matrice_incidenta[i][la_graf[i][0] - 1] = 2;
else {
la_matrice_incidenta[i][la_graf[i][0] - 1] = -1;
la_matrice_incidenta[i][la_graf[i][1] - 1] = 1;
// numere sus
printf("\n");
// line----
printf("--------");
printf("\n");
// afisare matrice in
printf("%4d\t", la_matrice_incidenta[i][j]);
printf("(%d,%d)", la_graf[i][0], la_graf[i][1]);
printf("\n");
la_matrice_adiacenta[la_graf[i][0] - 1][la_graf[i][1] - 1] = 1;
fputs("\t", stdout);
printf("\n");
printf("--------");
printf("\n");
printf("%3d:\t", i + 1);
printf("%4d\t", la_matrice_adiacenta[i][j]);
printf("\n");
printf("\n\n");
break;
default:
printf("Eroare.");
}
break;
/*------------------------------------*/
default:
}}}
7. Concluzie: