Menu
CoddyTech

Floyd Warshall Algorithm

Un graphe orienté comportant n nœuds, numérotés de 0 à n-1, est donné sous la forme d’une matrice n par n : matrix[i][j] est le poids de l’arête allant du nœud i au nœud j, ou -1 s’il n’y en a pas, et matrix[i][i] vaut 0. La longueur d’un chemin est la somme des poids de ses arêtes.

Renvoyez une matrice n par n dont l’entrée [i][j] est la longueur du plus court chemin du nœud i au nœud j, ou -1 si le nœud j ne peut pas être atteint depuis le nœud i.

Fonction

shortestDistances(matrix: integer-2d-array) → integer-2d-array
matrixinteger-2d-array
les poids des arêtes : matrix[i][j] est le poids de l’arête de i à j, ou -1 lorsqu’il n’y en a pas
Renvoieinteger-2d-array
la distance la plus courte pour chaque paire de nœuds, -1 lorsqu'il n'y a pas de chemin

Contraintes

  • 1 ≤ n ≤ 100, où n = matrix.length = matrix[i].length
  • matrix[i][i] = 0
  • Pour i ≠ j, matrix[i][j] vaut -1 (aucune arête) ou 0 ≤ matrix[i][j] ≤ 1000.
  • Les arêtes sont à sens unique : matrix[i][j] et matrix[j][i] sont indépendantes.

Exemples

Entrée
matrix = [[0, 4, 11, -1], [-1, 0, 2, 9], [1, -1, 0, 3], [-1, -1, -1, 0]]
Sortie
[[0, 4, 6, 9], [3, 0, 2, 5], [1, 5, 0, 3], [-1, -1, -1, 0]]
Explication
En passant par le nœud 1, le nœud 0 atteint le nœud 2 en 6 au lieu de 11, et le nœud 3 en 9. Le nœud 1 atteint le nœud 0 en passant par le nœud 2 en 3. Rien ne part du nœud 3, donc sa ligne vaut -1 hors de la diagonale.
challenge icon

Pour aller plus loin

Après avoir construit le tableau, le coût d’une arête diminue. Peux-tu mettre à jour chaque distance en O(n²) au lieu de relancer les boucles O(n³) ?

Réinitialiser le code
def shortestDistances(matrix):
    # Écrivez le code ici

Test #1

Test #2

Argument

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

Résultat attendu

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