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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Perguntas???




Jéverson, João, Sueli, Thalles (Unifal-MG)                  23 de setembro de 2012   16 / 16

Algoritmo de Floyd-Warshall

  • 1.
    UNIVERSIDADE FEDERAL DEALFENAS 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 seencontrar 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 entretodos 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 entretodos 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 entretodos 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 entretodos 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 entretodos 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 xDijkstra 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
  • 16.
    Perguntas??? Jéverson, João, Sueli,Thalles (Unifal-MG) 23 de setembro de 2012 16 / 16