B - 駅から駅へ / From Station to Station Editorial by admin
Gemini 3.0 Flash (Thinking)概要
この問題は、各駅から次の行き先が一つに決まっている路線において、駅 \(1\) から出発して目的地である駅 \(N\) に到着するまでに、いくつの駅を訪問するかを求めるシミュレーション問題です。
考察
この問題のポイントは、「各駅からの行き先が一つに固定されている」という点です。
駅 \(i\) に着くと、次は必ず駅 \(P_i\) へ向かうことになります。つまり、駅 \(1\) からスタートして駅 \(N\) に着くまでの経路は一本道であり、迷う余地がありません。したがって、問題文の指示通りに「今いる駅」を更新しながら、駅 \(N\) に着くまで移動を繰り返すことで正解を導き出すことができます。
制約を確認すると、駅の数 \(N\) は最大で \(2 \times 10^5\) です。最悪の場合、すべての駅を一度ずつ通ることになりますが、その場合でも計算回数は \(2 \times 10^5\) 程度です。これは一般的なプログラミング言語の制限時間(通常 2 秒程度)内で十分に間に合う計算量です。
アルゴリズム
以下の手順でシミュレーションを行います。
- 現在の駅を指す変数
currを \(1\) で初期化します。 - 訪れた駅の数をカウントする変数
countを \(1\) で初期化します(出発駅である駅 \(1\) を含むため)。 currが \(N\) になるまで、以下の処理を繰り返します。currを、現在の駅からの行き先である \(P_{curr}\) に更新します。countを \(1\) 増やします。
- 最終的な
countの値を出力します。
計算量
- 時間計算量: \(O(N)\)
- 駅 \(1\) から駅 \(N\) に到達するまでに、最大で \(N\) 個の駅を訪問するため、ループの回数は最大 \(N\) 回となります。
- 空間計算量: \(O(N)\)
- 各駅の行き先 \(P_i\) をリスト(配列)に格納するために、駅の数に比例したメモリを使用します。
実装のポイント
インデックスの対応: 問題文では駅番号が \(1\) から \(N\) で与えられますが、多くのプログラミング言語(Python など)のリストは \(0\) 番目から始まります。駅 \(i\) の行き先 \(P_i\) をリスト
pに格納する場合、駅currの次の駅はp[curr - 1]となる点に注意が必要です。入力の読み込み: \(N\) が大きいため、効率的に入力を読み込むことが推奨されます。Python の場合、
sys.stdin.read().split()を使うことで、大量の数値を一括で取得できます。ソースコード
import sys
def main():
# 入力をすべて読み込み、スペースや改行で分割します
input_data = sys.stdin.read().split()
if not input_data:
return
# 駅の数 N
n = int(input_data[0])
# 各駅からの行き先 P_i (i=1 から N-1 まで)
# P[i-1] が駅 i からの行き先に対応するようにリスト化します
p = list(map(int, input_data[1:]))
# 現在の駅 (1からスタート)
curr = 1
# 訪れた駅の数 (出発駅を含むため1で初期化)
count = 1
# 目的地である駅 N に到着するまで繰り返します
while curr != n:
# 駅 i からの行き先は P_i です。
# リスト p は 0-indexed なので、駅 curr からの行き先は p[curr - 1] です。
curr = p[curr - 1]
# 訪れた駅の数をカウント
count += 1
# 結果を出力
print(count)
if __name__ == "__main__":
main()
この解説は gemini-3-flash-thinking によって生成されました。