如何解决Edmonds-Karp 时间复杂度
我正在尝试为无向图实现 Edmonds-Karp 算法的一个版本。下面的代码有效,但在处理大矩阵时速度很慢。
是否可以让 Edmonds-Karp 算法运行得更快,还是应该继续使用另一种算法,例如“推送重新标记”?我虽然有一些与 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,t):
n = len(C) # C is the capacity matrix
F = [[0] * n for i in range(n)]
path = bfs(C,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,t)
return sum(F[s][i] for i in range(n))
C = [[ 0,3,0 ],# s
[ 3,2,# o
[ 0,# p
[ 0,4,2 ],# q
[ 0,# r
[ 0,0 ]] # t
source = 0 # A
sink = 5 # F
maxVal = maxFlow(C,source,sink)
print("max_flow_value is: ",maxVal)
解决方法
我认为您的解决方案可以从更好的图形表示中受益。特别是尝试保留 BFS 的邻居列表。我实际上写了一个很长的关于我在此处用于流算法的图形表示的答案https://stackoverflow.com/a/23168107/812912
如果您的解决方案仍然太慢,我建议您切换到 Dinic's algorithm,它在许多任务中都对我有用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。