SlideShare ist ein Scribd-Unternehmen logo
1 von 29
Downloaden Sie, um offline zu lesen
HCPC勉強会 2016/01/07 1
HCPC勉強会 2016/01/07
グラフマスターに、俺はなる!
M2 鈴木 浩史
HCPC勉強会 2016/01/07 2
さらっと事前知識:グラフとはなんぞや
● グラフ
– 頂点(○ぽいやつ)を辺(線分)で結んだ図形
● example
– ○が人 → 友人関係の図
– ○が状態 → 状態遷移図
– 頂点や辺には値が付けられることがある
– 辺は向きを持つことがある(有向グラフ)
戦闘力1
戦闘力
53万
戦闘力
10万
戦闘力5
友情0
友情0
友情0
友情100
友情50
就寝
起床
寝坊
研究室
二度寝
帰宅
HCPC勉強会 2016/01/07 3
さらっと事前知識:グラフの重要な用語
● 閉路
– ある頂点から開始して同じ辺を2度通らずに戻る路
● 連結
– 辺に向きがないとして全ての頂点が互いに行き来できる
● 木
– 閉路のない連結なグラフ
● 今回は特に辺に向きがないことにする
– 頂点に葉、子孫、先祖、根など特別な呼び方がある
● 強連結
– 辺に向きがあるとき、全ての頂点が互いに行き来できる
HCPC勉強会 2016/01/07 4
さらっと事前知識:DAG
● 非巡回有向グラフ(Directed Acyclic Graph : DAG)
– 辺に向きがあり閉路のないグラフ
● トポロジカル順序
– 各頂点が自身より若い頂点に辿りつけないような順序
● 求め方
– 向けられている辺の数が0の頂点を消して番号付けることを繰り返す
– DFSの帰りがけ順が遅いものから番号付けをする
– 一意的ではない(大体の場合で気にしないけど)
2 6
1
4
3 5 7
HCPC勉強会 2016/01/07 5
本スライドでの注意点
● 今後、グラフの頂点数をN、辺の数をMと記述する。
● 本スライドを見ただけでは、コードを書けるようには
なりません。頑張ってください。
– 困ったら -tsukasa_diary github [検索]-
– いや、蟻本読めよ
● 蟻本読め
HCPC勉強会 2016/01/07 6
本スライドの主な内容
● 強連結成分分解
– 任意の有向グラフをDAGに変換するお話
● 最小共通先祖
– 根を持つ木における重要なクエリのお話
● H/L分解
– 根を持つ木に対する良い性質を持った分解のお話
– ぶっちゃけ、競プロには必要ない
● 知ってると無理やり問題を殴れるだけ
● 趣味でしかない
HCPC勉強会 2016/01/07 7
強連結成分分解
● 有向グラフの強連結な部分を潰してDAGにする
v1
v2
v5
v3
v4
v7
v8
v9
v6
V10
v1
V2,3,4,5
V7,8,9
v6
V10
Directed
Graph
DAG!
DAG!!
強連結な部分
強連結成分
HCPC勉強会 2016/01/07 8
何が嬉しいの?
● 2-SATを爆速で解く(蟻本を読め)
– 強連結成分を考えることで解ける問題はたくさん
● DAGDAGできる!
● DAGは強い
– 色々な問題がDPで解ける
● 最長路問題(一般には難しい)は有名
● 強連結成分ごとに前処理して、
DAGに潰してDPするのは典型
– DPはDAGをトポロジカル順にたどるアルゴリズムと考
えることができる
dp[from]
dp[to1]
dp[to2]
HCPC勉強会 2016/01/07 9
強連結成分分解のアルゴリズム
part-1
● DFSを2回するだけ
– 1回目:帰りがけ順を記憶
v1
v2
v5
v3
v4
v7
v8
v9
v6
V10
例えばこんなDFSをしたとする(赤はその頂点から帰るタイミング)
v1
→v2
→v3
→v6
→v9
→v10
→v9
→v7
→v8
→v7
→v9
→v6
→v3
→v4
→v5
→v4
→v3
→v2
→v1
12
3
4
5
6
7
8
9
10
HCPC勉強会 2016/01/07 10
強連結成分分解のアルゴリズム
part-2
● DFSを2回するだけ
– 2回目:帰りが遅かった頂点から順に逆辺を使ったDFS
– 何が起こるのか?
● すでに訪れた頂点を避けると、強連結成分ごとにDFSが停止
v1
v2
v5
v3
v4
v7
v8
v9
v6
V10
12
3
4
5
6
7
8
9
10
1回目
2回目
3回目
4回目
5回目
辺の向きが逆のグラフ
HCPC勉強会 2016/01/07 11
1度にたどった頂点をまとめれば完成
● DFSするだけなので計算量はO(N+M)
● なぜうまくいく?
– 強連結な部分は辺を逆向きにしても強連結
● 正方向で全部辿れるなら逆方向でも辿れる
– DFSの帰りがけ順が遅い = 完成したDAGでトポ順が早い
● 完成DAGでのDFS帰りがけ順を考えれば当然
– 逆辺のDFSならトポ順で後の強連結成分を訪れない
– つまり、トポ順に強連結成分を舐めることになる
v1
v2
v5
v3
v4
v7
v8
v9
v6
V10
12
3
4
5
6
7
8
9
10
v1
V2,3,4,5 V7,8,9
v6
V10
HCPC勉強会 2016/01/07 12
さらっと事前知識:木について
根
両親
妹
(願望)
ワイ
子供
(願望)
葉
姉
● 根
– 一番上の頂点
– これを定めた木を根付き木と言う
● 先祖
– 根を定めたとき自分より上にいる頂点
– 自分自身も含むことに注意
● 子孫
– 根を定めたとき自分より下にいる頂点
● 葉
– 辺が1本しか出ていない頂点
– 根を定めたとき子孫を持たない頂点
姪
(願望)
HCPC勉強会 2016/01/07 13
最小共通先祖(LCA)
● 根付き木のある2頂点について、共通する先祖のう
ち最も根から遠いもの
– クエリとして良く問われる
根
両親
妹
(願望)
ワイ
子供
(願望)
葉
姉
姪
(願望)
2つの頂点
最小共通先祖
HCPC勉強会 2016/01/07 14
二分法を用いて求める
● 着眼点
– uとvの高さが同じなら、それぞれから「ある値だけ登っ
た位置」以降にu,vの全ての共通先祖がある
– 「ある値だけ登った位置」がLCA
● uとvが初めてぶつかる位置がLCAということ
● やること
– 前処理:各頂点について深さと2k
個上の先祖を記憶
– クエリ処理:二分法で一気に登る
HCPC勉強会 2016/01/07 15
前処理
● DFSで各頂点の深さと1つ上の先祖を記憶
● 各頂点の2k
個上の先祖を求める
– kは2k
>maxdepth
となる最小のkまで考えれば良い
● だいたいは雑に k = log(N)とする
– 2k
個上の先祖 = 2k-1
個上の先祖の2k-1
個上の先祖
v1
v2
v4
v5
v3
v6
v7
v8
k = 0 はDFSによってわかっている
kを1から初めて以下のDPをすれば良い!
v9
v10
k=1
k=2
前処理の計算量
DFS-part : O(N)
DP-part : O(N log(N))
全体 : O(N log(N))
parent[v][k] = parent[parent[v][k-1]][k-1]
HCPC勉強会 2016/01/07 16
クエリ処理
● 2頂点u,vのLCAを二分法により求める
● 一気に登るアルゴリズム
– uとvの高さが合うように深い方を登らせる
● これを二分法によりO(log(N))で行う
– uとvが初めてぶつかる直前まで一気に登る
● これも二分法によりO(log(N))で行う
– 全体でO(log(N))で処理
HCPC勉強会 2016/01/07 17
クエリ処理 part-1
● uが深いとして、vとの高さが合うまでuを登らせる
– vの高さを超えない範囲で一気に登る
● 2k
登ってもvの高さを超えないなら u = parent[u][k]
● 次に登る値の最大値が半分(2k
→2k-1
)になっていく
v
u
u
v
vを超えない
ギリギリ
vを超える
O(log(N))
HCPC勉強会 2016/01/07 18
クエリ処理 part-2
● 2k
個上の先祖情報を用いて一気に登る
– 2k
個上の先祖が違うならu,v共に2k
個登る
● If (parent[u][k] != parent[v][k]) then 登る;
● これもまた登る値の最大値が半分(2k
→2k-1
)になっていく
u v
u v
ぶつからない
ギリギリ
ここがLCA
O(log(N))
HCPC勉強会 2016/01/07 19
RMQ(Range Minimum Query)を用いて求める
● DFSの訪問順序を記憶
– v1
→v2
→v4
→v7
→v4
→v2
→v5
→v2
→v1
→v3
→v6
→v3
→v1
● 2頂点間の訪問経路上にLCAがある
– v5
とv7
のLCAは?
● Answer. v2
– v1
→v2
→v4
→v7
→v4
→v2
→v5
→v2
→v1
→v3
→v6
→v3
→v1
● 2頂点間の訪問経路上で最も深さの小さい頂点がLCA
– 深さに関するRMQでLCAの位置がわかる
– v1
→v2
→v4
→v7
→v4
→v2
→v5
→v2
→v1
→v3
→v6
→v3
→v1
– 0 →1 →2 →3 →2 →1 →2 →1 →0 →1 →2 →1 →0
v1
v2
v4
v3
v5
v6
v7
※行きがけ順のインデクスで考える
SegmentTreeを使う場合
前処理DFS+Seg木構築:O(N)
クエリ処理:O(log(N))
u v
LCA
HCPC勉強会 2016/01/07 20
事前知識:パス
● 一直線に書くことができるグラフ
– 閉路がない
– 木の特殊系とも見れる
HCPC勉強会 2016/01/07 21
H/L分解
● Heavy−Light Decompositionのこと
● 根付き木をいくつかのパスに分解する
v1
v2
v4
v5
v3
v6
v7
v8
v9
v11
v10
v1
v2
v5
v8
v10
v4
v6
v3
v7
v9
v11
1つのパスを1つのノードに潰すと、
より小さな木として考えることができる!
HCPC勉強会 2016/01/07 22
H/L分解の規則
● 規則
– 枝をHeavy-EdgeとLight-Edgeに分ける
● 子孫の半分以上を持つ枝をHeavyで他はLightとするだけ
– Heavy-Edgeをつないでパスにする
v1
v2
v4
v5
v3
v6
v7
v8
v9
v11
v10
Heavy!!
性質がほぼ同じ分解として、
子孫の最も多い枝をHeavyと考える分解もある。
(僕はいつもこっちを使っている)
HCPC勉強会 2016/01/07 23
H/L分解のうまみ
● 新しい木は高さがO(log(N))
– 潰した木に残っている辺はLight-Edgeのみ
– Light-Edgeで結ばれた先は |子孫| <= N/2
– Light-Edgeをたどった先では頂点数が半分になる
● 新しい木の頂点はパスを保持する
– パスに対する高速なアルゴリズムと組合せられる
– 1次元配列を用いたデータ構造で色々管理できる
HCPC勉強会 2016/01/07 24
H/L分解のうまい利用法(雑)
● O(log(N))でLCAを求められる
● データ構造との組合せ
– BIT
– SegmentTree
● コイツデナグルトキノモンダイダイタイトケルツヨイ
– 他にも色々あるんだろうなぁ。。。
● 結局のところ
– 根付き木に関する多くのクエリをO(log(N))とか
O(log2
(N))とかで解決
HCPC勉強会 2016/01/07 25
HL分解〜SegmentTreeを添えて〜
● 実際の問題で使い方を雑に説明します
● AOJ 2667 Tree を参照してください
– http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?
id=2667
HCPC勉強会 2016/01/07 26
HL分解〜SegmentTreeを添えて〜
● とりあえずH/L分解してSeg木を付ける
v1
v2
v5
v8
v10
v4
v6
v3
v7
v9
v11
根
cost 3 2 5 1
1 3
3 2 5 1
1
3
5 2
5
2
13
3 1
Seg0
Seg1 Seg2
Seg3
Seg4
All 3 2 3 3 2
木をDFSするとき、親子関係の
区間表現も作っておくことで、
各Seg木に対する
全範囲への追加コストを、
別のSeg木で管理する
Seg1Seg0 Seg2 Seg3 Seg4
図はいくつかクエリ処理した後だと
思ってくださいオナシャス
HCPC勉強会 2016/01/07 27
HL分解〜SegmentTreeを添えて〜
v1
v2
v5
v8
v10
v4
v6
v3
v7
v9
v11
根
cost 3 2 5 1
1 3
3 2 5 1
1
3
5 2
5
2
v5
からv7
へのcostは?
13
3 1
ここ足す
ここ
高さがlog(N)なので
O(log2
(N))
All 3 2 3 3 2
木をDFSするとき、親子関係の
区間表現も作っておくことで、
各Seg木に対する
全範囲への追加コストを、
別のSeg木で管理する
Seg0
Seg1 Seg2
Seg3
Seg4
ここ足す
Seg1Seg0 Seg2 Seg3 Seg4
HCPC勉強会 2016/01/07 28
HL分解〜SegmentTreeを添えて〜
v1
v2
v5
v8
v10
v4
v6
v3
v7
v9
v11
根
cost 3 2 5 1
1 3
3 2 5 1
1
3
5 2
5
2
v2
より下の辺のcostを +x
13
3 1
+x
※範囲更新可能な
SegmentTreeでやるべき
All 3 2 3 3 2
木をDFSするとき、親子関係の
区間表現も作っておくことで、
各Seg木に対する
全範囲への追加コストを、
別のSeg木で管理する
O(log(N))で更新できた!Seg0
Seg1 Seg2
Seg3
Seg4
v2
は[seg1, seg3]の先祖
+x
Seg1Seg0 Seg2 Seg3 Seg4
HCPC勉強会 2016/01/07 29
本スライドはここまで
蟻本とかWeb検索の方が圧倒的情報量

Weitere ähnliche Inhalte

Was ist angesagt?

プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~Takuya Akiba
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとはTakuya Akiba
 
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~Yuma Inoue
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木理玖 川崎
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Inc.
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話Nagisa Eto
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造Takuya Akiba
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Inc.
 
AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Inc.
 
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方Kensuke Otsuki
 
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法Hiro H.
 

Was ist angesagt? (20)

プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
双対性
双対性双対性
双対性
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
ユークリッド最小全域木
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
 
Rolling hash
Rolling hashRolling hash
Rolling hash
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
直交領域探索
直交領域探索直交領域探索
直交領域探索
 
AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説
 
AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説AtCoder Beginner Contest 011 解説
AtCoder Beginner Contest 011 解説
 
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
 
Za atsu-20170328
Za atsu-20170328Za atsu-20170328
Za atsu-20170328
 
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法
 

Mehr von HCPC: 北海道大学競技プログラミングサークル

Mehr von HCPC: 北海道大学競技プログラミングサークル (20)

写像 12 相
写像 12 相写像 12 相
写像 12 相
 
ACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2017 Day3 F: 掛け算は楽しいACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2017 Day3 F: 掛け算は楽しい
 
ACPC 2017 Day3 D: 優柔不断
ACPC 2017 Day3 D: 優柔不断ACPC 2017 Day3 D: 優柔不断
ACPC 2017 Day3 D: 優柔不断
 
ACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFSACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFS
 
ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解ACPC 2019 Day3 F: 部分文字列分解
ACPC 2019 Day3 F: 部分文字列分解
 
ACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取りACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取り
 
ACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェ
 
ACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探しACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探し
 
HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木
 
HUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャムHUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャム
 
HUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMGHUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMG
 
HUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD RushHUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD Rush
 
HUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺しHUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺し
 
HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号
 
HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元
 
HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?
 
HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価
 
HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍
 
HUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four teaHUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four tea
 
プログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニックプログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニック
 

Kürzlich hochgeladen

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 

Kürzlich hochgeladen (8)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 

目指せグラフマスター

  • 1. HCPC勉強会 2016/01/07 1 HCPC勉強会 2016/01/07 グラフマスターに、俺はなる! M2 鈴木 浩史
  • 2. HCPC勉強会 2016/01/07 2 さらっと事前知識:グラフとはなんぞや ● グラフ – 頂点(○ぽいやつ)を辺(線分)で結んだ図形 ● example – ○が人 → 友人関係の図 – ○が状態 → 状態遷移図 – 頂点や辺には値が付けられることがある – 辺は向きを持つことがある(有向グラフ) 戦闘力1 戦闘力 53万 戦闘力 10万 戦闘力5 友情0 友情0 友情0 友情100 友情50 就寝 起床 寝坊 研究室 二度寝 帰宅
  • 3. HCPC勉強会 2016/01/07 3 さらっと事前知識:グラフの重要な用語 ● 閉路 – ある頂点から開始して同じ辺を2度通らずに戻る路 ● 連結 – 辺に向きがないとして全ての頂点が互いに行き来できる ● 木 – 閉路のない連結なグラフ ● 今回は特に辺に向きがないことにする – 頂点に葉、子孫、先祖、根など特別な呼び方がある ● 強連結 – 辺に向きがあるとき、全ての頂点が互いに行き来できる
  • 4. HCPC勉強会 2016/01/07 4 さらっと事前知識:DAG ● 非巡回有向グラフ(Directed Acyclic Graph : DAG) – 辺に向きがあり閉路のないグラフ ● トポロジカル順序 – 各頂点が自身より若い頂点に辿りつけないような順序 ● 求め方 – 向けられている辺の数が0の頂点を消して番号付けることを繰り返す – DFSの帰りがけ順が遅いものから番号付けをする – 一意的ではない(大体の場合で気にしないけど) 2 6 1 4 3 5 7
  • 5. HCPC勉強会 2016/01/07 5 本スライドでの注意点 ● 今後、グラフの頂点数をN、辺の数をMと記述する。 ● 本スライドを見ただけでは、コードを書けるようには なりません。頑張ってください。 – 困ったら -tsukasa_diary github [検索]- – いや、蟻本読めよ ● 蟻本読め
  • 6. HCPC勉強会 2016/01/07 6 本スライドの主な内容 ● 強連結成分分解 – 任意の有向グラフをDAGに変換するお話 ● 最小共通先祖 – 根を持つ木における重要なクエリのお話 ● H/L分解 – 根を持つ木に対する良い性質を持った分解のお話 – ぶっちゃけ、競プロには必要ない ● 知ってると無理やり問題を殴れるだけ ● 趣味でしかない
  • 7. HCPC勉強会 2016/01/07 7 強連結成分分解 ● 有向グラフの強連結な部分を潰してDAGにする v1 v2 v5 v3 v4 v7 v8 v9 v6 V10 v1 V2,3,4,5 V7,8,9 v6 V10 Directed Graph DAG! DAG!! 強連結な部分 強連結成分
  • 8. HCPC勉強会 2016/01/07 8 何が嬉しいの? ● 2-SATを爆速で解く(蟻本を読め) – 強連結成分を考えることで解ける問題はたくさん ● DAGDAGできる! ● DAGは強い – 色々な問題がDPで解ける ● 最長路問題(一般には難しい)は有名 ● 強連結成分ごとに前処理して、 DAGに潰してDPするのは典型 – DPはDAGをトポロジカル順にたどるアルゴリズムと考 えることができる dp[from] dp[to1] dp[to2]
  • 9. HCPC勉強会 2016/01/07 9 強連結成分分解のアルゴリズム part-1 ● DFSを2回するだけ – 1回目:帰りがけ順を記憶 v1 v2 v5 v3 v4 v7 v8 v9 v6 V10 例えばこんなDFSをしたとする(赤はその頂点から帰るタイミング) v1 →v2 →v3 →v6 →v9 →v10 →v9 →v7 →v8 →v7 →v9 →v6 →v3 →v4 →v5 →v4 →v3 →v2 →v1 12 3 4 5 6 7 8 9 10
  • 10. HCPC勉強会 2016/01/07 10 強連結成分分解のアルゴリズム part-2 ● DFSを2回するだけ – 2回目:帰りが遅かった頂点から順に逆辺を使ったDFS – 何が起こるのか? ● すでに訪れた頂点を避けると、強連結成分ごとにDFSが停止 v1 v2 v5 v3 v4 v7 v8 v9 v6 V10 12 3 4 5 6 7 8 9 10 1回目 2回目 3回目 4回目 5回目 辺の向きが逆のグラフ
  • 11. HCPC勉強会 2016/01/07 11 1度にたどった頂点をまとめれば完成 ● DFSするだけなので計算量はO(N+M) ● なぜうまくいく? – 強連結な部分は辺を逆向きにしても強連結 ● 正方向で全部辿れるなら逆方向でも辿れる – DFSの帰りがけ順が遅い = 完成したDAGでトポ順が早い ● 完成DAGでのDFS帰りがけ順を考えれば当然 – 逆辺のDFSならトポ順で後の強連結成分を訪れない – つまり、トポ順に強連結成分を舐めることになる v1 v2 v5 v3 v4 v7 v8 v9 v6 V10 12 3 4 5 6 7 8 9 10 v1 V2,3,4,5 V7,8,9 v6 V10
  • 12. HCPC勉強会 2016/01/07 12 さらっと事前知識:木について 根 両親 妹 (願望) ワイ 子供 (願望) 葉 姉 ● 根 – 一番上の頂点 – これを定めた木を根付き木と言う ● 先祖 – 根を定めたとき自分より上にいる頂点 – 自分自身も含むことに注意 ● 子孫 – 根を定めたとき自分より下にいる頂点 ● 葉 – 辺が1本しか出ていない頂点 – 根を定めたとき子孫を持たない頂点 姪 (願望)
  • 13. HCPC勉強会 2016/01/07 13 最小共通先祖(LCA) ● 根付き木のある2頂点について、共通する先祖のう ち最も根から遠いもの – クエリとして良く問われる 根 両親 妹 (願望) ワイ 子供 (願望) 葉 姉 姪 (願望) 2つの頂点 最小共通先祖
  • 14. HCPC勉強会 2016/01/07 14 二分法を用いて求める ● 着眼点 – uとvの高さが同じなら、それぞれから「ある値だけ登っ た位置」以降にu,vの全ての共通先祖がある – 「ある値だけ登った位置」がLCA ● uとvが初めてぶつかる位置がLCAということ ● やること – 前処理:各頂点について深さと2k 個上の先祖を記憶 – クエリ処理:二分法で一気に登る
  • 15. HCPC勉強会 2016/01/07 15 前処理 ● DFSで各頂点の深さと1つ上の先祖を記憶 ● 各頂点の2k 個上の先祖を求める – kは2k >maxdepth となる最小のkまで考えれば良い ● だいたいは雑に k = log(N)とする – 2k 個上の先祖 = 2k-1 個上の先祖の2k-1 個上の先祖 v1 v2 v4 v5 v3 v6 v7 v8 k = 0 はDFSによってわかっている kを1から初めて以下のDPをすれば良い! v9 v10 k=1 k=2 前処理の計算量 DFS-part : O(N) DP-part : O(N log(N)) 全体 : O(N log(N)) parent[v][k] = parent[parent[v][k-1]][k-1]
  • 16. HCPC勉強会 2016/01/07 16 クエリ処理 ● 2頂点u,vのLCAを二分法により求める ● 一気に登るアルゴリズム – uとvの高さが合うように深い方を登らせる ● これを二分法によりO(log(N))で行う – uとvが初めてぶつかる直前まで一気に登る ● これも二分法によりO(log(N))で行う – 全体でO(log(N))で処理
  • 17. HCPC勉強会 2016/01/07 17 クエリ処理 part-1 ● uが深いとして、vとの高さが合うまでuを登らせる – vの高さを超えない範囲で一気に登る ● 2k 登ってもvの高さを超えないなら u = parent[u][k] ● 次に登る値の最大値が半分(2k →2k-1 )になっていく v u u v vを超えない ギリギリ vを超える O(log(N))
  • 18. HCPC勉強会 2016/01/07 18 クエリ処理 part-2 ● 2k 個上の先祖情報を用いて一気に登る – 2k 個上の先祖が違うならu,v共に2k 個登る ● If (parent[u][k] != parent[v][k]) then 登る; ● これもまた登る値の最大値が半分(2k →2k-1 )になっていく u v u v ぶつからない ギリギリ ここがLCA O(log(N))
  • 19. HCPC勉強会 2016/01/07 19 RMQ(Range Minimum Query)を用いて求める ● DFSの訪問順序を記憶 – v1 →v2 →v4 →v7 →v4 →v2 →v5 →v2 →v1 →v3 →v6 →v3 →v1 ● 2頂点間の訪問経路上にLCAがある – v5 とv7 のLCAは? ● Answer. v2 – v1 →v2 →v4 →v7 →v4 →v2 →v5 →v2 →v1 →v3 →v6 →v3 →v1 ● 2頂点間の訪問経路上で最も深さの小さい頂点がLCA – 深さに関するRMQでLCAの位置がわかる – v1 →v2 →v4 →v7 →v4 →v2 →v5 →v2 →v1 →v3 →v6 →v3 →v1 – 0 →1 →2 →3 →2 →1 →2 →1 →0 →1 →2 →1 →0 v1 v2 v4 v3 v5 v6 v7 ※行きがけ順のインデクスで考える SegmentTreeを使う場合 前処理DFS+Seg木構築:O(N) クエリ処理:O(log(N)) u v LCA
  • 20. HCPC勉強会 2016/01/07 20 事前知識:パス ● 一直線に書くことができるグラフ – 閉路がない – 木の特殊系とも見れる
  • 21. HCPC勉強会 2016/01/07 21 H/L分解 ● Heavy−Light Decompositionのこと ● 根付き木をいくつかのパスに分解する v1 v2 v4 v5 v3 v6 v7 v8 v9 v11 v10 v1 v2 v5 v8 v10 v4 v6 v3 v7 v9 v11 1つのパスを1つのノードに潰すと、 より小さな木として考えることができる!
  • 22. HCPC勉強会 2016/01/07 22 H/L分解の規則 ● 規則 – 枝をHeavy-EdgeとLight-Edgeに分ける ● 子孫の半分以上を持つ枝をHeavyで他はLightとするだけ – Heavy-Edgeをつないでパスにする v1 v2 v4 v5 v3 v6 v7 v8 v9 v11 v10 Heavy!! 性質がほぼ同じ分解として、 子孫の最も多い枝をHeavyと考える分解もある。 (僕はいつもこっちを使っている)
  • 23. HCPC勉強会 2016/01/07 23 H/L分解のうまみ ● 新しい木は高さがO(log(N)) – 潰した木に残っている辺はLight-Edgeのみ – Light-Edgeで結ばれた先は |子孫| <= N/2 – Light-Edgeをたどった先では頂点数が半分になる ● 新しい木の頂点はパスを保持する – パスに対する高速なアルゴリズムと組合せられる – 1次元配列を用いたデータ構造で色々管理できる
  • 24. HCPC勉強会 2016/01/07 24 H/L分解のうまい利用法(雑) ● O(log(N))でLCAを求められる ● データ構造との組合せ – BIT – SegmentTree ● コイツデナグルトキノモンダイダイタイトケルツヨイ – 他にも色々あるんだろうなぁ。。。 ● 結局のところ – 根付き木に関する多くのクエリをO(log(N))とか O(log2 (N))とかで解決
  • 25. HCPC勉強会 2016/01/07 25 HL分解〜SegmentTreeを添えて〜 ● 実際の問題で使い方を雑に説明します ● AOJ 2667 Tree を参照してください – http://judge.u-aizu.ac.jp/onlinejudge/description.jsp? id=2667
  • 26. HCPC勉強会 2016/01/07 26 HL分解〜SegmentTreeを添えて〜 ● とりあえずH/L分解してSeg木を付ける v1 v2 v5 v8 v10 v4 v6 v3 v7 v9 v11 根 cost 3 2 5 1 1 3 3 2 5 1 1 3 5 2 5 2 13 3 1 Seg0 Seg1 Seg2 Seg3 Seg4 All 3 2 3 3 2 木をDFSするとき、親子関係の 区間表現も作っておくことで、 各Seg木に対する 全範囲への追加コストを、 別のSeg木で管理する Seg1Seg0 Seg2 Seg3 Seg4 図はいくつかクエリ処理した後だと 思ってくださいオナシャス
  • 27. HCPC勉強会 2016/01/07 27 HL分解〜SegmentTreeを添えて〜 v1 v2 v5 v8 v10 v4 v6 v3 v7 v9 v11 根 cost 3 2 5 1 1 3 3 2 5 1 1 3 5 2 5 2 v5 からv7 へのcostは? 13 3 1 ここ足す ここ 高さがlog(N)なので O(log2 (N)) All 3 2 3 3 2 木をDFSするとき、親子関係の 区間表現も作っておくことで、 各Seg木に対する 全範囲への追加コストを、 別のSeg木で管理する Seg0 Seg1 Seg2 Seg3 Seg4 ここ足す Seg1Seg0 Seg2 Seg3 Seg4
  • 28. HCPC勉強会 2016/01/07 28 HL分解〜SegmentTreeを添えて〜 v1 v2 v5 v8 v10 v4 v6 v3 v7 v9 v11 根 cost 3 2 5 1 1 3 3 2 5 1 1 3 5 2 5 2 v2 より下の辺のcostを +x 13 3 1 +x ※範囲更新可能な SegmentTreeでやるべき All 3 2 3 3 2 木をDFSするとき、親子関係の 区間表現も作っておくことで、 各Seg木に対する 全範囲への追加コストを、 別のSeg木で管理する O(log(N))で更新できた!Seg0 Seg1 Seg2 Seg3 Seg4 v2 は[seg1, seg3]の先祖 +x Seg1Seg0 Seg2 Seg3 Seg4