在我深入研究这个问题之前,这里有一些我已经拥有的背景信息:
-我首先创建了一个基于美国各地城市的无向邻接矩阵图,边缘权重是计算的距离(通过距离公式实现)。
-我还使用 prim 算法实现了一个最小生成树。
现在我需要实现我拥有的 Edmonds Karp 最大流量算法,但我对如何根据我拥有的数据创建容量图以实现以下代码中使用的算法感到困惑:
def edmonds_karp(C, source, sink):
n = len(C) # C is the capacity matrix
F = [[0] * n for i in xrange(n)]
# residual capacity from u to v is C[u][v] - F[u][v]
while True:
path = bfs(C, F, source, sink)
if not path:
break
# traverse path to find smallest capacity
flow = min(C[u][v] - F[u][v] for u,v in path)
# traverse path to update flow
for u,v in path:
F[u][v] += flow
F[v][u] -= flow
return sum(F[source][i] for i in xrange(n))
def bfs(C, F, source, sink):
queue = [source]
paths = {source: []}
while queue:
u = queue.pop(0)
for v in xrange(len(C)):
if C[u][v] - F[u][v] > 0 and v not in paths:
paths[v] = paths[u] + [(u,v)]
if v == sink:
return paths[v]
queue.append(v)
return None
任何帮助将不胜感激,谢谢!
对于 Edmonds-Karp 算法,它需要做的只是将所有边的权重更改为 1,因为在这个问题中找到城市之间的边连通性不需要它们。边缘权重为 1 的城市图将成为我的容量图。同样对于Edmonds-Karp算法将需要有有向图。