かしのブログ

競技プログラミングとか

AtCoder Beginners Contest 164 E - Two Currencies

問題

十分多い金貨と S枚の銀貨を持って都市1にいる。  M本の線路はそれぞれ、都市 U_i - V_i間を走り、運賃は銀貨 A_i枚、時間は B_i分かかる。 各都市の料金所で D_i分かけて金貨1枚と銀貨 C_i枚を交換してくれる。 各都市に移動するのにかかる最小時間を求める。

atcoder.jp

考察

都市の数が50、運賃の上限が50なので、銀貨は2500枚あれば十分であることがわかる。コストを時間とし、今いる都市 iと所持している銀貨の枚数 cの状態で拡張ダイクストラ法を用いて解く。

路線 rを利用すると、都市 U_rで銀貨を c枚持っているとき、 B_r分後に都市 V_rで銀貨を c-A_r枚持っているので、この状態に辺を張る( U, Vの逆も)。

料金所 rを利用すると、都市 rで銀貨を c枚持っているとき、 D_r分後に都市 rで銀貨を c+C_r枚持っているので、この状態に辺を張る。

このグラフで (1, S)からの最短距離を求め、各都市の任意の銀貨の枚数でもっともかかったコストが小さいものが答え。ただし、 Sは2500あれば十分なので、超えているなら2500で置き換える。

実装

atcoder.jp