Hướng dẫn giải của Bedao Mini Contest 22 - Nhà khai phá và thần đèn


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Tác giả: Ddoraaaaa

Trước tiên, hãy xem xét thuật toán Floyd. Gọi ~dis_{u,v}~ là khoảng cách ngắn nhất từ ~u~ đến ~v~. Ban đầu, ~dis_{u,v} = e_{u,v}~. Ta lặp qua mỗi đỉnh từ ~1~ đến ~n~, và khi đến đỉnh ~i~, ta cập nhật cho mọi cặp đỉnh ~j, k~: ~dis_{j,k} = \min(dis_{j,k}, dis_{j,i} + dis_{i,k})~.

Chúng ta nhận thấy rằng thuật toán Floyd có một đặc điểm: khi vòng lặp ngoại cùng đến điểm ~k~ (chưa bắt đầu vòng lặp lần thứ ~k~), ~dis_{u,v}~ biểu thị cho đường đi ngắn nhất từ ~u~ đến ~v~ và chỉ đi qua các điểm có số thứ tự trong khoảng ~\left[1, k\right)~.

Vì vậy, trong quá trình lặp, với mỗi ~k~, ta duyệt qua tất cả các cặp ~(i, j)~ thỏa mãn ~i < k~, ~j < i~ và cập nhật câu trả lời. Độ dài chu trình này là ~d(i, j) + a(i, k) + a(j, k)~. Độ phức tạp là ~O(n^3)~.


Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.