Hướng dẫn giải của Hành Trình Người Sói
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.
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.
Hướng tiếp cận
Bài toán tìm đường đi ngắn nhất trên đồ thị có trọng số phụ thuộc thời gian (time-dependent shortest path). Ta mở rộng không gian trạng thái bằng cách thêm chiều "pha trăng" và dùng Dijkstra trên đồ thị mở rộng.
Nhận xét quan trọng
Trạng thái đầy đủ của người sói là với là khu vực hiện tại và là pha trăng. Vì , hai trạng thái khác nhau hoàn toàn xác định khả năng di chuyển tiếp.
Đồ thị mở rộng có đỉnh. Mỗi cạnh gốc tạo ra nhiều cạnh trong đồ thị mở rộng: với mỗi pha , ta có cạnh từ đến với trọng số .
Thao tác "chờ" tạo cạnh trọng số 1 từ đến với mọi và .
Khoảng pha có thể quay vòng (khi ), cần xử lý đúng.
Thuật toán
Time-Expanded Dijkstra
Xây đồ thị mở rộng (không cần tường minh - xử lý khi duyệt):
- Đỉnh: với và
- Cạnh di chuyển: với mỗi cạnh gốc và pha hợp lệ (trong ), thêm cạnh trọng số
- Cạnh chờ: trọng số
Dijkstra từ trạng thái :
dist[u][p]= thời gian ngắn nhất đến khu vực ở pha- Dùng priority queue min-heap
- Khi xét trạng thái , thử tất cả cạnh kề của và cạnh chờ
Kết quả: . Nếu tất cả đều , in .
Kiểm tra pha hợp lệ
Pha thuộc khoảng :
- Nếu :
- Nếu : hoặc
Độ phức tạp
- Thời gian: - Dijkstra trên đồ thị mở rộng với đỉnh và cạnh.
- Bộ nhớ: - mảng khoảng cách và danh sách kề.
Bình luận