Ex - Don't Swim Editorial by toam


座標 \((x_i,y_i)\) の点を点 \(P_i\) とし,\(2\)\(X,Y\) の距離を \(\mathrm{dist}(X,Y)\) とします.

\(S\) から点 \(T\) への最短経路問題として考えます.点 \(P_{i}\) と点 \(P_{i+1}\) の間に距離 \(\mathrm{dist}(P_i, P_{i+1})\) の双方向の辺を張ります(\(P_{N+1}=P_1\) とします).

\(i\) に対して,線分 \(SP_i\) と多角形 \(C\) が点 \(P_i\) 以外で共有点を持たないとき,点 \(S\) から点 \(i\) に距離 \(\mathrm{dist}(S, P_i)\) の辺を張ります.線分 \(SP_i\) と多角形 \(C\) が共有点を持つかの判定は,\(2\) つの線分 \(SP_i, P_{i-1}P_{i+1}\) が交点を持たないかで判定することができます.同様の処理を \(T\) に対しても行います.

以上によって得られたグラフで \(S\) から \(T\) への最短経路を求めればよいです.貼られる辺は高々 \(3N\) 本なので,ダイクストラ法によって \(O(N \log N)\) で答えを求めることができます.

実装例

posted:
last update: