Algoritmo de Ford-Bellman


Algoritmo de Ford-Bellman
Vamos receber um grafo ponderado direcionado G com n vértices e m arestas, e algum vértice inicial v . É necessário encontrar os comprimentos dos caminhos mais curtos do vértice v para todos os outros vértices.

Como Dijkstra, Ford-Bellman procura a distância do vértice 1 a todos os outros, mas trabalha com arestas negativas forte>.
 
O próprio algoritmo de Ford-Bellman consiste em várias fases (n-1). A cada fase, todas as arestas do grafo são examinadas, e o algoritmo tenta relaxar ao longo de cada aresta (a, b) do custo c. Relaxamento ao longo de uma borda — esta é uma tentativa de melhorar o significado de d[a]  o valor d[b] + c. Na verdade, isso significa que estamos tentando melhorar a resposta para o vértice usando a aresta  e a resposta atual para o topo.

O array d é um array dos menores comprimentos do vértice inicial, assim como em Dijkstra, inicialmente o preenchemos com os maiores números possíveis, exceto para o vértice inicial, no qual você precisa colocar 0.
Para armazenar arestas, não é utilizada uma matriz de adjacência ou uma matriz de peso, mas uma lista que indica de qual nó a aresta sai (from), para onde ela vem (to) e seu peso (custo).
  borda da estrutura { int de, para, custo; }; vetor<borda> arestas;
A constante INF denota o número "infinito" - deve ser escolhido de forma que obviamente exceda todos os comprimentos de caminho possíveis.

A implementação mais simples do algoritmo: d[v] = 0; for (int i=0; i<n-1; ++i) para (int j=0; j<m; ++j)      if (d[bordas[j].de] <INF)        d[bordas[j].to] = min(d[bordas[j].to], d[bordas[j].de] + arestas[j].custo);

ou um pouco mais curto usando a sintaxe C++11:
  d[v] = 0; for (int i=0; i< n-1; ++i) para (aresta j: arestas) if (d[j.from] <INF) d[j.to] = min(d[j.to], d[j.de] + j.custo);

Exemplo de trabalho


Pegue um gráfico direcionado simples  com 5 nós, 4 arestas com peso igual a 1.

Vamos apresentar uma lista de arestas nessa ordem.
4 5 1
3 4 1
2 3 1
1 2 1


Valores iniciais na matriz de comprimentos mais curtos:
 
0 inf inf inf inf

onde inf deve ser um inteiro correspondente que é sempre maior que o peso da aresta.

Após a 1ª passagem
 
0 1 inf inf inf

Após a 2ª passagem
 
0 1 2 inf inf

Após a 3ª passagem
 
0 1 2 3 inf


Após a 4ª passagem
 
0 1 2 3 4

Se alimentarmos as arestas de 1 a 1, poderemos encontrar os comprimentos mais curtos após a 1ª passagem.