アルゴリズムの考え方:グラフアルゴリズム

グラフとは

多くの問題が定式化(表現)可能

頂点(○や□で表す)を辺で結んだもの。
 有向グラフ:有向辺(→)
 無向グラフ:無向辺(―)
必要に応じて、頂点や辺にラベル


地下鉄路線図  放送大学組織図  ディズニーが描いた戦略図

グラフ理論の始まり


中央大学 山本慎教授
ケーニヒスベルグの橋の問題
7つの橋を一度ずつ通る散歩道は?

ウィキペディア
オイラーは、グラフの一筆書きの問題に翻訳し、不可能であることを示した。
:つながった辺の列
閉路:出発点に戻る路
オイラー路:すべての辺を1度ずつ通る路(一筆書き)
オイラー閉路:出発点に戻るオイラー路

パズル:ケーニヒスベルグの7つの橋を一度ずつ通る路はあるか。

同型なグラフ

同じグラフ:頂点の位置を適当に動かすと重なる(頂点の位置は無視)

同型なグラフ:頂点の名前の付け替えで同じグラフと見なせる

パズル:図3.2 のG1とG2が同型であり、G3がそれらと同形でないことを示せ。

頂点探索アルゴリズム

定められた始点から到達可能な全頂点を
一定の規則にしたがって訪問し処理する

頂点探索アルゴリズムの一般形
←{(始点,始点)}
が空でない間
 辺$(u,v)$をから取り出す
 $v$が未訪問なら
  $v$を訪問し処理を行う
  $v$の各辺$(v,w)$をに加える

縁からの辺取り出し方による分類
 深さ優先探索:後に追加された辺を先に(LIFO)
 幅優先探索 :先に追加された辺を先に(FIFO)
 最良優先探索:順位の高い辺を先に

深さ優先探索

始点から到達可能な全頂点を深さ優先で訪問し処理する
縁をスタック(プッシュとポップ)で実現
 プッシュ:列の後尾に追加
 ポップ:列の後尾から取出し

深さ優先探索アルゴリズム
←[(始点,始点)]
が空でない間
 辺$(u,v)$をからポップ
 $v$が未訪問なら
  $v$を訪問し処理を行う
  $v$の各辺$(v,w)$をにプッシュ

幅優先探索

始点から到達可能な全頂点を幅優先
(近いもの順)で訪問し処理する
縁をキュー(プッシュとシフト)で実現
 プッシュ:列の後尾に追加
 シフト:列の先頭から取出し

幅優先探索アルゴリズム
←[(始点,始点)]
が空でない間
 辺$(u,v)$をからシフト
 $v$が未訪問なら
  $v$を訪問し処理を行う
  $v$の各辺$(v,w)$をにプッシュ

最良(順位)優先探索

始点から到達可能な全頂点を優先順に訪問し処理する
縁を順位キュー(プッシュと最良取出し)で実現
 プッシュ:列に追加
 最良取出し:列中の最良要素を取出し

最良優先探索アルゴリズム
←{(始点,始点,順位1)}
が空でない間
 辺$(u,v,順位)$をから最良取出し
 $v$が未訪問なら
  $v$を訪問し処理を行う
  $v$の各辺$(v,w,順位)$をにプッシュ

辺長優先探索:プラムのアルゴリズム

始点から到達可能な全頂点に至る重み最小の辺集合(最小全域木)を求める
プラムのアルゴリズム
←{(始点,始点,0)};←空
が空でない間
 辺$(u,v,長さd)$をから$d$で最良取出し
 $v$が未訪問なら
  $v$を訪問済みにし辺$(u,v)$をに追加
  $v$の各辺$(v,w,長さ)$をにプッシュ

縁に対する操作(最良取出し、プッシュ)を効率的に実現するデータ構造
 2分探索木
 ヒープ

最短距離探索:ダイクストラのアルゴリズム

始点からの最短距離・経路を求める

ダイクストラのアルゴリズム
←{(始点,始点,距離$0$)};←空
が空でない間
 辺$(u,v,d)$をから距離$d$優先取出し
 $v$が未訪問なら
  $v$の距離を$d$(訪問済み)とし
  $(u,v)$をに追加
  $v$の各辺$(v,w,l)$に対し
   に$(v,w,d+l)$をプッシュ

縁に対する操作(最良取出し、プッシュ)を効率的に実現するデータ構造
 2分探索木
 ヒープ

最終ページ

最終ページ