10.16 CW 模擬賽 D. 迷宮(maze)

Yorg發表於2024-10-17

題面

傳統 T4 找不到原題
掛個 pdf
題面下載

演算法

不容易想到把出發點, 有被困同伴的人稱作關鍵點
那麼只需要求出關鍵點之間, 關鍵點到任意一個終點的最短距離, 然後在搜尋即可求解

dijkstra 演算法求單源最短路

\(n > 10^3\), 顯然會 T 飛

dijkstra 演算法求單源最短路

\(\mathcal{O}(k m \log m + k!)\)
只能透過 \(50\%\) 的點

狀態壓縮 dp + 堆最佳化 dijkstra

觀察到 \(k\) 很小, 考慮最佳化搜尋

狀態定義

\(f_{i, S}\), 表示當前在 \(i\) 點, 經過的關鍵點集合為 \(S\) 時, 最短路徑

邊界條件與初始化

\[f_{i, 1 \mathcal{<<} i} = dis_{i, s} \]

狀態轉移方程

\[f_{i, \mathcal{S}} = \min^{j = 1}_{k} (f_{j, \mathcal{S} - (1 \mathcal{<<} i)} + dis_{i, j} \times SIZE_\mathcal{S}) \]

時間複雜度

程式碼

後補

總結

對於一些有多個階段(本題中為解救同伴)這一型別的題目

  • 分層圖
  • 全源最短路
  • dp

本題中將每一個特殊點抽象出來的思路值得學習
搜尋效率不高時考慮轉化 dp