O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Próximos SlideShares
ACPC2016Day3:E問題
ACPC2016Day3:E問題
Carregando em…3
×

Confira estes a seguir

1 de 17 Anúncio
Anúncio

Mais Conteúdo rRelacionado

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

Mais recentes (20)

Anúncio

G editorial

  1. 1. G: カードの迷宮 Dungeon of Cards  原案:井上 問題文:鈴木  解答:井上・鈴木
  2. 2. 問題概要 • 英大文字と数字がそれぞれ1つずつ描かれた扉N 枚・カードM枚がある • 英字か数字のどちらか一方が っていれば、カー ドで扉を開けられる • カードには値段があり、使ってもなくならない • 扉をすべて開ける最小コストは? A 1 Z 0K 1 A0開かない 開く
  3. 3. 簡単にした問題 • 英大文字と数字がそれぞれ1つずつ描かれた扉N 枚・カード各種類がある • 英字か数字のどちらか一方が っていれば、カー ドで扉を開けられる • カードの値段はすべて1、使ってもなくならない • 扉をすべて開ける最小コストは? A 1 Z 0K 1 A0開かない 開く
  4. 4. 簡単にした問題の解法 • 使う数字を全通り決め打ちする (210通り) • その数字集合で開けられない扉は、英字で開 けるしかない
 → 使う英字集合もわかる • max{ |数字集合|, |英字集合| }が答え Z 5 U 0A 1 使う数字: {1,0} 使う英字: { Z }
  5. 5. 想定解法: 最小費用流 • 使う数字を決め打ちすれば、使わなければならな い英字がわかる • 使うべき数字と英字をカードですべてカバーする 最小費用を求めればよい
 → 数字と英字の二部グラフで最小費用流
   (辺重みがカードの値段、辺容量は1) 0 1 A B C 3 6 1 8 5 S T 0 0 0 0 0
  6. 6. 想定解法 Q&A Q. 最小費用流ってなんですか? A. 辺にコストと容量が付いたグラフに対し、   与えられた流量 F を流すときにかかる   最小コストを求める問題のことです。 a d b c e 3,9 1,8 4,9 1,2 S T 5,2 3,10 4,6 1,7 2,10 コスト, 容量
  7. 7. 想定解法 Q&A Q. 最小費用流ってなんですか? A. 辺にコストと容量が付いたグラフに対し、   与えられた流量 F を流すときにかかる   最小コストを求める問題のことです。 a d b c e 3,1/9 2,4/8 5,3/9 1,2/2 S T 5,5/5 3,5/7 3,2/6 1,7/7 2,1/10 コスト, 流す量/容量 流量 F = 10 最小コスト = 83
  8. 8. 想定解法 Q&A Q. 最小費用流はどうすれば解けますか? A. 蟻本を読もう!
 
 補足: 最小費用流問題を O( ¦F¦ ¦E¦ log¦V¦ ) で解く
    アルゴリズムが知られています
    ( ¦F¦ = 流す流量, ¦E¦ = 辺数, ¦V¦ = 頂点数 )
  9. 9. 想定解法 Q&A Q. フロー速いけどさすがに辺数 M = 104 は
   間に合わなくない? A. 英数字が同じカードは一番安いのだけ使えば🙆
   → 高々 260 辺になる 0 A 8 4 1 0 A 1
  10. 10. 想定解法 Q&A Q. 使う数字・英字だけで二部グラフを使って
   フロー流せばおk? A. 数字・英字は全部使わなければ🙅 1 B 0 1 A B C 3 6 1 8 5 8 コスト8 コスト6>
  11. 11. 想定解法 Q&A Q. じゃあどうやって使わなければならない
   英数字を制御するの? A. ソース・シンクからの辺に最小流量制約をつける 0 1 A B C 3 6 1 8 5 S T 流量: [0, ] コスト: 0 [1, ] / 0 [1, ] / 0 [0, ] / 0 [0, ] / 0
  12. 12. 想定解法 Q&A Q. 流す流量は max{ ¦数字集合¦, ¦英字集合¦ }
   でおk? A. さっきの例でダメだってわかるだろ💢 1 B 0 1 A B C 3 6 1 8 5 8 コスト8 コスト6>
  13. 13. 想定解法 Q&A Q. じゃあいくら流せばいいんですかね…… A. max{ ¦数字¦, ¦英字¦ } から ¦数字¦+¦英字¦の間
   (入力によって変わるので全部試す)
 
 補足: 普通のフローアルゴリズムは1本ずつ最短路を探すので、    最大流まで逐一コストを調べればOK 0 1 A B C 3 6 1 8 5 流量1, コスト8 流量2, コスト6> 0 1 A B C 3 6 1 8 5
  14. 14. 解法まとめ 1. 数字を210通り決め打ちし、使うべき英字を 求める 2. 数字・英字の二部グラフを作り、使う英数字 に最小流量制約を付けて最小費用流を解く • 計算量: 210 回 O(|F| |E| log |V|) の最小費用流を解く
 ただし、|F| = 最大流 ≤ 36, |E| = 辺数 ≤ 260, |V| ≤ 36+2
  15. 15. 別解 (多くの選手がこれだった) • 割り当て問題をDPで解くことも可能 • DP[i][S] := i番目までの英字が書かれたカードのみで、使う べき数字の部分集合Sをカバーするときの最小コスト • i番目の英字とj番目の数字が書かれたカードを使うとき、 DP[i+1][S U {j}] を更新する感じ • 使った数字集合Sが使うべき数字集合の部分集合であること に注目して解析すると、全体で O( |英字| × 3 |数字| )
  16. 16. writer解 • 井上 106行 (C++) • 鈴木 158行 (C++)
  17. 17. 提出状況 • First Acceptance • on-site: iidx (176 min) • on-line: snuke (88 min) • 正答率 7/25 (28.0%)

×