重みなし最短経路のための BFS
始点からの距離を層ごとに求めます
「重みなし最短経路のための BFS」はCoddyKit上の無料Competitive Programming Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCompetitive Programming Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Competitive Programming Academyコースには全4レッスンが含まれています。
BFSの動作
BFSはグラフを同心円状に探索します。まず開始地点、次に1ステップ離れたすべてのノード、その次に2ステップ離れたノード、という順番です。🌊
同心円が最短を意味する理由
BFSは次の層に進む前に現在の層をすべて処理するため、あるノードに初めて到達したとき、それがそのノードへの最短の重みなし経路になります。
キューが原動力
BFSはキューを使います。先入れ先出しの構造です。新しい隣接ノードを後ろに追加し、先頭から次に処理します。
from collections import deque
q = deque([start])訪問済みのノードを管理する
visitedマーカーを用意し、同じノードを2回キューに追加しないようにします。これにより、BFSを高速かつ有限に保てます。
visited = [False] * (n + 1)
visited[start] = True距離を保存する
dist配列に各ノードの層を保存します。開始ノードは0で、各隣接ノードは親の値に1を加えた距離になります。
dist = [-1] * (n + 1)
dist[start] = 0先頭から取り出す
各ステップでキューの先頭からノードを取り出します。それは未処理の中で最も近いノードなので、すぐに処理します。
u = q.popleft()隣接ノードを展開する
uの各隣接ノードについて、未訪問なら訪問済みにし、距離を設定して、キューの後ろに追加します。
for v in adj[u]:
if dist[v] == -1:
dist[v] = dist[u] + 1
q.append(v)完全なループ
キューが空でない間、取り出しと展開を繰り返します。キューが空になったとき、到達可能なすべてのノードを訪問したことになります。
while q:
u = q.popleft()
for v in adj[u]:
if dist[v] == -1:
dist[v] = dist[u] + 1
q.append(v)追加時にマークする
visitedは取り出したときではなく、キューに追加した瞬間に設定します。遅れてマークすると、重複したノードがキューに入ってしまいます。
到達不能なら-1のまま
BFS後も距離-1のままのノードは、開始地点から到達不能ということです。この結果にも意味があります。
BFSは線形時間
BFSは各ノードと各エッジを1回ずつ調べるため、計算量はO(n + m)です。ほとんどのコンテストの制限時間を十分にクリアできます。
確認問題
単純なBFSで最短経路が求まるのはなぜでしょうか。
復習
BFSはキューとdist配列を使って実行します。追加時にマークし、隣接ノードを展開し、終了後に最短距離を読み取ります。🎉
よくある質問
「重みなし最短経路のための BFS」レッスンは無料ですか?
はい。「重みなし最短経路のための BFS」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Competitive Programming Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Competitive Programming Academyコースには全4レッスンが含まれています。
「重みなし最短経路のための BFS」で何を学びますか?
始点からの距離を層ごとに求めます ブラウザで直接実行するハンズオンコードでCompetitive Programming Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Competitive Programming Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCompetitive Programming Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「重みなし最短経路のための BFS」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCompetitive Programming Academyレッスンでコードを書いて実行できますか?
はい。すべてのCompetitive Programming Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 入力から隣接リストを作る
- 重みなし最短経路のための BFS
- DFS、再帰、反復スタック
- 連結成分と Flood Fill