<一覧に戻る

幅優先探索(BFS)の実装と用途

幅優先探索(BFS)は、グラフや木構造を探索するためのアルゴリズムです。このアルゴリズムは、まず根ノードを訪問し、その後、隣接するノードを訪問していくことによって、すべてのノードを層ごとに探索します。BFSは、最短経路や最小コストの探索に利用されることが多いです。

BFSの特徴

  • 探索順序: 根ノードから始まり、次にその隣接ノードを全て探索し、次の層の隣接ノードを探索する。
  • 使用するデータ構造: キュー(FIFO)を使用して、訪問するノードを管理します。
  • 最短経路探索に適している(無向グラフの場合)。

BFSの実装

以下は、PythonによるBFSの実装例です。このコードは、隣接リストを用いてグラフを表現し、BFSを実行します。

from collections import deque

class Graph:
    def __init__(self):
        self.graph = {}  # グラフの隣接リストを保持

    def add_edge(self, u, v):
        if u not in self.graph:
            self.graph[u] = []
        if v not in self.graph:
            self.graph[v] = []
        self.graph[u].append(v)
        self.graph[v].append(u)  # 無向グラフの場合は両方向にエッジを追加

    def bfs(self, start):
        visited = set()  # 訪問済みノードを保持
        queue = deque([start])  # キューにスタートノードを追加
        visited.add(start)

        while queue:
            node = queue.popleft()  # キューの先頭からノードを取得
            print(node, end=' ')  # 訪問したノードを表示

            for neighbor in self.graph[node]:  # 隣接ノードをループ
                if neighbor not in visited:  # 訪問していない場合
                    visited.add(neighbor)  # 訪問済みに追加
                    queue.append(neighbor)  # キューに追加

# グラフの生成とBFSの実行
if __name__ == "__main__":
    g = Graph()
    g.add_edge(1, 2)
    g.add_edge(1, 3)
    g.add_edge(2, 4)
    g.add_edge(2, 5)
    g.add_edge(3, 6)
    g.add_edge(3, 7)

    print("幅優先探索の結果:")
    g.bfs(1)  # スタートノードを1に設定

コードの解説

  1. Graphクラス: グラフを表現するクラスで、隣接リストを辞書形式で保持しています。
  2. add_edge(u, v): 頂点uからvへのエッジを追加します。無向グラフのため、両方向にエッジを追加します。

  3. bfsメソッド: 幅優先探索を実行するメソッドです。

  4. visited: 訪問済みのノードを管理するためのセットです。
  5. queue: キューを使用して、次に訪問するノードを管理します。
  6. while queue: キューが空でない限り、ノードを取り出して訪問します。
  7. 隣接ノードをループで訪問し、訪問していないノードをキューに追加します。

BFSの用途

  • 最短経路探索: 無向グラフや重みのないグラフで、2点間の最短経路を探索するのに最適です。
  • 連結成分の探索: グラフ内の連結成分を見つける際にも使用されます。
  • 階層構造の探索: ツリー構造の各階層を探索するのにも適しています。

このように、幅優先探索(BFS)は多くの実用的な用途があり、特にグラフやツリーの問題を解決するために非常に有用なアルゴリズムです。

出力結果: