SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
ユークリッド
最小全域木
@maroon_kuri
このスライドはJOI夏季セミナー2016で発表したものです
アニメーションGIFが入っていたのですが
アップロードにできないので代わりにリンクを張りまし
た
ボロノイ図
2次元平面上の点がたくさんある
平面の最近点による分割を、ボロノイ図と呼ぶ
(画像はwikipediaから)
ボロノイ図
平面上の点を、サイトと呼ぶ
サイトP_iに対応する領域を、P_iのボロノイセルと呼ぶ
ドロネーグラフ
サイトPiとPjのボロノイセルが隣接するならば、その間に
辺を張る
こうしてできたグラフを、ドロネーグラフと呼ぶ
Fortuneのアルゴリズム
ボロノイ図やドロネーグラフを求めたい
Fortuneのアルゴリズムを使うと、頂点数がNの
時、O(NlogN)で求められる!
Fortuneのアルゴリズム
平面走査する
ここのGIFが大変わかりやすいです
https://en.wikipedia.org/wiki/Fortune%27s_algorithm
Fortuneのアルゴリズム
上から平面走査する
平面走査の各段階では、
現在までに確定した部分を保持する
Fortuneのアルゴリズム
走査線をLとおく
ある点Pを考えて、「y座標L以下の
いかなる点よりPの方が近い」
が成り立つ領域の境界は、
以下のようになる
L
P
Fortuneのアルゴリズム
Lより上にある全ての点で
この放物線を考える。
L
Fortuneのアルゴリズム
全ての放物線より下側にある
領域は、どのボロノイセルに
含まれるかわからない
L
Fortuneのアルゴリズム
2つの隣り合う放物線のもとになる
サイトのボロノイセルは隣接する
L
Fortuneのアルゴリズム
Lが小さくなるにつれ、新しい
放物線が増える
L
Fortuneのアルゴリズム
Lが小さくなるにつれ、
放物線が消える
L
Fortuneのアルゴリズム
走査線の移動に伴って変化する放物線
の出現と削除を管理すればよさそう
そのまま管理するのはもちろん
やばいので、陰に保持する
放物線の並ぶ順に、もとになった
サイトだけを保持しておけばいい
Fortuneのアルゴリズム
保持しているリスト
(0)
L
0
21
Fortuneのアルゴリズム
保持しているリスト
(0,1,0,2,0)
L
0
1 2
21
Fortuneのアルゴリズム
保持しているリスト
(0,1,2,0)
L
0
Fortuneのアルゴリズム
ここで、リストを平衡二分探索木を使って保持すると、
1回の挿入/削除がO(logN)で行える
あとは、放物線の出現、削除のタイミングが知りたい
出現は自明
じゃあ削除は?
Fortuneのアルゴリズム
隣り合う3点を通る円の最下部のy座標で
真ん中の放物線が消える
Fortune
新しく3点が隣り合うタイミングで、適切なy座標に、
放物線削除イベントを登録すればいい
これは、優先度付きキューで実現できる
Fortune
追加も削除もO(N)回
どの操作もO(logN)でできるので、合計O(NlogN)で求まる
ユークリッド最小全域木
ユークリッド最小全域木とは、2点間の辺コストを
そのユークリッド距離にした際の最小全域木
ドロネーグラフとの関係は?
ドロネーグラフの辺コストをユークリッド距離にすると、
その最小全域木はユークリッド最小全域木になる
ユークリッド最小全域木
証明
ある全域木Tがあり、点P_iとP_jを結ぶ辺がドロネーグラフ
に含まれないが、Tに含まれるとする
ユークリッド最小全域木
証明
少なくとも一つの点が、線分P_iーP_jを直径とする
円の内部に存在するので、これをP_kとおく
P_i
P_j
P_k
ユークリッド最小全域木
証明
Tから辺P_iーP_jを削除すると、P_kは、P_i,P_jのいずれか
と
非連結になる(一般化し、P_iと非連結とする)
P_k
P_i
P_j
ユークリッド最小全域木
証明
ここで、|P_k – P_i|<|P_i – P_j|より、P_iとP_kを結んで得
られる全域木T’は、Tよりもコストが低いので、
Tは最小全域木にはならない
P_k
P_i
P_j
ユークリッド最小全域木
ドロネーグラフの最小全域木を求めればよいとわかった
最小全域木は、O(ElogE)でもとまる
ドロネーグラフの辺数は、オイラーの定理より、
O(N)で抑えられる
ドロネーグラフはO(NlogN)で求まった
よってユークリッド最小全域木はO(NlogN)で求まる
応用
COCI 2015/2016 Second Round DRZAVA
問題概要
2次元平面上にN個の点があり、それぞれに値がある
距離D以下の点対を結んで、
以下の条件を満たす連結成分を作りたい
・条件 連結成分内の点をいくつか選ぶと、
    その値の総和がKの倍数になる
Dの最小値を求めよ
制約:N≦50000,K≦30
おわり
ユークリッド最小全域木が社会常識になる日に備え、
今から実装しておこう!

Contenu connexe

Tendances

プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドMasaki Hara
 
幾何コンテスト2013
幾何コンテスト2013幾何コンテスト2013
幾何コンテスト2013Naoto Mizuno
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話Nagisa Eto
 
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)AtCoder Inc.
 
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~Yuma Inoue
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Inc.
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題tmaehara
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとはTakuya Akiba
 
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端Yoichi Iwata
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Inc.
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)AtCoder Inc.
 
Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説kuno4n
 

Tendances (20)

プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
幾何コンテスト2013
幾何コンテスト2013幾何コンテスト2013
幾何コンテスト2013
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
 
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
 
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説Donutsプロコンチャレンジ 2015 解説
Donutsプロコンチャレンジ 2015 解説
 
双対性
双対性双対性
双対性
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
Trianguler
TriangulerTrianguler
Trianguler
 

Plus de 理玖 川崎

カードの取り合い
カードの取り合いカードの取り合い
カードの取り合い理玖 川崎
 
区間和剰余クエリ
区間和剰余クエリ区間和剰余クエリ
区間和剰余クエリ理玖 川崎
 
解説:デバッグ
解説:デバッグ解説:デバッグ
解説:デバッグ理玖 川崎
 
解説:歩くNPCたち
解説:歩くNPCたち解説:歩くNPCたち
解説:歩くNPCたち理玖 川崎
 
解説:エンブレム
解説:エンブレム解説:エンブレム
解説:エンブレム理玖 川崎
 
線形識別によるパターン認識
線形識別によるパターン認識線形識別によるパターン認識
線形識別によるパターン認識理玖 川崎
 
解説:サポーター
解説:サポーター解説:サポーター
解説:サポーター理玖 川崎
 
解説:おおきな数を作った
解説:おおきな数を作った解説:おおきな数を作った
解説:おおきな数を作った理玖 川崎
 
解説:吹奏楽部
解説:吹奏楽部解説:吹奏楽部
解説:吹奏楽部理玖 川崎
 

Plus de 理玖 川崎 (15)

RNNで頑張ろう
RNNで頑張ろうRNNで頑張ろう
RNNで頑張ろう
 
カードの取り合い
カードの取り合いカードの取り合い
カードの取り合い
 
石油
石油石油
石油
 
釣り
釣り釣り
釣り
 
区間和剰余クエリ
区間和剰余クエリ区間和剰余クエリ
区間和剰余クエリ
 
解説:ボス
解説:ボス解説:ボス
解説:ボス
 
解説:デバッグ
解説:デバッグ解説:デバッグ
解説:デバッグ
 
解説:貢物
解説:貢物解説:貢物
解説:貢物
 
解説:歩くNPCたち
解説:歩くNPCたち解説:歩くNPCたち
解説:歩くNPCたち
 
解説:エンブレム
解説:エンブレム解説:エンブレム
解説:エンブレム
 
線形識別によるパターン認識
線形識別によるパターン認識線形識別によるパターン認識
線形識別によるパターン認識
 
解説:サポーター
解説:サポーター解説:サポーター
解説:サポーター
 
解説:おおきな数を作った
解説:おおきな数を作った解説:おおきな数を作った
解説:おおきな数を作った
 
解説:吹奏楽部
解説:吹奏楽部解説:吹奏楽部
解説:吹奏楽部
 
WAVE_WITH_GLSL
WAVE_WITH_GLSLWAVE_WITH_GLSL
WAVE_WITH_GLSL
 

ユークリッド最小全域木