SlideShare a Scribd company logo
2013 年 3 月 20 日 @ NTT DATA 駒場研修センター
第 12 回日本情報オリンピオック春季トレーニング合宿




             様々な全域木問題



             前原 貴憲 (@tmaehara)


               国立情報学研究所
自己紹介

• 前原 貴憲(まえはら たかのり)
• Twitter: @tmaehara
• Web: http://www.prefield.com (Spaghetti Source)

• 略歴:
   2004 沼津工業高等専門学校卒
   2007 東京大学 工学部 計数工学科卒
   2012 東京大学大学院 情報理工学系研究科卒
   現在 国立情報学研究所

• 専門分野:連続・離散最適化,数値計算

                                               2/ 71
全域木問題




        3/ 71
木・全域木
• 無向グラフ G = (V, E),枝重み w : E → R
  – V :頂点集合,E :枝集合
   ※基本的に連結なグラフだけ考える

 – 木(tree):閉路のない連結部分グラフ(枝集合)
 – 森(forest):閉路のない部分グラフ(木の集まり)

 – 全域木(spanning tree):すべての頂点を繋ぐ木




                                   4/ 71
全域木に関する問題はとても多い!
しかも 効率的に解ける問題 がわりと多い
  → 効率的解法のテンプレ



 •   全域木存在判定     •   最速全域木
 •   最小全域木       •   ロバスト最小全域木
 •   最小比全域木      •   次数制約付全域木
 •   凸最小全域木      •   葉最多全域木
 •   逆最小全域木      •   確率的全域木
 •   最小直径全域木     •   最小ラベル全域木
 •   第 k 最小全域木   •   シュタイナー木
                     .
 •   最小全域有向木         .
                     .
                                 5/ 71
この講義の目標

 • マイナーな全域木問題 を題材にして

 • 解ける問題 の解法パターンを理解する


題材
•    最小全域木
                 • 最小直径全域木
•    葉指定最小全域木
                 • 逆最小全域木
•    最小比全域木
                 • 最小全域木 ×2
•    第 k 最小全域木
                 (EASY MEDIUM HARD)
                                6/ 71
だいぶ難しい内容なので

全部理解できなくても大丈夫!

• 問題の定義・解法の方針が分かれば上出来
• 細かい部分が気になったら調べましょう(see: 参考文献)


【前提知識】
秋葉・岩田・北川:プログラミングコンテストチャレンジブック
Cormen-Leiserson-Rivest-Stein:アルゴリズムイントロダクション


                                        7/ 71
最小全域木




        8/ 71
最小全域木
• 入力
 重み付きグラフ G = (V, E), w : E → R

• 問題:
 重み和が最小の全域木を求めよ


              3
                          1
          1       2   3
                          2
              2

                                 9/ 71
最小全域木
• 入力
 重み付きグラフ G = (V, E), w : E → R

• 問題:
 重み和が最小の全域木を求めよ


              3
                          1
          1       2   3
                          2
              2

                                 10/ 71
最小全域木
• 入力:
 重み付きグラフ G = (V, E), w : E → R

• 問題:
 重み和が最小の全域木を求めよ


• 解答:貪欲法(Kruskal)
 1. 枝の軽い順に採用していく
 2. ただし,閉路ができる場合は無視

Q. なぜ貪欲で解けるか? (→ どこまで拡張できるか?)

                                 11/ 71
最適化問題を考える際の基本
                  {∑
                       e∈X   w(e) 閉路なし
       f (X) :=
                  +∞               閉路あり

• 全部の X を調べると O(2m ) 時間
• もし f が 良い不等式 を満たすなら
 全部調べなくても,一部だけ調べれば十分!

• 一番扱いやすい不等式:凸不等式(2つの解 ≥ 間の解)

                   Y         f (X) + f (Y )
      X
                               ≥ 2f ((X + Y )/2)

                                              12/ 71
最小全域木問題の凸不等式
                   {∑
                        e∈X   w(e) 閉路なし
        f (X) :=
                   +∞             閉路あり


任意の e ∈ X  Y に対し,e′ ∈ Y  X がとれて
f (X) + f (Y ) ≥ f (X − e + e′ ) + f (Y + e − e′ )
                                -
                    Y         Y ?
         X-

                                     e′ 6
                                        
                                         X
                                        e
                                             13/ 71
凸不等式が成り立つこと(左辺有限 ⇒ 右辺有限)
f (X) + f (Y ) ≥ f (X − e + e′ ) + f (Y + e − e′ )




 e

                        ≥
       e′




     (よくある教科書の証明は,中でこれを示している)
                                             14/ 71
凸不等式を使った証明
T ∗ 最適解,T 貪欲解について凸不等式を書く
 f (T ) + f (T ∗ ) ≥ f (T − e + e′ ) + f (T ∗ + e − e′ )
 ∴ f (T ) ≥ f (T − e + e′ ) ∴ w(e) ≥ w(e′ )
-  で成立:貪欲で e を追加したところに矛盾
- = で成立:T ∗ + e − e′ を T ∗ として繰り返す
    → 最終的に T = T ∗ になって証明完了

☆この証明が動くことが凸のうれしさ

☆一般に,この凸不等式を満たす関数は
 貪欲で最小化可能( → 離散凸 )


                                                   15/ 71
最小全域木 まとめ

• 最小全域木問題は貪欲で解ける


 関数が満たす不等式を考える
  特に凸不等式が成り立つとハッピー

 凸不等式が成り立てば貪欲で解ける
  (「貪欲」1ステップが複雑な場合も;後述)


(例:w(X)2 の最小化など:凸不等式成立なので貪欲)


                          16/ 71
葉を指定した最小全域木




              17/ 71
葉を指定した最小全域木
• 入力
 重み付きグラフ G = (V, E), w : E → R+
 頂点の部分集合 U ⊆ V

• 問題:
  U が葉である 全域木の中で,重み和最小のもの




                                  18/ 71
グラフ問題の大原則:頂点問題 vs 枝問題

 • 頂点に対する問題は解きにくい
 • 枝に対する問題は解きやすい

    頂点に対する問題     枝に対する問題
    ハミルトンパス       オイラーパス
      頂点被覆          枝被覆
        .
        .            .
                     .
        .            .

葉を指定した最小全域木:
 「U を葉にする」(頂点条件)を 枝条件 で書き換える

                           19/ 71
頂点条件を枝条件で書き換える
           (1) U 同士を繋ぐ枝を使わない
U を葉にする ⇐⇒ (2) U とそれ以外を繋ぐ枝を
               |U | 本以上使わない
(1):U 同士を繋ぐ枝は先に除去
(2):全域木は少なくとも |U | 本 (2) 型の枝を使う
    ⇒ U の枝はできるだけ使わないようにする

∴ Kruskal 法の最初の枝ソートの部分を以下のように修正
(1) U 以外を繋ぐ枝(重み順ソート)
(2) U と U 以外を繋ぐ枝(重み順ソート)


                                  20/ 71
葉を指定した最小全域木 まとめ

• 頂点条件を枝条件に書き換える
 – U を葉にせよ ⇒ U と接続する枝を減らせ
 ⇒ Kruskal の変形版が適用可能



基本的に「頂点は難しい / 枝は簡単」

⇒ できるだけ枝条件であらわすようにする
(例:最長しりとり:文字列を枝に対応させる(オイラー路)
   頂点に容量のある最大流:頂点を増やして枝容量に)
                            21/ 71
最小比全域木




         22/ 71
最小比全域木
• 入力:
 2種類の重み付きグラフ
 G = (V, E), w1 , w2 : E → R0
• 問題:
        w1 (T )
 重み比              を最小化する全域木を出力
        w2 (T )                          ∑
                              wi (X) =       e∈X   wi (X)




TCO06 Finals (Div.1 Lv.3) PhoneNetwork
                                                   23/ 71
パラメタを用いた分数関数の凸化
                {
                    w1 (X)/w2 (X)      閉路なし
     f (X) :=
                    +∞                 閉路あり

そのままでは 凸っぽくない ので・・・
f = t の分母を払った関数 gt (t を止めたら凸)
                            :
                {
                    w1 (X) − tw2 (X)   閉路なし
    gt (X) :=
                    +∞                 閉路あり


         gt (X) ≤ 0 ⇐⇒ f (X) ≤ t
         gt (X) ≥ 0 ⇐⇒ f (X) ≥ t


                                              24/ 71
パラメトリックアプローチ
f :分数関数,g(t) = minT {w1 (T ) − tw2 (T )}

 (1) min f (T ) = t∗ ⇐⇒ g(t∗ ) = 0
 (2) g(t) は t の単調減少凹関数
                        (負の傾きの直線の min )


      g(t) 6




                             ∗
                                 -t
           0             t
                                           25/ 71
g のゼロ点の計算方法
Find 0 = g(t∗ ), g(t) = minT {w1 (T ) − tw2 (T )}
• 方法1:二分探索
  ゼロと大小比較して範囲を絞っていく

• 方法2:Dinkelbach の方法
  (1) g(t(k) ) を計算,最小を与える解を T (k+1) とおく
  (2) t(k+1) := w1 (T (k+1) )/w2 (T (k+2) ) と設定
    (g(t) を支える直線に沿って進む)

☆ Dinkelbach は常に収束,高速(実用的&理論的)
☆数値精度の問題が発生しづらい
☆実装難度は二分探索と大差なし

                                                26/ 71
最小比全域木 まとめ
              f (T ) := w1 (T )/w2 (T )

         ⇒ g(t) := min{w1 (T ) − tw2 (T )}
                     T

• f にパラメタを入れて 凸化
  – g(t∗ ) = 0 ⇐⇒ min f (T ) = t∗ .
  – g(t) は単調減少凹関数
• 二分探索 or Dinkelbach の方法

「比の最小化」は,ほぼこのパターンで解ける

何かを止めたら凸になるパターンは多い(解けるかは別)
  (例:分散最小全域木 = 平均をパラメタにすると凸)
                                             27/ 71
第 k 最小全域木




            28/ 71
第 k 最小全域木
• 入力:
 重み付きグラフ G = (V, E), w : E → R
 正整数 k

• 問題:
 重み和が k 番目に小さな全域木を出力
(注意:k = 1 のとき最小全域木)


ヒント 1:1 番目,2 番目,…と順番に求める
ヒント 2:同じ計算が多いので前処理する



                                 29/ 71
簡単のため:第 2 最小全域木
(1) MST を計算
(2) MST の枝を 1 本使用禁止 にして再び MST 計算
    MST のすべての枝 n 通りについて実行して min をとる
正当性:
•「2ndMST で使わない 1stMST の枝」が少なくとも 1 本存在
  ⇒ 「使わない枝」を禁止すると 2ndMST が出る
         (どれが「使わない枝」か不明なので全部試す)


これを繰り返すと第 k も求まる!



                                30/ 71
第 k 最小全域木:優先度付き探索

 Q ← (∅, MST)
 while Q ̸= ∅
    (banList, spanningTree) ← Q
    print (spanningTree)
    for each e in spanningTree:
        newList ← banList ∪ {e}
        newTree ← MST(newList)
        Q ← (newList, newTree)

計算量:だいたい O(kmnα(n) + m log n)
  同じ計算を何度もしているので,効率化できそう
                                  31/ 71
前処理 1:絶対使う枝は縮約する
T :全域木,枝 e ∈ T の 交換可能枝C(e):
   C(e) = {e′ ̸∈ T : T − e + e′ は全域木 }
       ⇐⇒ e′ の両端をつなぐ T 上の経路に e がある




全域木 T で枝 e を禁止するときの不可避なロス
   mine′ ∈C(e) w(e) − w(e′ )
∴ 最小全域木中のロスが小さな k 本以外の枝は絶対使う
   → 先に縮約して k 頂点のグラフにしておく
                           32/ 71
前処理 2:絶対使わない枝は捨てる
T :全域木,枝 e′ ̸∈ T の 交換可能枝C(e′ ):
   C(e′ ) = {e ∈ T : T − e + e′ は全域木 }
        ⇐⇒ e′ の両端をつなぐ T 上の経路の枝




全域木 T で枝 e′ と交換するときの不可避なロス
   mine∈C(e′ ) w(e) − w(e′ )
∴ 最小全域木外のロスが小さな k 本以外の枝は使わない
   → 先に捨てて 2k − 1 枝グラフにしておく
                            33/ 71
不可避ロスの計算
前処理 1:e ∈ T を禁止するときのロス計算
前処理 2:e′ ̸∈ T を使うときのロス計算

• 最小全域木上で 経路クエリ ができれば OK
  前処理 1:e′ の両端経路上の枝について w(e′ ) で更新
  前処理 2:e′ の両端経路上の枝について min w(e) を取得

• 木上の経路クエリ:
  動的木・heavy-light 分解・etc... O(log n)
「完全制覇・ツリー上でのクエリ処理技法」参照
 (2011 年 Competitive Programming Advent Calendar @秋葉)

         前処理 1,2 のどちらも,O(m log n) で計算可能

                                              34/ 71
第 k 全域木 まとめ
• 前処理 1 で k 頂点に減らす
• 前処理 2 で 2k − 1 枝に減らす
    → 最小全域木上の経路クエリ
• 優先度付き探索 O(k2 α(k) + n log n)


k-best 問題の基本は 優先度付き探索 + 枝刈り
   優先度付き探索 の部分は使いまわせる
   枝刈り の部分は問題特有になりがち
     (「絶対使わない部分」         「絶対使う部分」に注目)
(最短路:USACO 2006 November Gold Roadblocks,
      ICPC 2006 Asia Enjoyable Commutation)
                                       35/ 71
最小直径全域木




          36/ 71
最小直径全域木
• 入力
 重み付きグラフ G = (V, E), w : E → R+

• 問題:
 全域木 T で,直径が最小のもの
(木の直径:二点対間距離の最大値)

ヒント:
   「グラフのどまんなか」を探す
  ⇒ 「どまんなか」からの最短路木 = 最小直径全域木


SPOJ PT07C: The GbAaY Kingdom
SPOJ MDST: Minimum Diameter Spanning Tree
                                            37/ 71
グラフの絶対中心
グラフ G の絶対中心:maxv∈V d(c, v) が最小の点

絶対中心は頂点ではない可能性がある




                  6
                  c


 絶対中心からの最短路木 = 最小直径全域木

⇒ どの枝の内側に絶対中心があるかを全部試す

                                   38/ 71
枝の内点からの距離
枝 (u, v) の内点 c から w への距離:d(c, u) = t として
 gw (t) = min{t + d(u, w), d(u, v) − t + d(v, w)}
c からの最遠頂点までの距離
          g(t) = max gw (t)
                       w∈V

g(t) の最小値 = (u, v) 間に中心があるとしたときの半径
∴ すべての枝について,g(t) の最小値を計算すればいい!
                   w


                    u t       v
                          6
                          c
                                             39/ 71
gw (t) の形;枝 (u, v) 内点から w への距離
 gw (t) = min{t + d(u, w), d(u, v) − t + d(v, w)}
  g(t) = max gw (t)
         w∈V


          傾き 1 と −1 の直線の min

         gw (t) 6


       d(u, w)
                                   d(v, w)
                                     -t
                 0       d(u, v)

                                             40/ 71
min g(t) の計算;枝 (u, v) 内からの最小径
 gw (t) = min{t + d(u, w), d(u, v) − t + d(v, w)}
  g(t) = max gw (t)
         w∈V

          ∧ 型の端点を計算(切片でソート)
            → 上包絡線の一番低い点を出力 O(n log n)
          g(t) 6




                                   -t
               0         d(u, v)

                                             41/ 71
最小直径全域木 まとめ
• 最小直径全域木 = 絶対中心 からの最短路木
• 絶対中心の探索:∧ 型の端点(一次関数の交差)
計算量:

• 前処理:全点対間最短路 O(n3 ) (Floyd Warshall)
• 端点計算: O(mn)
(切片のソートは最短路計算のときに一緒に行える)


 やや珍しいパターン
(例:施設配置問題;グラフの絶対中央値)


                                   42/ 71
逆最小全域木




         43/ 71
問題:逆最小全域木
• 入力:
 重み付きグラフ G = (V, E), w : E → R
 全域木 T

• 問題:
  T が最小全域木になるような最小重み修正:
    - T は重み w + p のときの最小全域木,
      ∑
    - e |p(e)| 最小化

ヒント 1:T が MST であるための必要十分条件
ヒント 2:最低限必要な修正量を計算


                                 44/ 71
最小全域木の必要十分条件(最適性基準)
                   {∑
                        e∈X   w(e) 閉路なし
        f (X) :=
                    +∞            閉路あり

全域木 T が MST ⇐⇒ 任意の e ∈ T, e′ ̸∈ T について
    f (T − e + e′ ) ≥ f (T )
         =⇒ w(e)≤ w(e′ ) (e, e′ : 交換可能)
               (どの交換可能枝を交換しても得しない)

- 得したら最小でないのは当然
   ⇒ 得する分だけは 最低限修正が必要


                                          45/ 71
最低限必要な修正量
最低限必要な修正量は2部グラフマッチングでわかる

2部グラフ B = ({T, E  T }, A):

                e, e′ 間に辺がある
                    ⇐⇒ e, e′ は交換可能
                      (重み = 交換したときの得)

   T      ET     マッチング = その対を同時に交換

最大重みマッチングの分だけは,絶対修正が必要
       (負の辺 = 交換して損する辺は除いておく)

                                 46/ 71
逆全域木問題の最大最小定理

      min 重み変更量 = max マッチング


≥ は簡単(前ページ)
≤ は難しい;当面そういうものと覚えてもよい

             e, e′ 間に辺がある
                 ⇐⇒ e, e′ は交換可能
                   (重み = 交換したときの得)

  T    ET    マッチング = その対を同時に交換

                              47/ 71
最大最小定理証明のアウトライン
(1) w + p に関する最適性基準を書き下す
          ∑
      min e |p(e)| s.t. w + p の最適性基準

(2) T の枝は軽く・E  T の枝は重くするはず,と考えて
   絶対値を外しつつ,変数変換して形を整える
       ∑
    min e q(e) s.t. q に関する条件

(3) 線形計画の双対定理を使って式をじっと眺める
    → マッチングの LP 表現になっている
       最小費用流主双対アルゴリズムを使って得られる
       ポテンシャルの性質を観察することでも証明可能

                                       48/ 71
逆最小全域木 まとめ
• 最適性基準:どの枝を交換しても得しない

• 交換可能枝の間の二部グラフを作る
    必要な修正量 ≥ マッチング

• 必要な修正量 = 最大マッチング 定理
    ⇒ 二部グラフ最大重みマッチング で解ける



 既知のうまく解ける逆問題は,だいたいフローに帰着
(例:逆二部マッチング,逆最小カット,逆最短路@ DAG)

                            49/ 71
最小全域木 ×2




           50/ 71
最小全域木 ×2
• 入力
 重み付きグラフ G = (V, E), w : E → R

• 問題
 辺を共有しない(辺素な)全域木を2つ取り
 重み和が最小になるようにせよ

ヒント 1:目的関数が凸になるように作る → 貪欲
ヒント 2:貪欲の 1 ステップごとに探索が発生




                                 51/ 71
うまくいかない関数定義

           {
            w(X) + w(Y )   閉路なし・辺共有しない
g(X, Y ) =
            +∞             それ以外


「辺共有しない」という条件のせいで凸にならない
(貪欲するときに X と Y のどちらに足すべきかが不明)

※ダメ解法:Kruskal で UnionFind×2 = この関数で貪欲




                                   52/ 71
凸になる関数の定義
          {
            w(X) 閉路なし(森)
  f (X) =
            +∞   閉路あり
          {
           w(X) X をうまく配分すると森 × 2
  g(X) =
           +∞    それ以外

 g(X) + g(Y ) ≥ g(X − e + e′ ) + g(Y + e − e′ )


※ f と g の関係:畳み込み
    g(X) = min {f (T ) + f (X  T )} = f ∗ f
            T ⊆X


                                           53/ 71
凸なので貪欲で解ける(Kruskal と同じ)
         {
          w(X)          X をうまく配分すると森 × 2
  g(X) =
          +∞            それ以外

 for e ∈ E: 軽い順
     if X ∪ {e}: 森 ×2
        X = X ∪ {e}

必要なサブルーチン

 X が森 ×2 に配分できるとき,
 X ∪ {e} が森 ×2 に配分できるかの判定


                                      54/ 71
X :森 ×2 に e を追加できるか
• X = {F1 , F2 }:森 ×2 の形を常に保持
• e を追加できるかどうか:交換手順を探索
    (1) e が F1 に追加できれば終了
    (2) できなかったら e の交換可能枝を列挙
        それぞれについて F2 に追加を試みる 二部マッチング
    (3) F1 , F2 交互に繰り返す     増加道探索と類似

• 最短手数の交換だけ探す:幅優先探索
   (a) 同じ枝は何度もチェックしない
     → 探索中に 木を動的変更しなくてよい
交換枝の列挙:動的木を使えば全体で O(n2 )
 ☆ 列挙の順番を工夫すると動的木なしで O(n)
                                55/ 71
{F1 , F2 } に枝 (u, v) を追加できるかの判定
前処理:(1) F1 , F2 を u が根になるように向き付ける
    (2) 木の u 以外の頂点を白く塗り,u を黒く塗る
     (黒:w より根に近い枝は全部探索済み,の意味)

 L1 := [(u, v)]                   根に近い側からテスト
 for i = 1, 2, 1, 2, . . .:         → 同じ枝を二回見ない
     if Li = ∅: return false
     Li+1 = ∅
     for (x, y) ∈ Li :
         if (x, y) が Fi に追加可能: return true
         if x は白: swap(x,y) /* 一方は絶対黒 */
         while y は白: 
         Li+1 .push front((y, p[y]))
         y を黒く塗る,y ← p[y]

                                          56/ 71
最小全域木 ×2 まとめ
          {
           w(X)   X をうまく配分すると森 × 2
   g(X) =
           +∞     それ以外


• 凸なので貪欲で解ける
 (※ただし貪欲の 1 ステップが複雑)

• 効率的に貪欲するには:
  – X = {F1 , F2 } の形で保持
  – 交換経路を探索
     枝列挙順序を工夫して O(n)



                                57/ 71
まとめ




      58/ 71
まとめ
 • 最小全域木
                • 最小直径全域木
 • 葉指定最小全域木
                • 逆最小全域木
 • 最小比全域木
                • 最小全域木 ×2
 • 第 k 最小全域木



• 問題の定義・解答の方針
  ⇒ 興味の湧いた問題は調べてみましょう

 (ここで述べた内容はだいたい「マトロイド」に拡張可)
                             59/ 71
60/ 71
演習問題 / 発展課題
• 分散最小全域木 [Katoh 1990]
                       ∑
  全域木の平均重みを µ(T ) =      w(e)/(n − 1) とする.
                        ∑
  重みの分散,すなわち v(T ) = (w(e) − µ(T ))2 が
 最小となる全域木を求めよ.

• 逆最小全域木(min-max 型)[Sokkalingam et al. 1996]
  max |pi | が最小の修正を求めるアルゴリズムを与えよ.
• カラフル全域木 [Schrijver 2003]
  枝に重みとラベル {1, 2, . . . n − 1} がついているとき
  同じラベルが丁度 1 回ずつ現れる全域木のうち
 最小重みのものを求めるアルゴリズムを与えよ.


                                       61/ 71
演習問題 / 発展課題
• 次数制約付き最小全域木 [Garey-Johnson 1976]
  各頂点の次数が b 以下となる全域木を求める問題は
  NP-hard である.
• 葉最多全域木 [Garey-Johnson 1979]
 葉の数が最多の全域木を求める問題は NP-Hard である.
• 全距離最小木 [Garey-Johnson 1979]
 全頂点対の木距離の和が最小になる全域木を求める
 問題は,すべての重みが 1 であっても NP-hard である.
• 全域木 + 木 [Bernath-Kiraly 2011]
 全域木と全域とは限らない木を辺素に取れるかどうかを
 判定する問題は NP-hard である.
                                     62/ 71
演習問題 / 発展課題
• ランダムグラフの最小全域木 [Frieze 1985]
  n 頂点からなる完全グラフで,各枝の重みが独立に
  [0, 1] の一様分布に従うとき,最小全域木の重み期待値は
  n → ∞ で ζ(3) = 1 + 1/23 + 1/33 + · · · に収束する.
  ※各 n に対する一般式は 2013 年 3 月現在未知.

• 全域木ゲーム [Lehman 1964]
  2 人のプレイヤーが交互に次の操作を行う:
     (P1) グラフの枝を取り除く
     (P2) グラフの枝を固定する(以後取り除かれない)
 操作ができなくなったときの残りのグラフが全域木のとき
 P2 の勝利とする.辺素な全域木が 2 つとれることと P2 に
 必勝法が存在することは同値である.
                                        63/ 71
参考文献:最小全域木
• T. H. Cormen, C. E. Leiserson, R. L. Rivest, and C. Stein (2009):
  Introduction to Algorithms. 3rd eds., MIT Press.

• R. L. Graham and P. Hell (1985): On the history of the minimum
  spanning tree problem. Annals of the History of Computing, vol.7,
  pp.43-57.

• K. Murota (2003): Discrete Convex Analysis. SIAM Monographs
  on Discrete Mathematics and Applications, vol.10, SIAM,
  Philadelphia.

• J. Oxley (2003): What is a matroid? Cubo, vol.5, pp.179-218.

• A. Schrijver (2003): Combinatorial Optimization. Springer.

• 秋葉拓哉, 岩田陽一, 北川宜稔 (2012): プログラミングコンテストチャ
  レンジブック. 2nd eds, マイナビ.
                                                               64/ 71
参考文献:最小比全域木
• R. Chandrasekaran (1977): Minimum ratio spanning trees.
  Networks, vol.7, pp.335-342.

• W. Dinkelbach (1967): On nonlinear fractional programming.
  Management Science, vol.13, pp.492-498.

• T. Radzik (1992): Newton’s Method for Fractional Combinatorial
  Optimization. Proceedings of 33rd Annual Symposium of
  Foundation of Computer Science, pp. 659-669.




                                                            65/ 71
参考文献:第 k 最小全域木
• D. Eppstein (1990): Finding the k-smallest spanning trees. 2nd
  Scandinavian Workshop on Algorithm Theory, Bergen, Norway,
  Lecture Notes in Computer Science, vol.447, pp.38-47.

• R. E. Tarjan (1979): Applications of path compression on balanced
  trees. Journal of ACM, vol.26, pp.690-715.

• 秋葉拓哉 (2011): 完全制覇・ツリー上でのクエリ処理技法.
  Competitive Programming Advent Calendar 2011-12-05,
  http://topcoder.g.hatena.ne.jp/iwiwi/20111205/1323099376




                                                            66/ 71
参考文献:最小直径全域木
• R. A. Cunninghame-Green (1975): The absolute center of a graph,
  Discrete Applied Mathematics,. vol.7, pp.275-283.

• R. Hassin and A. Tamir (1995): On the minimum diameter
  spanning tree problem, Information Processing Letters, vol.53,
  pp.109-111.

• J. Halpern (1979): A simple elimination criterion in a search for the
  center of a graph, Management Science, vol.7, pp.287-293.

• O. Kariv and S. L. Hakimi (1979): An algorithmic approach to
  network location problem I: the p centers, SIAM Journal on Applied
  Mathematics, vol.37, no.513-518.




                                                              67/ 71
参考文献:逆最小全域木
• R. Ahuja and J. Orlin (2001): Inverse optimization, Operations
  Research, vol. 49 pp.771-783.

• M. Cai and Y. Li (1997): Inverse matroid intersection problem ZOR
  Mathematical Methods of Operations Research, vol.45 pp.235-243.

• C. Heuberger (2004): Inverse combinatorial optimization: A survey
  on problems, methods, and results. Journal of Combinatorial
  Optimization, vol.8, pp.329-361.

• P. T. Sokkalingam, R. K. Ahuja, and J. B. Orlin (1996): Solving
  inverse spanning tree problems though network flow techniques.
  Operations Research, vol.47, no.2.




                                                            68/ 71
参考文献:最小全域木 ×2
• J. Edmonds (1970): Submodular functions, matroids, and certain
  polyhedra. Proceedings of the Calgary Conerence on Conbinatorial
  Combinatorial Structures and Their Ppplications, pp.69-87.

• A. Frank (1981): A weighted matroid intersection algorithm.
  Journal of Algorithms, vol.2, no.4, pp.328-336.

• H. N. Gabow and R. E. Tarjan, Robert (1984), Efficient algorithms
  for a family of matroid intersection problems. Journal of
  Algorithms, vol.5, no.1, pp.80-131.

• J. Roskind and R. E. Tarjan (1985): A note on finding
  minimum-cost edge-disjoint spanning trees. Mathematics of
  Operations Research, vol.10, pp.701-708.



                                                           69/ 71
参考文献:演習問題 / 発展課題
• N. Katoh (1990): An ϵ-approximation scheme for minimum
  variance problems. Journal of the Operations Research Society of
  Japan, vol.33, no.1 46-65.
• M. R. Garey and D. S. Johnson (1979): Computers and
  Intracctability: A Guide to the Theory of NP-Completeness. W. H.
  Freeman, New York.
• H. Fernau, J. Kneis, D. Kratsch, A. Langer (2011), M. Liedloff, D.
  Raible, and P. Rossmanith: An exact algorithm for the maximum
  leaf spanning tree problem. Journal Theoretical Computer Science,
  vol.412, no.45, pp.6290-6302.
• A. Bernath and Z. Kiraly (2011): On the tractability of some
  natural packing, covering and partitioning problems. Technical
  Report.
                                                             70/ 71
• A. M. Frieze (1985): On the value of a random minimum spanning
  tree problem. Discrete Applied Mathematics, vol.10, pp.47-56.

• A. Frieze, M. Ruszink, and L. Thoma (2000): A note on random
  minimum length spanning trees, The Electronic Journal of
  Combinatorics, vol.7, R41.

• A. Lehman (1964): A solution to Shannon’s switching game.
  Journal of the Society for Industrial and Applied Mathematics,
  vol.12, pp.687-725.




                                                             71/ 71

More Related Content

様々な全域木問題

  • 1. 2013 年 3 月 20 日 @ NTT DATA 駒場研修センター 第 12 回日本情報オリンピオック春季トレーニング合宿 様々な全域木問題 前原 貴憲 (@tmaehara) 国立情報学研究所
  • 2. 自己紹介 • 前原 貴憲(まえはら たかのり) • Twitter: @tmaehara • Web: http://www.prefield.com (Spaghetti Source) • 略歴: 2004 沼津工業高等専門学校卒 2007 東京大学 工学部 計数工学科卒 2012 東京大学大学院 情報理工学系研究科卒 現在 国立情報学研究所 • 専門分野:連続・離散最適化,数値計算 2/ 71
  • 4. 木・全域木 • 無向グラフ G = (V, E),枝重み w : E → R – V :頂点集合,E :枝集合 ※基本的に連結なグラフだけ考える – 木(tree):閉路のない連結部分グラフ(枝集合) – 森(forest):閉路のない部分グラフ(木の集まり) – 全域木(spanning tree):すべての頂点を繋ぐ木 4/ 71
  • 5. 全域木に関する問題はとても多い! しかも 効率的に解ける問題 がわりと多い → 効率的解法のテンプレ • 全域木存在判定 • 最速全域木 • 最小全域木 • ロバスト最小全域木 • 最小比全域木 • 次数制約付全域木 • 凸最小全域木 • 葉最多全域木 • 逆最小全域木 • 確率的全域木 • 最小直径全域木 • 最小ラベル全域木 • 第 k 最小全域木 • シュタイナー木 . • 最小全域有向木 . . 5/ 71
  • 6. この講義の目標 • マイナーな全域木問題 を題材にして • 解ける問題 の解法パターンを理解する 題材 • 最小全域木 • 最小直径全域木 • 葉指定最小全域木 • 逆最小全域木 • 最小比全域木 • 最小全域木 ×2 • 第 k 最小全域木 (EASY MEDIUM HARD) 6/ 71
  • 7. だいぶ難しい内容なので 全部理解できなくても大丈夫! • 問題の定義・解法の方針が分かれば上出来 • 細かい部分が気になったら調べましょう(see: 参考文献) 【前提知識】 秋葉・岩田・北川:プログラミングコンテストチャレンジブック Cormen-Leiserson-Rivest-Stein:アルゴリズムイントロダクション 7/ 71
  • 9. 最小全域木 • 入力 重み付きグラフ G = (V, E), w : E → R • 問題: 重み和が最小の全域木を求めよ 3 1 1 2 3 2 2 9/ 71
  • 10. 最小全域木 • 入力 重み付きグラフ G = (V, E), w : E → R • 問題: 重み和が最小の全域木を求めよ 3 1 1 2 3 2 2 10/ 71
  • 11. 最小全域木 • 入力: 重み付きグラフ G = (V, E), w : E → R • 問題: 重み和が最小の全域木を求めよ • 解答:貪欲法(Kruskal) 1. 枝の軽い順に採用していく 2. ただし,閉路ができる場合は無視 Q. なぜ貪欲で解けるか? (→ どこまで拡張できるか?) 11/ 71
  • 12. 最適化問題を考える際の基本 {∑ e∈X w(e) 閉路なし f (X) := +∞ 閉路あり • 全部の X を調べると O(2m ) 時間 • もし f が 良い不等式 を満たすなら 全部調べなくても,一部だけ調べれば十分! • 一番扱いやすい不等式:凸不等式(2つの解 ≥ 間の解) Y f (X) + f (Y ) X ≥ 2f ((X + Y )/2) 12/ 71
  • 13. 最小全域木問題の凸不等式 {∑ e∈X w(e) 閉路なし f (X) := +∞ 閉路あり 任意の e ∈ X Y に対し,e′ ∈ Y X がとれて f (X) + f (Y ) ≥ f (X − e + e′ ) + f (Y + e − e′ ) - Y Y ? X- e′ 6 X e 13/ 71
  • 14. 凸不等式が成り立つこと(左辺有限 ⇒ 右辺有限) f (X) + f (Y ) ≥ f (X − e + e′ ) + f (Y + e − e′ ) e ≥ e′ (よくある教科書の証明は,中でこれを示している) 14/ 71
  • 15. 凸不等式を使った証明 T ∗ 最適解,T 貪欲解について凸不等式を書く f (T ) + f (T ∗ ) ≥ f (T − e + e′ ) + f (T ∗ + e − e′ ) ∴ f (T ) ≥ f (T − e + e′ ) ∴ w(e) ≥ w(e′ ) - で成立:貪欲で e を追加したところに矛盾 - = で成立:T ∗ + e − e′ を T ∗ として繰り返す → 最終的に T = T ∗ になって証明完了 ☆この証明が動くことが凸のうれしさ ☆一般に,この凸不等式を満たす関数は 貪欲で最小化可能( → 離散凸 ) 15/ 71
  • 16. 最小全域木 まとめ • 最小全域木問題は貪欲で解ける 関数が満たす不等式を考える 特に凸不等式が成り立つとハッピー 凸不等式が成り立てば貪欲で解ける (「貪欲」1ステップが複雑な場合も;後述) (例:w(X)2 の最小化など:凸不等式成立なので貪欲) 16/ 71
  • 18. 葉を指定した最小全域木 • 入力 重み付きグラフ G = (V, E), w : E → R+ 頂点の部分集合 U ⊆ V • 問題: U が葉である 全域木の中で,重み和最小のもの 18/ 71
  • 19. グラフ問題の大原則:頂点問題 vs 枝問題 • 頂点に対する問題は解きにくい • 枝に対する問題は解きやすい 頂点に対する問題 枝に対する問題 ハミルトンパス オイラーパス 頂点被覆 枝被覆 . . . . . . 葉を指定した最小全域木: 「U を葉にする」(頂点条件)を 枝条件 で書き換える 19/ 71
  • 20. 頂点条件を枝条件で書き換える (1) U 同士を繋ぐ枝を使わない U を葉にする ⇐⇒ (2) U とそれ以外を繋ぐ枝を |U | 本以上使わない (1):U 同士を繋ぐ枝は先に除去 (2):全域木は少なくとも |U | 本 (2) 型の枝を使う ⇒ U の枝はできるだけ使わないようにする ∴ Kruskal 法の最初の枝ソートの部分を以下のように修正 (1) U 以外を繋ぐ枝(重み順ソート) (2) U と U 以外を繋ぐ枝(重み順ソート) 20/ 71
  • 21. 葉を指定した最小全域木 まとめ • 頂点条件を枝条件に書き換える – U を葉にせよ ⇒ U と接続する枝を減らせ ⇒ Kruskal の変形版が適用可能 基本的に「頂点は難しい / 枝は簡単」 ⇒ できるだけ枝条件であらわすようにする (例:最長しりとり:文字列を枝に対応させる(オイラー路) 頂点に容量のある最大流:頂点を増やして枝容量に) 21/ 71
  • 23. 最小比全域木 • 入力: 2種類の重み付きグラフ G = (V, E), w1 , w2 : E → R0 • 問題: w1 (T ) 重み比 を最小化する全域木を出力 w2 (T ) ∑ wi (X) = e∈X wi (X) TCO06 Finals (Div.1 Lv.3) PhoneNetwork 23/ 71
  • 24. パラメタを用いた分数関数の凸化 { w1 (X)/w2 (X) 閉路なし f (X) := +∞ 閉路あり そのままでは 凸っぽくない ので・・・ f = t の分母を払った関数 gt (t を止めたら凸) : { w1 (X) − tw2 (X) 閉路なし gt (X) := +∞ 閉路あり gt (X) ≤ 0 ⇐⇒ f (X) ≤ t gt (X) ≥ 0 ⇐⇒ f (X) ≥ t 24/ 71
  • 25. パラメトリックアプローチ f :分数関数,g(t) = minT {w1 (T ) − tw2 (T )} (1) min f (T ) = t∗ ⇐⇒ g(t∗ ) = 0 (2) g(t) は t の単調減少凹関数 (負の傾きの直線の min ) g(t) 6 ∗ -t 0 t 25/ 71
  • 26. g のゼロ点の計算方法 Find 0 = g(t∗ ), g(t) = minT {w1 (T ) − tw2 (T )} • 方法1:二分探索 ゼロと大小比較して範囲を絞っていく • 方法2:Dinkelbach の方法 (1) g(t(k) ) を計算,最小を与える解を T (k+1) とおく (2) t(k+1) := w1 (T (k+1) )/w2 (T (k+2) ) と設定 (g(t) を支える直線に沿って進む) ☆ Dinkelbach は常に収束,高速(実用的&理論的) ☆数値精度の問題が発生しづらい ☆実装難度は二分探索と大差なし 26/ 71
  • 27. 最小比全域木 まとめ f (T ) := w1 (T )/w2 (T ) ⇒ g(t) := min{w1 (T ) − tw2 (T )} T • f にパラメタを入れて 凸化 – g(t∗ ) = 0 ⇐⇒ min f (T ) = t∗ . – g(t) は単調減少凹関数 • 二分探索 or Dinkelbach の方法 「比の最小化」は,ほぼこのパターンで解ける 何かを止めたら凸になるパターンは多い(解けるかは別) (例:分散最小全域木 = 平均をパラメタにすると凸) 27/ 71
  • 29. 第 k 最小全域木 • 入力: 重み付きグラフ G = (V, E), w : E → R 正整数 k • 問題: 重み和が k 番目に小さな全域木を出力 (注意:k = 1 のとき最小全域木) ヒント 1:1 番目,2 番目,…と順番に求める ヒント 2:同じ計算が多いので前処理する 29/ 71
  • 30. 簡単のため:第 2 最小全域木 (1) MST を計算 (2) MST の枝を 1 本使用禁止 にして再び MST 計算 MST のすべての枝 n 通りについて実行して min をとる 正当性: •「2ndMST で使わない 1stMST の枝」が少なくとも 1 本存在 ⇒ 「使わない枝」を禁止すると 2ndMST が出る (どれが「使わない枝」か不明なので全部試す) これを繰り返すと第 k も求まる! 30/ 71
  • 31. 第 k 最小全域木:優先度付き探索 Q ← (∅, MST) while Q ̸= ∅ (banList, spanningTree) ← Q print (spanningTree) for each e in spanningTree: newList ← banList ∪ {e} newTree ← MST(newList) Q ← (newList, newTree) 計算量:だいたい O(kmnα(n) + m log n) 同じ計算を何度もしているので,効率化できそう 31/ 71
  • 32. 前処理 1:絶対使う枝は縮約する T :全域木,枝 e ∈ T の 交換可能枝C(e): C(e) = {e′ ̸∈ T : T − e + e′ は全域木 } ⇐⇒ e′ の両端をつなぐ T 上の経路に e がある 全域木 T で枝 e を禁止するときの不可避なロス mine′ ∈C(e) w(e) − w(e′ ) ∴ 最小全域木中のロスが小さな k 本以外の枝は絶対使う → 先に縮約して k 頂点のグラフにしておく 32/ 71
  • 33. 前処理 2:絶対使わない枝は捨てる T :全域木,枝 e′ ̸∈ T の 交換可能枝C(e′ ): C(e′ ) = {e ∈ T : T − e + e′ は全域木 } ⇐⇒ e′ の両端をつなぐ T 上の経路の枝 全域木 T で枝 e′ と交換するときの不可避なロス mine∈C(e′ ) w(e) − w(e′ ) ∴ 最小全域木外のロスが小さな k 本以外の枝は使わない → 先に捨てて 2k − 1 枝グラフにしておく 33/ 71
  • 34. 不可避ロスの計算 前処理 1:e ∈ T を禁止するときのロス計算 前処理 2:e′ ̸∈ T を使うときのロス計算 • 最小全域木上で 経路クエリ ができれば OK 前処理 1:e′ の両端経路上の枝について w(e′ ) で更新 前処理 2:e′ の両端経路上の枝について min w(e) を取得 • 木上の経路クエリ: 動的木・heavy-light 分解・etc... O(log n) 「完全制覇・ツリー上でのクエリ処理技法」参照 (2011 年 Competitive Programming Advent Calendar @秋葉) 前処理 1,2 のどちらも,O(m log n) で計算可能 34/ 71
  • 35. 第 k 全域木 まとめ • 前処理 1 で k 頂点に減らす • 前処理 2 で 2k − 1 枝に減らす → 最小全域木上の経路クエリ • 優先度付き探索 O(k2 α(k) + n log n) k-best 問題の基本は 優先度付き探索 + 枝刈り 優先度付き探索 の部分は使いまわせる 枝刈り の部分は問題特有になりがち (「絶対使わない部分」 「絶対使う部分」に注目) (最短路:USACO 2006 November Gold Roadblocks, ICPC 2006 Asia Enjoyable Commutation) 35/ 71
  • 37. 最小直径全域木 • 入力 重み付きグラフ G = (V, E), w : E → R+ • 問題: 全域木 T で,直径が最小のもの (木の直径:二点対間距離の最大値) ヒント: 「グラフのどまんなか」を探す ⇒ 「どまんなか」からの最短路木 = 最小直径全域木 SPOJ PT07C: The GbAaY Kingdom SPOJ MDST: Minimum Diameter Spanning Tree 37/ 71
  • 38. グラフの絶対中心 グラフ G の絶対中心:maxv∈V d(c, v) が最小の点 絶対中心は頂点ではない可能性がある 6 c 絶対中心からの最短路木 = 最小直径全域木 ⇒ どの枝の内側に絶対中心があるかを全部試す 38/ 71
  • 39. 枝の内点からの距離 枝 (u, v) の内点 c から w への距離:d(c, u) = t として gw (t) = min{t + d(u, w), d(u, v) − t + d(v, w)} c からの最遠頂点までの距離 g(t) = max gw (t) w∈V g(t) の最小値 = (u, v) 間に中心があるとしたときの半径 ∴ すべての枝について,g(t) の最小値を計算すればいい! w u t v 6 c 39/ 71
  • 40. gw (t) の形;枝 (u, v) 内点から w への距離 gw (t) = min{t + d(u, w), d(u, v) − t + d(v, w)} g(t) = max gw (t) w∈V 傾き 1 と −1 の直線の min gw (t) 6 d(u, w) d(v, w) -t 0 d(u, v) 40/ 71
  • 41. min g(t) の計算;枝 (u, v) 内からの最小径 gw (t) = min{t + d(u, w), d(u, v) − t + d(v, w)} g(t) = max gw (t) w∈V ∧ 型の端点を計算(切片でソート) → 上包絡線の一番低い点を出力 O(n log n) g(t) 6 -t 0 d(u, v) 41/ 71
  • 42. 最小直径全域木 まとめ • 最小直径全域木 = 絶対中心 からの最短路木 • 絶対中心の探索:∧ 型の端点(一次関数の交差) 計算量: • 前処理:全点対間最短路 O(n3 ) (Floyd Warshall) • 端点計算: O(mn) (切片のソートは最短路計算のときに一緒に行える) やや珍しいパターン (例:施設配置問題;グラフの絶対中央値) 42/ 71
  • 44. 問題:逆最小全域木 • 入力: 重み付きグラフ G = (V, E), w : E → R 全域木 T • 問題: T が最小全域木になるような最小重み修正: - T は重み w + p のときの最小全域木, ∑ - e |p(e)| 最小化 ヒント 1:T が MST であるための必要十分条件 ヒント 2:最低限必要な修正量を計算 44/ 71
  • 45. 最小全域木の必要十分条件(最適性基準) {∑ e∈X w(e) 閉路なし f (X) := +∞ 閉路あり 全域木 T が MST ⇐⇒ 任意の e ∈ T, e′ ̸∈ T について f (T − e + e′ ) ≥ f (T ) =⇒ w(e)≤ w(e′ ) (e, e′ : 交換可能) (どの交換可能枝を交換しても得しない) - 得したら最小でないのは当然 ⇒ 得する分だけは 最低限修正が必要 45/ 71
  • 46. 最低限必要な修正量 最低限必要な修正量は2部グラフマッチングでわかる 2部グラフ B = ({T, E T }, A): e, e′ 間に辺がある ⇐⇒ e, e′ は交換可能 (重み = 交換したときの得) T ET マッチング = その対を同時に交換 最大重みマッチングの分だけは,絶対修正が必要 (負の辺 = 交換して損する辺は除いておく) 46/ 71
  • 47. 逆全域木問題の最大最小定理 min 重み変更量 = max マッチング ≥ は簡単(前ページ) ≤ は難しい;当面そういうものと覚えてもよい e, e′ 間に辺がある ⇐⇒ e, e′ は交換可能 (重み = 交換したときの得) T ET マッチング = その対を同時に交換 47/ 71
  • 48. 最大最小定理証明のアウトライン (1) w + p に関する最適性基準を書き下す ∑ min e |p(e)| s.t. w + p の最適性基準 (2) T の枝は軽く・E T の枝は重くするはず,と考えて 絶対値を外しつつ,変数変換して形を整える ∑ min e q(e) s.t. q に関する条件 (3) 線形計画の双対定理を使って式をじっと眺める → マッチングの LP 表現になっている 最小費用流主双対アルゴリズムを使って得られる ポテンシャルの性質を観察することでも証明可能 48/ 71
  • 49. 逆最小全域木 まとめ • 最適性基準:どの枝を交換しても得しない • 交換可能枝の間の二部グラフを作る 必要な修正量 ≥ マッチング • 必要な修正量 = 最大マッチング 定理 ⇒ 二部グラフ最大重みマッチング で解ける 既知のうまく解ける逆問題は,だいたいフローに帰着 (例:逆二部マッチング,逆最小カット,逆最短路@ DAG) 49/ 71
  • 51. 最小全域木 ×2 • 入力 重み付きグラフ G = (V, E), w : E → R • 問題 辺を共有しない(辺素な)全域木を2つ取り 重み和が最小になるようにせよ ヒント 1:目的関数が凸になるように作る → 貪欲 ヒント 2:貪欲の 1 ステップごとに探索が発生 51/ 71
  • 52. うまくいかない関数定義 { w(X) + w(Y ) 閉路なし・辺共有しない g(X, Y ) = +∞ それ以外 「辺共有しない」という条件のせいで凸にならない (貪欲するときに X と Y のどちらに足すべきかが不明) ※ダメ解法:Kruskal で UnionFind×2 = この関数で貪欲 52/ 71
  • 53. 凸になる関数の定義 { w(X) 閉路なし(森) f (X) = +∞ 閉路あり { w(X) X をうまく配分すると森 × 2 g(X) = +∞ それ以外 g(X) + g(Y ) ≥ g(X − e + e′ ) + g(Y + e − e′ ) ※ f と g の関係:畳み込み g(X) = min {f (T ) + f (X T )} = f ∗ f T ⊆X 53/ 71
  • 54. 凸なので貪欲で解ける(Kruskal と同じ) { w(X) X をうまく配分すると森 × 2 g(X) = +∞ それ以外 for e ∈ E: 軽い順 if X ∪ {e}: 森 ×2 X = X ∪ {e} 必要なサブルーチン X が森 ×2 に配分できるとき, X ∪ {e} が森 ×2 に配分できるかの判定 54/ 71
  • 55. X :森 ×2 に e を追加できるか • X = {F1 , F2 }:森 ×2 の形を常に保持 • e を追加できるかどうか:交換手順を探索 (1) e が F1 に追加できれば終了 (2) できなかったら e の交換可能枝を列挙 それぞれについて F2 に追加を試みる 二部マッチング (3) F1 , F2 交互に繰り返す 増加道探索と類似 • 最短手数の交換だけ探す:幅優先探索 (a) 同じ枝は何度もチェックしない → 探索中に 木を動的変更しなくてよい 交換枝の列挙:動的木を使えば全体で O(n2 ) ☆ 列挙の順番を工夫すると動的木なしで O(n) 55/ 71
  • 56. {F1 , F2 } に枝 (u, v) を追加できるかの判定 前処理:(1) F1 , F2 を u が根になるように向き付ける (2) 木の u 以外の頂点を白く塗り,u を黒く塗る (黒:w より根に近い枝は全部探索済み,の意味) L1 := [(u, v)] 根に近い側からテスト for i = 1, 2, 1, 2, . . .: → 同じ枝を二回見ない if Li = ∅: return false Li+1 = ∅ for (x, y) ∈ Li : if (x, y) が Fi に追加可能: return true if x は白: swap(x,y) /* 一方は絶対黒 */ while y は白: Li+1 .push front((y, p[y])) y を黒く塗る,y ← p[y] 56/ 71
  • 57. 最小全域木 ×2 まとめ { w(X) X をうまく配分すると森 × 2 g(X) = +∞ それ以外 • 凸なので貪欲で解ける (※ただし貪欲の 1 ステップが複雑) • 効率的に貪欲するには: – X = {F1 , F2 } の形で保持 – 交換経路を探索 枝列挙順序を工夫して O(n) 57/ 71
  • 58. まとめ 58/ 71
  • 59. まとめ • 最小全域木 • 最小直径全域木 • 葉指定最小全域木 • 逆最小全域木 • 最小比全域木 • 最小全域木 ×2 • 第 k 最小全域木 • 問題の定義・解答の方針 ⇒ 興味の湧いた問題は調べてみましょう (ここで述べた内容はだいたい「マトロイド」に拡張可) 59/ 71
  • 61. 演習問題 / 発展課題 • 分散最小全域木 [Katoh 1990] ∑ 全域木の平均重みを µ(T ) = w(e)/(n − 1) とする. ∑ 重みの分散,すなわち v(T ) = (w(e) − µ(T ))2 が 最小となる全域木を求めよ. • 逆最小全域木(min-max 型)[Sokkalingam et al. 1996] max |pi | が最小の修正を求めるアルゴリズムを与えよ. • カラフル全域木 [Schrijver 2003] 枝に重みとラベル {1, 2, . . . n − 1} がついているとき 同じラベルが丁度 1 回ずつ現れる全域木のうち 最小重みのものを求めるアルゴリズムを与えよ. 61/ 71
  • 62. 演習問題 / 発展課題 • 次数制約付き最小全域木 [Garey-Johnson 1976] 各頂点の次数が b 以下となる全域木を求める問題は NP-hard である. • 葉最多全域木 [Garey-Johnson 1979] 葉の数が最多の全域木を求める問題は NP-Hard である. • 全距離最小木 [Garey-Johnson 1979] 全頂点対の木距離の和が最小になる全域木を求める 問題は,すべての重みが 1 であっても NP-hard である. • 全域木 + 木 [Bernath-Kiraly 2011] 全域木と全域とは限らない木を辺素に取れるかどうかを 判定する問題は NP-hard である. 62/ 71
  • 63. 演習問題 / 発展課題 • ランダムグラフの最小全域木 [Frieze 1985] n 頂点からなる完全グラフで,各枝の重みが独立に [0, 1] の一様分布に従うとき,最小全域木の重み期待値は n → ∞ で ζ(3) = 1 + 1/23 + 1/33 + · · · に収束する. ※各 n に対する一般式は 2013 年 3 月現在未知. • 全域木ゲーム [Lehman 1964] 2 人のプレイヤーが交互に次の操作を行う: (P1) グラフの枝を取り除く (P2) グラフの枝を固定する(以後取り除かれない) 操作ができなくなったときの残りのグラフが全域木のとき P2 の勝利とする.辺素な全域木が 2 つとれることと P2 に 必勝法が存在することは同値である. 63/ 71
  • 64. 参考文献:最小全域木 • T. H. Cormen, C. E. Leiserson, R. L. Rivest, and C. Stein (2009): Introduction to Algorithms. 3rd eds., MIT Press. • R. L. Graham and P. Hell (1985): On the history of the minimum spanning tree problem. Annals of the History of Computing, vol.7, pp.43-57. • K. Murota (2003): Discrete Convex Analysis. SIAM Monographs on Discrete Mathematics and Applications, vol.10, SIAM, Philadelphia. • J. Oxley (2003): What is a matroid? Cubo, vol.5, pp.179-218. • A. Schrijver (2003): Combinatorial Optimization. Springer. • 秋葉拓哉, 岩田陽一, 北川宜稔 (2012): プログラミングコンテストチャ レンジブック. 2nd eds, マイナビ. 64/ 71
  • 65. 参考文献:最小比全域木 • R. Chandrasekaran (1977): Minimum ratio spanning trees. Networks, vol.7, pp.335-342. • W. Dinkelbach (1967): On nonlinear fractional programming. Management Science, vol.13, pp.492-498. • T. Radzik (1992): Newton’s Method for Fractional Combinatorial Optimization. Proceedings of 33rd Annual Symposium of Foundation of Computer Science, pp. 659-669. 65/ 71
  • 66. 参考文献:第 k 最小全域木 • D. Eppstein (1990): Finding the k-smallest spanning trees. 2nd Scandinavian Workshop on Algorithm Theory, Bergen, Norway, Lecture Notes in Computer Science, vol.447, pp.38-47. • R. E. Tarjan (1979): Applications of path compression on balanced trees. Journal of ACM, vol.26, pp.690-715. • 秋葉拓哉 (2011): 完全制覇・ツリー上でのクエリ処理技法. Competitive Programming Advent Calendar 2011-12-05, http://topcoder.g.hatena.ne.jp/iwiwi/20111205/1323099376 66/ 71
  • 67. 参考文献:最小直径全域木 • R. A. Cunninghame-Green (1975): The absolute center of a graph, Discrete Applied Mathematics,. vol.7, pp.275-283. • R. Hassin and A. Tamir (1995): On the minimum diameter spanning tree problem, Information Processing Letters, vol.53, pp.109-111. • J. Halpern (1979): A simple elimination criterion in a search for the center of a graph, Management Science, vol.7, pp.287-293. • O. Kariv and S. L. Hakimi (1979): An algorithmic approach to network location problem I: the p centers, SIAM Journal on Applied Mathematics, vol.37, no.513-518. 67/ 71
  • 68. 参考文献:逆最小全域木 • R. Ahuja and J. Orlin (2001): Inverse optimization, Operations Research, vol. 49 pp.771-783. • M. Cai and Y. Li (1997): Inverse matroid intersection problem ZOR Mathematical Methods of Operations Research, vol.45 pp.235-243. • C. Heuberger (2004): Inverse combinatorial optimization: A survey on problems, methods, and results. Journal of Combinatorial Optimization, vol.8, pp.329-361. • P. T. Sokkalingam, R. K. Ahuja, and J. B. Orlin (1996): Solving inverse spanning tree problems though network flow techniques. Operations Research, vol.47, no.2. 68/ 71
  • 69. 参考文献:最小全域木 ×2 • J. Edmonds (1970): Submodular functions, matroids, and certain polyhedra. Proceedings of the Calgary Conerence on Conbinatorial Combinatorial Structures and Their Ppplications, pp.69-87. • A. Frank (1981): A weighted matroid intersection algorithm. Journal of Algorithms, vol.2, no.4, pp.328-336. • H. N. Gabow and R. E. Tarjan, Robert (1984), Efficient algorithms for a family of matroid intersection problems. Journal of Algorithms, vol.5, no.1, pp.80-131. • J. Roskind and R. E. Tarjan (1985): A note on finding minimum-cost edge-disjoint spanning trees. Mathematics of Operations Research, vol.10, pp.701-708. 69/ 71
  • 70. 参考文献:演習問題 / 発展課題 • N. Katoh (1990): An ϵ-approximation scheme for minimum variance problems. Journal of the Operations Research Society of Japan, vol.33, no.1 46-65. • M. R. Garey and D. S. Johnson (1979): Computers and Intracctability: A Guide to the Theory of NP-Completeness. W. H. Freeman, New York. • H. Fernau, J. Kneis, D. Kratsch, A. Langer (2011), M. Liedloff, D. Raible, and P. Rossmanith: An exact algorithm for the maximum leaf spanning tree problem. Journal Theoretical Computer Science, vol.412, no.45, pp.6290-6302. • A. Bernath and Z. Kiraly (2011): On the tractability of some natural packing, covering and partitioning problems. Technical Report. 70/ 71
  • 71. • A. M. Frieze (1985): On the value of a random minimum spanning tree problem. Discrete Applied Mathematics, vol.10, pp.47-56. • A. Frieze, M. Ruszink, and L. Thoma (2000): A note on random minimum length spanning trees, The Electronic Journal of Combinatorics, vol.7, R41. • A. Lehman (1964): A solution to Shannon’s switching game. Journal of the Society for Industrial and Applied Mathematics, vol.12, pp.687-725. 71/ 71