グラフ探索と無重み距離の演習
informationalgorithmgraphexercise
1問題1:道・距離・連結成分
無向グラフ G=(V,E) を
V=\{a,b,c,d,e,f\},\qquad
E=\{\{a,b\},\{a,c\},\{b,d\},\{c,d\},\{e,f\}\}
で定める。
- a から d への長さ2の道をすべて挙げよ。
- d(a,d) と d(a,f) を求めよ。
- 連結成分をすべて求めよ。
1.1解答
長さ2の道は a,b,d と a,c,d である。したがって d(a,d)=2 である。a と f の間に道は存在しないので d(a,f)=\infty である。連結成分は \{a,b,c,d\} と \{e,f\} である。
2問題2:DFSとBFSの順序
問題1のグラフで、各隣接リストはアルファベット順に調べるものとする。始点を a とし、頂点を候補へ追加した時点で訪問済みにする。
- 再帰的DFSで初めて訪問する頂点の順序を求めよ。
- BFSで初めて訪問する頂点の順序を求めよ。
- BFSが記録する探索レベル \ell を求め、a から各到達可能頂点への距離と一致することを確認せよ。
2.1解答
DFSは a,b,d,c の順に訪問する。a から b、b から d へ進み、d から未訪問の c へ進むためである。
BFSは a,b,c,d の順に訪問する。距離は
\ell[a]=0,\qquad \ell[b]=\ell[c]=1,\qquad \ell[d]=2
であり、問題1で求めた最短の道の長さと一致する。e,f は a から到達不能である。
3問題3:訪問済み記録の時点
三角形グラフ
V=\{s,u,v\},\qquad E=\{\{s,u\},\{s,v\},\{u,v\}\}
でBFSを行う。頂点をキューから取り出すまで訪問済みにしない実装では、どの重複が発生し得るか説明せよ。また、追加時に訪問済みにする修正が重複を防ぐ理由を述べよ。
3.1解答
s の処理で u,v がキューへ入る。u を取り出した時点で v がまだ未訪問なら、辺 \{u,v\} により v が再び追加され、キューに v が二つ存在し得る。
追加と同時に訪問済みにすれば、最初に v を追加した時点で v\in S となる。その後に別の辺から v を調べても追加条件 v\notin S を満たさないため、各頂点は高々一度しか候補へ追加されない。
4問題4:表現・計算量・手法の選択
|V|=n, |E|=m の無向グラフについて答えよ。
- 隣接リストに格納される辺の項目数と空間計算量を示せ。
- 隣接行列の空間計算量と辺の存在判定の時間計算量を示し、疎グラフに適した表現を選べ。
- 隣接リストを用いるDFSとBFSの時間計算量を説明せよ。
- 無重み最短距離、到達可能性、辺の重みが異なる最短距離に、それぞれDFSまたはBFSを適用できるか述べよ。
4.1解答
無向辺は両端点のリストに一度ずつ現れるため、辺の項目数は 2m、頂点のリストも含めた空間計算量は O(n+m) である。隣接行列は O(n^2) 空間を使用するが、辺の存在を O(1) 時間で判定できる。m が n^2 より十分小さい疎グラフには隣接リストが適している。
隣接リストでは、各頂点を高々一度、各無向辺を両端から高々一度ずつ調べるため、DFSとBFSは O(n+m) 時間で動作する。無重み最短距離にはBFSを使用する。到達可能性にはDFSとBFSのどちらも使用できる。辺の重みが異なる場合、通常のDFSとBFSはいずれも最短距離を保証しない。重みが非負ならDijkstra法などを使用する。