Menu
CoddyTech

Floyd Warshall Algorithm

Se proporciona un grafo dirigido con n nodos, numerados del 0 al n-1, como una matriz de n por n: matrix[i][j] es el peso de la arista desde el nodo i hasta el nodo j, o -1 cuando no hay ninguna, y matrix[i][i] es 0. La longitud de un camino es la suma de los pesos de sus aristas.

Devuelve una matriz de n por n cuya entrada [i][j] es la longitud del camino más corto desde el nodo i hasta el nodo j, o -1 cuando no se puede llegar al nodo j desde el nodo i.

Función

shortestDistances(matrix: integer-2d-array) → integer-2d-array
matrixinteger-2d-array
los pesos de las aristas: matrix[i][j] es el peso de la arista de i a j, o -1 cuando no hay ninguna
Devuelveinteger-2d-array
la distancia más corta para cada par de nodos, -1 cuando no hay ningún camino

Restricciones

  • 1 ≤ n ≤ 100, donde n = matrix.length = matrix[i].length
  • matrix[i][i] = 0
  • Para i ≠ j, matrix[i][j] es -1 (sin arista) o 0 ≤ matrix[i][j] ≤ 1000.
  • Las aristas son unidireccionales: matrix[i][j] y matrix[j][i] son independientes.

Ejemplos

Entrada
matrix = [[0, 4, 11, -1], [-1, 0, 2, 9], [1, -1, 0, 3], [-1, -1, -1, 0]]
Salida
[[0, 4, 6, 9], [3, 0, 2, 5], [1, 5, 0, 3], [-1, -1, -1, 0]]
Explicación
A través del nodo 1, el nodo 0 llega al nodo 2 por 6 en lugar de 11, y al nodo 3 por 9. El nodo 1 llega al nodo 0 a través del nodo 2 por 3. No sale nada del nodo 3, así que su fila es -1 fuera de la diagonal.
challenge icon

Para ir más allá

Después de construir la tabla, una arista se vuelve más barata. ¿Puedes actualizar cada distancia en O(n²) en lugar de volver a ejecutar los bucles O(n³)?

Restablecer código
def shortestDistances(matrix):
    # Escribe el código aquí

Prueba #1

Prueba #2

Argumento

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

Salida Esperada

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