グラフ探索 — 波で塗るBFS、深く潜るDFS
迷路も、SNSの友達関係も、路線図も、すべて「点(節点)と、それをつなぐ線(枝)」=グラフです。ある場所から行ける所をもれなく調べる2つの基本戦略 — 波のように広がるBFSと、行けるところまで潜るDFS — を、動かしながら体で覚えます。ちがいは「次にどこから調べるかを入れておく器」だけ。
1. 迷路はグラフ — マスが節点、隣どうしが枝
グラフとは、点(節点 / ノード)と、点をつなぐ線(枝 / エッジ)だけでできた抽象的な地図です。迷路なら、各マスが節点で、壁で仕切られていない隣のマスへの移動が枝にあたります。
探索とは「スタートから枝をたどって到達できるマスを、順序よく全部調べていく」こと。下の図では、スタート(S)から距離が等しいマスが同心円状の波になって広がります。まずはこの「つながり」の感覚をつかみましょう。
2. 幅優先探索 BFS — 近い順に、波で塗る
BFS(Breadth-First Search / 幅優先探索)は、候補をキュー(FIFO:先に入れたものから取り出す)で管理します。すると探索は、スタートから距離1のマスを全部 → 距離2を全部 → … と、同心円状に外へ広がります。
この「近い順」という性質のおかげで、最初にゴールへ到達した経路が、そのまま最短(最少ステップ)になります。再生してキュー(下の帯)の中身の増減と、色の濃淡(距離の帯)を見比べてください。
3. 深さ優先探索 DFS — 行けるところまで潜る
DFS(Depth-First Search / 深さ優先探索)は、候補をスタック(LIFO:後に入れたものから取り出す)で管理します。すると探索は、一本道をどんどん奥へ奥へと潜り、行き止まりに当たって初めて一歩戻り(バックトラック)、別の枝へ進みます。
まるで細い蛇が穴を掘り進むよう(オレンジの帯がいま潜っている道=スタックの中身)。全経路の列挙・連結成分の判定・トポロジカルソートなどで主役になりますが、最初に見つかる経路は最短とは限りません。同じ迷路でも、器を変えるだけで探索順がまるで違うことを確かめましょう。
4. BFS vs DFS — 並べて体感、そしてまとめ
最後に、同じ迷路で BFS と DFS を同時に走らせて見比べます。同じスタート・同じゴールでも、たどり着くまでに調べるマスの順番も、見つかる経路の長さも違います。BFS の経路は必ず最短、DFS の経路は運任せ、という差に注目してください。
- BFS(キュー・FIFO):近い順に波で広がる。重みなしなら最短経路を保証。ただしフロンティアが太くメモリを食いやすい。
- DFS(スタック・LIFO):行けるところまで潜り、行き止まりで戻る。メモリは道の深さぶんで済むが、最短は保証しない。全列挙・連結判定・トポロジカルソート向き。
- 両者の違いは「候補を入れる器」だけ。手順(取り出す→隣を足す)は共通で、計算量はどちらも O(V+E)。