K图中的互斥路线

时间:2012-11-27 02:25:28

标签: algorithm graph

输入:图G(假设所有边都有单位权重),源 - 目标顶点对(X1,Y1),(X2 Y2),...,(Xk,Yk)(它们都是不同的)。 / p>

输出:路由R1(从X1到Y1),R2(从X2到Y2),...,Rk(从Xk到Yk),使R1,R2,...,Rk不共享任何顶点他们。无需优化路线长度。

使用什么算法?这个问题的复杂性是什么?我需要一个理论上强大的解决方案,而不是启发式工作 - 大部分时间的解决方案。

最明显的解决方案是将每个自由顶点(不在X1,X2,... Xk或Y1,Y2,...,Yk中)分配给k个路径中的一个,并查看它们是否实际形成了要求的方式。有可能n ^ k个赋值((n-2k)^ k更精确)。我们可以做得更好吗?如果我们假设图形是2d网格结构怎么办? (相当于解决https://play.google.com/store/apps/details?id=com.bigduckgames.flow游戏,但没有填补每个方格的要求。)

3 个答案:

答案 0 :(得分:10)

您可以在本文中找到一种可能的解决方案:"The disjoint paths problem in quadratic time" by Ken-ichi Kawarabayashi, Yusuke Kobayashi, Bruce Reed(pdf)。

这个解决方案并非简单但有效 - 只有O(N 2 )时间复杂度,其中N是顶点数。只有当K是一个小常数时才有效。


也可以将其解决为Multi-commodity flow problem。但我怀疑任何多商品专用算法都足够有效。因为一般的多商品流动问题(当至少一种商品的流量大于一时)是NP难的。

这不太可能作为单一商品流问题解决。例如,以下是以下提案的反例:

  

...将S限制为X2和T至Y2边缘容量为0.5?如果存在一对具有所需匹配的不相交路线,那么从S到T的总流量可能为1.5 ...我相信这种方法可以准确报告是否有一组不相交的路径。

counter-example graph

很容易找到容量为1.5的流量(此流程如图所示)。但是没有办法将两个(绿色和红色)顶点对与不相交的路径连接起来。

答案 1 :(得分:6)

您可以使用MaxFlow来解决此问题。 如果您不熟悉Flow,可以阅读一些有关它的资料。

算法

  1. 制作一个超级凹陷顶点S和一个超级目标顶点T.链接 一些新的边缘 S - > X1,S - > X2,Y1 - > T,Y2 - > T .....,S - > Xk,Yk - > T ,并设置每对边缘的容量1,0.75,0.5 .....
  2. 将每个顶点 p 分隔为两个新顶点 p' p" , 将 p' p" 与一个容量相同的新边缘相关联 1。
  3. 从S到T运行MaxFlow,并保存流路径的信息。 它'很明显,这个新图的最大流量是2.而这两个 flow-path指示所需的路由。因为算法总是找到最大流量,所以最终流量路径必须是X1 - > Y1,X2 - > Y2 ... Xk - > YK。
  4. 证明

    因为我们将每个顶点分开并替换为一个容量为1的边,所以原始图中的每个顶点都可以遍历一个流。换句话说,它还意味着每个顶点都可以属于一条路径。

    扩展

    如果要最小化两个路径的总长度,可以只扩展算法。在新图表中添加一个属性:cost。原点图的边成本为0;并且表示单独顶点的新边的成本将为1。 您可以运行Min-Cost-Max-Flow算法,并获取所需信息。

    复杂性

    通过使用Dinic算法,MaxFlow的复杂度为O(N * N * M)。 Min-Cost-Max-Flow的复杂度也大约为O(N * N * N)。

答案 2 :(得分:2)

我没有完整的解决方案,但我确实有减少可以作为第一步。首先,将图表分解为biconnected components。此分解识别所有切割顶点,如果删除了顶点,则将图形断开为两个组件。对于每个切割顶点,源和目标顶点对要么位于切割的同一侧,要么作为非拆分对,要么位于切割的相对侧,作为拆分对。 (如果切割顶点也是源或目标,则将其计为拆分对。)

  • 如果任何切割顶点有两个或更多个分割对,则问题无法解决,因为两个路径都必须通过切割顶点。 (这是我上面评论中的梅花​​形图示例的概括。)

  • 如果没有拆分对,则问题会解决为两个较小的问题,每个问题都有一个问题。解决方案是在每个较小的解决方案上组合解决方案。

  • 如果只有一个分割对,则可以将问题减少为一对较小的问题,一个在每个组件的相关版本上,其中切割顶点在图形之间重复。假设某个组件​​中的切割顶点为X_1;在该组件标签中复制的切割顶点Y_1。反之亦然另一个组件。和以前一样,解决方案是两个较小的解决方案的组合。

这个解决方案的本质是鸽子原则,因为两条路径不能通过一个点。向上移动一步,三点不能经过两点。这导致立即检查三联组件并使用SPQR trees。从这个结构中,您可以枚举所有两点切割。在除以之前,将顶点分成两组并类似地进行,除了您必须考虑分裂对的所有排列。子问题现在都是三联组件。

你可以看到这导致了什么。我不知道SPQR树是否已被推广到更高的连通度。即使它们已经存在,你也可以期待组合爆炸。而这一切都导致了一个难题。

<小时/> 起初,我怀疑这个问题在平面图上是易处​​理的。不是;见上面引用的论文。它仍然是NP完全的。

鉴于上述算法,您可以假设双连图上存在问题。这里的不同之处在于平面图只有“局部”边缘(通过将图形嵌入球体看到); “远程”边缘必须越过其他边缘。这意味着最小割集的行为表现得更好。但是没有更好的表现来解决这个问题。