Files
tira/viikko16/max_flow.py
T
2026-06-17 23:09:20 +03:00

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))