$Inf=999999999999999 classPair includeComparable definitialize(first=0,second=0) @first,@second=first,second end defto_s() "(%d, %d)"%[first,second] end attr_reader:first,:second end
classNetwork definitialize() @net=Hash.new(nil) end defplusedge(s,e,value) @net[s]=@net[s]||Hash.new(nil) @net[s][e]=value end defadd(s,e,value) plusedge(s,e,value) plusedge(e,s,value) end attr_accessor:net defdup Marshal::load(Marshal.dump(self)) end end classMaxflow defaugment(pos,ed,m=$Inf) returnfalseif(@check&(1<<pos))!=0 @check^=(1<<pos) ifpos==ed: @m=m; returntrue else @G.net[pos].eachdo|to,val| nextif(val==0) @path[to]=pos returntrueif(augment(to,ed,m>val?val:m)) end end @check^=(1<<pos) false end
deffordfulkerson(ed,t) ret=0 @G=t.dup while(augment(1,ed))do @check=0 pos=ed ret+=@m while(pos!=1)do prev=@path[pos].to_i @G.net[prev][pos]-=@m @G.net[pos][prev]+=@m pos=prev end end ret end definitialize() @check=0 @path=[] end end