【问题标题】:Edmonds–Karp time complexityEdmonds–Karp 时间复杂度
【发布时间】: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


【解决方案1】:

我认为您的解决方案可以从更好的图形表示中受益。特别要尝试为 BFS 保留邻居列表。实际上,我在https://stackoverflow.com/a/23168107/812912https://stackoverflow.com/a/23168107/812912

如果您的解决方案仍然太慢,我建议您切换到 Dinic's algorithm,它在许多任务中对我很有帮助。

【讨论】:

    猜你喜欢
    • 2011-07-19
    • 2016-02-13
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2018-08-02
    相关资源
    最近更新 更多