Menu
CoddyTech

Floyd Warshall Algorithm

Задан ориентированный граф с n узлами, пронумерованными от 0 до n-1, в виде матрицы размера n на n: matrix[i][j] — это вес ребра от узла i к узлу j или -1, если ребра нет, а matrix[i][i] равно 0. Длина пути — это сумма весов его рёбер.

Верните матрицу размера n на n, в которой элемент [i][j] — это длина кратчайшего пути от узла i до узла j или -1, если из узла i нельзя достичь узла j.

Функция

shortestDistances(matrix: integer-2d-array) → integer-2d-array
matrixinteger-2d-array
веса рёбер: matrix[i][j] — это вес ребра из i в j или -1, если ребра нет
Возвращаетinteger-2d-array
кратчайшее расстояние для каждой пары узлов, -1, если пути нет

Ограничения

  • 1 ≤ n ≤ 100, где n = matrix.length = matrix[i].length
  • matrix[i][i] = 0
  • Для i ≠ j значение matrix[i][j] равно -1 (ребра нет) или 0 ≤ matrix[i][j] ≤ 1000.
  • Рёбра направлены в одну сторону: matrix[i][j] и matrix[j][i] независимы.

Примеры

Ввод
matrix = [[0, 4, 11, -1], [-1, 0, 2, 9], [1, -1, 0, 3], [-1, -1, -1, 0]]
Вывод
[[0, 4, 6, 9], [3, 0, 2, 5], [1, 5, 0, 3], [-1, -1, -1, 0]]
Пояснение
Через узел 1 узел 0 достигает узла 2 за 6 вместо 11, а узла 3 — за 9. Узел 1 достигает узла 0 через узел 2 за 3. Из узла 3 ничего не выходит, поэтому в его строке стоит -1 вне диагонали.
challenge icon

Дополнительный вопрос

После построения таблицы одно ребро становится дешевле. Можешь обновить все расстояния за O(n²), вместо того чтобы снова запускать циклы O(n³)?

Сбросить код
def shortestDistances(matrix):
    # Напишите здесь код

Тест #1

Тест #2

Аргумент

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

Ожидаемый вывод

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