Menu
CoddyTech

Floyd Warshall Algorithm

Ein gerichteter Graph mit n Knoten, nummeriert von 0 bis n-1, ist als n-mal-n-Matrix gegeben: matrix[i][j] ist das Gewicht der Kante von Knoten i zu Knoten j oder -1, wenn keine Kante vorhanden ist, und matrix[i][i] ist 0. Die Länge eines Pfads ist die Summe der Kantengewichte.

Gib eine n-mal-n-Matrix zurück, deren Eintrag [i][j] die Länge des kürzesten Pfads von Knoten i zu Knoten j ist oder -1, wenn Knoten j von Knoten i aus nicht erreichbar ist.

Funktion

shortestDistances(matrix: integer-2d-array) → integer-2d-array
matrixinteger-2d-array
die Kantengewichte: matrix[i][j] ist das Gewicht der Kante von i nach j oder -1, wenn keine vorhanden ist
Gibt zurückinteger-2d-array
die kürzeste Entfernung für jedes Knotenpaar, -1, wenn kein Pfad existiert

Einschränkungen

  • 1 ≤ n ≤ 100, wobei n = matrix.length = matrix[i].length
  • matrix[i][i] = 0
  • Für i ≠ j ist matrix[i][j] -1 (keine Kante) oder 0 ≤ matrix[i][j] ≤ 1000.
  • Kanten verlaufen in eine Richtung: matrix[i][j] und matrix[j][i] sind unabhängig.

Beispiele

Eingabe
matrix = [[0, 4, 11, -1], [-1, 0, 2, 9], [1, -1, 0, 3], [-1, -1, -1, 0]]
Ausgabe
[[0, 4, 6, 9], [3, 0, 2, 5], [1, 5, 0, 3], [-1, -1, -1, 0]]
Erklärung
Über Knoten 1 erreicht Knoten 0 Knoten 2 mit Kosten von 6 statt 11 und Knoten 3 mit Kosten von 9. Knoten 1 erreicht Knoten 0 über Knoten 2 mit Kosten von 3. Von Knoten 3 geht nichts ab, daher steht in seiner Zeile außerhalb der Diagonale -1.
challenge icon

Weiterführende Frage

Nachdem du die Tabelle erstellt hast, wird eine Kante günstiger. Kannst du jede Distanz in O(n²) aktualisieren, statt die O(n³)-Schleifen erneut auszuführen?

Code zurücksetzen
def shortestDistances(matrix):
    # Schreibe hier den Code

Test #1

Test #2

Argument

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

Erwartete Ausgabe

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