You are on page 1of 1

Algoritmul Bellman Ford poate fi folosit si pentru grafuri ce conin muchii de cost negativ,

dar nu poate fi folosit pentru grafuri ce conin cicluri de cost negativ (cnd cutarea unui
drum minim nu are sens). Cu ajutorul sau putem afla daca un graf conine cicluri.
Algoritmul folosete acelai mecanism de relaxare ca si Dijkstra, dar, spre deosebire de
acesta, nu optimizeaz o soluie folosind un criteriu de optim local, ci parcurge fiecare
muchie de un numr de ori egal cu numrul de noduri si ncearc sa o relaxeze de fiecare
data, pentru a mbunti distanta pn la nodul destinaie al muchiei curente.
Motivul pentru care se face acest lucru este ca drumul minim dintre sursa si orice nod
destinaie poate sa treac prin maximum |V| noduri (adic toate nodurile grafului); prin
urmare, relaxarea tuturor muchiilor de |V| ori este suficienta pentru a propaga pn la
toate nodurile informaia despre distanta minima de la sursa.

Daca, la sfritul acestor |E|*|V| relaxri, mai poate fi mbuntit o distan, atunci
graful are un ciclu de cost negativ si problema nu are soluie.

Meninnd notaiile anterioare, pseudocodul algoritmului este:

BellmanFord(sursa):
// initializari
foreach nod in V // V = multimea nodurilor
daca muchie[sursa, nod]
d[nod] = w[sursa, nod]
P[nod] = sursa
altfel
d[nod] = +
P[nod] = null
d[sursa] = 0
p[sursa] = null

// relaxari succesive
for i = 1 to |V|
foreach (u, v) in E // E = multimea muchiilor
daca d[v] > d[u] + w(u,v)
d[v] = d[u] + w(u,v)
p[v] = u;

// daca se mai pot relaxa muchii


foreach (u, v) in E
daca d[v] > d[u] + w(u,v)
fail (exista cicluri negativ)

Algoritmul Bellman Ford determin vrfurile minime de la un vrf de start x0 la toate celelalte vrfuri
in graf, chiar dac exist costuri negative pe arce. Se consider c exist soluie doar in cazul n care
vrful de start nu se ajunge la un circuit de cost negativ, deoarece acesta ar duce la minimizarea
drumului la infinit.

Algoritmul ncearc s minimizeze succesiv costul drumului de la x0 la orice vrf k din graf (d[k]) pn
la obinerea costului minim, astfel se verific pentru fiecare arc (j, k) dac particip la minimizarea
distanei de la x0 la k, adic dac respect condiia: d[k]> d[j]+ c[j][k].

Operaia de minimizare a distanelor se repet de n ori.

n final dac variabila ok va avea valoarea 1, semn c s-a descoperit un circuit negativ, un mesaj cu
acest text va fi afiat.

Complexitatea algoritmului este n mod evident O(|E|*|V|)

You might also like