問題一覧 > 通常問題

No.160 最短経路のうち辞書順最小

レベル : / 実行時間制限 : 1ケース 5.000秒 / メモリ制限 : 512 MB / 標準ジャッジ問題
タグ : / 解いたユーザー数 189
作問者 : ぴろず
8 ProblemId : 417 / 出題時の順位表 / 自分の提出
問題文最終更新日: 2015-11-14 17:48:25

問題文

太郎君の住んでいる地域には地下鉄の駅がN個あり、0からN1までの番号が振られています。
駅と駅は路線で結ばれており、それぞれの路線について移動時間が決まっています。

急ぎの用事がある太郎君は駅Sから駅Gまでの最短経路を気にしています。
Sから駅Gまでの最短経路を出力するプログラムを書いてください。
ただし、そのような経路は複数考えられる場合があるので、最短経路のうち辞書順最小のものを出力してください。

ここで最短経路とは用いる路線の移動時間の和が最小となる経路のことです。乗り換えの時間などは考慮する必要はありません。経路は、出発する駅と目的の駅を含みます。
ある経路Pが経路Qよりも辞書順で小さいというのは、経路上の駅をそれぞれ(p1,p2,,pk)(q1,q2,,ql)と表した時、あるjが存在して、i=1,2,,j1についてpi=qiかつpj<qjとなることです。

入力

N M S G
a1 b1 c1

aM bM cM

1行目に駅の数を表すN、路線の本数を表すM、出発する駅S、目的地の駅Gがスペース区切りで与えられます。
続くM行は路線の情報で、駅aiと駅biを結ぶ路線の移動時間はciであることを表します。 路線は駅aiから駅biの向きへも、駅biから駅aiの向きへも利用できます。

2N200
N1MN(N1)/2
1ci104
0S,G,ai,biN1
SG
aibi
ある駅の組を直接結ぶ路線は高々1つである。
Sから駅Gに向かう経路は必ず存在する。

出力

S v2 v3  vk1 G    

1行に最短経路のうち辞書順最小のものを出力してください。
経路は、通る駅を順番にスペース区切りで並べてください。出発する駅と目的地の駅を含みます。
最後に改行してください。

サンプル

サンプル1
入力
4 3 0 3
0 2 100
2 1 200
1 3 300
出力
0 2 1 3

0から駅3に向かう経路は(0,2,1,3)1つしかないので、これを出力します。

サンプル2
入力
4 4 0 3
0 2 100
2 3 100
0 1 200
1 3 200
出力
0 2 3

0から駅3に向かう経路は(0,2,3)(0,1,3)2つです。
(0,2,3)は移動時間の和が200(0,1,3)は移動時間の和が400となるので、経路(0,2,3)を出力します。

サンプル3
入力
4 4 0 3
0 2 100
2 3 100
0 1 100
1 3 100
出力
0 1 3

サンプル2と同様、駅0から駅3に向かう経路は(0,2,3)(0,1,3)2つです。
今度は2つの経路の移動時間は等しいですが、(0,2,3)より(0,1,3)の方が辞書順で小さいので、経路(0,1,3)を出力します。

サンプル4
入力
8 28 4 6
1 4 15
4 5 2457
1 6 8234
0 7 109
5 2 6669
0 5 31
2 6 1
0 3 2896
0 4 1493
7 5 78
5 6 96
2 7 7486
0 2 66
7 6 4776
4 2 3820
2 3 8843
4 7 8276
3 1 67
1 5 4053
1 0 912
3 4 82
6 3 3165
5 3 81
1 2 2948
4 6 3164
3 7 3
1 7 70
0 6 65
出力
4 1 3 5 0 6

提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。