問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
ここからは最短経路問題を解くアルゴリズムであるダイクストラ法を扱います。最短経路問題とは、重み付きグラフの与えられた 2 点を結ぶ経路のうち、コスト(距離など)が最小のものを求める問題です。ダイクストラ法を使うと、グラフのある頂点からそのほかの各頂点への最短距離を求めることができます。
まずは、ある頂点に最も近い頂点を求めてみましょう。これは二分ヒープを用いて求めることができます。
1,...,N の番号のついた N 個の頂点とそれらをつなぐ枝からなる有向グラフを考えます。ただし、自己ループと多重辺は考えません。
M 本の有向枝と頂点番号 s が与えられます。頂点 s に隣接している頂点のなかで、s からの距離が最も短い頂点を出力してください。
ただし、頂点 s から距離が同じ頂点が複数存在する場合は、そのなかで番号が最も小さい頂点を、頂点 s から最も距離が短い頂点とします。また、距離とはその頂点までの経路(枝の集合)を構成する枝の重みの和とします。
s に隣接している頂点が存在しない場合は、inf
と出力してください。
N M s
a_1 b_1 c_1
...
a_M b_M c_M
s からの距離が最も短い頂点を一行で出力してください。s に隣接している頂点が存在しない場合は、inf
と出力してください。
また末尾に改行をいれ、余計な文字、空行を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
5 5 1
1 2 4
1 3 9
2 4 1
4 5 3
5 2 3
2
8 7 1
1 2 8
1 8 4
1 3 7
1 7 4
1 4 6
1 6 4
1 5 5
6
8 7 2
1 2 8
1 8 4
1 3 7
1 7 4
1 4 6
1 6 4
1 5 5
inf