幅優先探索(breadth-first search)とは、グラフの始点 $s$ から、先に見つけた頂点を先に調べるキュー(待ち行列)の規則で隣接頂点をたどり、まだ訪れていない頂点に番号を付けていく探索の手順である。付いた番号は $s$ からの距離にちょうど等しく、各頂点と初めて届いたときの親を結ぶ辺は、$s$ の連結成分の全域木で、その中の道が最短の道になる木(幅優先探索木)をなし、手間は頂点の個数と辺の本数の和に比例する。辺はどれも同じ層か隣の層を結び、同じ層を結ぶ辺がないことは二部グラフであることと同値で、そうでなければ奇数の長さの閉路が取り出せるうえ、最短の道の本数も層ごとの足し算で求まる(辺に長さがある場合は Dijkstra 法を使う)。
グラフの 1 つの頂点 $s$ から出発して、まず $s$ の隣の頂点をすべて訪れ、次にそれらの隣でまだ訪れていない頂点をすべて訪れ、……と、近いところから順に同心円状に広げていく探し方を 幅優先探索 という。訪れる順番を「先に見つけた頂点から先に調べる」という待ち行列(キュー)の規則で決めるだけの単純な手順だが、終わったときには、$s$ から各頂点までの距離(グラフの距離)と、そこまでの最短の道が全部わかっている。
この記事では、幅優先探索の手順を定め、次を証明する。手順が付ける番号がちょうど $s$ からの距離であり、たどった辺が最短の道の木(幅優先探索木)をなすこと(thm-bfs-correctness)。手順が頂点の個数と辺の本数の和に比例する手間で終わること(prop-bfs-cost)。同じ層の頂点を結ぶ辺があるかどうかで、グラフが二部グラフであるかを判定でき、二部グラフでなければ奇数の長さの閉路を具体的に取り出せること(thm-bfs-bipartite)。最短の道の本数を層ごとに足し算で数えられること(thm-bfs-counting)。
この記事の「グラフ」は単純無向グラフ $G=(V,E)$ で、頂点は有限個とする。$\lvert V\rvert=n$、$\lvert E\rvert=m$ と書く。頂点 $u,v$ の 距離 $\operatorname{dist}(u,v)$ は、$u$ と $v$ を結ぶ道の長さ(辺の本数)の最小値であり、結ぶ道がなければ $\infty$ とする(グラフの距離 の記事の定義「グラフの距離」)。始点 $s$ を固定したとき、$\operatorname{dist}(s,v)=i$ となる頂点 $v$ の集合を 距離 $i$ の層 $L_i$ という(同記事の定義「球と距離層」の $S_i(s)$)。
キュー(待ち行列)とは、頂点を 1 列に並べたもので、末尾に頂点を加える操作と、先頭の頂点を取り出す操作だけを行うものをいう。先に加えた頂点ほど先に取り出される。
グラフ $G$ と頂点 $s$ に対し、次の手順を $s$ を始点とする幅優先探索(breadth-first search、BFS)という。各頂点には「印」が付いているか付いていないかの状態があり、印の付いた頂点 $v$ には番号 $\ell(v)$ を記録し、$v\ne s$ ならさらに 親 $p(v)$ を記録する。
手順 3 で隣接頂点を調べる順番は自由である。順番によって親の選び方、したがって幅優先探索木は変わりうるが、番号 $\ell(v)$ は変わらない(thm-bfs-correctness により $\ell(v)=\operatorname{dist}(s,v)$ だから)。どの頂点も印を付けるときに 1 回だけキューに加わるので、手順は有限回で終わる。
池に石を投げると、波紋が同心円状に広がる。幅優先探索はその離散版で、$s$ から「1 歩で行ける頂点」「2 歩で行ける頂点」……を順に塗っていく。キューの規則は、波紋の内側の頂点をすべて調べ終わるまで外側の頂点を調べない、ということを保証している。だから頂点に初めて届いたときの歩数がそのまま最短の歩数になる。これと対照的に、行けるところまで一気に進んでから引き返す探し方が深さ優先探索である。
$\{1,2,3,4,5\}$ の 2 元部分集合を頂点とし、交わらない 2 つを結んだ Petersen グラフで、$\{1,2\}$($12$ と書く)を始点にする。
この例では、層 $2$ に辺がある。thm-bfs-bipartite により、Petersen グラフは二部グラフでない。実際、$13$ と $25$ の親は $45$ と $34$ で、その親はどちらも $12$ なので、$12,45,13,25,34,12$ は長さ $5$ の閉路である。
$\{0,1,2\}^2$ の 9 点を頂点とし、1 つの座標が $1$ だけ異なる 2 点を結んだ $3\times3$ の格子グラフで、$s=(0,0)$ から幅優先探索を行う。層 $i$ は $x+y=i$ を満たす点 $(x,y)$ の集合で、大きさは $1,2,3,2,1$ である。
各点への最短の道の本数 $\sigma(v)$ を thm-bfs-counting の漸化式で層ごとに足すと、
| 層 | 点と $\sigma$ |
|---|---|
| $0$ | $(0,0)\colon1$ |
| $1$ | $(1,0)\colon1$、$(0,1)\colon1$ |
| $2$ | $(2,0)\colon1$、$(1,1)\colon2$、$(0,2)\colon1$ |
| $3$ | $(2,1)\colon3$、$(1,2)\colon3$ |
| $4$ | $(2,2)\colon6$ |
となり、$(x,y)$ への最短の道の本数は二項係数 $\binom{x+y}{x}$ に一致する。最短の道は右に $x$ 歩、上に $y$ 歩を並べる並べ方と対応するからである。
まず、キューの中の番号がいつも「小さい順に並び、差が $1$ 以内」であることを示す。
幅優先探索の実行中のどの時点でも、キューの中の頂点を先頭から $u_1,\dots,u_r$ とすると
$$
\ell(u_1)\le\ell(u_2)\le\dots\le\ell(u_r)\le\ell(u_1)+1
$$
である。とくに、頂点がキューから取り出される順に番号を並べると、広い意味で増加する列になる。
キューが変わるたびにこの性質が保たれることを示す。最初はキューが $s$ だけなので成り立つ。
先頭の $u_1$ を取り出すと、残りは $u_2,\dots,u_r$ で、$\ell(u_2)\le\dots\le\ell(u_r)\le\ell(u_1)+1\le\ell(u_2)+1$ なので性質は保たれる。
$u_1$ を調べている間に末尾へ加わる頂点 $v$ の番号はすべて $\ell(u_1)+1$ である。加える前のキューは $u_2,\dots,u_r$ と、すでに加えた番号 $\ell(u_1)+1$ の頂点からなり、その番号はすべて $\ell(u_1)$ 以上 $\ell(u_1)+1$ 以下で小さい順に並んでいる。末尾に $\ell(u_1)+1$ を加えても小さい順のままであり、先頭の番号は $\ell(u_1)$ 以上なので、末尾と先頭の差は $1$ 以下である。
後半:$u_1$ を取り出した直後に次に取り出される頂点は、$r\ge2$ ならそのときキューにある $u_2$ で、前半により $\ell(u_2)\ge\ell(u_1)$ である。$r=1$ なら、$u_1$ を調べて加えた番号 $\ell(u_1)+1$ の頂点である(加えたものがなければキューは空になり手順は終わる)。どちらの場合も、続けて取り出される頂点の番号は前の頂点の番号以上である。$\square$
$G$ をグラフ、$s$ を頂点とし、$s$ を始点とする幅優先探索を行う。
段 1(番号は距離以上).印の付いた頂点 $v$ について、$v,p(v),p(p(v)),\dots$ は $G$ の歩道で、親をとるたびに番号が $1$ ずつ減るので、ちょうど $\ell(v)$ 歩で番号 $0$ の頂点 $s$ に着く。よって $v$ は $s$ と長さ $\ell(v)$ の歩道で結ばれ、$\operatorname{dist}(s,v)\le\ell(v)$ である。とくに印の付いた頂点は $s$ と同じ連結成分にある。
段 2(距離有限なら印が付き、番号は距離以下).$s$ との距離が有限で、「印が付かない」か「$\ell(v)\ne\operatorname{dist}(s,v)$」となる頂点 $v$ があったとして矛盾を導く。そのような $v$ のうち $k:=\operatorname{dist}(s,v)$ が最小のものをとる。$s$ には印が付き $\ell(s)=0$ なので $k\ge1$ である。$s$ と $v$ を結ぶ長さ $k$ の道の、$v$ の 1 つ手前の頂点を $u$ とすると、$\operatorname{dist}(s,u)=k-1$ である($k-1$ 歩で行け、それより短く行けるなら $v$ へ $k$ 歩未満で行けてしまう)。$k$ の最小性から $u$ には印が付き $\ell(u)=k-1$ である。
印の付いた頂点はキューに加わり、手順はキューが空になるまで続くので、$u$ はいつか取り出されて調べられる。そのとき $v$ に印が付いていなければ、$v$ に印が付き $\ell(v)=\ell(u)+1=k$ となり、$v$ の選び方に反する。よって $v$ には $u$ を調べるより前に印が付いている。$v\ne s$ なので、$v$ はある頂点 $w=p(v)$ を調べているときに印が付き、$w$ は $u$ より前に取り出されている。lem-bfs-monotone の後半により $\ell(w)\le\ell(u)$ なので
$$
\ell(v)=\ell(w)+1\le\ell(u)+1=k=\operatorname{dist}(s,v)
$$
である。段 1 と合わせて $\ell(v)=\operatorname{dist}(s,v)$ となり、やはり $v$ の選び方に反する。
段 3(結論).段 1・段 2 から 1 と 2 が従う。3:$s$ の連結成分の頂点を $c$ 個とすると、$T$ の辺は印の付いた $s$ 以外の頂点ごとに 1 本で $c-1$ 本ある。段 1 により、どの頂点も親をたどって $s$ に着くので、$T$ からなるグラフは連結である。$c$ 頂点 $c-1$ 本の辺の連結グラフは木である(全域木 の記事の命題「木の判定」)。$v$ から $s$ への $T$ の中の道は長さ $\ell(v)=\operatorname{dist}(s,v)$ なので、$G$ における最短の道である。$\square$
段 2 で使ったのは、「$u$ が調べられる時点では、$u$ より番号の小さい頂点はもう調べ終わっている」という lem-bfs-monotone の内容だけである。キューを、最後に加えた頂点を先に取り出す列(スタック)に替えると、この性質が崩れ、番号は距離と一致しなくなる(ex-bfs-stack)。この定理は Eri19 Theorem 8.2(p. 281)にあり、同書は「段」(phase)に分けた見方で Lemma 8.1(p. 280)を示してから証明している。
グラフ $G$ が連結であることと、ある頂点 $s$ を始点とする幅優先探索ですべての頂点に印が付くことは同値である。印の付かない頂点が残ったら、その 1 つを新しい始点として探索を続けることを繰り返すと、各回で印が付く頂点の集合がちょうど連結成分になる。
thm-bfs-correctness の 1 により、印の付く頂点は $s$ の連結成分の頂点である。前半はこれから従う。後半:2 回目以降の探索でも、すでに印の付いた頂点は別の連結成分にあり、新しい始点の連結成分の頂点にはまだ印が付いていないので、同じ定理の 1 がそのまま当てはまる。$\square$
各頂点の隣接頂点の一覧が与えられているとする。$s$ を始点とする幅優先探索で、頂点がキューに加わる回数は $n$ 以下、取り出される回数も $n$ 以下であり、手順 3 で隣接頂点を確かめる回数の合計は $2m$ 以下である。cor-bfs-connected のようにすべての頂点から探索を続けても、それぞれの回数は $n$、$n$、$2m$ である。
頂点は印を付けるときにだけキューに加わり、印はいったん付けたら消えないので、各頂点は高々 1 回加わり、高々 1 回取り出される。頂点 $u$ を調べるとき、隣接頂点を確かめる回数は $\deg u$ である。各頂点は高々 1 回しか調べられないので、合計は $\sum_u\deg u=2m$ 以下である(握手補題、次数(グラフ) の記事の定理「次数の総和と辺数」)。すべての頂点から探索を続ける場合は、どの頂点もちょうど 1 回加わり、ちょうど 1 回調べられる。$\square$
1 回の操作の手間を一定とみなせば、幅優先探索の手間は $n+m$ に比例する(Eri19 p. 281)。
$s$ を始点とする層 $L_0,L_1,\dots$ について、$s$ の連結成分の辺 $uv$ はどれも、同じ層の 2 頂点か、隣り合う層 $L_i,L_{i+1}$ の頂点を結ぶ。
距離の三角不等式(グラフの距離 の記事の命題「距離空間の公理」)により $\operatorname{dist}(s,v)\le\operatorname{dist}(s,u)+1$ であり、$u,v$ を入れ替えても同じなので $\lvert\operatorname{dist}(s,u)-\operatorname{dist}(s,v)\rvert\le1$ である。$\square$
幅優先探索木に入らない辺は、同じ層の頂点を結ぶ辺か、隣の層の頂点で親子でないものを結ぶ辺である。同じ層を結ぶ辺の有無が、次の定理で二部グラフの判定に使われる。
$G$ を連結なグラフとし、頂点 $s$ を始点とする幅優先探索の層を $L_0,L_1,\dots$、幅優先探索木を $T$ とする。
1:prop-bfs-edges により、どの辺も同じ層か隣の層を結び、仮定により同じ層は結ばないので、どの辺も番号の偶奇が異なる 2 頂点を結ぶ。よって偶数の層の和と奇数の層の和は二部分割である。
2:$T$ の中の $s$ から頂点 $x$ への道を $P_x$ と書く。$P_x$ は $x$ から親をたどって得られる道を逆に並べたもので、$P_x$ の上の頂点 $z$ について、$P_x$ の $s$ から $z$ までの部分は $P_z$ に一致する($z$ から親をたどる列は、$x$ から親をたどる列の後半だから)。よって $P_u$ と $P_v$ に共通する頂点 $z$ があれば、$P_u$ と $P_v$ はどちらも $P_z$ で始まる。$w$ を共通の頂点のうち番号が最大のものとすると、$P_u$ の $w$ 以降の部分 $Q_u$(長さ $t-\ell(w)$)と $P_v$ の $w$ 以降の部分 $Q_v$(長さ $t-\ell(w)$)は $w$ 以外に共通の頂点をもたない。$w$ 以外の共通の頂点 $z$ があれば、$z$ は $P_u$ と $P_v$ の共通の頂点で、$Q_u$ の上で $w$ より後にあるので $\ell(z)>\ell(w)$ となり、$w$ の選び方に反するからである。
$u\ne v$ で $\ell(u)=\ell(v)=t$ なので、$w$ は $u$ とも $v$ とも異なり($w=u$ なら $u$ が $P_v$ の上にあって番号 $t$ をもつが、$P_v$ の上で番号 $t$ の頂点は $v$ だけ)、$\ell(w)< t$ である。$Q_u$、辺 $uv$、$Q_v$ を逆にたどった道をつなぐと、$w$ に戻る閉じた歩道で、$w$ 以外の頂点は重複しない。長さは $2(t-\ell(w))+1\ge3$ なので、これは奇数の長さの閉路である。奇数の長さの閉路をもつグラフは二部グラフでない(二部グラフ の記事の定理「閉路の長さによる特徴付け」)。
最後の主張は 1 と 2 を合わせたものである。$\square$
連結でないグラフでは、cor-bfs-connected のように連結成分ごとに探索し、各成分で判定すればよい(二部グラフであることは連結成分ごとに判定できる。二部グラフ の記事の命題「部分グラフと連結成分への遺伝」)。どちらの場合も、手間は prop-bfs-cost と同じく $n+m$ に比例し、答えに証拠が付く。二部グラフなら二部分割を、そうでなければ奇数の長さの閉路を出力できる。
$G$ をグラフ、$s$ を頂点とし、$s$ と同じ連結成分の頂点 $v$ について、$s$ と $v$ を結ぶ最短の道の本数を $\sigma(v)$ と書く。このとき $\sigma(s)=1$ であり、$v\in L_i$($i\ge1$)について
$$
\sigma(v)=\sum_{u\in L_{i-1},\ u\sim v}\sigma(u)
$$
が成り立つ($u\sim v$ は $u$ と $v$ が隣接することを表す)。
長さ $0$ の道は $s$ だけなので $\sigma(s)=1$ である。$v\in L_i$($i\ge1$)とし、$s$ と $v$ を結ぶ長さ $i$ の道全体を $\mathcal{P}_v$ と書く。$P=(s=x_0,x_1,\dots,x_i=v)\in\mathcal{P}_v$ について、$x_{i-1}$ は $v$ と隣接し、$P$ の $x_{i-1}$ までの部分は $s$ と $x_{i-1}$ を結ぶ長さ $i-1$ の道である。$\operatorname{dist}(s,x_{i-1})\ge\operatorname{dist}(s,v)-1=i-1$ なので $x_{i-1}\in L_{i-1}$ で、その部分は最短の道である。
逆に、$u\in L_{i-1}$ が $v$ と隣接し、$Q$ が $s$ と $u$ を結ぶ最短の道(長さ $i-1$)なら、$Q$ の頂点は $s$ からの距離が $0,1,\dots,i-1$ なので $v$(距離 $i$)を含まず、$Q$ の後に $v$ をつないだものは $\mathcal{P}_v$ の元である。この 2 つの対応は互いに逆なので、$\mathcal{P}_v$ は、$v$ と隣接する $u\in L_{i-1}$ と $s$ から $u$ への最短の道の組の全体と 1 対 1 に対応する。個数を数えれば漸化式を得る。$\square$
幅優先探索で頂点を調べる順は層の順なので、$u$ を調べるときに、$u$ の隣接頂点 $v$ で $\ell(v)=\ell(u)+1$ となるもの(印をこのとき付けたものも、すでに付いていたものも含む)に $\sigma(u)$ を足していけば、手間を増やさずにすべての $\sigma(v)$ が求まる。ex-bfs-grid はこの計算である。$d$ 次元の超立方体グラフ(長さ $d$ の $0,1$ の列を頂点とし、1 か所だけ異なる列を結んだグラフ)では、$1$ を $i$ 個含む列への最短の道は $i!$ 本で、$s=00\cdots0$ と $11\cdots1$ を結ぶ最短の道は $d!$ 本である($1$ にする位置の順番と対応する)。
| 外す条件 | 反例 | 成り立たなくなること |
|---|---|---|
| キュー(先に加えたものを先に取り出す) | 5 角形をスタックで探索する(ex-bfs-stack) | 番号 $\ell(v)$ が距離に等しい |
| 印を付けて二度加えない | 辺 1 本のグラフ $s$—$a$ を、印なしで探索する | 有限回で終わる |
| 辺の長さがすべて $1$ | 辺に長さのある三角形(ex-bfs-weighted) | 層の番号が(長さで測った)距離に等しい |
| 連結 | 辺のない 2 頂点のグラフ | すべての頂点に印が付く |
| thm-bfs-bipartite の 1 の「同じ層を結ぶ辺がない」 | 三角形 $K_3$ | 偶数の層と奇数の層が二部分割になる |
5 角形の頂点を $s,a,b,c,d$ の順に並べ($s\sim a\sim b\sim c\sim d\sim s$)、手順の「先頭を取り出す」を「末尾を取り出す」に替えて実行する。$s$ を調べると $a,d$ に番号 $1$ が付き、列は $a,d$ になる。末尾の $d$ を取り出して調べると $c$ に番号 $2$ が付く。次に末尾の $c$ を取り出すと $b$ に番号 $3$ が付く。しかし $\operatorname{dist}(s,b)=2$($s,a,b$)である。$a$ に印は付いていたが、$a$ を調べる前に $b$ に届いてしまったのが原因で、lem-bfs-monotone が崩れている。
三角形 $s,a,b$ の辺 $sa$ に長さ $5$、辺 $sb$ と $ba$ に長さ $1$ を与える。幅優先探索は辺の長さを見ないので、$a$ は層 $1$ に入り、幅優先探索木は辺 $sa$ を使う。しかし長さの和で測ると $s,b,a$ の長さは $2$ で、$sa$ の $5$ より短い。辺に長さがあるときの最短の道は、近い頂点から順に距離を確定させる Dijkstra 法で求める(重み付きグラフの最短経路)。辺の長さがすべて等しければ、幅優先探索の層は長さで測った距離の層と一致する。
2 行目:印を付けずに「隣接頂点をすべて末尾に加える」とすると、$s$ を調べて $a$ が加わり、$a$ を調べて $s$ が加わり、……と列が空にならない。3 行目:ex-bfs-weighted。4 行目:ex-bfs-extreme の 3。5 行目:$K_3$ を頂点 $s$ から探索すると層 $1$ に 2 頂点が入り、それらは隣接する。偶数の層 $\{s\}$ と奇数の層は二部分割にならず、thm-bfs-bipartite の 2 により長さ $3$ の閉路が得られる。
有向グラフでも、手順 3 の「隣接頂点」を「$u$ から出る辺の終点」に替えれば同じ手順が動き、thm-bfs-correctness は「$s$ から有向の道で行ける頂点に印が付き、番号は $s$ からの有向の距離に等しい」と読み替えて同じ証明で成り立つ。lem-bfs-monotone の証明は辺の向きを使っていない。一方、prop-bfs-edges の三角不等式は片側 $\operatorname{dist}(s,v)\le\operatorname{dist}(s,u)+1$(辺 $u\to v$ について)しか成り立たず、番号が $2$ 以上小さい頂点へ戻る辺がありうる。Eri19 §8.4 は有向グラフで述べている。
Mathpediaは寄付と、参考文献の書籍リンク(Amazonアソシエイト)の紹介料で運営されています。 支援について / 寄付する