Menu
CoddyTech

Floyd Warshall Algorithm

Dany jest graf skierowany z n wierzchołkami ponumerowanymi od 0 do n-1, przedstawiony jako macierz n na n: matrix[i][j] to waga krawędzi z wierzchołka i do wierzchołka j albo -1, jeśli taka krawędź nie istnieje, a matrix[i][i] wynosi 0. Długość ścieżki to suma wag jej krawędzi.

Zwróć macierz n na n, której element [i][j] jest długością najkrótszej ścieżki z wierzchołka i do wierzchołka j albo wynosi -1, jeśli z wierzchołka i nie można dotrzeć do wierzchołka j.

Funkcja

shortestDistances(matrix: integer-2d-array) → integer-2d-array
matrixinteger-2d-array
wagi krawędzi: matrix[i][j] to waga krawędzi od i do j albo -1, jeśli jej nie ma
Zwracainteger-2d-array
najkrótsza odległość dla każdej pary węzłów, -1, gdy nie ma ścieżki

Ograniczenia

  • 1 ≤ n ≤ 100, gdzie n = matrix.length = matrix[i].length
  • matrix[i][i] = 0
  • Dla i ≠ j wartość matrix[i][j] wynosi -1 (brak krawędzi) lub 0 ≤ matrix[i][j] ≤ 1000.
  • Krawędzie są jednokierunkowe: matrix[i][j] i matrix[j][i] są niezależne.

Przykłady

Wejście
matrix = [[0, 4, 11, -1], [-1, 0, 2, 9], [1, -1, 0, 3], [-1, -1, -1, 0]]
Wyjście
[[0, 4, 6, 9], [3, 0, 2, 5], [1, 5, 0, 3], [-1, -1, -1, 0]]
Wyjaśnienie
Przez węzeł 1 węzeł 0 dociera do węzła 2 za 6 zamiast 11, a do węzła 3 za 9. Węzeł 1 dociera do węzła 0 przez węzeł 2 za 3. Z węzła 3 nic nie wychodzi, więc jego wiersz ma wartość -1 poza przekątną.
challenge icon

Pytanie dodatkowe

Po zbudowaniu tablicy koszt jednej krawędzi spada. Czy możesz zaktualizować każdą odległość w czasie O(n²), zamiast ponownie wykonywać pętle O(n³)?

Zresetuj kod
def shortestDistances(matrix):
    # Wpisz kod tutaj

Test #1

Test #2

Argument

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

Oczekiwany wynik

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