SlideShare a Scribd company logo
1 of 71
Download to read offline
Looking for Challenge
小倉拳
@catupper
Looking for Challenge
グラフ理論
問題
● 頂点数がN、辺の数がMのグラフが与えられる
● 互いに隣接している3頂点を全て見つけよ
問題
● 頂点数がN、辺の数がMのグラフが与えられる
● 互いに隣接している3頂点を全て見つけよ
問題
● 頂点数がN、辺の数がMのグラフが与えられる
● 互いに隣接している3頂点を全て見つけよ
● 一つ
問題
● 頂点数がN、辺の数がMのグラフが与えられる
● 互いに隣接している3頂点を全て見つけよ
● 二つ
問題
● 頂点数がN、辺の数がMのグラフが与えられる
● 互いに隣接している3頂点を全て見つけよ
● たくさん
Looking for Challenge
グラフ理論
列挙
第一の疑問
● 頂点数がN、辺の数がMのグラフが与えられる
● 互いに隣接している3頂点を列挙せよ
● 最大で何個くらいあるの?
第一の補題
● 辺の数がMのグラフの中にある三角形の個数は
たかだかM√(2M)個
第一の補題
● 辺の数がMのグラフの中にある三角形の個数は
たかだかM√(2M)個
● 証明しよう!
● 証明は2通り
1.バリバリのグラフ理論
2.不等式をこねる
第一の補題
● 辺の数がMのグラフの中にある三角形の個数は
たかだかM√(2M)個
● 証明しよう!
● 証明は2通り
1.バリバリのグラフ理論
2.不等式をこねる
Looking for Challenge
グラフ理論
列挙
バリバリのグラフ理論
● 命題:辺の数がMのグラフのなかで最も次数が小さ
い頂点の次数は√(2M)を超えない
– 頂点の次数というのはそれに繋がっている辺の数↓
 
 
 
 
 
バリバリのグラフ理論
● 命題:辺の数がMのグラフのなかで最も次数が小さ
い頂点の次数は√(2M)を超えない
– 頂点の次数というのはそれに繋がっている辺の数↓
– 次数の総和は2Mと一致する
 
 
 
 
バリバリのグラフ理論
● 命題:辺の数がMのグラフのなかで最も次数が小さ
い頂点の次数は√(2M)を超えない
– 頂点の次数というのはそれに繋がっている辺の数↓
– 次数の総和は2Mと一致する
● 背理法で証明
– 全て次数が√(2M)以上と仮定
 
 
バリバリのグラフ理論
● 命題:辺の数がMのグラフのなかで最も次数が小さ
い頂点の次数は√(2M)を超えない
– 頂点の次数というのはそれに繋がっている辺の数↓
– 次数の総和は2Mと一致する
● 背理法で証明
– 全て次数が√(2M)以上と仮定
– 頂点数は√(2M)を超える
 
バリバリのグラフ理論
● 命題:辺の数がMのグラフのなかで最も次数が小さ
い頂点の次数は√(2M)を超えない
– 頂点の次数というのはそれに繋がっている辺の数↓
– 次数の総和は2Mと一致する
● 背理法で証明
– 全て次数が√(2M)以上と仮定
– 頂点数は√(2M)を超える
– 次数の総和が2Mを超える
バリバリのグラフ理論
● グラフの中から最も次数が小さい頂点を選び、
それを含む三角形を列挙し、その頂点を消すと
いう操作を考える
– 隣接する辺も同時に消す
  
                       
 
バリバリのグラフ理論
● グラフの中から最も次数が小さい頂点を選び、
それを含む三角形を列挙し、その頂点を消すと
いう操作を考える
– 隣接する辺も同時に消す
● これを全頂点がなくなるまで繰り返す
– 全ての三角形を漏れなく、重複なく列挙することが
できる
Looking for Challenge
グラフ理論
列挙
バリバリのグラフ理論
● 辺に注目する
● ある辺eが消えるタイミングを考える
– その辺がつなぐ頂点のうちどちらかが消えるとき
● vとする
                       
  
 
     
バリバリのグラフ理論
● 辺に注目する
● ある辺eが消えるタイミングを考える
– その辺がつなぐ頂点のうちどちらかが消えるとき
● vとする
– そのとき数えられる三角形の中でeを含むものはい
くつあるか?
 
 
     
バリバリのグラフ理論
● 辺に注目する
● ある辺eが消えるタイミングを考える
– その辺がつなぐ頂点のうちどちらかが消えるとき
● vとする
– そのとき数えられる三角形の中でeを含むものはい
くつあるか?
– eでない辺のうち少なくともひとつはvに隣接する
– よってたかだかeの次数しかない
     
バリバリのグラフ理論
● 辺に注目する
● ある辺eが消えるタイミングを考える
– その辺がつなぐ頂点のうちどちらかが消えるとき
● vとする
– そのとき数えられる三角形の中でeを含むものはい
くつあるか?
– eでない辺のうち少なくともひとつはvに隣接する
– よってたかだかeの次数しかない
– 命題1よりたかだか√(2M)           
    
バリバリのグラフ理論
● 例
● 赤い辺について考
える
● 次数が4の頂点と共
に消えるとする
バリバリのグラフ理論
● 例
● 赤い辺について考
える
● 次数が4の頂点と共
に消えるとする
● この辺と頂点を含
む三角形はたかだ
か4つ
バリバリのグラフ理論
● 辺は全部でM個なので数えられる三角形はたか
だかM√(2M)個
● やったぜ
バリバリのグラフ理論
● 辺は全部でM個なので数えられる三角形はたか
だかM√(2M)個
● やったぜ
● 頭が痛くてなってつらい
第一の補題
● 辺の数がMのグラフの中にある三角形の個数は
たかだかM√(2M)個
● 証明しよう!
● 証明は2通り
1.バリバリのグラフ理論
2.不等式をこねる
不等式をこねる
● 次数がd[v]の頂点vを含む三角形はたかだか
d[v]*d[v]/2個しかない
– vに隣接する頂点から2つ選ぶ組み合わせ
不等式をこねる
● 辺の数がM個のグラフの頂点vを含む三角形は
たかだかM個しかない
– 頂点vとそれを含まない辺が与えられるとそれらを
つかってたかだか1個しか辺が作れない
不等式をこねる
● 辺がM個のグラフの次数がd[v]の頂点vを含む三
角形の個数はmin(d[v]*d[v]/2, M)個を超えない
不等式をこねる
● 辺がM個のグラフの次数がd[v]の頂点vを含む三
角形の個数はmin(d[v]*d[v]/2, M)個を超えない
● min(d[v]*d[v]/2, M) ≦ √(M*d[v]*d[v]/2)
= d[v]√(M/2)
不等式をこねる
● 辺がM個のグラフの次数がd[v]の頂点vを含む三
角形の個数はmin(d[v]*d[v]/2, M)個を超えない
● min(d[v]*d[v]/2, M) ≦ √(M*d[v]*d[v]/2)
= d[v]√(M/2)
● 全頂点での総和をとる
– 次数の総和は2Mなので
– Σd[v]√(M/2) = M√(2M)
不等式をこねる
● 辺がM個のグラフの次数がd[v]の頂点vを含む三
角形の個数はmin(d[v]*d[v]/2, M)個を超えない
● min(d[v]*d[v]/2, M) ≦ √(M*d[v]*d[v]/2)
= d[v]√(M/2)
● 全頂点での総和をとる
– 次数の総和は2Mなので
– Σd[v]√(M/2) = M√(2M)
● やったぜ
第一の疑問
● 頂点数がN、辺の数がMのグラフが与えられる
● 互いに隣接している3頂点を列挙せよ
● 最大で何個くらいあるの?
– M√(2M)個
第二の疑問
● 頂点数がN、辺の数がMのグラフが与えられる
● 互いに隣接している3頂点を列挙せよ
● どうやって列挙する?
第二の疑問
● 頂点数がN、辺の数がMのグラフが与えられる
● 互いに隣接している3頂点を列挙せよ
● どうやって列挙する?
実装の仕方
● 「バリバリのグラフ理論」の取り除くやつを実
際に実装するだけ
 
 
 
 
 
実装の仕方
● 「バリバリのグラフ理論」の取り除くやつを実
際に実装するだけ
– 次数が最小の頂点を探す
 
 
 
 
実装の仕方
● 「バリバリのグラフ理論」の取り除くやつを実
際に実装するだけ
– 次数が最小の頂点を探す
– それを含む三角形を全部列挙
 
 
 
実装の仕方
● 「バリバリのグラフ理論」の取り除くやつを実
際に実装するだけ
– 次数が最小の頂点を探す
– それを含む三角形を全部列挙
– その頂点を消す
 
 
実装の仕方
● 「バリバリのグラフ理論」の取り除くやつを実
際に実装するだけ
– 次数が最小の頂点を探す
– それを含む三角形を全部列挙
– その頂点を消す
– 繰り返す
 
実装の仕方
● 「バリバリのグラフ理論」の取り除くやつを実
際に実装するだけ
– 次数が最小の頂点を探す
– それを含む三角形を全部列挙
– その頂点を消す
– 繰り返す
– やったぜ
実装の仕方
● 「バリバリのグラフ理論」の取り除くやつを実
際に実装するだけ
– 次数が最小の頂点を探す   ならしO(1)
– それを含む三角形を全部列挙 O(d[v]^2 logM)
– その頂点を消す       ならしO(1)
– 繰り返す
– やったぜ?
実装の仕方
● 「バリバリのグラフ理論」の取り除くやつを実
際に実装するだけ
– 次数が最小の頂点を探す   ならしO(1)
– それを含む三角形を全部列挙 O(d[v]^2 logM)
– その頂点を消す       ならしO(1)
– 繰り返す
– 全部でO(M√MlogM)で残念ながら遅い
どうすればよいのか?
もっとバリバリの
グラフ理論をする
もっとバリバリのグラフ理論
● グラフの辺にループが出来ないように適当な向
きを付ける
– DAGを作れば良い
もっとバリバリのグラフ理論
● グラフの辺にループが出来ないように適当な向
きを付ける
– DAGを作れば良い
● 三角形はすべてこの形になる
もっとバリバリのグラフ理論
● グラフの辺にループが出来ないように適当な向
きを付ける
– DAGを作れば良い
● 三角形はすべてこの形になる
● ある辺について始点と終点から
同じ頂点に辺が出ている時
ちょうど1個三角形がある
もっとバリバリのグラフ理論
● グラフの辺にループが出来ないように適当な向
きを付ける
– DAGを作れば良い
● 三角形はすべてこの形になる
● ある辺について始点と終点から
同じ頂点に辺が出ている時
ちょうど1個三角形がある
● 重複や漏れはない
Looking for Challenge
グラフ理論
列挙
もっとバリバリのグラフ理論
● 全ての辺について、その始点からも終点からも
点が出ている頂点を数え上げれば良い
 
                     
   
 
                     
 
もっとバリバリのグラフ理論
● 全ての辺について、その始点からも終点からも
点が出ている頂点を数え上げれば良い
● ここで計算量を考える
● 各辺についてその終点と始点から共通して出て
いる頂点はflagを使って調べれば良い
 
                     
 
もっとバリバリのグラフ理論
● 全ての辺について、その始点からも終点からも
点が出ている頂点を数え上げれば良い
● ここで計算量を考える
● 各辺についてその終点と始点から共通して出て
いる頂点はflagを使って調べれば良い
● 計算量はmax(始点の出次数、終点の出次数)
                     
 
もっとバリバリのグラフ理論
● 全ての辺について、その始点からも終点からも
点が出ている頂点を数え上げれば良い
● ここで計算量を考える
● 各辺についてその終点と始点から共通して出て
いる頂点はflagを使って調べれば良い
● 計算量はmax(始点の出次数、終点の出次数)
● 出次数をおさえることに成功したら計算量が削
減される
もっとバリバリのグラフ理論
● どうやって出次数を削減しようか?
Looking for Challenge
グラフ理論
列挙
ひらめきのLooking for Challenge
● 元の無向グラフの頂点たちの次数を求める
● 各辺には次数が小さい方から大きい方に向きを
付ける
                     
  
 
ひらめきのLooking for Challenge
● 元の無向グラフの頂点たちの次数を求める
● 各辺には次数が小さい方から大きい方に向きを
付ける
● これでDAGになるので先ほどの数え上げが使え
る
ひらめきのLooking for Challenge
● 元の無向グラフの頂点たちの次数を求める
● 各辺には次数が小さい方から大きい方に向きを
付ける
● これでDAGになるので先ほどの数え上げが使え
る
● 出次数はどうなるだろうか?
ひらめきのLooking for Challenge
● 命題1の証明を思い出す
– 次数が√(2M)より大きい頂点は√(2M)個より少ない
                     
      
                     
 
ひらめきのLooking for Challenge
● 命題1の証明を思い出す
– 次数が√(2M)より大きい頂点は√(2M)個より少ない
● 次数が√(2M)より小さい頂点はどんなふうに向
きを付けても出次数は√(2M)を超えない
                     
     
 
ひらめきのLooking for Challenge
● 命題1の証明を思い出す
– 次数が√(2M)より大きい頂点は√(2M)個より少ない
● 次数が√(2M)より小さい頂点はどんなふうに向
きを付けても出次数は√(2M)を超えない
● 次数が√(2M)より大きい頂点は自分より次数が
多い頂点にしか辺は出て行かない
– √(2M)個もないので出自数は√(2M)を超えない
ひらめきのLooking for Challenge
● 次数が√(2M)より小さい頂点はどんなふうに向
きを付けても出次数は√(2M)を超えない
● 次数が√(2M)より大きい頂点は自分より次数が
多い頂点にしか辺は出て行かない
– √(2M)個もないので出自数は√(2M)を超えない
ひらめきのLooking for Challenge
● どの頂点も出次数が√(2M)を超えない!
● さきほどの考察より全計算量はM√2M
● これは三角形の個数の最大値と一致するのでお
およそ最適!
● やったぜ
Looking for Challenge
小倉拳
@catupper
今の発想を使う問題
● Algorithmic Engagements 2009 Round6
– Cakes
● http://main.edu.pl/en/archive/pa/2009/cia
● 面白いのでやってみてね!
クリックしてタイトルの挿入!
ご清聴ありがとうございました

More Related Content

What's hot

CODE FESTIVAL 予選B 解説
CODE FESTIVAL 予選B 解説CODE FESTIVAL 予選B 解説
CODE FESTIVAL 予選B 解説AtCoder Inc.
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Inc.
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Inc.
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方Kensuke Otsuki
 
AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Inc.
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Inc.
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Inc.
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Inc.
 
AtCoder Beginner Contest 013 解説
AtCoder Beginner Contest 013 解説AtCoder Beginner Contest 013 解説
AtCoder Beginner Contest 013 解説AtCoder Inc.
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Inc.
 
AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Inc.
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説AtCoder Inc.
 
AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説AtCoder Inc.
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)AtCoder Inc.
 

What's hot (20)

CODE FESTIVAL 予選B 解説
CODE FESTIVAL 予選B 解説CODE FESTIVAL 予選B 解説
CODE FESTIVAL 予選B 解説
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説
 
AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説AtCoder Beginner Contest 025 解説
AtCoder Beginner Contest 025 解説
 
abc032
abc032abc032
abc032
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
 
AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046
 
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説AtCoder Regular Contest 042 解説
AtCoder Regular Contest 042 解説
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説
 
AtCoder Beginner Contest 013 解説
AtCoder Beginner Contest 013 解説AtCoder Beginner Contest 013 解説
AtCoder Beginner Contest 013 解説
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
abc027
abc027abc027
abc027
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 

Viewers also liked

かけざん
かけざんかけざん
かけざんKen Ogura
 
Deque with Haskel
Deque with HaskelDeque with Haskel
Deque with HaskelKen Ogura
 
Cをやりましょう
CをやりましょうCをやりましょう
CをやりましょうKen Ogura
 
人間対Pc2
人間対Pc2人間対Pc2
人間対Pc2Ken Ogura
 
Npc april fool2014
Npc april fool2014Npc april fool2014
Npc april fool2014Ken Ogura
 
Amortize analysis of Deque with 2 Stack
Amortize analysis of Deque with 2 StackAmortize analysis of Deque with 2 Stack
Amortize analysis of Deque with 2 StackKen Ogura
 
ハッキング実演
ハッキング実演ハッキング実演
ハッキング実演Ken Ogura
 

Viewers also liked (16)

Mage
MageMage
Mage
 
Moon
MoonMoon
Moon
 
かけざん
かけざんかけざん
かけざん
 
PC解体
PC解体PC解体
PC解体
 
Deque with Haskel
Deque with HaskelDeque with Haskel
Deque with Haskel
 
April2013
April2013April2013
April2013
 
April2013
April2013April2013
April2013
 
Cをやりましょう
CをやりましょうCをやりましょう
Cをやりましょう
 
Jissou
JissouJissou
Jissou
 
Yarudake
YarudakeYarudake
Yarudake
 
人間対Pc2
人間対Pc2人間対Pc2
人間対Pc2
 
Npc april fool2014
Npc april fool2014Npc april fool2014
Npc april fool2014
 
Amortize analysis of Deque with 2 Stack
Amortize analysis of Deque with 2 StackAmortize analysis of Deque with 2 Stack
Amortize analysis of Deque with 2 Stack
 
Imo
ImoImo
Imo
 
辺彩色
辺彩色辺彩色
辺彩色
 
ハッキング実演
ハッキング実演ハッキング実演
ハッキング実演
 

More from Ken Ogura

More from Ken Ogura (14)

計算量
計算量計算量
計算量
 
Shio dtm
Shio dtmShio dtm
Shio dtm
 
Hairetu2
Hairetu2Hairetu2
Hairetu2
 
Lunch
LunchLunch
Lunch
 
Divisor
DivisorDivisor
Divisor
 
Homework
HomeworkHomework
Homework
 
Pool
PoolPool
Pool
 
Sns
SnsSns
Sns
 
Pencil
PencilPencil
Pencil
 
Spell check
Spell checkSpell check
Spell check
 
Black board
Black boardBlack board
Black board
 
Donyoku
DonyokuDonyoku
Donyoku
 
Nazoki
NazokiNazoki
Nazoki
 
人材発掘うっはうは
人材発掘うっはうは人材発掘うっはうは
人材発掘うっはうは
 

Trianguler