ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

AOJ 2021 - お姫様の危機

問題
提出コード

解法

町の数が少ないので、まずは任意の2つの町を結ぶ最短経路を求めます。これは、ワーシャルフロイドを利用すれば簡単に求めることができます。
あとは、スタート地点から、今いる地点からM分以内で行ける、冷凍施設のある町のみを経由してゴールの町まで行くことができるかどうか、そしてその場合の最短経路を調べます。これは、ダイクストラ法を利用することで求めることができます。このとき求まった最短経路をDとします。
最後に、途中で冷凍する時間を追加してあげます。
最初の町にいる時点では、M分間冷やさなくても大丈夫です。また、
D \geqq Mの場合は、目的地に着いた時点で、ちょうど残り時間が0になるようにするのが最適です。
これらを踏まえると、結局は
 D + max(0,D - M)
が求める答えになります。

感想

ワーシャルフロイドとダイクストラを組み合わせる系問題でした(ダイクストラは2回目のワーシャルフロイドでも問題ない気もします)。この手の問題の考察をぱぱぱーっと解くことができると、昔よりは強くなったな、という気分になれます。
制約と、最短距離を求めたい雰囲気が出ている時点で、これらの手法が使いたくなりますね。