Documente Academic
Documente Profesional
Documente Cultură
Raport
La Matematic Discret
Pentru laboratorul nr 1
A ndeplinit
A verificat
Dohotaru Leonid
Chisinu 2014
SCOPUL LUCRRII:
Studierea metodelor de definire a unui graf: matrice de inciden, matrice de adiacen, liste;
Elaborarea unor proceduri de introducere, extragere i transformare a diferitor forme de reprezentare
intern a grafurilor cu scoaterea rezultatelor la display i imprimant.
NOTE DE CURS
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.
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.
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.
SARCINA DE BAZ
1. Elaborai 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. Elaborai proceduri de transformare dintr-o form de reprezentare n alta.
3. Folosind procedurile menionate elaborai 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.
list[i]=head;
vertex=0;
head=NULL;temp=NULL;
return vertices;
}
int NewAdjacentMatrix(int* &list){
int nr,temp;
printf("Introduceti numarul de virfuri ale grafului \n>>");
scanf_s("%d",&nr);
list=(int*)malloc(sizeof(int)*nr*nr);
for(int i=0;i<nr;i++){
printf("Introduceti datele pentru virful %d (adiacent[1] sau
neadiacent[0])\n\n",i+1);
for(int j=0;j<nr;j++){
printf("Virful %d | ",j+1);
while(!(scanf_s("%d",&temp)==1) || !((temp==1) || (temp==0)))
printf("Gresit!Intoduceti [0] sau [1] .\n Virful %d | ",j+1)
;
list[i*nr+j]=temp;
}
}
return nr;
}
void NewIncidenceMatrix(int* &list,int &anr,int &vnr){
int temp,ch;
printf("Introduceti nr. de arcuri\n>>");
scanf_s("%d",&anr);
printf("Introduceti nr. de virfuri\n>>");
scanf_s("%d",&vnr);
list=(int*)malloc(sizeof(int)*anr*vnr);
for(int i=0;i<anr;i++)
for(int k=0;k<vnr;k++)
list[i*vnr+k]=0;
printf("Liniar indicind doar 2 virfuri pentru arcul respectiv \n>>");
for(int i=0;i<anr;i++){
printf("Introduceti datele pentru arcul %d \n",i+1);
printf("Din care virf iese arcul %d \n>>",i+1);
while(!(scanf_s("%d",&temp)==1) || !((temp<=vnr) && (temp>0)))
}
}
Vertex** AdjcentMatrixToAdjacentsList(int *adjmatrix,int msize){
Vertex** list=NULL;
if(adjmatrix==NULL)exit(0);
list=(Vertex**)calloc(msize,sizeof(Vertex*));
PVertex temp=NULL,head=NULL;
for(int i=0;i<msize;i++){
for(int j=0;j<msize;j++){
if(adjmatrix[i*msize+j]==1){
if(head==NULL){
head=(Vertex*)malloc(sizeof(Vertex));
head->ID=j;
head->link=NULL;
}
else{
temp=head;
while(temp->link!=NULL)temp=temp->link;
temp->link=(Vertex*)malloc(sizeof(Vertex));
temp->link->ID=j;
temp->link->link=NULL;
}
}
}
list[i]=head;printf("\n");
head=NULL;temp=NULL;
}
return list;
}
Vertex* temp=NULL;
for( int i=0;i<vertices;i++){
temp=list[i];
while(temp!=NULL){
(*arcs)+=1;
temp=temp->link;
}
}
int *incmatrix=(int*)calloc((*arcs)*vertices,sizeof(int));
int arc=0;
for( int i=0;i<vertices;i++){
temp=list[i];
while(temp!=NULL){
if(temp->ID==i)
incmatrix[arc*vertices+ i]=2;
else{
incmatrix[arc*vertices+ i]=-1;
incmatrix[arc*vertices+ temp->ID]=1;
}
arc+=1;
temp=temp->link;
}
}
return incmatrix;
}
if(adjmatrix[i*vertices+j]==1){
incmatrix[arc*vertices+i]=-1;
incmatrix[arc++*vertices+j]=1;
}
}
return incmatrix;
}
void main(){
Vertex**adjlist=NULL;
int* adjmatrix=NULL,*incmatrix=NULL;;
int vertices=0,arc=0,var=0;
printf("Introducerea si afisarea unui graf\n\n");
printf("Alegeti modul de prezentare a unui graf;\r\n");
printf("
1.Matricea de Adiacenta:\r\n");
printf("
2.Matricea de Incidenta:\r\n");
printf("
3.Lista de Adiacenta:\r\n");
printf(">>");
while(!(scanf_s("%d",&var)==1) || !((var==1) || (var==2) ||(var==3)))
printf("Gresit!Intoduceti alte date .\n>> ") ;
switch(var){
case 1:{
printf("\nAti ales tipul de introducere sub forma de Matrice de
Adiacenta:\n");
vertices=NewAdjacentMatrix(adjmatrix);
PrintAdjcentMatrix(adjmatrix,vertices);
break;
}
case 2:{
printf("\nAti ales tipul de introducere sub forma de Matrice de
Incidenta:\n");
NewIncidenceMatrix(incmatrix,arc,vertices);
PrintIncidenceMatrix(incmatrix,arc,vertices);
break;
}
case 3:{
printf("\nAti ales tipul de introducere sub forma de Lista de
Adiacenta:\n");
vertices=NewAdjacentList(adjlist);
PrintAdjacentsList(adjlist,vertices);
break;
}
}
N:{
printf("\nAlegeti modalitatea de transformare a Grafului:\n");
printf("
1.Matricea de adiacenta ---> Lista de adiacenta\n");
printf("
2.Matricea de adiacenta ---> Matricea de incidenta\n");
printf("
3.Matricea de incidenta ---> Lista de adiacenta\n");
printf("
4.Matricea de incidenta ---> Matricea de adiacenta\n");
printf("
5.Lista de adiacenta ---> Matricea de adiacenta\n");
printf("
6.Lista de adiacenta ---> Matricea de incidenta\n");
printf("
7.Iesire di program\n");
printf(">>");
while(!(scanf_s("%d",&var)==1) || !((var==1) || (var==2) ||(var==3) || (var==4) ||
(var==5) || (var==6) ||(var==7)))
printf("Gresit!Intoduceti alte date .\n>> ");
switch(var){
case 1:{
printf("\nAti ales tipul Matricea de adiacenta ---> Lista de
adiacenta:\n");
adjlist=AdjcentMatrixToAdjacentsList(adjmatrix,vertices);
PrintAdjacentsList(adjlist,vertices);
break;
}
case 2:{
printf("\nAti ales tipul Matricea de adiacenta ---> Matricea de
incidenta:\n");
incmatrix=AdjcentMatrixToIncidenceMatrix(adjmatrix,vertices,&arc);
PrintIncidenceMatrix(incmatrix,arc,vertices);
break;
}
case 3:{
printf("\nAti ales tipul Matricea de incidenta ---> Lista de
adiacenta:\n");
adjlist=IncidenceMatrixToAdjacentsList(incmatrix,arc,vertices);
PrintAdjacentsList(adjlist,vertices);
break;
}
case 4:{
printf("\nAti ales tipul Matricea de incidenta ---> Matricea de
adiacenta:\n");
adjmatrix=IncidenceMatrixToAdjcentMatrix(incmatrix,vertices,arc);
PrintAdjcentMatrix(adjmatrix,vertices);
break;
}
case 5:{
printf("\nAti ales tipul Lista de adiacenta ---> Matricea de
adiacenta:\n");
adjmatrix=AdjacentsListToAdjcentMatrix(adjlist,vertices);
PrintAdjcentMatrix(adjmatrix,vertices);
break;
}
case 6:{
printf("\nAti ales tipul Lista de adiacenta ---> Matricea de
incidenta:\n");
incmatrix=AdjacentsListToIncidenceMatrix(adjlist,vertices,&arc);
PrintIncidenceMatrix(incmatrix,arc,vertices);
break;
}
case 7:{
goto Q;
free(incmatrix);
free(adjmatrix);
free(adjlist);
break;
}
}
}
goto N;
Q:getch();
}
2.Reprezentarea din list de adiacent n form de matrice de adiacent i afisarea acesteia la display.
3.Reprezentarea din list de adiacent n form de matrice de incident i afisarea acesteia la display.
Concluzie:
n urma acestei lucrari de laborator am facut cunostinta cu noiunea de graf i modurile n care poate fi
reprezentat graful: lista de adiacen, matricea de adiacen i matricea de inciden. Am fobservat ca cea
mai obtim modalitate de introducere a grafului estea ce n form de list de adiacen. La fel programul
realizat d posibiliatatea de trecere de la o metod de reprezentate la una din celelalte.