有向图中的 K 条边不相交路径
Posted
技术标签:
【中文标题】有向图中的 K 条边不相交路径【英文标题】:K edge disjoint paths in a directed graph 【发布时间】:2016-08-22 07:55:31 【问题描述】:给定 G = (V,E) 中的两个顶点 u 和 v 以及一个正整数 k,描述一个算法来判断是否存在从 u 到 v 的不相交边路径。如果决策问题的答案是肯定的,描述如何计算一组 k 边不相交的路径。
解决方案: 运行从 u 到 v 的最大流(给图 G 中的所有边赋予 1 的权重,这样一条边只能是从 u 到 v 的一条路径的一部分)并得到流量的价值。如果流的值为 k,那么我们对决策问题的答案是肯定的。
现在要查找所有此类路径,通过从 u 执行 BFS 来找到最小切割,因此我将分割顶点,将顶点分成 2 个集合,在最小切割的每一侧。
然后我是否需要再次执行从 u 到 v 的 DFS,以查找仅具有这些顶点的所有路径,这些顶点存在于我从最小切割中获得的两个分区集中。
或者还有其他更清洁的方法吗?得到所有k条边不相交的路径。
【问题讨论】:
【参考方案1】:获得流程后,您可以按照流程提取边缘不相交的路径。
起始节点将有一个 k 流,沿着 k 条边离开 u。
对于这些边中的每一个,您可以继续沿流出流的方向移动以提取路径,直到到达 v。您需要做的就是标记您已经使用过的边以避免重复边。
对每个离开 u 的 k 个流单元重复以提取所有 k 个路径。
伪代码
repeat k times:
set x to start node
set path to []
while x is not equal to end node:
find a edge from x which has flow>0, let y be the vertex at the far end
decrease flow from x->y by 1 unit
append y to path
set x equal to y
print path
【讨论】:
嗨!我正在尝试解决这个问题,而我发现的关于这个主题的所有内容都有一个我无法理解的“漏洞”。那么,我应该在哪个图中跟随流程?来自最大流或原始图的残差图?如何治疗周期?提前致谢。 我添加了一些伪代码来尝试让事情变得更清晰。您正在跟踪图中存在流量大于 0 的边缘的边缘。当您提取路径时,流量会减少,因此边缘将逐渐消失,直到最后所有边缘都消失(假设流程图中没有循环)。正常的最大流算法不会在流图中生成循环,因为它们搜索简单的增广路径。 (简单意味着顶点在路径中不重复) 彼得,很抱歉耽搁了这么久。我正在考虑您的答案并尝试实施它,同时我不得不旅行。假设我使用 Edmonds-Karp 方法来获得最大流量,这意味着对于我找到的每条增广路径,我将改变其中每条边(u, v)
的方向(或将 (v, u)
的容量增加 1 ),所以我有可能找到两条具有相同边缘的增广路径(我什至发现了一个发生这种情况的实例)。如何在算法期间/之后检测流 > 0 的这些边缘?再次感谢并为给您带来的不便深表歉意。
@Marco 您需要通过计算沿每条边的净流量,将 Edmonds-Karp 的输出转换为真实的流程图。此净流量将增加 1,0 或 -1,因为您的边的权重均为 1。将 +1 流量转换为流量(u,v)=1,将 -1 流量转换为流量(v,u)=1。此时您应该能够使用我上面描述的算法。如果不清楚,如果您可以发布您的 Edmonds-Karp 代码可能会有所帮助,以便我可以根据您程序中的变量描述此过程。
终于成功了,谢谢!如果有人遇到同样的问题,只是为了澄清整个算法:1)在你的图中运行 Edmonds-Karp,保持增广路径及其容量。 2)创建一个新图,弧容量= 0,它将是包含真实流的图(我们称之为真实图)。 3) 对于每个增广路径中的每个弧(v, u)
,将路径的容量求和到(v, u)
并从(u, v)
中减去,两者都在真实图上。 4)从真实图中删除所有容量
以上是关于有向图中的 K 条边不相交路径的主要内容,如果未能解决你的问题,请参考以下文章