Menu
CoddyTech

Floyd Warshall Algorithm

Um grafo direcionado com n nós, numerados de 0 a n-1, é fornecido como uma matriz n por n: matrix[i][j] é o peso da aresta do nó i para o nó j, ou -1 quando não há nenhuma, e matrix[i][i] é 0. O comprimento de um caminho é a soma dos pesos de suas arestas.

Retorne uma matriz n por n cuja entrada [i][j] seja o comprimento do caminho mais curto do nó i ao nó j, ou -1 quando o nó j não puder ser alcançado a partir do nó i.

Função

shortestDistances(matrix: integer-2d-array) → integer-2d-array
matrixinteger-2d-array
os pesos das arestas: matrix[i][j] é o peso da aresta de i para j, ou -1 quando não há nenhuma
Retornainteger-2d-array
a menor distância para cada par de nós, -1 onde não há caminho

Restrições

  • 1 ≤ n ≤ 100, em que n = matrix.length = matrix[i].length
  • matrix[i][i] = 0
  • Para i ≠ j, matrix[i][j] é -1 (sem aresta) ou 0 ≤ matrix[i][j] ≤ 1000.
  • As arestas são unidirecionais: matrix[i][j] e matrix[j][i] são independentes.

Exemplos

Entrada
matrix = [[0, 4, 11, -1], [-1, 0, 2, 9], [1, -1, 0, 3], [-1, -1, -1, 0]]
Saída
[[0, 4, 6, 9], [3, 0, 2, 5], [1, 5, 0, 3], [-1, -1, -1, 0]]
Explicação
Por meio do nó 1, o nó 0 chega ao nó 2 com custo 6 em vez de 11, e ao nó 3 com custo 9. O nó 1 chega ao nó 0 por meio do nó 2 com custo 3. Nada sai do nó 3, então sua linha é -1 fora da diagonal.
challenge icon

Para ir além

Depois de construir a tabela, uma aresta fica mais barata. Você consegue atualizar todas as distâncias em O(n²) em vez de executar novamente os loops O(n³)?

Redefinir código
def shortestDistances(matrix):
    # Escreva o código aqui

Teste #1

Teste #2

Argumento

matrix = [[0, 4, 11, -1], [-1, 0, 2, 9], [1, -1, 0, 3], [-1, -1, -1, 0]]

Saída Esperada

[[0, 4, 6, 9], [3, 0, 2, 5], [1, 5, 0, 3], [-1, -1, -1, 0]]