#注意,运行过一次最大流之后会毁掉图的
class Dinic
class Edge
attr_accessor :from, :to, :rem
def initialize(a, b, c)
@from = a
@to = b
@rem = c
end
end
attr_accessor :source, :sink
attr_reader :graph, :edges
def initialize(vs, sr, sk) #顶点数,起点,终点
[url=home.php?mod=space&uid=171370]@source[/url] = sr
@sink = sk
@graph = Array.new(vs+1) {Array.new}
@edges = []
#private
@dist = Array.new(vs+1, 0)
@vis = Array.new(vs+1, false)
@q = Array.new(vs+1, nil)
end
def addedge(u, v, c)
@edges.push(Edge.new(u, v, c))
@edges.push(Edge.new(v, u, 0))
@graph[u].push(@edges.size-2)
@graph[v].push(@edges.size-1)
end
def bfs
@vis.fill(false)
@dist[@source] = 0
head = 0
tail = 1
@q[head] = @source
@vis[@source] = true
while head < tail
u = @q[tail-1]
head += 1
@graph[u].each do |i|
e = @edges[i]
if !@vis[e.to] && e.rem > 0
@vis[e.to] = true
@dist[e.to] = @dist[u]+1
@q[tail] = e.to
tail += 1
end
end
end
return @vis[@sink]
end
def dfs(u, flow)
return flow if u == @sink || flow == 0
n = 0
r = 0
@graph[u].each do |i|
e = @edges[i]
if @dist[e.to] == @dist[u]+1
n = dfs(e.to, [flow, e.rem].min)
next if n <= 0
r += n
e.rem -= n
flow -= n
@edges[i^1].rem += n
break if flow == 0
end
end
return r
end
def maxflow()
r = 0
r += dfs(@source, 0x7fffffff) while bfs
r
end
end
#test,正确答案为50
d = Dinic.new(4, 1, 4)
d.addedge(1, 2, 40)
d.addedge(1, 4, 20)
d.addedge(2, 4, 20)
d.addedge(2, 3, 30)
d.addedge(3, 4, 10)
puts d.maxflow # => 50
#注意,运行过一次最大流之后会毁掉图的
class Dinic
class Edge
attr_accessor :from, :to, :rem
def initialize(a, b, c)
@from = a
@to = b
@rem = c
end
end
attr_accessor :source, :sink
attr_reader :graph, :edges
def initialize(vs, sr, sk) #顶点数,起点,终点
[url=home.php?mod=space&uid=171370]@source[/url] = sr
@sink = sk
@graph = Array.new(vs+1) {Array.new}
@edges = []
#private
@dist = Array.new(vs+1, 0)
@vis = Array.new(vs+1, false)
@q = Array.new(vs+1, nil)
end
def addedge(u, v, c)
@edges.push(Edge.new(u, v, c))
@edges.push(Edge.new(v, u, 0))
@graph[u].push(@edges.size-2)
@graph[v].push(@edges.size-1)
end
def bfs
@vis.fill(false)
@dist[@source] = 0
head = 0
tail = 1
@q[head] = @source
@vis[@source] = true
while head < tail
u = @q[tail-1]
head += 1
@graph[u].each do |i|
e = @edges[i]
if !@vis[e.to] && e.rem > 0
@vis[e.to] = true
@dist[e.to] = @dist[u]+1
@q[tail] = e.to
tail += 1
end
end
end
return @vis[@sink]
end
def dfs(u, flow)
return flow if u == @sink || flow == 0
n = 0
r = 0
@graph[u].each do |i|
e = @edges[i]
if @dist[e.to] == @dist[u]+1
n = dfs(e.to, [flow, e.rem].min)
next if n <= 0
r += n
e.rem -= n
flow -= n
@edges[i^1].rem += n
break if flow == 0
end
end
return r
end
def maxflow()
r = 0
r += dfs(@source, 0x7fffffff) while bfs
r
end
end
#test,正确答案为50
d = Dinic.new(4, 1, 4)
d.addedge(1, 2, 40)
d.addedge(1, 4, 20)
d.addedge(2, 4, 20)
d.addedge(2, 3, 30)
d.addedge(3, 4, 10)
puts d.maxflow # => 50