Module: algoritmo de Floyd


Problem

4 /10


O caminho mais curto

Theory Click to read/hide

Se um gráfico tiver ciclos de peso negativo, formalmente o algoritmo Floyd-Warshall não é aplicável a tal gráfico.

De fato, para aqueles pares de vértices i ej, entre os quais é impossível entrar em um ciclo de peso negativo, o algoritmo funcionará corretamente.

Para os mesmos pares de vértices para os quais não há resposta (devido à presença de um ciclo negativo no caminho entre eles), o algoritmo de Floyd encontrará algum número (possivelmente fortemente negativo, mas não necessariamente) como resposta. No entanto, o algoritmo de Floyd pode ser aprimorado para lidar com esses pares de vértices de maneira organizada e produzir, por exemplo, \(- \infty\).

Para fazer isso, por exemplo, o seguinte critério "inexistência do caminho" pode ser feito. Portanto, deixe o algoritmo comum do Floyd trabalhar neste gráfico. Então não há caminho mais curto entre os vértices i e j se e somente se houver um vértice t alcançável de i e do qual j é alcançável, para o qual  \(d [t][t]<0\).

Além disso, ao usar o algoritmo de Floyd para gráficos com ciclos negativos, deve-se lembrar que as distâncias que surgem no processo de trabalho podem ir de forma negativa, exponencialmente com cada fase. Portanto, você deve tomar cuidado com o estouro de número inteiro, limitando todas as distâncias abaixo para algum valor (por exemplo,  \(- \infty\)).

Verbalmente, a solução pode ser descrita da seguinte forma:
Após o algoritmo Floyd-Warshall ter funcionado para o grafo de entrada, vamos iterar sobre todos os pares de vértices \((i,j)\), e para cada um desses pares verificamos, infinitamente o caminho mais curto de i para j é pequeno ou não. Para fazer isso, vamos iterar sobre o terceiro vértice t, e se ele for \(d[t][t] < 0\)  (ou seja, encontra-se no ciclo de peso negativo), e é alcançável de i e j — então o caminho \((i,j)\) pode ser de comprimento infinitesimal.

Problem

Você recebe um grafo completo direcionado com alguns pesos (comprimentos) atribuídos às suas arestas. Os pesos podem ser positivos, negativos ou zero. Estamos interessados ​​no comprimento mínimo de todos os caminhos possíveis entre todos os pares de vértices distintos neste grafo. Será necessário descobrir se esse mínimo existe e, se existir, calculá-lo. (Não há mínimo se for possível encontrar um caminho de comprimento negativo no grafo, arbitrariamente grande em valor absoluto, tendendo ao infinito).
 
Entrada
A primeira linha é N≤50 vértices. A seguir vem a matriz de adjacência do grafo, ou seja, N linhas, cada uma contendo N números. O j-ésimo número na i-ésima linha da matriz de adjacência especifica o comprimento da aresta que vai do i-ésimo vértice ao j-ésimo. Os comprimentos podem assumir qualquer valor de -1.000.000 a 1.000.000. É garantido que haja zeros na diagonal principal da matriz.
 
Saída
Imprimir um único número – mínimo desejado. Se não existir, imprima  -1.
Exemplos
# Entrada Saída
1
3
0 42 18468 
6335 0 26501 
19170 15725 0 
42
2
3
0 -7 3
-2 0 10
2 215 0 
-1