結果

問題 No.119 旅行のツアーの問題
ユーザー gigurururugigurururu
提出日時 2015-02-19 21:10:49
言語 Ruby
(3.3.0)
結果
AC  
実行時間 102 ms / 5,000 ms
コード長 2,297 bytes
コンパイル時間 40 ms
コンパイル使用メモリ 7,552 KB
実行使用メモリ 13,056 KB
最終ジャッジ日時 2024-06-01 06:52:23
合計ジャッジ時間 3,022 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 95 ms
12,160 KB
testcase_01 AC 98 ms
12,288 KB
testcase_02 AC 89 ms
12,288 KB
testcase_03 AC 89 ms
12,160 KB
testcase_04 AC 90 ms
12,288 KB
testcase_05 AC 94 ms
12,160 KB
testcase_06 AC 99 ms
13,056 KB
testcase_07 AC 88 ms
12,160 KB
testcase_08 AC 88 ms
12,288 KB
testcase_09 AC 89 ms
12,160 KB
testcase_10 AC 88 ms
12,160 KB
testcase_11 AC 87 ms
12,160 KB
testcase_12 AC 88 ms
12,160 KB
testcase_13 AC 88 ms
12,160 KB
testcase_14 AC 94 ms
12,288 KB
testcase_15 AC 91 ms
12,288 KB
testcase_16 AC 98 ms
12,800 KB
testcase_17 AC 89 ms
12,032 KB
testcase_18 AC 89 ms
12,288 KB
testcase_19 AC 91 ms
12,288 KB
testcase_20 AC 97 ms
12,288 KB
testcase_21 AC 101 ms
12,928 KB
testcase_22 AC 102 ms
12,928 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
Syntax OK

ソースコード

diff #

# グラフの最大フローを求める
class MaxFlow
  def 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]=cost
  end

  # 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 residual
      pre={}
      q=[src]
      while q[0] && !pre[dst]
        sr=q.shift
        residual[sr]&&residual[sr].each{|d,c|
          pre[d]||=(q << d;sr)
        }
      end
      # dstへのパスが見つからなくなったら終了
      break if !pre[dst]
      path=[]
      ds=dst
      co=residual.values.flat_map(&:values).max
      # パスを経路復元し、そのパスの流量を求める
      while ds!=src
        #p ds
        sr=pre[ds]
        co=[residual[sr][ds],co].min
        path.unshift [sr,ds]
        ds=sr
      end
      # 元のグラフから流量を引いた残余グラフを求める
      path.each{|s,d|
        residual[s][d]-=co
        if residual[s][d]==0
          residual[s].delete(d)
        end
        residual[d][s]+=co
      }
    end
    Hash[@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(:+):0
  end
end

def g;gets.split.map(&:to_i)end
sum=0
mf=MaxFlow.new
INF=1000000
g[0].times{|i|
  b,c=g
  sum+=b+c
  mf.add_edge(:src,:"b#{i}",b)
  mf.add_edge(:"b#{i}",:"c#{i}",INF)
  mf.add_edge(:"c#{i}",:sink,c)
}
g[0].times{
  d,e=g
  mf.add_edge(:"b#{d}",:"c#{e}",INF)
}
p sum-mf.maxflow(:src,:sink)
0