Menu
CoddyTech

Floyd Warshall Algorithm

Cho một đồ thị có hướng gồm n nút, được đánh số từ 0 đến n-1, biểu diễn bằng ma trận n × n: matrix[i][j] là trọng số của cạnh từ nút i đến nút j, hoặc là -1 nếu không có cạnh, còn matrix[i][i] là 0. Độ dài của một đường đi bằng tổng trọng số các cạnh trên đường đi đó.

Trả về ma trận n × n, trong đó phần tử [i][j] là độ dài của đường đi ngắn nhất từ nút i đến nút j, hoặc là -1 nếu không thể đi từ nút i đến nút j.

Hàm

shortestDistances(matrix: integer-2d-array) → integer-2d-array
matrixinteger-2d-array
trọng số của các cạnh: matrix[i][j] là trọng số của cạnh từ i đến j, hoặc -1 nếu không có cạnh
Trả vềinteger-2d-array
khoảng cách ngắn nhất cho mỗi cặp nút, -1 nếu không có đường đi

Ràng buộc

  • 1 ≤ n ≤ 100, trong đó n = matrix.length = matrix[i].length
  • matrix[i][i] = 0
  • Với i ≠ j, matrix[i][j] bằng -1 (không có cạnh) hoặc 0 ≤ matrix[i][j] ≤ 1000.
  • Các cạnh chỉ có một chiều: matrix[i][j] và matrix[j][i] độc lập với nhau.

Ví dụ

Đầu vào
matrix = [[0, 4, 11, -1], [-1, 0, 2, 9], [1, -1, 0, 3], [-1, -1, -1, 0]]
Đầu ra
[[0, 4, 6, 9], [3, 0, 2, 5], [1, 5, 0, 3], [-1, -1, -1, 0]]
Giải thích
Thông qua nút 1, nút 0 đến nút 2 với chi phí 6 thay vì 11, và đến nút 3 với chi phí 9. Nút 1 đến nút 0 thông qua nút 2 với chi phí 3. Không có đường đi nào xuất phát từ nút 3, nên hàng của nút này có giá trị -1 ở ngoài đường chéo.
challenge icon

Câu hỏi mở rộng

Sau khi bạn dựng bảng, một cạnh sẽ có chi phí thấp hơn. Bạn có thể cập nhật mọi khoảng cách trong O(n²) thay vì chạy lại các vòng lặp O(n³) không?

Đặt lại code
def shortestDistances(matrix):
    # Viết code ở đây

Kiểm thử #1

Kiểm thử #2

Đối số

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

Đầu ra mong đợi

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