SlideShare uma empresa Scribd logo
1 de 15
Baixar para ler offline
TREINAMENTO PARA COMPETIÇÕES DE
         PROGRAMAÇÃO

        GRAFOS - PARTE II
    ALL-PAIRS SHORTEST PATHS:

 O ALGORITMO DE FLOYD-
      WARSHALL
                         Murilo Adriano Vasconcelos
                        http://murilo.wordpress.com
O Problema




 • Dada a descrição de um grafo G(V, E)
   (implícita/explicitamente) sem ciclos
   negativos, queremos saber quais são as
   menores distâncias entre cada par de
   vértices vi, vj ∈ V.
Representação do Grafo

•Matriz de adjacência
•Peso da aresta de i para i é 0
•Arestas que não estão no grafo são
 representadas por ∞(um valor muito
 grande)
                                      -   a b c d e
                                      a   0   20   ∞    12   ∞
                                      b   ∞    0    8   ∞    3
                                      c   ∞   ∞     0   ∞    ∞
                                      d   ∞   ∞    17    0   4
                                      e   6   ∞     3    5   0
O Algoritmo
const int MAXV = 100; // número máximo de vértices
const int INF = 0x3f3f3f3f; // cuidado com esse valor
int grafo[MAXV][MAXV];

for (int i = 0; i < N; ++i) {
    for (int j = i; j < N; ++j)
        grafo[i][j] = grafo[j][i] = INF;

   grafo[i][i] = 0; // distância de i->i = 0
}
...
for (int k = 0; k < N; ++k) {
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            grafo[i][j] = min(grafo[i][j],
              grafo[i][k] + grafo[k][j]); // ir i->k->j
        }
    }
}
O Algoritmo - explicação
A cada passo, o algoritmo tenta diminuir a distância entre os
vértices i e j passando pelo vértice intermediário k.

O “k” representa o vértice intermediário atual. Assim, quando k
= 3 é finalizado, todos os grafo[i][j] estarão os menores
caminhos “podendo” passar pelos vértices 0, 1, 2 e 3. Ao final de
k == N-1 temos os menores caminhos podendo passar por todos
os vértices. Esse processo é chamado de relaxação.

// k indica o vértice intermediário que estamos processando
for (int k = 0; k < N; ++k) {
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            grafo[i][j] = min(grafo[i][j],
              grafo[i][k] + grafo[k][j]); // relaxando
        }
    }
}
Menor distância vs. distância direta


•Qual a menor distância entre b e c?
  •Distância direta = 8
  •Distância mínima = 6
               8              6              -   a b c d e
g[b][c] = min(g[b][c], g[b][e] + g[e][c]);

                                             a   0   20   ∞    12   ∞
                                             b   ∞    0    8   ∞    3
                                             c   ∞   ∞     0   ∞    ∞
                                             d   ∞   ∞    17    0   4
                                             e   6   ∞     3    5   0
Considerações

 • Utiliza O(N^2) espaço para guardar a
   matriz de adjacência
 • Complexidade de tempo O(N^3)
 • Ou seja, funciona bem para N <= 200
  • 200^2 = 40.000 x 4 = 160.000bytes
  • 200^3 = 8.000.000 operações
 • Se 200 < N <= 500 e você não tiver outra
   ideia, tente, talvez passa!!!
  • 500^3 = 125.000.000 operações!
Aplicações - Fecho Transitivo




 • Dada a descrição de um grafo direcionado,
   responder, para cada par de vértices, se
   existe pelo menos um caminho entre eles
Aplicações - Fecho Transitivo


• Matriz de adjacência binária
  • 1 - se existe uma aresta de i para j
  • 0 - caso contrário
                                           -   1 2 3 4
                                           1   1   0   0   0
                                           2   0   1   1   1
                                           3   0   1   1   0
                                           4   1   0   1   1
O Algoritmo

bool grafo[MAXV][MAXV]; // 1 existe uma aresta, 0 cc

for (int i = 0; i < N; ++i) {
    for (int j = i; j < N; ++j)
        grafo[i][j] = grafo[j][i] = false;

   grafo[i][i] = true; // existe um caminho de i para i
}
... // substitui o min() por um OR (||)
for (int k = 0; k < N; ++k) {
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            grafo[i][j] = grafo[i][j] ||
                (grafo[i][k] && grafo[k][j]);
        }
    }
}
Reconstrução do caminho



Alguns problemas podem pedir que você informe além dos
menores caminhos, o caminho em si.

Para isso, podemos armazenar facilmente as informações
necessárias para a reconstrução do caminho utilizando outra
matriz NxN e ir preenchendo na medida que uma relaxação é
feita.

Pra imprimir fazer um backtracking nessa matriz.
Reconstrução do caminho

int g[MAXV][MAXV]; // pesos das arestas
int path[MAXV][MAXV]; // armazenamento do caminho

// Inicializa o grafo e lê o grafo
// Inicializa path[i][j] com -1

for (int k = 0; k < N; ++k) {
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            if (g[i][k] + g[k][j] < g[i][j]) {
                g[i][j] = g[i][k] + g[k][j];
                path[i][j] = k; // de i pra j, passei por k
            }
        }
    }
}
Reconstrução do caminho
void print_path(int i, int j)
{
    if (g[i][j] == INF) {
        cout << “Sem caminhon”;
        return;
    }

     // Se não há alguém entre i e j (menor caminho é
     direto)
     if (path[i][j] == -1) {
         cout << “ “;
         return;
     }

     print_path(i, path[i][j]);
     cout << path[i][j] << “ “;
     print_path(path[i][j], j);
}
Alguns Problemas



SpojBR - MINIMO

Codeforces Round #33 Probl. B - String Problem

UVa   821 -   Page Hopping
UVa   10171   - Meeting Prof. Miguel...
UVa   10724   - Road Construction
UVa   10793   - The Orc Attack
UVa   10803   - Thunder Mountain
UVa   10987   - AntiFloyd
UVa   11015   - Rendezvous
Dúvidas?

Mais conteúdo relacionado

Mais procurados

Ita2013 1dia
Ita2013 1diaIta2013 1dia
Ita2013 1diacavip
 
Cammpos vetoriais disciplinas calculo_iii_lista04_calculo3
Cammpos vetoriais  disciplinas calculo_iii_lista04_calculo3Cammpos vetoriais  disciplinas calculo_iii_lista04_calculo3
Cammpos vetoriais disciplinas calculo_iii_lista04_calculo3Bowman Guimaraes
 
Aulas 11-guloso Algoritmos
Aulas 11-guloso AlgoritmosAulas 11-guloso Algoritmos
Aulas 11-guloso AlgoritmosKevin Takano
 
23 integrais triplas
23 integrais triplas23 integrais triplas
23 integrais triplasflanucos1968
 
Apostila funcao-de-segundo-grau
Apostila funcao-de-segundo-grauApostila funcao-de-segundo-grau
Apostila funcao-de-segundo-grauPetronio Paniago
 
Aplicações da integral_definida_-_comprimento_de_arco
Aplicações da integral_definida_-_comprimento_de_arcoAplicações da integral_definida_-_comprimento_de_arco
Aplicações da integral_definida_-_comprimento_de_arcomrsquiddo
 
Exercícios Resolvidos: Taxa relacionada
Exercícios Resolvidos: Taxa relacionadaExercícios Resolvidos: Taxa relacionada
Exercícios Resolvidos: Taxa relacionadaDiego Oliveira
 
Editdocument15107902255388
Editdocument15107902255388Editdocument15107902255388
Editdocument15107902255388Assis Nunes
 
Campos escalares e vetoriais - Cálculo 2
Campos escalares e vetoriais - Cálculo 2Campos escalares e vetoriais - Cálculo 2
Campos escalares e vetoriais - Cálculo 2Sandra Gaspar Martins
 
Exercícios - Princípio da Indução Finita (PIF)
Exercícios - Princípio da Indução Finita (PIF)Exercícios - Princípio da Indução Finita (PIF)
Exercícios - Princípio da Indução Finita (PIF)Rodrigo Thiago Passos Silva
 
Aplicação do k-NN utilizando Bitonic Sort
Aplicação do k-NN utilizando Bitonic SortAplicação do k-NN utilizando Bitonic Sort
Aplicação do k-NN utilizando Bitonic SortVinicius Coelho
 

Mais procurados (19)

4ª questão
4ª questão4ª questão
4ª questão
 
4ª questão
4ª questão4ª questão
4ª questão
 
4ª questão
4ª questão4ª questão
4ª questão
 
Ita2013 1dia
Ita2013 1diaIta2013 1dia
Ita2013 1dia
 
Cammpos vetoriais disciplinas calculo_iii_lista04_calculo3
Cammpos vetoriais  disciplinas calculo_iii_lista04_calculo3Cammpos vetoriais  disciplinas calculo_iii_lista04_calculo3
Cammpos vetoriais disciplinas calculo_iii_lista04_calculo3
 
Aulas 11-guloso Algoritmos
Aulas 11-guloso AlgoritmosAulas 11-guloso Algoritmos
Aulas 11-guloso Algoritmos
 
23 integrais triplas
23 integrais triplas23 integrais triplas
23 integrais triplas
 
Apostila funcao-de-segundo-grau
Apostila funcao-de-segundo-grauApostila funcao-de-segundo-grau
Apostila funcao-de-segundo-grau
 
Aplicações da integral_definida_-_comprimento_de_arco
Aplicações da integral_definida_-_comprimento_de_arcoAplicações da integral_definida_-_comprimento_de_arco
Aplicações da integral_definida_-_comprimento_de_arco
 
Exercícios Resolvidos: Taxa relacionada
Exercícios Resolvidos: Taxa relacionadaExercícios Resolvidos: Taxa relacionada
Exercícios Resolvidos: Taxa relacionada
 
Questão 2 blog fis14
Questão 2  blog fis14Questão 2  blog fis14
Questão 2 blog fis14
 
Editdocument15107902255388
Editdocument15107902255388Editdocument15107902255388
Editdocument15107902255388
 
Questão 2 blog fis14
Questão 2  blog fis14Questão 2  blog fis14
Questão 2 blog fis14
 
Trigonometria fórmls exc
Trigonometria fórmls excTrigonometria fórmls exc
Trigonometria fórmls exc
 
Campos escalares e vetoriais - Cálculo 2
Campos escalares e vetoriais - Cálculo 2Campos escalares e vetoriais - Cálculo 2
Campos escalares e vetoriais - Cálculo 2
 
Integral de linha
Integral de linhaIntegral de linha
Integral de linha
 
Exercícios - Princípio da Indução Finita (PIF)
Exercícios - Princípio da Indução Finita (PIF)Exercícios - Princípio da Indução Finita (PIF)
Exercícios - Princípio da Indução Finita (PIF)
 
Tensão média e tensão eficaz
Tensão média e tensão eficazTensão média e tensão eficaz
Tensão média e tensão eficaz
 
Aplicação do k-NN utilizando Bitonic Sort
Aplicação do k-NN utilizando Bitonic SortAplicação do k-NN utilizando Bitonic Sort
Aplicação do k-NN utilizando Bitonic Sort
 

Destaque

Tópicos Avançados em Computabilidade - Teorema da Recursão e Decibilidade de ...
Tópicos Avançados em Computabilidade - Teorema da Recursão e Decibilidade de ...Tópicos Avançados em Computabilidade - Teorema da Recursão e Decibilidade de ...
Tópicos Avançados em Computabilidade - Teorema da Recursão e Decibilidade de ...Murilo Adriano Vasconcelos
 
Introdução ao Processamento de Imagens Digitais
Introdução ao Processamento de Imagens DigitaisIntrodução ao Processamento de Imagens Digitais
Introdução ao Processamento de Imagens DigitaisMurilo Adriano Vasconcelos
 
Treinamento Para competições de Programação do INF-UFG - Grafos Parte 1 - Tur...
Treinamento Para competições de Programação do INF-UFG - Grafos Parte 1 - Tur...Treinamento Para competições de Programação do INF-UFG - Grafos Parte 1 - Tur...
Treinamento Para competições de Programação do INF-UFG - Grafos Parte 1 - Tur...Murilo Adriano Vasconcelos
 
Processamento de Imagens Digitais - Transformações de Intensidade, Filtragem ...
Processamento de Imagens Digitais - Transformações de Intensidade, Filtragem ...Processamento de Imagens Digitais - Transformações de Intensidade, Filtragem ...
Processamento de Imagens Digitais - Transformações de Intensidade, Filtragem ...Murilo Adriano Vasconcelos
 
Introdução ao Processamento de Imagem Digital - Relacionamentos básicos entre...
Introdução ao Processamento de Imagem Digital - Relacionamentos básicos entre...Introdução ao Processamento de Imagem Digital - Relacionamentos básicos entre...
Introdução ao Processamento de Imagem Digital - Relacionamentos básicos entre...Murilo Adriano Vasconcelos
 
Caminhos Mínimos: Dijkstra e Floyd-Warshall
Caminhos Mínimos: Dijkstra e Floyd-WarshallCaminhos Mínimos: Dijkstra e Floyd-Warshall
Caminhos Mínimos: Dijkstra e Floyd-WarshallJohnnatan Messias
 

Destaque (9)

Tópicos Avan
Tópicos AvanTópicos Avan
Tópicos Avan
 
Tópicos Avançados em Computabilidade - Teorema da Recursão e Decibilidade de ...
Tópicos Avançados em Computabilidade - Teorema da Recursão e Decibilidade de ...Tópicos Avançados em Computabilidade - Teorema da Recursão e Decibilidade de ...
Tópicos Avançados em Computabilidade - Teorema da Recursão e Decibilidade de ...
 
Design Patterns - Adapter e Decorator
Design Patterns - Adapter e DecoratorDesign Patterns - Adapter e Decorator
Design Patterns - Adapter e Decorator
 
Introdução ao Processamento de Imagens Digitais
Introdução ao Processamento de Imagens DigitaisIntrodução ao Processamento de Imagens Digitais
Introdução ao Processamento de Imagens Digitais
 
Treinamento Para competições de Programação do INF-UFG - Grafos Parte 1 - Tur...
Treinamento Para competições de Programação do INF-UFG - Grafos Parte 1 - Tur...Treinamento Para competições de Programação do INF-UFG - Grafos Parte 1 - Tur...
Treinamento Para competições de Programação do INF-UFG - Grafos Parte 1 - Tur...
 
Processamento de Imagens Digitais - Transformações de Intensidade, Filtragem ...
Processamento de Imagens Digitais - Transformações de Intensidade, Filtragem ...Processamento de Imagens Digitais - Transformações de Intensidade, Filtragem ...
Processamento de Imagens Digitais - Transformações de Intensidade, Filtragem ...
 
Introdução ao Processamento de Imagem Digital - Relacionamentos básicos entre...
Introdução ao Processamento de Imagem Digital - Relacionamentos básicos entre...Introdução ao Processamento de Imagem Digital - Relacionamentos básicos entre...
Introdução ao Processamento de Imagem Digital - Relacionamentos básicos entre...
 
Caminhos Mínimos: Dijkstra e Floyd-Warshall
Caminhos Mínimos: Dijkstra e Floyd-WarshallCaminhos Mínimos: Dijkstra e Floyd-Warshall
Caminhos Mínimos: Dijkstra e Floyd-Warshall
 
Grafos e Árvores
Grafos e ÁrvoresGrafos e Árvores
Grafos e Árvores
 

Semelhante a Algoritmo de Floyd-Warshall para encontrar caminhos mínimos em grafos

Ita2006 3dia
Ita2006 3diaIta2006 3dia
Ita2006 3diacavip
 
Lista de exercícios para a prova sub-stitutiva - trigonometria e números com...
Lista de  exercícios para a prova sub-stitutiva - trigonometria e números com...Lista de  exercícios para a prova sub-stitutiva - trigonometria e números com...
Lista de exercícios para a prova sub-stitutiva - trigonometria e números com...Jhow Almeida
 
Aula1 funcaoquadrática
Aula1 funcaoquadráticaAula1 funcaoquadrática
Aula1 funcaoquadráticaJosenildo Lima
 
Introdução ao Matlab
Introdução ao MatlabIntrodução ao Matlab
Introdução ao Matlabedusfernandes
 
Exercicios resolvidos
Exercicios resolvidosExercicios resolvidos
Exercicios resolvidostexa0111
 
Conteúdo de matemática 8o ano
Conteúdo de matemática 8o anoConteúdo de matemática 8o ano
Conteúdo de matemática 8o anoMichele Boulanger
 
Conteúdo de matemática 8o ano
Conteúdo de matemática 8o anoConteúdo de matemática 8o ano
Conteúdo de matemática 8o anoMichele Boulanger
 
Derivadas Aplicações
Derivadas AplicaçõesDerivadas Aplicações
Derivadas AplicaçõesJones Fagundes
 
Glauco exercicios resolvidos (1)
Glauco exercicios resolvidos (1)Glauco exercicios resolvidos (1)
Glauco exercicios resolvidos (1)Amália Ribeiro
 
ResoluExame, Matemática A, 2011_2011
ResoluExame, Matemática A, 2011_2011ResoluExame, Matemática A, 2011_2011
ResoluExame, Matemática A, 2011_2011David Azevedo
 
Ita2013 3dia
Ita2013 3diaIta2013 3dia
Ita2013 3diacavip
 
Números inteiros relativos adição e subtração
Números inteiros relativos   adição e subtraçãoNúmeros inteiros relativos   adição e subtração
Números inteiros relativos adição e subtraçãoPatriciaLavos
 
Exercícios resolvidos de máximo e mínimo de função
Exercícios resolvidos de máximo e mínimo de funçãoExercícios resolvidos de máximo e mínimo de função
Exercícios resolvidos de máximo e mínimo de funçãoDiego Oliveira
 

Semelhante a Algoritmo de Floyd-Warshall para encontrar caminhos mínimos em grafos (20)

Ita2006 3dia
Ita2006 3diaIta2006 3dia
Ita2006 3dia
 
Trigonometria extra
Trigonometria extraTrigonometria extra
Trigonometria extra
 
Lista de exercícios para a prova sub-stitutiva - trigonometria e números com...
Lista de  exercícios para a prova sub-stitutiva - trigonometria e números com...Lista de  exercícios para a prova sub-stitutiva - trigonometria e números com...
Lista de exercícios para a prova sub-stitutiva - trigonometria e números com...
 
Complexos
ComplexosComplexos
Complexos
 
Complexos
ComplexosComplexos
Complexos
 
Complexos
ComplexosComplexos
Complexos
 
Aula1 funcaoquadrática
Aula1 funcaoquadráticaAula1 funcaoquadrática
Aula1 funcaoquadrática
 
Introdução ao Matlab
Introdução ao MatlabIntrodução ao Matlab
Introdução ao Matlab
 
Fatec1 mat
Fatec1 matFatec1 mat
Fatec1 mat
 
Exercicios resolvidos
Exercicios resolvidosExercicios resolvidos
Exercicios resolvidos
 
Conteúdo de matemática 8o ano
Conteúdo de matemática 8o anoConteúdo de matemática 8o ano
Conteúdo de matemática 8o ano
 
Conteúdo de matemática 8o ano
Conteúdo de matemática 8o anoConteúdo de matemática 8o ano
Conteúdo de matemática 8o ano
 
Derivadas Aplicações
Derivadas AplicaçõesDerivadas Aplicações
Derivadas Aplicações
 
Gab complexo formatrigonometrica2010
Gab complexo formatrigonometrica2010Gab complexo formatrigonometrica2010
Gab complexo formatrigonometrica2010
 
Glauco exercicios resolvidos (1)
Glauco exercicios resolvidos (1)Glauco exercicios resolvidos (1)
Glauco exercicios resolvidos (1)
 
ResoluExame, Matemática A, 2011_2011
ResoluExame, Matemática A, 2011_2011ResoluExame, Matemática A, 2011_2011
ResoluExame, Matemática A, 2011_2011
 
Ita2013 3dia
Ita2013 3diaIta2013 3dia
Ita2013 3dia
 
Números inteiros relativos adição e subtração
Números inteiros relativos   adição e subtraçãoNúmeros inteiros relativos   adição e subtração
Números inteiros relativos adição e subtração
 
Trigonometria
TrigonometriaTrigonometria
Trigonometria
 
Exercícios resolvidos de máximo e mínimo de função
Exercícios resolvidos de máximo e mínimo de funçãoExercícios resolvidos de máximo e mínimo de função
Exercícios resolvidos de máximo e mínimo de função
 

Algoritmo de Floyd-Warshall para encontrar caminhos mínimos em grafos

  • 1. TREINAMENTO PARA COMPETIÇÕES DE PROGRAMAÇÃO GRAFOS - PARTE II ALL-PAIRS SHORTEST PATHS: O ALGORITMO DE FLOYD- WARSHALL Murilo Adriano Vasconcelos http://murilo.wordpress.com
  • 2. O Problema • Dada a descrição de um grafo G(V, E) (implícita/explicitamente) sem ciclos negativos, queremos saber quais são as menores distâncias entre cada par de vértices vi, vj ∈ V.
  • 3. Representação do Grafo •Matriz de adjacência •Peso da aresta de i para i é 0 •Arestas que não estão no grafo são representadas por ∞(um valor muito grande) - a b c d e a 0 20 ∞ 12 ∞ b ∞ 0 8 ∞ 3 c ∞ ∞ 0 ∞ ∞ d ∞ ∞ 17 0 4 e 6 ∞ 3 5 0
  • 4. O Algoritmo const int MAXV = 100; // número máximo de vértices const int INF = 0x3f3f3f3f; // cuidado com esse valor int grafo[MAXV][MAXV]; for (int i = 0; i < N; ++i) { for (int j = i; j < N; ++j) grafo[i][j] = grafo[j][i] = INF; grafo[i][i] = 0; // distância de i->i = 0 } ... for (int k = 0; k < N; ++k) { for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { grafo[i][j] = min(grafo[i][j], grafo[i][k] + grafo[k][j]); // ir i->k->j } } }
  • 5. O Algoritmo - explicação A cada passo, o algoritmo tenta diminuir a distância entre os vértices i e j passando pelo vértice intermediário k. O “k” representa o vértice intermediário atual. Assim, quando k = 3 é finalizado, todos os grafo[i][j] estarão os menores caminhos “podendo” passar pelos vértices 0, 1, 2 e 3. Ao final de k == N-1 temos os menores caminhos podendo passar por todos os vértices. Esse processo é chamado de relaxação. // k indica o vértice intermediário que estamos processando for (int k = 0; k < N; ++k) { for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { grafo[i][j] = min(grafo[i][j], grafo[i][k] + grafo[k][j]); // relaxando } } }
  • 6. Menor distância vs. distância direta •Qual a menor distância entre b e c? •Distância direta = 8 •Distância mínima = 6 8 6 - a b c d e g[b][c] = min(g[b][c], g[b][e] + g[e][c]); a 0 20 ∞ 12 ∞ b ∞ 0 8 ∞ 3 c ∞ ∞ 0 ∞ ∞ d ∞ ∞ 17 0 4 e 6 ∞ 3 5 0
  • 7. Considerações • Utiliza O(N^2) espaço para guardar a matriz de adjacência • Complexidade de tempo O(N^3) • Ou seja, funciona bem para N <= 200 • 200^2 = 40.000 x 4 = 160.000bytes • 200^3 = 8.000.000 operações • Se 200 < N <= 500 e você não tiver outra ideia, tente, talvez passa!!! • 500^3 = 125.000.000 operações!
  • 8. Aplicações - Fecho Transitivo • Dada a descrição de um grafo direcionado, responder, para cada par de vértices, se existe pelo menos um caminho entre eles
  • 9. Aplicações - Fecho Transitivo • Matriz de adjacência binária • 1 - se existe uma aresta de i para j • 0 - caso contrário - 1 2 3 4 1 1 0 0 0 2 0 1 1 1 3 0 1 1 0 4 1 0 1 1
  • 10. O Algoritmo bool grafo[MAXV][MAXV]; // 1 existe uma aresta, 0 cc for (int i = 0; i < N; ++i) { for (int j = i; j < N; ++j) grafo[i][j] = grafo[j][i] = false; grafo[i][i] = true; // existe um caminho de i para i } ... // substitui o min() por um OR (||) for (int k = 0; k < N; ++k) { for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { grafo[i][j] = grafo[i][j] || (grafo[i][k] && grafo[k][j]); } } }
  • 11. Reconstrução do caminho Alguns problemas podem pedir que você informe além dos menores caminhos, o caminho em si. Para isso, podemos armazenar facilmente as informações necessárias para a reconstrução do caminho utilizando outra matriz NxN e ir preenchendo na medida que uma relaxação é feita. Pra imprimir fazer um backtracking nessa matriz.
  • 12. Reconstrução do caminho int g[MAXV][MAXV]; // pesos das arestas int path[MAXV][MAXV]; // armazenamento do caminho // Inicializa o grafo e lê o grafo // Inicializa path[i][j] com -1 for (int k = 0; k < N; ++k) { for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { if (g[i][k] + g[k][j] < g[i][j]) { g[i][j] = g[i][k] + g[k][j]; path[i][j] = k; // de i pra j, passei por k } } } }
  • 13. Reconstrução do caminho void print_path(int i, int j) { if (g[i][j] == INF) { cout << “Sem caminhon”; return; } // Se não há alguém entre i e j (menor caminho é direto) if (path[i][j] == -1) { cout << “ “; return; } print_path(i, path[i][j]); cout << path[i][j] << “ “; print_path(path[i][j], j); }
  • 14. Alguns Problemas SpojBR - MINIMO Codeforces Round #33 Probl. B - String Problem UVa 821 - Page Hopping UVa 10171 - Meeting Prof. Miguel... UVa 10724 - Road Construction UVa 10793 - The Orc Attack UVa 10803 - Thunder Mountain UVa 10987 - AntiFloyd UVa 11015 - Rendezvous