这张网每秒最多过多少水
一张管道网,0 号是水源、6 号是出口,每条管子上的数字是每秒最多能过多少水:
CAP = {0: {1: 6, 2: 5}, 1: {3: 4, 4: 2}, 2: {4: 5},
3: {6: 3}, 4: {3: 2, 5: 4}, 5: {6: 5}, 6: {}}
from collections import deque
CAP = {0: {1: 6, 2: 5}, 1: {3: 4, 4: 2}, 2: {4: 5},
3: {6: 3}, 4: {3: 2, 5: 4}, 5: {6: 5}, 6: {}}
def maxflow(cap_in, s, t):
cap = {a: dict(b) for a, b in cap_in.items()}
for u in list(cap):
for v in list(cap[u]):
cap.setdefault(v, {}).setdefault(u, 0)
flow = 0
while True:
par = {s: None}
q = deque([s])
while q:
u = q.popleft()
for v, c in cap[u].items():
if c > 0 and v not in par:
par[v] = u
q.append(v)
if t not in par:
break
path, v = [t], t
while par[v] is not None:
path.append(par[v])
v = par[v]
path.reverse()
b = min(cap[path[i]][path[i + 1]] for i in range(len(path) - 1))
for i in range(len(path) - 1):
cap[path[i]][path[i + 1]] -= b
cap[path[i + 1]][path[i]] += b
flow += b
return flow, cap
f, _ = maxflow(CAP, 0, 6)
print(f)
全部评论