題面
傳統 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