mirror of
https://github.com/iritmaximus/tira.git
synced 2026-10-12 19:13:47 +03:00
60 lines
1.5 KiB
Python
60 lines
1.5 KiB
Python
class MaximumFlow:
|
|
def __init__(self, nodes):
|
|
self.nodes = nodes
|
|
self.graph = {}
|
|
for i in self.nodes:
|
|
for j in self.nodes:
|
|
self.graph[(i, j)] = 0
|
|
|
|
def add_edge(self, node_a, node_b, capacity):
|
|
self.graph[(node_a, node_b)] += capacity
|
|
|
|
def add_flow(self, node, sink, flow):
|
|
if node in self.seen:
|
|
return 0
|
|
self.seen.add(node)
|
|
if node == sink:
|
|
return flow
|
|
for next_node in self.nodes:
|
|
if self.flow[(node, next_node)] > 0:
|
|
new_flow = min(flow, self.flow[(node, next_node)])
|
|
inc = self.add_flow(next_node, sink, new_flow)
|
|
if inc > 0:
|
|
self.flow[(node, next_node)] -= inc
|
|
self.flow[(next_node, node)] += inc
|
|
return inc
|
|
return 0
|
|
|
|
def construct(self, source, sink):
|
|
self.flow = self.graph.copy()
|
|
total = 0
|
|
while True:
|
|
self.seen = set()
|
|
add = self.add_flow(source, sink, float("inf"))
|
|
if add == 0:
|
|
break
|
|
total += add
|
|
return total
|
|
|
|
if __name__ == "__main__":
|
|
mf = MaximumFlow([x for x in range(1,7+1)])
|
|
mf.add_edge(1,2,7)
|
|
mf.add_edge(1,5,15)
|
|
|
|
mf.add_edge(2,3,3)
|
|
mf.add_edge(2,4,2)
|
|
|
|
mf.add_edge(3,7,8)
|
|
|
|
mf.add_edge(4,3,4)
|
|
mf.add_edge(4,7,3)
|
|
|
|
mf.add_edge(5,4,3)
|
|
mf.add_edge(5,6,9)
|
|
|
|
mf.add_edge(6,4,5)
|
|
mf.add_edge(6,7,5)
|
|
|
|
print(mf.construct(1,7))
|
|
|