在最大流量问题中,如何找到给出最大流量的所有可能路径集?

时间:2018-12-18 02:31:55

标签: algorithm graph network-flow

我知道Ford-Fulkerson Algorithm可以找到流网络中从源(s)到沉(t)的最大流量。
但是,是否有一种算法可以找到给出最大流量的所有可能路径集?

一个例子:
在下面的该网络中,所有边缘的容量为1。不难看出从st的最大流量是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

enter image description here

有人问了一个类似的问题here,但似乎没有明确的答案。

1 个答案:

答案 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使用邻接列表表示形式,并在列表内外使用拼接弧。另一方面,也许您的图形足够小,没关系。