Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
HN
Uploaded by
Hideaki Nagamine
2,057 views
競技プログラミング練習会2015 Normal 第4回
2015年5月8日. 京大マイコンクラブ部室.
Engineering
◦
Read more
3
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 68
2
/ 68
3
/ 68
4
/ 68
5
/ 68
6
/ 68
7
/ 68
8
/ 68
9
/ 68
10
/ 68
11
/ 68
12
/ 68
13
/ 68
14
/ 68
15
/ 68
16
/ 68
17
/ 68
18
/ 68
19
/ 68
20
/ 68
21
/ 68
22
/ 68
23
/ 68
24
/ 68
25
/ 68
26
/ 68
27
/ 68
28
/ 68
29
/ 68
30
/ 68
31
/ 68
32
/ 68
33
/ 68
34
/ 68
35
/ 68
36
/ 68
37
/ 68
38
/ 68
39
/ 68
40
/ 68
41
/ 68
42
/ 68
43
/ 68
44
/ 68
45
/ 68
46
/ 68
47
/ 68
48
/ 68
49
/ 68
50
/ 68
51
/ 68
52
/ 68
53
/ 68
54
/ 68
55
/ 68
56
/ 68
57
/ 68
58
/ 68
59
/ 68
60
/ 68
61
/ 68
62
/ 68
63
/ 68
64
/ 68
65
/ 68
66
/ 68
67
/ 68
68
/ 68
More Related Content
PDF
競技プログラミング練習会2015 Normal 第2回
by
Hideaki Nagamine
PPTX
東大生向けデータ解析講座 第1回 2017/12/27
by
西岡 賢一郎
PPTX
東大生向けデータ解析講座 第4回 2018/01/05
by
西岡 賢一郎
PPTX
東大生向けデータ解析講座 第2回 2017/12/29
by
西岡 賢一郎
PPTX
東大生向けデータ解析講座 第3回 2018/01/04
by
西岡 賢一郎
PDF
蟻本輪講 データ構造
by
HCPC: 北海道大学競技プログラミングサークル
PDF
[DL Hacks]Visdomを使ったデータ可視化
by
Deep Learning JP
PPTX
(ブログ用)累積和をmapに入れて区間の和をカウントする
by
satanic
競技プログラミング練習会2015 Normal 第2回
by
Hideaki Nagamine
東大生向けデータ解析講座 第1回 2017/12/27
by
西岡 賢一郎
東大生向けデータ解析講座 第4回 2018/01/05
by
西岡 賢一郎
東大生向けデータ解析講座 第2回 2017/12/29
by
西岡 賢一郎
東大生向けデータ解析講座 第3回 2018/01/04
by
西岡 賢一郎
蟻本輪講 データ構造
by
HCPC: 北海道大学競技プログラミングサークル
[DL Hacks]Visdomを使ったデータ可視化
by
Deep Learning JP
(ブログ用)累積和をmapに入れて区間の和をカウントする
by
satanic
Viewers also liked
PPTX
(ブログ用)Codeforces #400 D. The Door Problem
by
satanic
PDF
ダブリング
by
satanic
PDF
競技プログラミング練習会2015 Normal 第3回
by
Hideaki Nagamine
PDF
高速フーリエ変換
by
AtCoder Inc.
PDF
動的計画法
by
HCPC: 北海道大学競技プログラミングサークル
PDF
最短経路問題 & 最小全域木
by
HCPC: 北海道大学競技プログラミングサークル
PDF
二分探索をはじめからていねいに
by
HCPC: 北海道大学競技プログラミングサークル
PPTX
動的計画法を極める!
by
HCPC: 北海道大学競技プログラミングサークル
PDF
AtCoder Beginner Contest 025 解説
by
AtCoder Inc.
(ブログ用)Codeforces #400 D. The Door Problem
by
satanic
ダブリング
by
satanic
競技プログラミング練習会2015 Normal 第3回
by
Hideaki Nagamine
高速フーリエ変換
by
AtCoder Inc.
動的計画法
by
HCPC: 北海道大学競技プログラミングサークル
最短経路問題 & 最小全域木
by
HCPC: 北海道大学競技プログラミングサークル
二分探索をはじめからていねいに
by
HCPC: 北海道大学競技プログラミングサークル
動的計画法を極める!
by
HCPC: 北海道大学競技プログラミングサークル
AtCoder Beginner Contest 025 解説
by
AtCoder Inc.
More from Hideaki Nagamine
PDF
PietでLISP処理系を書くのは難しい
by
Hideaki Nagamine
PDF
Pietでlisp処理系を書くのは難しい 進捗報告
by
Hideaki Nagamine
PDF
フェーザとか
by
Hideaki Nagamine
PDF
Pietソースコード精読
by
Hideaki Nagamine
PDF
競技プログラミング練習会2015 Normal 第1回
by
Hideaki Nagamine
PPTX
Gaucheでマクロを書こう
by
Hideaki Nagamine
ODP
On Lisp読書会2014 第3回「第2章 関数 (つづき)」
by
Hideaki Nagamine
PietでLISP処理系を書くのは難しい
by
Hideaki Nagamine
Pietでlisp処理系を書くのは難しい 進捗報告
by
Hideaki Nagamine
フェーザとか
by
Hideaki Nagamine
Pietソースコード精読
by
Hideaki Nagamine
競技プログラミング練習会2015 Normal 第1回
by
Hideaki Nagamine
Gaucheでマクロを書こう
by
Hideaki Nagamine
On Lisp読書会2014 第3回「第2章 関数 (つづき)」
by
Hideaki Nagamine
競技プログラミング練習会2015 Normal 第4回
1.
競技プログラミング練習会 2015 Normal 第4回 2015/05/08 長嶺英朗(ID:hnagamin)
2.
● プライオリティキュー ●Union-Find 木 ● ダイクストラ法 ● 最小全域木問題 ● プリム法 ● クラスカル法 目次
3.
プライオリティキュー
4.
● キューは以下のことができるデータ構造でした 思い出してください ● push データを入れる ● pop 最後に入れたデータを取り出す push pop
5.
● プライオリティキューでは以下のことができます ● “Priority” =
優先度 プライオリティキュー ● push データを入れる ● pop 今までに入れたデータのうち、 最も優先度の高いものを1つ 取り出す 10 1 8 push pop 8 2 42 23 42
6.
プライオリティキュー ● 先の2操作のほかに追加の操作をサポートするもの もあります – 最も小さい要素の参照(peek) –
ある要素の優先度を下げる(decrease) – 2つのプライオリティキューを併合する(meld)
7.
実装 ● いろいろあります – 赤黒木(平衡二分探索木) push:
O(log n) pop: O(log n) – 二分ヒープ push: O(log n) pop: O(log n) – フィボナッチヒープ push: O(1) pop: O(log n) – Leftist Heap push: O(log n) pop: O(log n) ● 各データ構造に長所・短所があるので目的に応じ て使い分けてください – (時間の都合上、長所・短所については説明しません)
8.
C++におけるプライオリティキュー ● 朗報です ● C++の標準ライブラリはプライオリティキューをサ ポートしています #include<queue> using namespace std; priority_queue<int> q; // 入れた要素が大きい順に出てくる
9.
C++におけるプライオリティキュー ● 朗報です ● C++の標準ライブラリはプライオリティキューをサ ポートしています #include<queue> #include<vector> using namespace std; priority_queue<int, vector<int>, greater<int> > q; // 入れた要素が小さい順に出てくる
10.
ダイクストラ法
11.
復習: 最短経路問題 ●頂点間の距離を求める問題 ●全点対最短経路問題…全ての頂点間の距離 ●単一始点最短経路問題…ある点から各点への距離 1 0 2 3 10 20 60 15 30 頂点1 0:
20⇒ 頂点1 1: 0⇒ 頂点1 2: 35⇒ 頂点1 3: 65⇒ 単一始点最短経路問題の例
12.
復習: ベルマンフォード法 ●単一始点最短経路問題を解くアルゴリズム ●各頂点への暫定的な最短経路を保存しておいて、 各辺を使うことで最短経路を更新できるか調べる ●計算量 O(VE) 1 0 2 3 10 20 60 15 30 頂点i
0 1 2 3 距離di 20 0 35 65 辺のリスト (0,1,10), (0,2,15), (1,0, 20), (1,2,60), (2,3,30) d3 = 90 > d2 + 30 = 65 (更新する)
13.
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_A
14.
GRL_1: Single Source
Shortest Path ● 単一始点最短経路問題 ● 0 (≦ 各辺のコスト) 10≦ 4 ● V 10≦ 5 ● E 5 × 10≦ 5 ● ベルマンフォード法では解けない – VE > 1010
15.
ダイクストラ法 ● 単一始点最短経路問題を解く ● 負のコストの辺が存在しないとき使える ● 計算量O(E log
V) – 辺の探索方法によって変わる
16.
ダイクストラ法のアイデア ● 負の辺が無いことを仮定しています
17.
ダイクストラ法のアイデア ● 最短距離が確定した頂点の集合Sと確定していな い頂点の集合Tを考える 1 0 2 3 10 50 10 15 30 S T コスト0 コスト10
18.
ダイクストラ法のアイデア ● Sの頂点からTの頂点へ伸びる辺の集合E'をとる 1 0 2 3 10 50 10 15 30 S T コスト0 コスト10
19.
ダイクストラ法のアイデア ● Sの頂点の最短距離は確定しているので、E'の各終 点(つまりTの幾つかの頂点)に対して暫定的な最短 距離が計算できる 1 0 2 3 10 50 10 15 30 S T コスト0 コスト10 コスト≦10+30 コスト≦0+50
20.
ダイクストラ法のアイデア ● ここで計算された暫定的な最短距離のうち最小の ものをとると、これは実際最短距離である 1 0 2 3 10 50 10 15 30 S T コスト0 コスト10 コスト≦10+30 コスト≦0+50
21.
ダイクストラ法のアイデア ● ここで計算された暫定的な最短距離のうち最小の ものをとると、これは実際最短距離である 3 S T 仮にこのようなより短い経路が 存在したと仮定すると、 コスト≦10+30
22.
ダイクストラ法のアイデア ● ここで計算された暫定的な最短距離のうち最小の ものをとると、これは実際最短距離である 3 S T この経路のコストは非負なので、 コスト≦10+30
23.
ダイクストラ法のアイデア ● ここで計算された暫定的な最短距離のうち最小の ものをとると、これは実際最短距離である 3 S T この頂点の最短距離は 40より小さくないといけない。 これは最小のものをとった と言う仮定に矛盾する。 よってそのような経路は存在しない。 コスト≦10+30
24.
ダイクストラ法のアイデア ● ここで計算された暫定的な最短距離のうち最小の ものをとると、これは実際最短距離である 1 0 2 3 10 50 10 15 30 S T コスト0 コスト10 コスト≦10+30 コスト≦0+50
25.
ダイクストラ法のアイデア ● 以上から新たな頂点の最短距離が確定し、Sが拡 大する。このようにして1個ずつ最短距離を確定させ ていく 1 0 2 3 10 50 10 15 30 S T コスト0 コスト10
26.
ダイクストラ法 ● 暫定的最短距離が最小の頂点を探すときに「頂点 を格納するプライオリティキュー」を使うと計算量を 落とすことができる ● push回数はO(E) ● キューの要素数はO(V)→挿入コストはO(log
V) ● 全体の計算量はO(E log V) ● 実装については蟻本を読め(完)
27.
最小全域木問題
28.
木 ● 以下、無向グラフのみを考えます ● 連結かつ閉路のないグラフを木といいます – 連結…どの2頂点間にも道がある – 閉路…始点と頂点が同じ道 木 木じゃない木じゃない
29.
最小全域木問題 ● 辺に重みがある連結グラフが与えられる ● この中の辺のいくつかを使って、与えられたグラフ を木にしたい ● 使用する辺の重みの合計を最小化せよ
30.
問題例 ● いくつかの街が存在する ● 街の間に道路を作ってどの街からどの街へも行け るようにしたい ● 道路を作るための費用が予めわかっている ● 必要な道路作成費用を最小化せよ 街 ⇔ 頂点 道路
⇔ 辺 費用 ⇔ 辺の重み(コスト)
31.
最小全域木問題を解くアルゴリズム ● 今日は2種類のアルゴリズムを紹介します – プリム法 –
クラスカル法
32.
プリム法
33.
プリム法 ● 最小全域木問題を解く ● 部分木を広げていくことで最小全域木を得る ● 計算量O(E log
E) – E: 辺の本数, V: 頂点の数 – 辺の探索方法によって変わる
34.
プリム法のアイデア ● 用語を定義します ● グラフのある部分グラフSが木になっていて、かつS を部分木として含む最小全域木が存在するとき、 Sは「素敵な部分木である」ということにします S
35.
プリム法のアイデア ● いま、素敵な部分木Sがあるとします ● このときSを使ってより大きい素敵な部分木S'を作 ることができます ● 作り方を示します S
36.
プリム法のアイデア ● Sの頂点以外の頂点の集合をTとする S T
37.
プリム法のアイデア ● Sの頂点とTの頂点を結ぶ辺の集合E'をとる S T 細い辺がE'の要素
38.
プリム法のアイデア ● E'の要素のうちコストが最小の辺eをとる S T e
39.
プリム法のアイデア ● このとき、下のような部分木S'を考えると、S'は素敵 な部分木である S'
40.
プリム法のアイデア ● このとき、下のような部分木S'を考えると、S'は素敵 な部分木である S e 仮定よりSを含む最小全域木が存在します いま、eを含まない最小全域木が 何かひとつ存在したとします T
41.
プリム法のアイデア ● このとき、下のような部分木S'を考えると、S'は素敵 な部分木である S e このとき、この部分木には SとTをつなぐ辺が 必ず存在します これをe'とします T
42.
プリム法のアイデア ● このとき、下のような部分木S'を考えると、S'は素敵 な部分木である S e ここにeを加えてみます すると、閉路が1つできます T e'
43.
プリム法のアイデア ● このとき、下のような部分木S'を考えると、S'は素敵 な部分木である S e e'を消去するとこれはまた木になります T
44.
プリム法のアイデア ● このとき、下のような部分木S'を考えると、S'は素敵 な部分木である S e すると、e'のコストは絶対にeのコスト以上なので、 これはまた最小全域木になります 従って、S'を部分木に持つ最小全域木が少なくともひとつあることになります T
45.
プリム法のアイデア ● こうして素敵な部分木Sを使ってより大きい素敵な 部分木S'を作ることができました ● これを繰り返すことでグラフの頂点全体を使った素 敵な部分木ができます。これが最小全域木です。 S'
46.
プリム法の動作 1.頂点を1個適当に取って、頂点が1つの素敵な部分 木Sを作る (これは明らかに素敵な部分木ですよね) 2.SからTに伸びる辺のうちコストが最小の辺を1つ選 び、その辺およびその辺に繋がっている頂点をSに 追加する 3.全ての頂点を覆うまで2を繰り返す
47.
プリム法の動作 ● 頂点としてCを選びます – どれを選んでも良い ●
S = {C} T = {A,B,D,E,F} D F C B E A 1 2 3 4 5 6 7 8 9
48.
プリム法の動作 ● SからTに伸びる辺の最小 コストは2です ● よってこの辺と頂点Aを追 加します D F C B E A 1 2 3 4 5 6 7 8 9
49.
プリム法の動作 ● SからTに伸びる辺の最小 コストは1です ● よってこの辺と頂点Eを追 加します D F C B E A 1 2 3 4 5 6 7 8 9
50.
プリム法の動作 ● SからTに伸びる辺の最小 コストは5です ● よってこの辺と頂点Bを追 加します D F C B E A 1 2 3 4 5 6 7 8 9
51.
プリム法の動作 ● SからTに伸びる辺の最小 コストは3です ● よってこの辺と頂点Fを追 加します D F C B E A 1 2 3 4 5 6 7 8 9
52.
プリム法の動作 ● SからTに伸びる辺の最小 コストは3です ● よってこの辺と頂点Dを追 加します ● これで最小全域木が完成 しました D F C B E A 1 2 3 4 5 6 7 8 9
53.
プリム法の計算量 ● コストの小ささを優先度として辺を格納するプライ オリティキューを利用するとO(E log E)となる ● 実装については蟻本を読め
54.
クラスカル法
55.
クラスカル法 ● 最小全域木問題を解く ● 辺をコストが小さい順に見ていき、閉路ができない 限り追加していく ● O(E log
E)
56.
クラスカル法の動作 ● 辺のコストが小さい順に 見ていきます D F C B E A 1 2 3 4 5 6 7 8 9
57.
クラスカル法の動作 ● コスト1の辺が最小です ● AとEは繋がっていないので、 この辺を使います D F C B E A 1 2 3 4 5 6 7 8 9
58.
クラスカル法の動作 ● コスト2の辺が最小です ● AとCは繋がっていないので、 この辺を使います D F C B E A 1 2 3 4 5 6 7 8 9
59.
クラスカル法の動作 ● コスト3の辺が最小です ● FとBは繋がっていないので、 この辺を使います D F C B E A 1 2 3 4 5 6 7 8 9
60.
クラスカル法の動作 ● コスト4の辺が最小です ● CとEは既に繋がっているので、 この辺は使いません D F C B E A 1 2 3 4 5 6 7 8 9
61.
クラスカル法の動作 ● コスト5の辺が最小です ● BとEは繋がっていないので、 この辺を使います D F C B E A 1 2 3 5 6 7 8 9
62.
クラスカル法の動作 ● コスト6の辺が最小です ● CとDは繋がっていないので、 この辺を使います D F C B E A 1 2 3 5 6 7 8 9
63.
クラスカル法の動作 ● 7,8,9の辺は全て使いません ● これで最小全域木が完成します D F C B E A 1 2 3 5 6
64.
クラスカル法の動作 ● このようなアルゴリズムで最小全域 木が求まることは、プリム法と同様 の形式で示すことができます D F C B E A 1 2 3 5 6 7 8 9 e
65.
クラスカル法の計算量 ● Union-Find 木というデータ構造を使うと、繋がって るか否かの判断を効率的に行うことができる –
「繋がっている」「繋がっていない」を「同じ集合に属す」 「属さない」とみる
66.
// ここでUnion-Find 木の話をする
67.
クラスカル法の計算量 ● 辺のソートにO(E log
E)かかる ● 各辺について頂点が繋がっているか判定するのに O(α(E))かかる – 全体でO(E・α(E)) – α(n)は逆アッカーマン関数 ● よって全体の計算量は O(E log E + E α(E)) = O(E log E)
68.
α (2 2 2 65536 −3)=4
Download