そのためには、訪れた各頂点について「親(parent)」となる頂点を記録しておきます。たとえば、頂点 v を処理して頂点 to をキューに追加したら、「to の親は v」であると記録するわけです。こうしておけば、最後にゴールからスタートまで親をたどる形でパスを復元できます。具体的には、パスの終点から始めて、その親をたどり、さらにその親…というふうに進み、親が存在しなくなる頂点(スタート地点)に到達するまでたどっていきます。最後に、そのたどった順序を反転すればスタートからゴールへ向かう道筋が得られます。これは次のように、追加で親の配列 p を持つことで実装できます。
start = int(input()) # スタート頂点
d = [-1] * n # start からの距離
p = [-1] * n # 親頂点
q = deque([start]) # 頂点を管理するキュー
d[start] = 0 # start から start への距離は 0
while q: # キューが空でないうちは処理を続行
v = q.popleft() # キューから頂点を取り出す
print(v, end=' ') # 頂点を出力(確認用)
for to in g[v]: # v に隣接する頂点を順番にチェック
if d[to] == -1: # まだ訪れていない頂点の場合
d[to] = d[v] + 1 # (start -> to) = (start -> v) + 1
p[to] = v # to の親として v を記録
q.append(to) # to をキューに追加
# start から end へのパスを復元
end = int(input()) # ゴール頂点
path = [] # start から end への経路
while end != -1: # 親が無くなるまでたどる
path.append(end) # パスに頂点を追加
end = p[end] # 親頂点へ移動
print(*path[::-1], sep=' -> ') # 逆順に並べてパスを出力
インターネットは互いに接続されたコンピュータの集合で、データをやり取りすることができます。ここでは、コンピュータが 1 から n までの番号で管理されており、どのコンピュータ同士が接続されているかが分かっている状況を考えます。アリスは自分のメッセージをボブに送りたいと思っており、その際できる限り速く届けたい(つまり経路はできるだけ短いほうがよい)と考えています。
アリスのコンピュータ番号を a、ボブのコンピュータ番号を b とするとき、メッセージを最短時間で届けるためのコンピュータの並び(経路)を求めてください。
入力
最初の行には、ネットワーク上のコンピュータの数 n (1 ≤ n ≤ 100 000) と、接続の数 e (1 ≤ e ≤ 100 000) が与えられます。
次の行では、アリスとボブのコンピュータ番号 a と b (1 ≤ a, b ≤ n) が与えられます。