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 code>) 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:
onde inf deve ser um inteiro correspondente que é sempre maior que o peso da aresta.
Após a 1ª passagem
Após a 2ª passagem
Após a 3ª passagem
Após a 4ª passagem
Se alimentarmos as arestas de 1 a 1, poderemos encontrar os comprimentos mais curtos após a 1ª passagem.