输入:图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游戏,但没有填补每个方格的要求。)
答案 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 ...我相信这种方法可以准确报告是否有一组不相交的路径。
很容易找到容量为1.5的流量(此流程如图所示)。但是没有办法将两个(绿色和红色)顶点对与不相交的路径连接起来。
答案 1 :(得分:6)
您可以使用MaxFlow来解决此问题。 如果您不熟悉Flow,可以阅读一些有关它的资料。
因为我们将每个顶点分开并替换为一个容量为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完全的。
鉴于上述算法,您可以假设双连图上存在问题。这里的不同之处在于平面图只有“局部”边缘(通过将图形嵌入球体看到); “远程”边缘必须越过其他边缘。这意味着最小割集的行为表现得更好。但是没有更好的表现来解决这个问题。