単一始点最短パス(BFS)

全ての辺の重みが\(1\)の場合の単一始点最短路(単一始点最短パス)は,BFSで\(O(|V|)\)で求められる.

説明

単一始点最短パスをDijkstra法で求めることを考える.Dijkstra法では,始点からの最短路長が小さいノードから順に最短路が求まっていった.全ての辺の重みが\(1\)の場合,最短路長が小さい順というのはすなわち,始点からBFSをした時に訪れる順番であるため,単に始点からBFSをすることで単一始点最短パスを求めることができる.BFSで全てのノードを1回ずつ訪れるので,計算量は\(O(|V|)\).

コード

vector<int> bfs(int node, int n, vector<vector<int>> &g) {
  queue<pair<int, int>> q;
  vector<bool> visited(n, false);
  vector<int> ret(n, -1);

  visited[node] = true;
  q.push({node, 0});
  while (q.size()) {
    pair<int, int> v = q.front();
    q.pop();
    ret[v.first] = v.second;
    for (int &e: g[v.first]) {
      if (visited[e]) continue;
      visited[e] = true;
      q.push({e, v.second+1});
    }
  }
  return move(ret);
}