O documento apresenta o algoritmo de Floyd-Warshall para encontrar o menor caminho entre todos os pares de vértices de um grafo orientado e ponderado. O algoritmo utiliza programação dinâmica para calcular uma matriz contendo as distâncias mínimas entre todos os pares de vértices. Sua complexidade é de O(n3) onde n é o número de vértices do grafo.
1. UNIVERSIDADE FEDERAL DE ALFENAS Teoria dos Grafos
Algoritmo de Floyd-Warshall
Discentes: Jéverson Abreu, João A. Silva,
Sueli Perpétua, Thalles Terra
Docente: Douglas Castilho
Disciplina: Teoria dos Grafos
23 de setembro de 2012
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 1 / 16
2. Introdução
Também conhecido como algoritmo de Floyd, algoritmo de
Roy-Floyd, algoritmo de Roy-Warshall ou algoritmo WFI;
Foi explicado por Bernard Roy em 1959 e publica 3 anos
mais tarde por Stephen Warshall e Robert Floyd.
É um algoritmo que resolve o problema de encontrar o menor
caminho entre todos os pares de vértices de um grafo orientado e
ponderado
Ele apenas encontra os valores de tais caminhos, e não
a seqüência de arestas a ser percorrida.
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 2 / 16
3. Outras Aplicações
Calcular o Fecho Transitivo de um grafo;
Verificar se um grafo não-dirigido é bipartido;
Achar um vértice central, isto é, aquele que minimiza a distância
máxima ou média entre todos os vértices;
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 3 / 16
4. Problema de se encontrar um vértice central
Poderíamos pensar, em como avaliar o melhor local para
instalarmos uma loja. Podemos definir como melhor local aquele
que diminui a distância entre a loja e locais estratégicos como:
Um bairro onde o consumo dos produtos vendidos por ela é alto;
Estabelicimentos que prestarão serviços para a loja;
Um local onde se tenha uma grande concentração de um público
alvo para a loja.
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 4 / 16
5. Menor caminho entre todos os vértices
Dado um grafo G direcionado e ponderado, encontrar para todo
par u, v de vértices um caminho mínimo de u a v.
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 5 / 16
6. Menor caminho entre todos os vértices
O algorimto de Floyd-Warshall tem como objetivo calcular o
caminho mínimo entre cada par de vértices de um grafo
O grafo pode conter arestas negativas
Não pode conter ciclos negativos
Utiliza técnica de programação dinâmica
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 6 / 16
7. Menor caminho entre todos os vértices
Entrada: matriz de adjacência representando os pesos das
arestas de um grafo orientado e satisfaça a seguinte condição:
0,
se i = j,
yj = o peso da aresta orientada(i, j), se, i = j e (i, j) ∈ A,
∞,
caso contrário.
Saída: Uma matriz quadrada D|V |X |V | onde cada célula dij contém
a distancia mínima entre o vétice i e j, onde a entrada dij contém
o peso do caminho mais curto do vértice i até o vértice j.
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 7 / 16
8. Menor caminho entre todos os vértices
func floyd-Warshall(caminho[][])
for k = 1 to n
for i = 1 to n
for j = 1 to n
caminho[i][j] = min(caminho[i][j], caminho[i][k]+caminho[k][j])
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 8 / 16
9. Menor caminho entre todos os vértices
func floyd-Warshall(caminho[][])
for k = 1 to n
for i = 1 to n
for j = 1 to n
caminho[i][j] = min(caminho[i][j], caminho[i][k]+caminho[k][j])
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 9 / 16
10. Acompanhamento
Matriz de adjacência de entrada
0 8 5
D (0) = 3 0 ∞
∞ 2 0
Após iteração sobre o primeiro vértice
0 8 5
D (1) = 3 0 8
∞ 2 0
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 10 / 16
11. Acompanhamento
Após iteração sobre o segundo vértice
0 8 5
D (2) = 3 0 8
5 2 0
Após iteração sobre o terceiro vértice
0 7 5
D (3) = 3 0 8
5 2 0
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 11 / 16
12. Complexidade
É fácil analisar o tempo de execução do algoritmo de
Floyd-warshall. O laço principal é executado n vezes e o laço
interno considera cada um dos O(n2 ) pares de vértices,
realizando um operação de tempo constante para cada par. Se
usarmos uma estrutura de dados como a matriz de adjacência,
temos um tempo de execução total de O(n3 ).
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 12 / 16
13. Bellman Ford x Dijkstra x Floyd-Warshall
BF Dijkstra FW
|V |O(|V ∗ A|) |V |O(|V |2 + |A| O(|V |3 )
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 13 / 16
14. Considerações Finais
O Algoritmo de Floyd-Warshall e Bellman Ford trabalha com
arestas de peso negativo enquanto Dijkstra não.
Floyd-Warshall tem como saída uma matriz de caminho mínimos
já Bellman Ford e Dijkstra fornece um vetor.
No Dijkstra, é possível reproduzir o caminho, enquanto que o
Floyd-Warshall apenas fornece o caminho mais curto, e não a
sequência das arestas.
Bellman Ford aceita ciclo negativo enquanto Floyd-Warshall não.
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 14 / 16
15. Bibliografia
CORMEN, T. H.; LEISERSON, C. E.; RIVEST, R. L.; (2002).
Algoritmos - Teoria e Prática. Tradução da 2a edição americana.
Rio de Janeiro. Editora Campus
Jéverson, João, Sueli, Thalles (Unifal-MG) 23 de setembro de 2012 15 / 16