3.2: グラフの向き付けと探索木 今回の講義目的 無向グラフに H27 グラフ理論 無駄なく向きを付ける 強連結な向き アルゴリズム グラフを効率よく ―第6回― グラフの向き付けと探索 どの2頂点も行き来できるように 辺に無駄なく向きを付ける(失敗例) 探索する 深さ優先探索 (DFS) 幅優先探索 (BFS) DFSの探索順 1 2 定義(グラフの向き付け): 任意の辺 (u,v) に対して u←v または u→v の いずれかの向きを定義すること. このような有向グラフの道を有向道という. 定理3.13 (H.E. ロビンス) 強連結な向き付けが存在する必要十分条件は, グラフ G が連結で橋を含まないことである. 定義:どの2頂点に対しても双方向の有向道 が存在するとき,その向き付けを強連結という. ※連結:任意の2頂点の間に道がある ※橋:取り除くと連結でなくなるような辺 y x 失敗例 (右から左の頂点に行けない) 強連結な向き付け 橋 証明(必要条件:強連結な向き付け⇒連結で橋を含まない) G が連結でないときや橋を含むとき,どのように向きを 付けても,x から y へ行くことができないか,行くことが できても帰ってこられない. 3 4 1 証明(十分条件:⇐)Gが連結で橋を持たないと仮定する. このとき G を次の条件を満たすように分解できる. (1) G = G1∪ G2 ∪ … ∪ Gr かつ (2) Gi+1 は G1∪ G2 ∪ … ∪ Gi と2点を共有する道か, または1点を共有する閉路.(下図) G1 G2 G3 以下同じことを繰り返すことで, G = G1∪ G2 ∪ … ∪ Gr = C1∪ C2 ∪ … ∪ Cr を得ることができる. ... G4 2点を共有する道 1点を共有する閉路 G1 5 証明(つづき) 得られた分解 G = C1∪ C2 ∪ … ∪ Cr の各 Ci に対して勝手な 1方向へ向き付けをすれば,任意の u,v ∈ V(G) に有向道を 構成できる (以下証明).よって,G は強連結な向き付けを持つ. 証明(つづき:分解の方法) G は連結で橋を持たないので (xとyが2つ以上の道で繋がる), ある閉路 C1 を持つ.C1を G から取り除いても辺が残るなら, それらをたどると,G は端点を持たないので(橋がないから), いつかは C1 と合流する.それは道または閉路 C2 となる. (Gが閉路C1のみ)の ときはあきらか r=kのとき正しいと仮定 Ck+1 が C1~Ck と1点で 交わる閉路のとき(右図) 任意のx-yのどちらにも 有向道がある Ck+1が道の場合も同様 C1 x C3 C2 y G3 Gr 6 この定理の弱点 r に関する帰納法 r=1 G2 グラフを次々に分解し ていけばよいが... グラフを閉路(や道)に 分解するコストが高い もっと単純な方法がな いか?→探索木を使う Ck+1 ひとつひとつ閉路を 探すのは大変!! 7 8 2 もう一つのテーマ(探索木) DFS (depth first search: 深さ優先探索) 最新の探索点に最も近い未探索の点を 次に探索する手法. グラフを効率よく探索 なるべく高速に なるべくメモリを使わず すべての頂点を訪れる 出発点 DFS 最も近い未探索点 二つの方法 深さ優先探索(DFS) 幅優先探索(BFS) BFS 出発点を指定するか 任意に選ぶ DFSの探索木 現在点と隣接する 未探索の点へ移動する 9 DFSによる探索木(根付き木) 10 木構造に関する定義(再掲) 根 葉 葉 連結で閉路のないグラフを 木という 図のような階層構造の木を 根付き木という 葉 未探索辺を... 削除すると... 根付き木 DFSによって探索した頂点と辺によって構成されるグラフは 必ず根付き木となる(探索辺が合流しないため) 根:だれからも指されていな い頂点 葉:だれも指していない頂点 親と子:有向辺の両端 先祖と子孫:有向道の両端 兄弟:同じ親を持つ頂点 根 先祖と子孫 親と子 兄弟 葉 根付き木の構造 11 12 3 アルゴリズムの動作例 強連結な向き付けの効率的手法 アルゴリズム3.15 (F.S. ロバーツ) 入力:橋を持たない連結グラフ G 出力:G の強連結な向き付け 方法: (1) G の各点にDFSによる探索順位 n(v) を付ける. (DFSによる探索木を T とする) (2) e=(u,v) ∈ T ならば,その辺に探索順位の 大きい方へ向きを付ける (3) そうでないなら,逆順に向きを付ける 整数値がDFSの探索順 黒矢印が探索木の辺 赤矢印が逆辺 アルゴリズムの正当性 1 7 C1 2 木に辺を追加するとちょうど ひとつの閉路が生まれる グラフが閉路または道に分 解される 定理3.13よりこれは強連結 8 4 5 3 6 C2 9 13 深さ優先探索:その他の応用 有向グラフの頂点 vに 順序 L(v) を付ける問題 順序:(u,v)∈E ならば L(u) < L(v) グラフが閉路を持たない ときは必ずこのような順 序が存在する 14 トポロジカルソートの例 1 トポロジカルソート C3 3 2 4 トポロジカルソート 1 3 2 下着 右グラフは服を着るときの 順序関係を表す.例えば, 靴下をはく前に靴を履くこと はできない. これをトポロジカルソートす ると下の順序が得られる. 身につけるべき順に並んで いる(すべての辺が左から 右へ向いている) 靴下 ズボン 腕時計 靴 シャツ ベルト ネクタイ 上着 4 閉路がある場合はあきらかに トポロジカルソートは存在しない 腕時計 15 靴下 下着 ズボン 靴 シャツ ベルト ネクタイ 上着 16 4 深さ優先探索:応用例2題 アルゴリズム 9/14 グラフを深さ優先探索 1. 各頂点に開始時刻と終了 10/13 ズボン 時刻を記録する 6/7 2. 頂点を終了時刻の降順で ベルト 整列する 3. 開始時刻とは,その頂点 を最初に訪れた時刻を表 す(終了時刻も同様:右 図) 17/18 15/16 下着 靴下 靴 ネクタイ 強連結成分分解 部分グラフの任意の2頂点間に道が あるとき,その部分グラフを強連結 成分という 深さ優先探索後に,そのグラフの逆 向きの辺を終了時刻の大きいものか らたどれる頂点を同一の強連結成 分として取り出す 11/12 1/8 シャツ 上着 腕時計 2/5 太辺が深さ優先 探索した辺 3/4 平面性の判定 グラフが辺を交差しないよう に平面に描くことができるか を判定できる(下のグラフは 平面に描画可能) 3/4 1/10 5/8 2/9 11/18 腕時計 靴下 下着 ズボン 靴 シャツ ベルト ネクタイ 上着 17 もう一つの探索法 現在点に隣接するすべてを 探索してから現在点を更新 (赤→黄色の順) 15/16 18 幅優先探索の応用 BFS (breasth first search: 幅優先探索) 探索された点に隣接するまだラベル付け されていない点をすべて探索する方法. 根を決める 6/7 12/17 13/14 最短経路の発見(右図: 重み無しの場合) 二部グラフのテスト etc... ドイツ都市間の 接続を表すグラフ フランクフルトからの 幅優先探索木 (根からの最短距離) 得られる探索木 19 http://ja.wikipedia.org/ 20 5 二部グラフのテスト 右グラフは同型で二部 グラフであるが,ひと目 ではわからない 簡単なチェック法 あるノードに0を付けて 出発点とする 幅優先探索で未探索の 点に 0 or 1 を付ける 0 に隣接するなら 1 1 に隣接するなら 0 探索終了後,二部グラ フの特性をチェックする 二部グラフであるかどうかは ひと目ではわからない 21 6
© Copyright 2024 ExpyDoc