Sunteți pe pagina 1din 7

MINISTERUL EDUCAȚIEI ȘI TINERETULUI AL

REPUBLICII MOLDOVA
UNIVERSITATEA DE STAT DIN R.MOLDOVA
FACULTATEA DE MATEMATICĂ ȘI INFORMATICĂ

ALGORITMICA GRAFURIOR
LUCRARE DE LABORATOR NR.1

Preliminare și parcurgerea grafului

Varianta 3

A executat
St. grupei IA-1801

JARDAN VICTOR
A verificat
Lector universitar

ȚURCANU CĂLIN
Chișinău 2019
Cerinte:
1. Elaboraţi un program pentru pentru trecerea dintr-o matrice in alta in cadrul unui
graf:
Matricea de adiacenta->Matricea de incidenta->Matricea kirchhoff
Matricea de adiacenta fiind deja cunoscuta, introdusă cu un input, importată ditr-un fișier sau regăsita
in program.
2. Elaborați un program ce va parcurge graficul iterativ în adîncime începând cu un
vârf vs de start.
3. Rezolvarea problemelor 12 și 9 propuse.

12.
Stabiliți condițiile, în care graful muchiilor unui graf G = (X;U ) este regulat.

9.
De demonstrat, ca centrul unui graf conex G aparține unui bloc din G .

1. Perechea ( X ,U ) , unde X este o mulţime nevidă de elemente distincte, iar U este o mulţime
formată din perechi neordonate de elemente din X , se numeşte graf neorientat.
O matrice binară A = aij de dimensiune n  n se numeşte matrice de adiacenţă a grafului G cu

mulţimea de vârfuri X G = x1 , x2 ,..., xn  , dacă:

1, în cazul când xi  x j ,


aij = 
0, în caz contrar.
Matricea de adiacenţă a grafului este o matrice simetrică cu elementele de pe diagonala principală egale
cu zero. Liniile şi coloanele acestei matrici corespund vârfurilor grafului. Numărul de unităţi dintr-o linie
(coloană) este egal cu gradul vârfului corespunzător acestei linii (coloane).

O matrice binară B = bij , de dimensiune n  m se numeşte matrice de incidenţă a grafului


G = ( X ;U ) , X = {x1 , x 2 ,..., x n } , U = {u1 , u2 ,..., um } , dacă
1, în cazul când vârful xi şi muchia u j sunt incidente,
bij = 
0, în caz contrar.

În diverse aplicaţii ale teoriei grafurilor se mai întâlnesc şi alte tipuri de matrici, printre care matricea
distanţelor, matricea Kirhgoff, matricea de accesibilitate.Matricea Kirhgoff:

Pentru a îndeplini sarcina nr 1 am folosit limbajul de programare C:


#include <stdio.h>
#include <string.h>
#include <conio.h>
#define n 5
int numarare(int aray[n][n]){//functia ce calculeaza numarul de muchii
int k=0;// variabila in care se salveaza numarul de muchii
for (int i=0;i<n;i++)
for(int j=i;j<n;j++){
if (aray[i][j]==1)k++;}
return k;
}
int incidenta(int aray[n][n],int k){
int incidenta[n][k];
int u =0;
for (int i=0;i<n;i++)
for(int j=0;j<k;j++){
incidenta[i][j]=0;
}
while(u<k){//parcurgerea matricei si completarea matricei de incidenta
for (int i=0;i<n;i++)
for(int j=i;j<n;j++){
if (aray[i][j]==1){
incidenta[i][u]=1;
incidenta [j][u]=1;
u++;
}
}
}
printf("\nMatricea de incidenta este:\n");
for (int i=0;i<n;i++){
printf("\n");
for(int j=0;j<k;j++){
printf("%3i",incidenta[i][j]);}}
kirchhoff(k,incidenta);
}
int kirchhoff(int k, int incidenta[n][k]){
int kirchhoff[n][n];
for(int j=0;j<n;j++){
for (int i=0;i<n;i++){
kirchhoff[i][j]=0;}}
//printf("%i",k);
for(int u=0;u<k;u++){
for(int i=0;i<n;i++)
if (incidenta[i][u]==1){
for (int j=i+1;j<n;j++)
if (incidenta[j][u]==1){
kirchhoff[i][j]= -1;
kirchhoff[j][i]= -1;
kirchhoff[i][i]++;
kirchhoff[j][j]++;
break;}
break;}
}
printf("\nMatricea kirchhoff este:\n");
for (int i=0;i<n;i++){
printf("\n");
for(int j=0;j<n;j++){
printf("%3i",kirchhoff[i][j]);
}
}
}
main()
{
int adiacenta[n][n]={ {0,0,0,0,1},
{0,0,1,0,1},
{0,1,0,1,0},
{0,0,1,0,1},
{1,1,0,1,0}};
printf("\nMatricea de adiacenta este:\n");
for (int i=0;i<n;i++){
printf("\n");
for(int j=0;j<n;j++){
printf("%3i",adiacenta[i][j]);
}
}
int k =numarare(adiacenta);
incidenta(adiacenta,k);
#include<stdio.h>
#define n 5
int Graph[n][n]={ {0,0,0,0,1},
{0,0,1,0,1},
{0,1,0,1,0},
{0,0,1,0,1},
{1,1,0,1,0}};//matricea de adiacenta
int visited[n]; //n este numarul varfurilor care urmeaza a fi introdus in graful graf [n][n]
main()
{
int i,j,v;
// printf("Introduceti numarul de varfuri:");
//scanf("%i",&n);
//introducerea matricei de adiacenta
//printf("\nIntroduceti matricea de adiacenta:");//se poate folosi matricea din exercitiul precedent
//vizitarile sunt initiate la 0
for( i=0;i<n;i++)
visited[i]=0;
printf("\nMatricea de adiacenta este:\n");
for ( i=0;i<n;i++){
printf("\n");
for( j=0;j<n;j++){
printf("%3i",Graph[i][j]);}
}
printf("\nCu ce varf ati dori sa incepem: ");
scanf("%d",&v);
DFS(v-1);// alegem nodul cu care incepem
}
void DFS(int i)
{
int j;
printf("\n\n %d",i+1);
visited[i]=1;

for( j=0;j<n;j++)
if(!visited[j]&&Graph[i][j]==1){//daca nodul nu a fost parcurs si daca este conexiune dintre noduri

DFS(j);}
}

Iar ca rezultat al executarii obtinem:

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