Sunteți pe pagina 1din 3

MINISTERUL EDUCAȚIEI ȘI CERCETĂRII

AL REPUBLICII MOLDOVA
UNIVERSITATEA TEHNICĂ A MOLDOVEI

INFORMATICĂ ȘI INGINERIA SISTEMELOR

RAPORT
Lucrarea de laborator nr. 5
Tema: Algoritmi de determinare a drumului minim.

A efectuat: Batranac Adriana


st. gr. AI-221

A verificat: V.Melnic

Chişinău, 2023
Lucrare de laborator Nr. 5
Tema: Algoritmi de determinare a drumului minim.
1. Scopul lucrării:
1. Studiereaalgoritmilordedeterminareadrumurilorminimeșimaximeîntr- un
graf;
2. Elaborarea programelor de determinare a drumului minim și maxim într- un
graf ponderat.
2. Sarcina:
1. Elaboraţi procedura introducerii unui graf ponderat.
2. Elaboraţi procedurile determinării drumului minim utilizând algoritmul
Bellman-Kalaba.
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 Bellman-Kalaba
➢Extragerea informaţiei la display (valoarea drumului minim şi
succesiunea vârfurilor care formează acest drum);
3. Întrebări de control:
1. Ce se numeşte graf ponderat?
2. Definiţi noţiunea de distanţă.
3. Care sunt momentele principale în algoritmul Bellman-Kalaba?
4. Prin ce se deosebeşte algoritmul Ford de algoritmul Bellman-Kalaba?
5. Cum se va stabili succesiunea vârfurilor care formează drumul minim?

#include <stdio.h>
#include <stdlib.h>

#define NODES 8

int matricePonderata[NODES][NODES] =
{
{-50, 2, 8, -50, 6, -50, -50, -50},
{-50, -50, 2, 2, -50, -50, -50, -50},
{-50, -50, -50, 1, 2, -50, 4, -50},
{-50, -50, -50, -50, 3, 3, -50, 6},
{-50, -50, -50, -50, -50, 1, 2, 4},
{-50, -50, -50, -50, -50, -50, -50, 2},
{-50, -50, -50, -50, -50, -50, -50, 1},
{-50, -50, -50, -50, -50, -50, -50, -50}
};

int primvect[2][NODES], secundvect[2][NODES];

int main()
{
int end = 7, start = 0, randul = 0, maxSum, indice, isEqual = 0;
for (int i = 0; i < NODES; i++)
{
primvect[0][i] = matricePonderata[i][end];
primvect[1][i] = end;
}
while (isEqual == 0)
{
isEqual = 1;
while (randul < NODES)
{
maxSum = primvect[0][randul];
indice = primvect[1][randul];
for (int j = 0; j < NODES; j++)
{
if (matricePonderata[randul][j] + primvect[0][j] > maxSum)
{
maxSum = matricePonderata[randul][j] + primvect[0][j];
indice = j;
}
}
secundvect[0][randul] = maxSum;
secundvect[1][randul] = indice;
randul++;
}

for (int i = 0; i < NODES; i++)


{
if (secundvect[0][i] != primvect[0][i])
{
isEqual = 0;
randul = 0;
}
}

for (int j = 0; j < NODES; j++)


{
primvect[0][j] = secundvect[0][j];
primvect[1][j] = secundvect[1][j];
}
}

printf("Bellman - Kalaba pentru drum maxim:\n%d ", start+1);


while (start != end)
{
start = secundvect[1][start];
printf("%d ", start+1);
}
return 0;
}

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