我知道Ford-Fulkerson Algorithm可以找到流网络中从源(s
)到沉(t
)的最大流量。
但是,是否有一种算法可以找到给出最大流量的所有可能路径集?
一个例子:
在下面的该网络中,所有边缘的容量为1。不难看出从s
到t
的最大流量是3。但是如何找到承载该流量的路径的组合呢?
预期输出:
路径集1:s-0-1-t, s-2-3-t, s-5-6-t
路径集2:s-0-1-t, s-2-4-t, s-5-6-t
路径集3:s-0-3-t, s-2-4-t, s-5-6-t
路径集4:s-0-4-t, s-2-3-t, s-5-6-t
有人问了一个类似的问题here,但似乎没有明确的答案。
答案 0 :(得分:0)
根据您的评论,我假设所有弧线都是有向的且容量为1。
高级伪代码是
define EnumerateFlows(G, s, t):
if G has no s-t path:
yield [] # solution with no paths
else:
for P in EnumeratePaths(G, s, t):
derive G' = G - P
let s-u be the first arc in P
derive G'' = G' - {arcs s-v such that v < u} # ensure canonically ordered solutions only
for F in EnumerateFlows(G'', s, t):
yield [P, F...] # solution with P followed by the elements of F
,其中函数的返回值是函数体内所有yield
的列表。输出需要进行后处理以除去非最大流量。
EnumeratePaths
无疑有一个关于Stack Overflow的解决方案,但出于完整性考虑,
define EnumeratePaths(G, s, t):
if s = t:
yield [s]
else:
for u in {successors of s in t}:
for P in EnumeratePaths(G - {s-u}, u, t):
yield [s, P...]
要改善EnumerateFlows
,值得添加检查以确保残差图中仍然存在最大流量。
关于低级实施建议,我的建议是对G
使用邻接列表表示形式,并在列表内外使用拼接弧。另一方面,也许您的图形足够小,没关系。