trang chủ / bài tập / werewolf / lời giải

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.
Tác giả: huunguyenhuunguyen

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

  1. Trạng thái đầy đủ của người sói là (u,p) với u là khu vực hiện tại và p=tmodT là pha trăng. Vì wi1, hai trạng thái (u,p) khác nhau hoàn toàn xác định khả năng di chuyển tiếp.

  2. Đồ thị mở rộng có N×T đỉnh. Mỗi cạnh gốc (u,v,w,l,r) tạo ra nhiều cạnh trong đồ thị mở rộng: với mỗi pha p[l,r], ta có cạnh từ (u,p) đến (v,(p+w)modT) với trọng số w.

  3. Thao tác "chờ" tạo cạnh trọng số 1 từ (u,p) đến (u,(p+1)modT) với mọi up.

  4. Khoảng pha [l,r] có thể quay vòng (khi l>r), cần xử lý đúng.

Thuật toán

Time-Expanded Dijkstra
  1. Xây đồ thị mở rộng (không cần tường minh - xử lý khi duyệt):

    • Đỉnh: (u,p) với 1uN0p<T
    • Cạnh di chuyển: với mỗi cạnh gốc (u,v,w,l,r) và pha p hợp lệ (trong [l,r]), thêm cạnh (u,p)(v,(p+w)modT) trọng số w
    • Cạnh chờ: (u,p)(u,(p+1)modT) trọng số 1
  2. Dijkstra từ trạng thái (1,0):

    • dist[u][p] = thời gian ngắn nhất đến khu vực u ở pha p
    • Dùng priority queue min-heap
    • Khi xét trạng thái (u,p), thử tất cả cạnh kề của u và cạnh chờ
  3. Kết quả: min0p<Tdist[N][p]. Nếu tất cả đều , in 1.

Kiểm tra pha hợp lệ

Pha p thuộc khoảng [l,r]:

  • Nếu lr: lpr
  • Nếu l>r: pl hoặc pr

Độ phức tạp

  • Thời gian: O((N·T+M·T)log(N·T)) - Dijkstra trên đồ thị mở rộng với N·T đỉnh và (M+N)·T cạnh.
  • Bộ nhớ: O(N·T+M) - mảng khoảng cách và danh sách kề.

Bình luận

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

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0