8000 Added maximum flow algorithm. · pythonpeixun/practice-python@31e6905 · GitHub
[go: up one dir, main page]

Skip to content

Commit 31e6905

Browse files
committed
Added maximum flow algorithm.
1 parent fdce8ec commit 31e6905

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

maximum_flow/max-flows.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
class Edge(object):
2+
def __init__(self, u, v, w):
3+
self.source = u
4+
self.sink = v
5+
self.capacity = w
6+
7+
def __repr__(self):
8+
return "%s->%s:%s" % (self.source, self.sink, self.capacity)
9+
10+
11+
class FlowNetwork(object):
12+
def __init__(self):
13+
self.adj = {}
14+
self.flow = {}
15+
16+
def add_vertex(self, vertex):
17+
self.adj[vertex] = []
18+
19+
def get_edges(self, v):
20+
return self.adj[v]
21+
22+
def add_edge(self, u, v, w=0):
23+
if u == v:
24+
raise ValueError("u == v")
25+
edge = Edge(u, v, w)
26+
redge = Edge(v, u, 0)
27+
edge.redge = redge
28+
redge.redge = edge
29+
self.adj[u].append(edge)
30+
self.adj[v].append(redge)
31+
self.flow[edge] = 0
32+
self.flow[redge] = 0
33+
34+
def find_path(self, source, sink, path):
35+
if source == sink:
36+
return path
37+
for edge in self.get_edges(source):
38+
residual = edge.capacity - self.flow[edge]
39+
if residual > 0 and edge not in path:
40+
result = self.find_path(edge.sink, sink, path + [edge])
41+
if result is not None:
42+
return result
43+
44+
def max_flow(self, source, sink):
45+
path = self.find_path(source, sink, [])
46+
while path is not None:
47+
residuals = [edge.capacity - self.flow[edge] for edge in path]
48+
flow = min(residuals)
49+
for edge in path:
50+
self.flow[edge] += flow
51+
self.flow[edge.redge] -= flow
52+
path = self.find_path(source, sink, [])
53+
return sum(self.flow[edge] for edge in self.get_edges(source))
54+
55+
56+
def main():
57+
g = FlowNetwork()
58+
[g.add_vertex(v) for v in "sopqrt"]
59+
60+
g.add_edge('s', 'o', 3)
61+
g.add_edge('s', 'p', 3)
62+
g.add_edge('o', 'p', 2)
63+
g.add_edge('o', 'q', 3)
64+
g.add_edge('p', 'r', 2)
65+
g.add_edge('r', 't', 3)
66+
g.add_edge('q', 'r', 4)
67+
g.add_edge('q', 't', 2)
68+
69+
print(g.max_flow('s', 't'))
70+
71+
if __name__ == '__main__':
72+
main()

0 commit comments

Comments
 (0)
0