Algorithm 有向图中的K边不相交路

Algorithm 有向图中的K边不相交路,algorithm,directed-graph,max-flow,Algorithm,Directed Graph,Max Flow,给出G=(v,E)中的两个顶点u和v以及一个正整数k,描述一个算法来确定从u到v是否存在k条边不相交的路径。如果决策问题的答案是“是”,请描述如何计算一组k边不相交路径 解决方案:运行从u到v的最大流量(为图G中的所有边赋予权重1,以便一条边只能是从u到v的一条路径的一部分),并获得流量值。如果流的值是k,那么我们对决策问题的答案是肯定的 现在,为了找到所有这样的路径,通过从u开始做BFS来找到最小割,因此我将有顶点的划分,这将把顶点分成两组,一组在最小割的每一侧 然后我需要再次做一个从u到v的

给出G=(v,E)中的两个顶点u和v以及一个正整数k,描述一个算法来确定从u到v是否存在k条边不相交的路径。如果决策问题的答案是“是”,请描述如何计算一组k边不相交路径

解决方案:运行从u到v的最大流量(为图G中的所有边赋予权重1,以便一条边只能是从u到v的一条路径的一部分),并获得流量值。如果流的值是k,那么我们对决策问题的答案是肯定的

现在,为了找到所有这样的路径,通过从u开始做BFS来找到最小割,因此我将有顶点的划分,这将把顶点分成两组,一组在最小割的每一侧

然后我需要再次做一个从u到v的DFS,寻找所有的路径,这些路径只有这些顶点,它们在我从min cut得到的两个分区集中


或者还有其他更干净的方法吗?获取所有k条边不相交的路径。

一旦有了流,就可以按照流提取边不相交的路径

开始节点将有一个k流,沿k条边离开u

对于这些边中的每一条,可以沿流出流的方向继续移动以提取路径,直到到达v。您需要做的只是标记已使用的边,以避免重复边

对离开u的k个流单元中的每一个重复此操作,以提取所有k条路径

伪码
你好我试图解决这个问题,但我发现关于这个问题的所有东西都有一个我无法理解的“漏洞”。那么,我应该在哪个图表中遵循流程?最大流量的残差图还是原始图?如何治疗周期?提前谢谢。我添加了一些伪代码,试图让事情更清楚。您正在跟踪图中的边,其中边存在于流大于0的位置。提取路径时,流将减少,因此边将逐渐消失,直到最后所有边都消失(假设流图中没有循环)。普通的最大流算法不会在流图中生成循环,因为它们搜索简单的扩充路径。(简单的意思是路径中没有重复顶点)Peter,很抱歉延迟了这么长时间。我在考虑你的答案,并试图实施它,我不得不在这期间旅行。假设我使用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) 创建一个新的图,当arc容量=0时,它将是包含真实流的图(我们称之为真实图)。3) 对于每个增强路径中的每个弧
(v,u)
,将路径的容量相加到
(v,u)
,然后从
(u,v)
中减去,两者都在真实图形上。4) 删除所有具有容量的弧
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