【发布时间】:2021-06-29 07:45:00
【问题描述】:
我正在尝试为无向图实现 Edmonds–Karp 算法的一个版本。下面的代码可以工作,但是在处理大矩阵时速度很慢。
是否可以让 Edmonds–Karp 算法运行得更快,或者我应该继续使用另一种算法,例如“Push Relabel”?虽然我有某种与 bfs 合作的出队,但我不知道该怎么做。
代码:
def bfs(C, F, s, t):
stack = [s]
paths={s:[]}
if s == t:
return paths[s]
while(stack):
u = stack.pop()
for v in range(len(C)):
if(C[u][v]-F[u][v]>0) and v not in paths:
paths[v] = paths[u]+[(u,v)]
if v == t:
return paths[v]
stack.append(v)
return None
def maxFlow(C, s, t):
n = len(C) # C is the capacity matrix
F = [[0] * n for i in range(n)]
path = bfs(C, F, s, t)
while path != None:
flow = min(C[u][v] - F[u][v] for u,v in path)
for u,v in path:
F[u][v] += flow
F[v][u] -= flow
path = bfs(C,F,s,t)
return sum(F[s][i] for i in range(n))
C = [[ 0, 3, 3, 0, 0, 0 ], # s
[ 3, 0, 2, 3, 0, 0 ], # o
[ 0, 2, 0, 0, 2, 0 ], # p
[ 0, 0, 0, 0, 4, 2 ], # q
[ 0, 0, 0, 2, 0, 2 ], # r
[ 0, 0, 0, 0, 2, 0 ]] # t
source = 0 # A
sink = 5 # F
maxVal = maxFlow(C, source, sink)
print("max_flow_value is: ", maxVal)
【问题讨论】:
-
处理大事的时间比处理慢事的时间长。
-
是的@ScottHunter,但我正在寻找关于时间复杂度的算法更有效的重写。
-
@VictorGunnarsson 你认为编辑错别字是个好主意,因为我已经花时间删除了?该算法不叫“Edmund Karp”,“algorihm”的拼写不像“algoritm”
标签: python max-flow edmonds-karp