時は金なり

この問題はタクシースタンドを頂点,歩道・車道を辺とするグラフとして考えることができる. そのグラフ上で複数の最短経路を求める問題である.

頂点 n に到達するのに必要なタクシーに乗る最小の回数を k とする. この場合の待ち時間の合計は 2 k - 1 分である. 高々 n 回の移動があり,そのコストは各 1000000 分以下であり n は 20000 以下なので, タクシーに乗る回数がちょうど k 回の経路にかかる時間は 2 * 10 10 + 2 k - 1 以下である. タクシーに乗る回数 k+1 回の待ち時間の合計 2k+1-1 は k が 35 以上の場合はちょうど k 回乗る経路にかかる時間より大きい. そのため,k が 35 以上の場合はタクシーに乗る回数がちょうど最小値 k になる経路だけ考えればよい.

タクシーに乗っている状態と乗っていない状態を区別するために頂点数を 2 倍したグラフを作る. 車道や歩道のコストを 0,タクシーに乗っていない状態から乗っている状態への辺のコストを 1 にしたグラフで幅優先探索などでタクシーに乗る最小回数 k を求めることができる. k が 35 未満の場合と 35 以上の場合で分けて解く.

k が 35 未満の場合,頂点を更に増やしてタクシーに乗った回数 (0 回から 34 回) を区別できるグラフを作る.車道や歩道はその移動にかかる時間をコストにし,タクシーに乗るときの辺はその待ち時間をコストにする. このグラフ上で最短経路問題をダイクストラ法で解くことで答えを求めることができる.

k が 35 以上の場合,タクシーに乗る回数が最小値 k になる経路の中で,車道や歩道にかかる時間の最小値を求めたい. これはグラフの移動のコストを (タクシーに乗った回数,車道や歩道を移動した時間の合計) の順番に比較するような 2 要素のコストにして 最短経路問題をダイクストラ法で解くことで答えを求めることができる.