NOSSの雑記

主に競プロでやったことを書きます。

AOJ 2419 - Acrophobia

問題リンク

https://onlinejudge.u-aizu.ac.jp/problems/2419

問題概要

H*Wのマス目上を上下左右に移動します。Sからスタートし全てのMを一回以上通りながらGにたどり着くのにかかる最短時間を求めてください。隣り合うマス目の移動には1秒かかりますが穴の付近では変化します。(問題文参照)

制約

  • 2 <= H,W <= 100
  • 1 <= (Mの個数) <= 5

方針

まずそれぞれの関係をグラフで表してみます。便宜上Mには番号をふっておきます。

f:id:NOSS:20180812004451p:plain

だいぶスッキリしました。

求めるものは一筆書きのようにすべてのMを巡るときのSからGへの最短時間です。

Mが最大5と小さいことに注目するとMの巡り方全通りを調べられることがわかります (next_permutationを用いると簡単)。 S → (Mの順列) → G の順で巡るときの移動時間の和をとっていき、それらの最小値をとってくれば解が求まります。

あとは各頂点間の最短移動時間を求めておけばよく、これはマス目ごとの穴の影響を考慮したコストを求めておけば各頂点を始点としたダイクストラ法で求められます。

以上でこの問題は解けました。

コメント

このようなグラフのすべての頂点をすべて一回ずつ通るようなパスのことをハミルトン路と言います。最短ハミルトン路問題はbitDPを用いればO(N22N)で解くことができます。(N<=18程度が限界)