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

Giao Hàng

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

Lời giải: Giao Hàng

Hướng tiếp cận

Xây dựng đồ thị lưới với các nút là vị trí tọa độ nguyên. Với mỗi chặng từ điểm i đến điểm i+1, chạy Dijkstra trên lưới tránh các nút là điểm trung gian (không được đi qua). Tổng chi phí các chặng là đáp án.

Nhận xét quan trọng

  1. Khoảng cách tối thiểu giữa hai điểm trên lưới không có chướng ngại vật là khoảng cách Manhattan. Nhưng vì đường đi không được qua các điểm khác, đôi khi phải đi vòng.
  2. Không gian toạ độ lên đến 106, không thể xây đồ thị toàn bộ. Thay vào đó chỉ cần quan tâm đến tọa độ của N điểm và 4 láng giềng của chúng để tạo đồ thị nén (compressed coordinate graph).
  3. Mỗi chặng từ i đến i+1 phải tránh tất cả điểm khác (trừ ii+1). Chạy Dijkstra riêng cho từng chặng.
  4. Nếu không tồn tại đường đi hợp lệ cho một chặng nào đó, in 1.

Thuật toán

  1. Thu thập tất cả tọa độ xy của N điểm, cùng với x±1, y±1 để tạo lưới tọa độ rời rạc.
  2. Xây đồ thị: mỗi nút là giao điểm (cxi,cyj) trong lưới nén, các cạnh nối hai nút kề nhau với trọng số bằng khoảng cách thực.
  3. Với mỗi chặng (src,dst):
    • Đánh dấu các điểm "cấm" (tất cả điểm ngoại trừ srcdst).
    • Chạy Dijkstra từ src đến dst trên đồ thị nén, bỏ qua các nút bị cấm.
    • Cộng kết quả vào tổng.
  4. In tổng hoặc 1 nếu không thể.

Độ phức tạp

  • Thời gian: O(N·(N2logN)) — mỗi chặng Dijkstra trên đồ thị O(N2) nút
  • Bộ nhớ: O(N2)

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