狠狠撸

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




             様々な全域木问题



             前原 貴憲 (@tmaehara)


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

? 前原 貴憲(まえはら たかのり)
? Twitter: @tmaehara
? Web: http://www.pre?eld.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 ?ow 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), E?cient 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 ?nding
  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. Liedlo?, 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.pre?eld.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 ?ow 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), E?cient 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 ?nding 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. Liedlo?, 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