canuc80k3401·2/50

Bảng Khoảng Cách

Nộp bài trên LQDOJ

Bài 34 · Shortest Paths

Cho một đồ thị vô hướng gồm đỉnh, được đánh số từ đến . Mỗi cạnh có một độ dài nguyên dương. Bạn cần trả lời truy vấn độc lập; mỗi truy vấn hỏi độ dài đường đi ngắn nhất giữa hai đỉnh cho trước.

Nếu hai đỉnh thuộc hai thành phần liên thông khác nhau thì không tồn tại đường đi giữa chúng.

Input

  • Dòng đầu chứa ba số nguyên và - số đỉnh, số cạnh và số truy vấn.
  • Mỗi dòng trong dòng tiếp theo chứa ba số nguyên , biểu thị một cạnh vô hướng nối với , có độ dài .

  • Mỗi dòng trong dòng cuối chứa hai số nguyên , yêu cầu khoảng cách ngắn nhất từ tới .

Output

  • Với mỗi truy vấn, in đáp án trên một dòng. Nếu không có đường đi, in .

Constraints

  • .
  • .
  • .
  • .
  • .
  • Có thể có khuyên và nhiều cạnh nối cùng một cặp đỉnh.

Scoring

  • Subtask ( số điểm): và .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

5 5 6
1 2 8
1 2 3
2 3 4
3 4 2
1 4 20
1 4
4 1
1 5
5 5
2 4
1 2

Output

9
9
-1
0
6
3

Giải thích: Cạnh độ dài giữa và cho đường có tổng độ dài , còn đỉnh không nối với đỉnh nào. Khoảng cách từ một đỉnh tới chính nó bằng .

Lời giải tóm tắt
  • Phân tích: Số đỉnh chỉ tới 500, trong khi số truy vấn có thể rất lớn. Vì vậy ta tính trước khoảng cách ngắn nhất cho mọi cặp đỉnh bằng Floyd-Warshall, rồi trả lời mỗi truy vấn trong O(1).
  • Thuật toán: Khởi tạo dist[i][i] = 0, các ô khác bằng vô cùng. Với mỗi cạnh vô hướng, cập nhật cả dist[a][b] và dist[b][a] bằng trọng số nhỏ nhất đã gặp.
  • Thuật toán: Lần lượt cho phép đỉnh k = 1..n làm đỉnh trung gian. Với mọi i, j, cập nhật
  • Thuật toán: dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]).
  • Thuật toán: Cuối cùng, mỗi truy vấn dùng trực tiếp một ô của ma trận; ô vô cùng được in là -1.
  • Chứng minh tính đúng đắn: Sau khi xử lý các đỉnh trung gian từ 1 tới k, dist[i][j] là độ dài nhỏ nhất của một đường từ i tới j chỉ dùng các đỉnh trong tập 1..k làm trung gian. Mệnh đề đúng ban đầu khi chưa có đỉnh trung gian. Khi thêm k, một đường tối ưu hoặc không đi qua k, hoặc tách được thành đường i -> k và k -> j; công thức cập nhật lấy đúng trường hợp tốt hơn. Với k = n, mọi đường hợp lệ đều đã được xét.
  • Độ phức tạp: Thời gian O(n^3 + q), bộ nhớ O(n^2).