Sunteți pe pagina 1din 8

MINISTERUL EDUCAȚIEI, CULTURII ȘI CERCETĂRII

AL REPUBLICII MOLDOVA
Universitatea Tehnică a Moldovei
Facultatea Calculatoare, Informatică şi Microelectronică
Departamentul Informatică şi Ingineria Sistemelor

Gîsca Vlad

Raport
pentru lucrarea de laborator Nr.4

la cursul de “Matematică discretă”


Tema: : Algoritmi de determinare a drumului minim.

Verificat:
Melnic Vladimir, Lector Universitar,
Facultatea FCIM,
Chișinău – 2024
1.Scopul lucrării:

1. Studierea algoritmilor de determinare a drumurilor minime și maxime întrun graf;

2. Elaborarea programelor de determinare a drumului minim și maxim întrun graf


ponderat.

2. Sarcina:

1. Elaboraţi procedura introducerii unui graf ponderat.

2. Elaboraţi procedurile determinării drumului minim utilizând algoritmul Ford.

3. Realizaţi un program cu următoarele funcţii:

➢ Introducerea grafului ponderat cu posibilităţi de analiză sintactică şi semantică şi


de corectare a informaţiei;

➢ Determinarea drumului minim utilizând algoritmul Ford

➢ Extragerea informaţiei la display (valoarea drumului minim şi succesiunea


vârfurilor care formează acest drum);
Codul:

#include <stdio.h>

#include <stdlib.h> // Pentru alocare dinamică de memorie

#define INF 99999

int *H;

int *precedent;

int schimbare = 0;

void Ford(int varfuri, int graf[][varfuri]) {

schimbare = 0;

for (int i = 0; i < varfuri; i++) {

for (int j = 0; j < varfuri; j++) {

if (graf[i][j] > 0 && H[i] + graf[i][j] < H[j]) {

H[j] = H[i] + graf[i][j];

precedent[j] = i;

schimbare = 1;

if (schimbare) {

Ford(varfuri, graf);

}
}

void drum(int start, int end) {

if (end != start) {

drum(start, precedent[end]);

printf("%d ", end + 1);

int main() {

int varfuri, muchii, start, end, pondere, sfarsit;

printf("Introduceti numarul de varfuri: ");

scanf("%d", &varfuri);

printf("Introduceti numarul de muchii: ");

scanf("%d", &muchii);

// Alocare dinamică pentru H și precedent

H = (int *)malloc(varfuri * sizeof(int));

precedent = (int *)malloc(varfuri * sizeof(int));

// Inițializare H cu INF și precedent cu -1

for (int i = 0; i < varfuri; i++) {

H[i] = INF;

precedent[i] = -1;
}

// Citirea muchiilor și ponderilor

int graf[varfuri][varfuri];

for (int i = 0; i < varfuri; i++) {

for (int j = 0; j < varfuri; j++) {

graf[i][j] = 0;

for (int i = 0; i < muchii; i++) {

printf("Introduceti varful de start, varful de sfarsit si ponderea pentru muchia %d: ", i + 1);

scanf("%d %d %d", &start, &end, &pondere);

graf[start - 1][end - 1] = pondere;

// Afișare matrice de adiacență

printf("\nMatricea de adiacență pentru graful orientat ponderat este:\n");

for (int i = 0; i < varfuri; i++) {

for (int j = 0; j < varfuri; j++) {

printf("%d ", graf[i][j]);

printf("\n");

}
// Introducerea nodului de start și de sfârșit

printf("\nIntroduceti varful de start pentru determinarea drumurilor minime: ");

scanf("%d", &start);

start--;

printf("Introduceti varful de sfarsit pentru determinarea drumurilor minime: ");

scanf("%d", &sfarsit);

sfarsit--;

// Initializare H pentru nodul de start

H[start] = 0;

// Apelul algoritmului Ford

Ford(varfuri, graf);

// Afisarea drumului minim

printf("\nDrumul minim: ");

drum(start, sfarsit);

// Afisarea lungimii drumului minim

printf("\nLungimea drumului minim: %d\n", H[sfarsit]);

// Eliberarea memoriei alocate dinamic

free(H);

free(precedent);
return 0;

Outputul:
Concluzii:
Scopul lucrării este să studiem algoritmii de determinare a drumurilor minime și maxime într-un
graf ponderat și să elaborăm programe care să implementeze acești algoritmi. Prin această lucrare,
ne propunem să înțelegem modul în care algoritmii precum algoritmul lui Ford-Bellman
funcționează pentru găsirea celor mai scurte sau mai lungi drumuri între două noduri într-un graf
ponderat.

Prin elaborarea programelor, vom putea aplica acești algoritmi în practică pentru a rezolva diverse
probleme legate de rețele, transport, telecomunicații sau alte domenii în care este important să găsim
drumurile optime între diferite puncte.

Astfel, lucrarea urmărește să ofere o înțelegere profundă a conceptelor de bază ale algoritmilor de
determinare a drumurilor minime și maxime într-un graf, să ofere cunoștințe practice despre
implementarea acestor algoritmi și să evidențieze importanța lor în rezolvarea diverselor probleme
din domenii variate.

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