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,它在许多任务中都对我有用。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...