グラフ探索アルゴリズム とその応用 2011 / 05 / 04 保坂和宏.

Slides:



Advertisements
Similar presentations
ゲームプログラミング講習 第2章 関数の使い方
Advertisements

サービス管理責任者等研修テキスト 分野別講義    「アセスメントと        支援提供の基本姿勢」 <児童発達支援管理責任者> 平成27年10月1日.
ヒトの思考プロセスの解明を目的とするワーキングメモリの研究
第27講 オームの法則 電気抵抗の役割について知る オームの法則を使えるようにする 抵抗の温度変化を理解する 教科書P.223~226
コラッツ予想の変形について 東邦大学 理学部 情報科 白柳研究室 山中 陽子.
コンパイラ 第3回 字句解析 ― 決定性有限オートマトンの導出 ―
第5章 家計に関する統計 ー 経済統計 ー.
公共財 公共経済論 II no.3 麻生良文.
VTX alignment D2 浅野秀光 2011年12月15日  放射線研ミーティング.
冷却フランシウム原子を用いた 電子の永久電気双極子能率探索のための ルビジウム磁力計の研究
生命情報学 (8) スケールフリーネットワーク
前半戦 「史上最強」風 札上げクイズ.

認知症を理解し 環境の重要性について考える
フッ化ナトリウムによる洗口 2010・9・13 宮崎市郡東諸県郡薬剤師会 学校薬剤師  日高 華代子.
食品の安全性に関わる社会システム:総括 健康弱者 ハイリスク集団 HACCP (食肉処理場・食品工場) 農場でのQAP 一般的衛生管理
規制改革とは? ○規制改革の目的は、経済の活性化と雇用の創出によって、   活力ある経済社会の実現を図ることにあります。
地域保健対策検討会 に関する私見(保健所のあり方)
公共政策大学院 鈴木一人 第8回 専門化する政治 公共政策大学院 鈴木一人
医薬品ネット販売規制について 2012年5月31日 ケンコーコム株式会社.
平成26年8月27日(水) 大阪府 健康医療部 薬務課 医療機器グループ
平成26年度 呼吸器学会からの提案結果 (オレンジ色の部分が承認された提案) 新規提案 既収載の変更 免疫組織化学染色、免疫細胞化学染色
エナジードリンクの危険性 2015年6月23日 経営学部市場戦略学科MR3195稲沢珠依.
自動吸引は 在宅を変えるか 大分協和病院 院長         山本 真.
毎月レポート ビジネスの情報 (2016年7月号).
医療の歴史と将来 医療と医薬品産業 個人的経験 3. 「これからの医療を考える」 (1)医薬品の研究開発 -タクロリムスの歴史-
社会福祉調査論 第4講 2.社会調査の概要 11月2日.
2015年12月28日-2016年3月28日 掲載分.
2010度 民事訴訟法講義 補論 関西大学法学部教授 栗田 隆.
腫瘍学概論 埼玉医科大学国際医療センター 包括的がんセンター 緩和医療科/緩和ケアチーム 奈良林 至
“企業リスクへの考え方に変化を求められています。 トータルなリスクマネジメント・サービスをプロデュースします。“
情報漏えい 経済情報学科 E  西村 諭 E  釣 洋平.
金融班(ミクロ).
第11回 2009年12月16日 今日の資料=A4・4枚+解答用紙 期末試験:2月3日(水)N2教室
【ABL用語集】(あいうえお順) No 用語 解説 12 公正市場価格 13 債権 14 指名債権 15 事業収益資産 16 集合動産 17
基礎理論(3) 情報の非対称性と逆選択 公共政策論II No.3 麻生良文.
浜中 健児 昭和42年3月27日生まれ 東京都在住 株式会社ピー・アール・エフ 代表取締役 (学歴) 高 校:千葉県立東葛飾高校 卒業
COPYRIGHT(C) 2011 KYUSHU UNIVERSITY. ALL RIGHTS RESERVED
Blosxom による CMS 構築と SEO テクニック
記入例 JAWS DAYS 2015 – JOB BOARD 会社名 採用職種 営業職/技術職/その他( ) 仕事内容 待遇 募集数
ネットビジネスの 企業と特性 MR1127 まさ.
Future Technology活用による業務改革
ネットビジネス論(杉浦) 第8回 ネットビジネスと情報技術.
g741001 長谷川 嵩 g740796 迫村 光秋 g741000 西田 健太郎 g741147 小井出 真聡
自然独占 公共経済論 II no.5 麻生良文.
Autonomic Resource Provisioning for Cloud-Based Software
Webショップにおける webデザイン 12/6 08A1022 甲斐 広大.
物理的な位置情報を活用した仮想クラウドの構築
ハイブリッドクラウドを実現させるポイントと SCSKのOSSへの取組み
寺尾 敦 青山学院大学社会情報学部 第12回 情報デザイン(4) 情報の構造化と表現 寺尾 敦 青山学院大学社会情報学部
【1−1.開発計画 – 設計・開発計画】 システム開発計画にはシステム開発を効率的、効果的に実行する根拠(人員と経験、開発手順、開発・導入するシステム・アプリケーション・サービス等)を記述すること。 システム開発の開始から終了までの全体スケジュールを記載すること。 アプリケーション機能配置、ソフトウェア、インフラ構成、ネットワーク構成について概要を示すこと。
6 日本のコーポレート・ガバナンス 2008年度「企業論」 川端 望.
急成長する中国ソフトウェア産業 中国ソフトウェアと情報サービス産業の規模 総売上高は5年間で約5.3倍の成長
米国ユタ州LDS病院胸部心臓外科フェローの経験
公益社団法人日本青年会議所 関東地区埼玉ブロック協議会 JCの情熱(おもい)育成委員会 2011年度第1回全体委員会
次世代大学教育研究会のこれまでの活動 2005年度次世代大学教育研究大会 明治大学駿河台校舎リバティタワー9階1096教室
子どもの本の情報 大阪府内の協力書店の情報 こちらをクリック 大阪府内の公立図書館・図書室の情報
第2回産業調査 小島浩道.
〈起点〉を示す格助詞「を」と「から」の選択について
広東省民弁本科高校日語専業骨幹教師研修会 ①日本語の格助詞の使い分け ②動詞の自他受身の選択について   -日本語教育と中日カルチャーショックの観点から- 名古屋大学 杉村 泰.
■5Ahバッテリー使用報告 事例紹介/東【その1】 ■iphon4S(晴れの昼間/AM8-PM3) ◆約1時間で68%⇒100%
『ワタシが!!』『地域の仲間で!!』 市民が始める自然エネルギー!!
ポイントカードの未来形を形にした「MUJI Passport」
SAP NetWeaver を支える Microsoft テクノロジーの全貌 (Appendix)
ガイダンス(内業) 測量学実習 第1回.
Python超入門 久保 幹雄 東京海洋大学.
熱力学の基礎 丸山 茂夫 東京大学大学院 工学系研究科 機械工学専攻
京都民医連中央病院 CHDF学習推進委員会
資料2-④ ④下水道.
Accessによる SQLの操作 ~実際にテーブルを操作してみよう!~.
Presentation transcript:

グラフ探索アルゴリズム とその応用 2011 / 05 / 04 保坂和宏

内容 グラフの扱い方 深さ優先探索 (DFS) 幅優先探索 (BFS) 辞書順幅優先探索 (LexBFS) 橋,関節点 Dijkstra 法, 0-1-BFS 辞書順幅優先探索 (LexBFS) cograph

グラフ グラフ理論からの出題 Islands (IOI 2008) Regions (IOI 2009) Saveit (IOI 2010) Regions (JOI 2010 春合宿) Finals (JOI 2010 春合宿) Joitter (JOI 2011 選考会) Shiritori (JOI 2011 選考会) Report (JOI 2011 選考会) Orienteering (JOI 2011 選考会)

グラフ グラフとは? 「点が線で繋がった構造」

グラフ グラフ (graph) 𝐺= 𝑉, 𝐸 辺 : 頂点の 2 つ組 𝑉 : 頂点 (vertex) の集合 𝐸 : 辺 (edge) の集合 𝑛=|𝑉| (頂点数), 𝑚= 𝐸 (辺数) とおく 辺 : 頂点の 2 つ組 無向グラフ : 𝑢, 𝑣 と 𝑣, 𝑢 は区別しない 有向グラフ : 𝑢, 𝑣 と 𝑣, 𝑢 は異なる辺 重み 𝑐:𝐸→ℝ が定まっていることも

無向グラフと有向グラフ 無向グラフ 有向グラフ

特殊な辺 単純グラフ 多重辺やループを含まないグラフ 今回よくでてくるのは無向単純グラフ 多重辺 ループ

グラフの用語 次数 頂点 𝑢 の次数 (degree) とは, 𝑢 に接続している辺の個数 有向グラフに対しては, 𝑢 を始点とする辺の個数 : 出次数 (out-degree) 𝑢 を終点とする辺の個数 : 入次数 (in-degree) 1 1 1 4 2 1

グラフの用語 パス 頂点と辺の列 𝑣 1 , 𝑒 1 , 𝑣 2 , 𝑒 2 ,…, 𝑣 𝑘 , 𝑒 𝑘 , 𝑣 𝑘+1 であって, 𝑣 1 , 𝑣 2 ,…, 𝑣 𝑘 , 𝑣 𝑘+1 と 𝑒 1 , 𝑒 2 ,…, 𝑒 𝑘 がすべて異なるものをパス (path) という 頂点の重複を許す場合もある サイクル 頂点と辺の列 𝑣 1 , 𝑒 1 , 𝑣 2 , 𝑒 2 ,…, 𝑣 𝑘 , 𝑒 𝑘 , 𝑣 1 であって, 𝑣 1 , 𝑣 2 ,…, 𝑣 𝑘 と 𝑒 1 , 𝑒 2 ,…, 𝑒 𝑘 がすべて異なるものをサイクル (cycle) あるいは閉路という

グラフの用語 連結性 どの 2 頂点 𝑢,𝑣 に対しても, 𝑢 から 𝑣 へのパスが存在するとき, グラフは連結 (connected) であるという 有向グラフでは強連結 (strongly connected) という

グラフの用語 連結成分 「𝑢 から 𝑣 へのパスも 𝑣 から 𝑢 へのパスも存在-する」ときに 𝑢 と 𝑣 が同じグループに属する, として 𝑉 をグループ分けしたときの各グループを連結成分 (connected component) という 有向グラフでは強連結成分 (strongly connected component) という

グラフの用語 木 木 (tree) : 連結でサイクルがないグラフ 森 (forest) : サイクルがないグラフ 𝑛 頂点の木は辺の数 𝑚=𝑛−1 森 (forest) : サイクルがないグラフ ある頂点を根 (root) として考えることがある 有向木 : 辺の向きが根から葉の方向 根 𝑏 : 𝑎 の親 𝑐, 𝑑 : 𝑎 の子 𝑏 𝑎 𝑐 葉 𝑑

グラフの扱い方

グラフの扱い方 隣接行列 隣接リスト グラフを陽に持たない 実装が単純 頂点の 2 つ組で辺を管理したいとき楽 疎グラフに対して高速・省メモリ 疎グラフ … 𝑚=O(𝑛) くらい 密グラフ … 𝑚=Θ 𝑛 2 くらい 辺に番号をつけて管理したいとき楽 グラフを陽に持たない

隣接行列 2 次元配列 𝑔 𝑀𝐴𝑋_𝑁 𝑀𝐴𝑋_𝑁 を確保 辺 𝑢𝑣 に対して 𝑔 𝑢 𝑣 を更新 代入する値 (例) 2 次元配列 𝑔 𝑀𝐴𝑋_𝑁 𝑀𝐴𝑋_𝑁 を確保 辺 𝑢𝑣 に対して 𝑔 𝑢 𝑣 を更新 無向グラフなら 𝑔 𝑣 𝑢 も同じ値に 代入する値 (例) 重みなし : 𝑔 𝑢 𝑣 = 1 (𝑢𝑣∈𝐸) 0 (𝑢𝑣∉𝐸) 重みつき : 𝑔 𝑢 𝑣 = 0 𝑢=𝑣 𝑐 𝑢𝑣 (𝑢𝑣∈𝐸) ∞ (𝑢𝑣∉𝐸)

隣接リスト 各頂点に対し, その点に接続している辺のリストを管理 実装方法 有向グラフであれば「その点を始点とする辺」 STL の vector を使う (C++) ポインタを使う 配列でリストを実装 おすすめ 配列に格納 次数が小さいとわかっているときに良い

隣接リストの実装 配列でリストを実装 int m, head[MAX_N], next[MAX_M], to[MAX_M]; // 初期化 // 初期化 memset(head, -1, sizeof(head)); // 辺 uv を加える (無向グラフならば逆向きも加える) next[m] = head[u]; head[u] = m; to[m] = v; ++m; // u に接続している辺を調べる (追加と逆順) for (e = head[u]; e != -1; e = next[e]) { // 辺 e = (u, to[e]) に対する処理 }

隣接リストの実装 頂点 1 2 3 4 3 2 辺 1 -1 1 2 3 4 5 6 4 1 6 4 2 3 head 5 next

隣接リストの実装 頂点 1 2 3 4 3 2 辺 1 -1 1 2 3 4 5 6 4 1 6 4 2 3 head 5 next

隣接リストの実装 配列でリストを実装 int m, head[MAX_N], next[MAX_M], to[MAX_M]; // 初期化 // 初期化 memset(head, -1, sizeof(head)); // 辺 uv を加える (無向グラフならば逆向きも加える) next[m] = head[u]; head[u] = m; to[m] = v; ++m; // u に接続している辺を調べる (追加と逆順) for (e = head[u]; e != -1; e = next[e]) { // 辺 e = (u, to[e]) に対する処理 }

隣接リストの実装 𝑁× 次数の上限 がメモリに収まる場合 int deg[MAX_N], g[MAX_N][MAX_DEG]; // 初期化 𝑁× 次数の上限 がメモリに収まる場合 int deg[MAX_N], g[MAX_N][MAX_DEG]; // 初期化 memset(deg, 0, sizeof(deg)); // 辺 uv を加える (無向グラフならば逆向きも加える) g[u][deg[u]++] = v; // u に接続している辺を調べる for (i = 0; i < deg[u]; ++i) { // 辺 e = (u, g[u][i]) に対する処理 }

隣接リストの実装 最初にすべての辺を読み込む方法 int deg[MAX_N], p[MAX_N + 1], pp[MAX_N], g[MAX_M]; // すべての辺を読み込んだ後, 次数を配列 deg に保存 for (u = 0; u < N; ++u) { p[u + 1] = p[u] + deg[u]; pp[u] = p[u]; } // 辺 uv を加える (無向グラフならば逆向きも加える) g[pp[u]++] = v; // u に接続している辺を調べる for (i = p[u]; i < p[u + 1]; ++i) { // 辺 e = (u, g[i]) に対する処理

隣接リスト 各実装方法の主なデメリット STL の vector を使う (C++) ポインタを使う 配列でリストを実装 配列に格納 大きいサイズでは push_back のコストが重い ポインタを使う 自分で構造体を作るのが面倒 配列でリストを実装 メモリアクセスの効率が悪い 配列に格納 (次数固定) 次数にばらつきがあるとメモリが無駄 (1 次元) 最初に読み込んで保存する手間がかかる

グラフを陽に持たない 「辺 𝑢𝑣 があるかどうか」「辺 𝑢𝑣 のコスト」 「頂点 𝑢 に接続している辺」 これらを予め調べて配列などに保存するのではなく, 必要になるたびに計算 例

辺集合を直接管理 辺 𝑢𝑣 を「𝑢 の小さい順→ 𝑣 の小さい順」にすべてまとめてソート (STL の pair (C++)) すべての辺を平衡二分木, ハッシュテーブルなどに入れる 隣接リストの代わりになる 2 頂点を指定して辺を調べたいときに便利 操作に O(log 𝑚 ) 程度の時間がかかる

深さ優先探索 (DFS)

グラフ探索アルゴリズム 以下のアルゴリズムでグラフの頂点を 1 つずつ取り出す 𝑅≔𝑉. while 𝑅 が空でない: 「適切に」「なにか」は用いるアルゴリズムによる 𝑅≔𝑉. while 𝑅 が空でない: 𝑢∈𝑅 を「適切に」選ぶ. 𝑅 から 𝑢 を取り除く. 𝑢 に接続している辺を走査して「なにか」する.

DFS 深さ優先探索 (depth-first search) 「人間が街で行える探索」 再帰, スタック 計算量 「バックトラック法」とも 時間 𝑂(𝑛+𝑚) (隣接行列で持つ場合 𝑂( 𝑛 2 )) 空間 𝑂(𝑛) (再帰の深さ)

DFS function 𝐷𝐹𝑆 (𝑢) 頂点 𝑢 を訪れた, と記録. for each 𝑣 (𝑢 に隣接している点): if 頂点 𝑣 をまだ訪れていない: 𝐷𝐹𝑆 𝑣 . for each 𝑢∈𝑉: if 頂点 𝑢 をまだ訪れていない: 𝐷𝐹𝑆 𝑢 .

DFS

DFS-tree DFS を行うと, 通った辺からなる森ができる 以下, 無向連結グラフで考える DFS で通らなかった辺は? 連結グラフに対しては木が得られる 深さ優先探索木 (DFS-tree) あるいは 深さ優先探索森 (DFS-forest) 以下, 無向連結グラフで考える DFS で通らなかった辺は? 後退辺 (back edge)

DFS-tree

橋, 関節点 橋 (bridge) : 取り除くと連結成分が増える辺 関節点 (articulation point) : 取り除くと連結成分が増える頂点 接続している辺も同時に取り除く 問題 : 与えられた無向連結グラフの橋, 関節点をすべて求めよ.

橋, 関節点

橋, 関節点 橋 単純な方法 : 各辺に対し, それを取り除いたときに連結かどうかを DFS などにより調べる 𝑂(𝑚 𝑛+𝑚 ) 少し工夫 : DFS を行ったとき, 後退辺は橋になりえないので, DFS 木の辺 (𝑛−1 本) のみを調べる 𝑂(𝑛 𝑛+𝑚 )

Lowlink 頂点を訪れた順に番号 𝑜𝑟𝑑[𝑢] をつける 各頂点の “Lowlink” 𝑙𝑜𝑤[𝑢] を求める 根から葉の向きへ進むと 𝑜𝑟𝑑 は大きくなる 各頂点の “Lowlink” 𝑙𝑜𝑤[𝑢] を求める 𝑙𝑜𝑤[𝑢] は, 𝑢 から以下の方法で辿り着ける頂点での 𝑜𝑟𝑑 の最小値 DFS 木の辺を根から葉の向きへ進む (何度でも) 後退辺を葉から根の向きへ進む (1 回まで)

Lowlink 2 / 2 0 / 0 5 / 5 9 / 5 1 / 1 8 / 5 4 / 1 6 / 5 3 / 1 7 / 7 𝑜𝑟𝑑 / 𝑙𝑜𝑤

Lowlink function 𝐷𝐹𝑆 (𝑢) 𝑜𝑟𝑑 𝑢 ≔𝑘. 𝑘≔𝑘+1. 𝑙𝑜𝑤 𝑢 ≔𝑜𝑟𝑑[𝑢]. for each 𝑣 (𝑢 に隣接している点): if 頂点 𝑣 をまだ訪れていない: 𝐷𝐹𝑆 𝑣 . 𝑙𝑜𝑤 𝑢 ≔ min 𝑙𝑜𝑤 𝑢 , 𝑙𝑜𝑤 𝑣 . else if 辺 𝑣𝑢 を通っていない: /* このとき 𝑢𝑣 は後退辺 */ 𝑙𝑜𝑤 𝑢 ≔min⁡{ 𝑙𝑜𝑤 𝑢 ,𝑜𝑟𝑑 𝑣 }.

橋, 関節点 2 / 2 0 / 0 5 / 5 9 / 5 1 / 1 8 / 5 4 / 1 6 / 5 3 / 1 7 / 7 𝑜𝑟𝑑 / 𝑙𝑜𝑤

橋, 関節点 橋 DFS 木の辺 𝑢𝑣 が橋 ⇔ 𝑜𝑟𝑑 𝑢 <𝑙𝑜𝑤[𝑣] 𝑂 𝑛+𝑚 応用例 : 同じ長さの単語がたくさん与えられるので, 辞書順最小のしりとりを求めよ (JOI 2011 選考会 Shiritori).

橋, 関節点 関節点 単純な方法 : 各頂点に対し, それを取り除いたときに連結かどうかを DFS などにより調べる 𝑂(𝑛 𝑛+𝑚 ) 𝑂(𝑛+𝑚)

橋, 関節点 発展 : 無向連結グラフが与えられる. 以下のようなクエリに答えよ (Croatia OI 2007). 頂点 𝑢, 𝑣 と辺 𝑒 に対し, 𝑒 を取り除いたとき 𝑢 から 𝑣 へ辿り着けるか? 頂点 𝑢, 𝑣, 𝑤 に対し, 𝑤 を取り除いたとき 𝑢 から 𝑣 へ辿り着けるか?

幅優先探索 (BFS)

BFS 幅優先探索 (breadth-first search) 距離が近いところから順番に見る キュー (待ち行列) 計算量 最短路が求まる キュー (待ち行列) 計算量 時間 𝑂(𝑛+𝑚) (隣接行列で持つ場合 𝑂( 𝑛 2 )) 空間 𝑂(𝑛)

BFS for each 𝑢∈𝑉: 𝑑𝑖𝑠𝑡 𝑢 ≔∞. 𝑑𝑖𝑠𝑡 𝑠𝑡𝑎𝑟𝑡 ≔0. 𝑄 の末尾に 𝑠𝑡𝑎𝑟𝑡 を追加. while 𝑄 が空でない: 𝑢≔𝑄 の先頭から取り除く. for each 𝑣 (𝑢 に隣接している点): if 𝑑𝑖𝑠𝑡 𝑣 >𝑑𝑖𝑠𝑡 𝑢 +1: 𝑑𝑖𝑠𝑡 𝑣 ≔𝑑𝑖𝑠𝑡 𝑢 +1. 𝑄 の末尾に 𝑣 を追加.

BFS 2 1 2 1 3 2 2 2 3

BFS-tree BFS を行うと, 通った辺からなる木ができる BFS で通らなかった辺は? 幅優先探索木 (BFS-tree) 𝑑𝑖𝑠𝑡 の差が 0 または 1

Dijkstra 法, 0-1-BFS BFS では, 次の頂点を選ぶ機構としてキューを用いた 最初に追加したものが最初に取り出される これを変えると重みつきグラフの最短路を求めることができる

Dijkstra 法 Dijkstra 法 辺の重みは非負に限る 𝑑𝑖𝑠𝑡 𝑣 ≔𝑑𝑖𝑠𝑡 𝑢 +𝑐(𝑢𝑣) のように距離を更新 次の頂点を選ぶときに, まだ選ばれていない頂点のうち 𝑑𝑖𝑠𝑡[𝑢] が最小であるものを選ぶ 単純な方法 : 𝑂( 𝑛 2 ) (密グラフに対しては高速) ヒープなどのデータ構造を用いる : 𝑂( 𝑛+𝑚 𝑛+𝑚 log 𝑛) 実用的ではないが 𝑂(𝑛 log 𝑛+𝑚) となるものもある

0-1-BFS 0-1-BFS 辺の重みは 0 または 1 に限る 次の頂点を選ぶときに, まだ選ばれていない頂点のうち 𝑑𝑖𝑠𝑡[𝑢] が最小であるものを選ぶ デック (両端キュー) を用いる : 𝑂(𝑛+𝑚) 先頭および末尾に対する追加・削除ができる

0-1-BFS 𝑄 の末尾に 𝑠𝑡𝑎𝑟𝑡 を追加. while 𝑄 が空でない: 𝑢≔𝑄 の先頭から取り除く. for each 𝑣 (𝑢 に隣接している点): if 𝑑𝑖𝑠𝑡 𝑣 >𝑑𝑖𝑠𝑡 𝑢 +𝑐(𝑢𝑣): 𝑑𝑖𝑠𝑡 𝑣 ≔𝑑𝑖𝑠𝑡 𝑢 +𝑐(𝑢𝑣). if 𝑐 𝑢𝑣 =0: 𝑄 の先頭に 𝑣 を追加. else (if 𝑐 𝑢𝑣 =1): 𝑄 の末尾に 𝑣 を追加.

辞書順幅優先探索 (LexBFS)

LexBFS, Cograph LexBFS Cograph 𝑃 4 -free graph Read-once function グラフはすべて無向単純グラフ

𝑃 4 -free graph 問題 1 : グラフ 𝐺=(𝑉,𝐸) が与えられるので, 以下の条件をみたす 4 頂点 𝑎, 𝑏, 𝑐, 𝑑 が存在するか否か判定せよ. (PKU Judge Online 3236) 𝑎𝑏,𝑏𝑐,𝑐𝑑∈𝐸 𝑎𝑐,𝑎𝑑,𝑏𝑑∉𝐸 𝑎 𝑑 𝑃 4 𝑏 𝑐

Read-once function 問題 2 : 単項式の和の形の式が与えられるので, 現れた文字を 1 回ずつと加算・乗算のみを使って等価な式に変形できるか否か判定せよ. 可能 : 𝑎𝑐𝑓+𝑏𝑐+𝑐𝑒ℎ+𝑑𝑔 𝑎𝑓+𝑏+𝑒ℎ 𝑐+𝑑𝑔 可能 : 𝑎𝑏𝑐+𝑎𝑒𝑓+𝑎𝑔+𝑏𝑐𝑑+𝑑𝑒𝑓+𝑑𝑔 𝑎+𝑑 (𝑏𝑐+𝑒𝑓+𝑔) 不可能 : 𝑎𝑏𝑐+𝑎𝑏𝑒+𝑎𝑑𝑒+𝑏𝑐𝑓+𝑏𝑒𝑓+𝑑𝑒𝑓

Cograph cograph (complement reducible graph) 1 頂点からなるグラフは cograph 𝐺 1 ∪ 𝐺 2 : 𝐺 1 , 𝐺 2 の union (結ばずに並べる) 𝐺 : 𝐺 の complement (辺の有無を逆転) complement … 補グラフ

Cograph ∪ = =

Cograph ∪ ∪ = =

無向グラフの性質 𝐺= 𝑉,𝐸 に対し, 𝐺 または 𝐺 の少なくとも一方は連結 𝐺= 𝑉,𝐸 に対し, 𝐺 または 𝐺 の少なくとも一方は連結 (証明) 𝐺 が連結でないとする. 𝑢, 𝑣∈𝑉 に対し, 𝑢𝑣∈𝐸 のとき : 𝑢, 𝑣 を含まない 𝐺 の連結成分が存在. そこから頂点 𝑤 を選べば, 𝑢𝑤,𝑤𝑣∉𝐸 より 𝐺 のパス 𝑢𝑤𝑣 が存在 𝑢𝑣∉𝐸 のとき : 𝐺 のパス 𝑢𝑣 が存在 2 頂点以上の cograph 𝐺 に対し, 𝐺 または 𝐺 のちょうど一方が連結

Cograph 判定 問題 : グラフが与えられたとき, cograph であるか否かを判定せよ. 単純な方法 : 𝑂(𝑛𝑚)

LexBFS 辞書順幅優先探索 BFS の一種 計算量 (LexBFS, lexicographic breadth-first search) BFS の一種 最初の方に選んだ頂点に隣接する頂点を優先 計算量 時間 𝑂(𝑛+𝑚) (隣接行列で持つ場合 𝑂( 𝑛 2 )) いろいろ手抜くと 𝑂( 𝑛 2 log 𝑛) 空間 𝑂(𝑛)

LexBFS グラフ探索における「まだ訪れていない頂点」を「リストのリスト」で管理する 最初に頂点に適当な順序を与える 𝑑 𝑎 𝑔 𝑐 𝑓 ℎ 𝑖 𝑏 𝑒

LexBFS 𝑑 𝑎 𝑔 𝑐 𝑓 ℎ 𝑖 𝑏 𝑒 𝑎 𝑏 𝑐 𝑑 𝑒 𝑓 𝑔 ℎ 𝑖 𝑎 𝑐 𝑓 𝑏 𝑑 𝑒 𝑔 ℎ 𝑖 𝑐 𝑓 𝑏 𝑒 ℎ 𝑎 𝑏 𝑐 𝑑 𝑒 𝑓 𝑔 ℎ 𝑖 𝑎 𝑐 𝑓 𝑏 𝑑 𝑒 𝑔 ℎ 𝑖 𝑑 𝑎 𝑐 𝑓 𝑏 𝑒 ℎ 𝑑 𝑔 𝑖 𝑔 𝑓 𝑏 𝑒 ℎ 𝑖 𝑑 𝑔 𝑓 𝑐 𝑏 𝑒 ℎ 𝑖 𝑑 𝑔 𝑒 ℎ 𝑖 𝑑 𝑔 ℎ 𝑖 ℎ 𝑖 𝑑 𝑔 𝑏 𝑖 𝑑 𝑔 𝑒 𝑑 𝑔 𝑔

LexBFS slice 頂点を取り出すときの先頭のリストに属していた頂点集合 先頭の頂点 𝑢 の slice を 𝑆(𝑢) と書く 既に選ばれた頂点との接続関係は同じ 最初に与えられた順番により先頭が選ばれる 先頭の頂点 𝑢 の slice を 𝑆(𝑢) と書く 𝑎 𝑏 𝑐 𝑑 𝑒 𝑓 𝑔 ℎ 𝑖 𝑎 𝑐 𝑓 𝑏 𝑑 𝑒 𝑔 ℎ 𝑖 𝑐 𝑓 𝑏 𝑒 ℎ 𝑑 𝑔 𝑖 𝑓 𝑏 𝑒 ℎ 𝑖 𝑑 𝑔 𝑏 𝑒 ℎ 𝑖 𝑑 𝑔 𝑒 ℎ 𝑖 𝑑 𝑔 ℎ 𝑖 𝑑 𝑔 𝑖 𝑑 𝑔 𝑑 𝑔 𝑔

[ 𝑎 [ 𝑐 [ 𝑓 ] ] [ 𝑏 [ 𝑒 [ ℎ ] ] ] [ 𝑖 ] [ 𝑑 [ 𝑔 ] ] ] LexBFS slice の構造 [ 𝑎 [ 𝑐 [ 𝑓 ] ] [ 𝑏 [ 𝑒 [ ℎ ] ] ] [ 𝑖 ] [ 𝑑 [ 𝑔 ] ] ] 𝑆(𝑢) を分解 𝑢 𝑆 𝐴 (𝑢) : 𝑆(𝑢) 中の 𝑢 に隣接している頂点 𝑆 1 𝑢 , 𝑆 2 𝑢 ,… : LexBFS で 𝑆 𝐴 (𝑢) の点まで取り出したときのリストの中身 𝑆 𝑖 (𝑢) は一般には slice とは限らない 𝑆 𝐴 𝑎 =𝑐𝑓 𝑆 1 𝑎 =𝑏𝑒ℎ, 𝑆 2 𝑎 =𝑖, 𝑆 3 𝑎 =𝑑𝑔

Cograph 判定 𝐺 が cograph であるかを 𝑂(𝑛+𝑚) で判定 𝐺 に LexBFS を行う 1. と 2. で得られる slice が「適切な性質」を持つかどうか調べる

Cograph 判定 cograph の slice が持つ性質 (証明略) 計算量 𝑂(𝑛+𝑚) 𝑖<𝑗 に対し, 𝑆 𝑖 (𝑢) の頂点と 𝑆 𝑗 (𝑢) の頂点を結ぶ辺は存在しない 𝑣∈ 𝑆 𝐴 𝑢 と 𝑖<𝑗 に対し, 𝑣 が 𝑆 𝑗 (𝑢) の頂点と隣接しているならば, 𝑣 は 𝑆 𝑖 (𝑢) の頂点とも隣接している 各 𝑆 𝑖 (𝑢) 内では, 𝑆 𝐴 (𝑢) のどの頂点と隣接しているかは同じであることに注意 計算量 𝑂(𝑛+𝑚)

[ 𝑎 [ 𝑐 [ 𝑓 ] ] [ 𝑏 [ 𝑒 [ ℎ ] ] ] [ 𝑖 ] [ 𝑑 [ 𝑔 ] ] ] Cograph 判定 [ 𝑎 [ 𝑐 [ 𝑓 ] ] [ 𝑏 [ 𝑒 [ ℎ ] ] ] [ 𝑖 ] [ 𝑑 [ 𝑔 ] ] ] 𝑆 𝐴 (𝑎) の点は, 𝑆 1 (𝑎) に対しては 𝑐, 𝑆 2 (𝑎) に対しては 𝑓 で隣接 → cograph でない 𝑎 𝑐 𝑓 𝑏 𝑒 ℎ 𝑖 𝑑 𝑔 𝑆 𝐴 (𝑎) 𝑆 1 (𝑎) 𝑆 2 (𝑎) 𝑆 3 (𝑎)

Cograph と 𝑃 4 元のグラフも complement も連結なグラフ 1 頂点からなるグラフ 𝑃 4 (complement も 𝑃 4 ) 実は, cograph であることは, 𝑃 4 を含まないことと同値 「 𝑃 4 を含む」とは, 単に 4 頂点からなるパスが存在するだけでなく, 上図の 𝑎𝑐,𝑎𝑑,𝑏𝑑 に対応する箇所に辺がないことも要する 𝑎 𝑑 𝑏 𝑐

Cograph と 𝑃 4 cograph は 𝑃 4 を含まない (証明) 以上より帰納的に示される 1 頂点からなるグラフは 𝑃 4 を含まない 𝐺 1 , 𝐺 2 が 𝑃 4 を含まない ⇒ 𝐺 1 ∪ 𝐺 2 も 𝑃 4 を含まない 𝐺 が 𝑃 4 を含まない ⇒ 𝐺 も 𝑃 4 を含まない 以上より帰納的に示される

Cograph と 𝑃 4 𝑃 4 を含まないグラフは cograph である (証明) 𝐺 : そのうち頂点数が最小のものの 1 つ 𝑥 : 𝐺 の適当な頂点 𝐺−𝑥 (𝐺 から 𝑥 を取り除いたグラフ) は 𝑃 4 を含まないので cograph 𝐺−𝑥 が連結のときは 𝐺−𝑥 が連結でないので, 𝐺 の代わりに 𝐺 を考えることで, 𝐺−𝑥 は連結でないとしてよい

Cograph と 𝑃 4 𝑃 4 を含まないグラフは cograph である (証明つづき) 𝐺 も 𝐺 も連結 𝐺 も 𝐺 も連結 連結でないとすると cograph たちに分かれるので矛盾 𝑦 : 𝐺 の頂点で 𝑥 と隣接しないものがとれる 𝑧 : 𝐺−𝑥 で 𝑦 と異なる連結成分に属する頂点 𝐺 は連結なので 𝑦 から 𝑧 へのパスが存在するが, 𝑥 を経由しなければならない 𝑦 から 𝑥 へは他の頂点を経由しなければならない → 𝑦 から 𝑧 への辺が最小のパスを考えると, 「ショートカット」がないのでこのパスは 𝑃 4 を含み矛盾

Cograph と 𝑃 4 𝑥 𝑦 𝐺−𝑥 の連結成分 𝑧

Cograph と Cotree cograph の定義は, 次の定義と同値 1 頂点からなるグラフは cograph 𝐺 1 ⊎ 𝐺 2 : 𝐺 1 , 𝐺 2 の join ( 𝐺 1 の頂点と 𝐺 2 の頂点を結ぶ辺をすべて加えて並べる) join は complement, union, complement でできる

Cograph と Cotree ⊎ =

Cograph と Cotree cotree cograph の頂点を葉とし, その他の頂点には 0 か 1 の印がついている 0 : union 1 : join complement をとると 0 / 1 がすべて入れ替わる cograph の 2 頂点に対して, 最も根から遠い共通の祖先が 0 ならば辺がなく, 1 ならば辺がある

Cograph と Cotree cograph 対応する cotree 𝑑 𝑎 𝑔 1 1 𝑓 𝑐 𝑐 𝑑 𝑔 ℎ 1 1 𝑏 𝑏 𝑎 𝑓 𝑑 𝑎 𝑔 1 1 𝑓 𝑐 𝑐 𝑑 𝑔 ℎ 1 1 𝑏 𝑏 𝑎 𝑓 𝑒 ℎ 𝑒

Cograph と Cotree LexBFS で cograph 判定をするとき, 以下も計算量 𝑂(𝑛+𝑚) で行える (詳細略)

Cotree と Read-once function 𝑎𝑐𝑓+𝑏𝑐+𝑐𝑒ℎ+𝑑𝑔 𝑎𝑏𝑐+𝑎𝑏𝑒+𝑎𝑑𝑒+𝑏𝑐𝑓+𝑏𝑒𝑓+𝑑𝑒𝑓 各変数を頂点とするグラフを考える 掛け合わさっている変数どうしを辺で結ぶ 𝑎𝑐,𝑎𝑓,𝑐𝑓, 𝑏𝑐, 𝑐𝑒,𝑐ℎ,𝑒ℎ, 𝑑𝑔 𝑎𝑏,𝑎𝑐,𝑏𝑐, … 重複は無視する

Cotree と Read-once function cograph でないならば失敗 cograph ならば, cotree から多項式を復元して元の多項式になれば read-once 𝑎 𝑑 𝑒 𝑏 𝑐 𝑓

Cotree と Read-once function (𝑎𝑓+𝑏+𝑒ℎ)𝑐+𝑑𝑔 (𝑎𝑓+𝑏+𝑒ℎ)𝑐 𝑑𝑔 1 1 𝑎𝑓+𝑏+𝑒ℎ 𝑐 𝑑 𝑔 𝑎𝑓 𝑒ℎ 1 1 𝑏 𝑎 𝑓 𝑒 ℎ

Cograph と Read-once function クリーク : 頂点の集合で, どの 2 点も辺で結ばれているもの (𝑎𝑓+𝑏+𝑒ℎ)𝑐+𝑑𝑔 (𝑎𝑓+𝑏+𝑒ℎ)𝑐 𝑑𝑔 1 1 𝑎𝑓+𝑏+𝑒ℎ 𝑐 𝑑 𝑔 𝑎𝑓 𝑒ℎ 1 1 𝑏 𝑎 𝑓 𝑒 ℎ

Cograph の性質 cotree を構成すると, 最大クリークが求められる 最大安定集合が求められる 彩色数が求められる 安定集合 :頂点の集合で, どの 2 点も辺で結ばれていないもの 彩色数が求められる 彩色数 : 辺で結ばれた頂点を同じ色で塗らないとき, 何色で塗り分けられるか cograph においては彩色数は最大クリークの大きさに等しい 一般には, 彩色数は最大クリークの大きさ以上

Cograph の性質 cograph から頂点をいくつか取り除いても cograph 任意の極大クリークと任意の極大安定集合はちょうど 1 頂点を共有 などなど 文献入手法 cograph, LexBFS などで検索