Bellman-Ford Algorithm

Bellman-Ford Algorithm is a dynamic programming problem that solves single-source shortest path.

d[v] = \infty
d[s] = 0
for i = 0, ..., n-2:
    for v in v:
        d_prev = d
        for u in v.in_neigbors:
            d[v] = min(d_prev[v], d_prev[u] + w(u,v))

Notice you need \(O\qty(n)\) space (2 \(d\) rounds, the previous round and the next round), and runtime is \(O\qty(nm)\) (outer \(n\) loop, inner is an iteration between \(deg\qty(v)*|v| = |e| = m\); that is, we have an minimum over the degree of each \(v\) for every \(v\), which adds up to the total number of edges.)

\(d^{(i)}[v]\) is the cost of the shortest path between \(s\) and \(v\) with at most \(i\) edges (i.e. we propagate “one edge of minimum” forward each time).

So \(d^{(n-1)}[v]\) is the cost of the shortest path between \(s\) and \(v\) if there are no negative cycles.

  1. if there are no negative cycle, after n iterations, the distance estimates will stop changing
  2. if there is a negative cycle, then the distances will keep updating

…so you can just run one more iteration of Bellman-Ford Algorithm to check for negative cycles.