結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー |
|
提出日時 | 2015-04-03 11:27:24 |
言語 | Ruby (3.4.1) |
結果 |
AC
|
実行時間 | 119 ms / 2,000 ms |
コード長 | 2,374 bytes |
コンパイル時間 | 45 ms |
コンパイル使用メモリ | 7,296 KB |
実行使用メモリ | 14,464 KB |
最終ジャッジ日時 | 2024-12-26 02:56:01 |
合計ジャッジ時間 | 2,578 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 13 |
コンパイルメッセージ
Main.rb:75: warning: assigned but unused variable - m Main.rb:76: warning: assigned but unused variable - sum Syntax OK
ソースコード
# グラフの最大フローを求めるclass MaxFlowdef initialize@node={}#Hash.new{|h,k|h[k]=[]}end# ノード追加(外から呼ぶ必要なし)def add_node(name)@node[name]||=Hash.new{0}end# エッジ追加# costは整数でないと計算できない(INFに当たる値を入れたいときは十分大きい整数にする)def add_edge(src,dst,cost)add_node(src)add_node(dst)@node[src][dst]=costend# srcからdstの最大フロー時の流量のグラフを以下の形式のハッシュで返す# (YAML形式で示す)# --# [src1]:# [dst1]: [src1->dst1 cost]# [dst2]: [src1->dst2 cost]# [dst3]: [src1->dst3 cost]# [src2]:# [dst1]: [src2->dst1 cost]# [dst2]: [src2->dst2 cost]# [dst3]: [src2->dst3 cost]def maxflowgraph(src,dst)residual=Hash[@node.map{|k,v|[k,v.dup]}]while true# srcからdstへのパスを幅優先探索#p residualpre={}q=[src]while q[0] && !pre[dst]sr=q.shiftresidual[sr]&&residual[sr].each{|d,c|pre[d]||=(q << d;sr)}end# dstへのパスが見つからなくなったら終了break if !pre[dst]path=[]ds=dstco=residual.values.flat_map(&:values).max# パスを経路復元し、そのパスの流量を求めるwhile ds!=src#p dssr=pre[ds]co=[residual[sr][ds],co].minpath.unshift [sr,ds]ds=srend# 元のグラフから流量を引いた残余グラフを求めるpath.each{|s,d|residual[s][d]-=coif residual[s][d]==0residual[s].delete(d)endresidual[d][s]+=co}endHash[@node.map{|k,v|[k,Hash[v.map{|d,c|[d,c-residual[k][d]]}]]}]end# srcからdstの最大フロー時の流量を返すdef maxflow(src,dst)graph=maxflowgraph(src,dst)graph[src]?graph[src].values.inject(:+):0endend(w,),(n,),j,(m,),c,*q=$<.map{|l|l.split.map(&:to_i)}sum=0mf=MaxFlow.newINF=1000000j.each.with_index(1){|a,i|mf.add_edge(:src,:"j#{i}",a)}c.each.with_index(1){|a,i|mf.add_edge(:"c#{i}",:sink,a)}q.each.with_index(1){|(_,*x),i|([*1..n]-x).each{|j|mf.add_edge(:"j#{j}",:"c#{i}",INF)}}puts w>mf.maxflow(:src,:sink)?"BANSAKUTSUKITA":"SHIROBAKO"