是否有一种有效的算法可以打印流网络中的所有边缘不相交路径?

问题描述

我很好奇是否有一种有效的算法可以实际返回流程图中从 s 到 t 的所有边不相交路径?

例如,采用以下网络,其中每条边的容量为 1:

enter image description here

很明显只有两条边不相交的路径:

  1. s -> A -> B -> t
  2. s -> C -> D -> E -> F -> t

我猜您需要使用 ford-fulkerson 算法的修改版本来跟踪增强路径。但是它如何覆盖以前的错误路径(如我的示例中的 s -> A -> E -> F -> t)。

解决方法

如您所见,Ford--Fulkerson 使用的增广路径并不是立即有用。

你可以做的是运行 F--F(或任何最大流算法)来完成,然后从结果流中贪婪地提取路径。要提取路径,请从 s 开始。如果没有剩余的流出流弧,则没有剩余的路径可供提取。否则,选择尾部为当前顶点的任意流弧,移动到该弧的头部,删除该弧,重复直到当前顶点为t,打印出弧序列。

如果您需要简单的路径,那么您还需要检测路径何时自身翻倍并删除循环。这可以通过将当前当前访问的顶点映射到路径中它们传入弧的索引来有效地实现。

如果您需要较短的简单路径,您可以将 F--F 换成最小成本流算法并省略循环检测(具有正成本循环的流不能是最小成本)。