修改的最短路径算法,禁止路径

时间:2016-09-22 09:41:19

标签: graph dijkstra shortest-path

我们提供图G =(V,E),其中每个边与一些正权重(W [i]> 0)相关联。如果我们遵循以下条件,我们被要求找到从A到B的最短路径:

我们也有一些禁止的路径,比如说x。目标是最短路径不应包含任何禁止路径作为其子路径。

例如:考虑一个有4个顶点和5个边(1,2,1),(2,1,1),(1,4,5),(1,3,1.5),(3)的图G ,4,1)。这里,括号中的第三个实体表示“' u”之间的边缘权重。并且' v'。我们需要找到1到4之间的最短路径,并且禁止路径列表仅包含路径1-> 3-> 4。

从1到4的路径是1 - > 4,1-> 2 - > 3 - > 4,1-> 3 - > 4。

其中,只有前2个是有效路径,其中最短路径是1 - > 2 - > 3 - > 4总重量为3.0。

上述任务是否有效的算法?请用复杂性分析来描述算法。如果你能提供代码,我将非常感激。

1 个答案:

答案 0 :(得分:0)

您可以预处理图形,以便在其中嵌入禁止的路径。对于每个禁用路径,您复制属于它的顶点,然后删除一些边。复制品具有特殊含义:沿着复制边缘行走意味着您沿着禁止路径到达顶点并且不能沿着它的最后边缘行走。如果你沿着原始边缘行走,那么你就到了禁止路径的中间,所以它不会影响你。为了达到这个目的,你将所有传入的边缘放到一个重复的路径上,除了它的第一个顶点之外的第二个顶点。但是你从原来的道路上掉下那条边。

a forYou分割顶点,它们是几个虚拟顶点的禁止路径的一部分,并丢弃一些边缘。我们假设在下面的图形路径中禁止使用ABC:

A-->B-->C
D->/

然后将B分割为BA和BD(取决于您从哪个顶点到达B)并删除BA-> C边缘。

A->BA  /->C
D->BD-/

现在你可以在预处理图上使用经典的dijkstra。

更复杂的例子,我们假设禁止ABCF:

    G->\
A-->B-->C-->F
D->/ \->E

因此我们将B和C复制为禁止路径的内部顶点,我们丢弃A-> B边缘并仅留下A-> B'。我们还将所有其他传入边缘丢弃到B'和C'但我们离开B' - > E边缘因为它远离禁止路线。我们也放弃了C' - > F edge。

 /->B'-->C'
|    \------->\
|              \
|   G->\        \
A   B-->C---->F  \
D->/ \----------->E