AOJ 2371 TransferTrain

概要

問題文

電車で目的地まで行くための最短経路を求めるというよくある感じの問題。

N本の路線がありそれぞれの路線はa_i個の駅からなる。 一つの路線について駅s_1,\ldots,s_{a_i}とそれらの間の所要時間t_1,\ldots,t_{a_i - 1}が与えられる。 電車は両方向にあるのでどちら向きに移動しても良い。

また、同じ駅が複数回現れる (異なる路線はもちろん、同じ路線でもありうる)とき、その駅は乗り換え駅で、時間Tで乗り換えることができる。

このとき今いる駅から目的駅までの最短時間と乗り換え回数を求めよ。最短経路が複数あるときは乗り換え回数が最小のものを求めよ。

制約:  1 \leq N \leq 5\times 10^4,\ \sum_{i=1}^{N}a_i \leq 10^5

解法

Dijkstra.

普通に路線ごとにs_1 \overset{(t_1,0)}\longleftrightarrow s_2 \overset{(t_2,0)}\longleftrightarrow \cdotsと辺を張る。 辺のコストは(かかる時間、乗り換え回数)を表している。

乗り換えのために同じ駅同士でコストTの辺を張ると辺の数が大きくなりすぎるので次のように工夫する。 駅名sに対して一つ頂点Sを作っておき、駅sが現れるごとにs \overset{(T,1)}\longrightarrow SS \overset{(0,0)}\longrightarrow sのように辺を張る。

後は普通にDijkstraする。スタートとゴールがa,bのとき上に対応するのはA,Bになる。 また、乗り換えを一回余分に数えている (b \overset{(T,1)}\longrightarrow Bの部分) のでそれを引いたものが答え。