我们提供了图G =(V,E),其中每个边与一些正权重(W [i]> 0)相关联 . 如果我们遵循以下条件,我们被要求找到从A到B的最短路径:
我们也有一些禁止的路径,比如说x . 目标是最短路径不应包含任何禁止路径作为其子路径 .
例如:考虑一个图G,有4个顶点和5个边(1,2,1),(2,1,1),(1,4,5),(1,3,1.5),(3,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 回答
您可以预处理图形,以便在其中嵌入禁止的路径 . 对于每个禁用路径,您复制属于它的顶点,然后删除一些边 . 复制品具有特殊含义:沿着重复边缘行走意味着您沿着禁止路径到达顶点并且不能沿着它的最后边缘行走 . 如果你沿着原始边缘行走,那么你就来到了禁止路径的中间,所以它不会影响你 . 为了达到这个目的,你将所有传入的边缘放到一个重复的路径上,除了它的第一个顶点之外的第二个顶点 . 但是你从原始路径上掉下那条边 .
a forYou拆分顶点,它们是几个虚拟顶点中的禁止路径的一部分,并删除一些边缘 . 让我们假设在下面的图形路径中禁止使用ABC:
然后将B分割为BA和BD(取决于您从哪个顶点到达B)并放下BA-> C边缘 .
现在,您可以在预处理图上使用经典的dijkstra .
更复杂的例子,让我们假设禁止ABCF:
因此我们将B和C复制为禁止路由的内部顶点,我们删除A-> B边缘并仅留下A-> B' . 我们还将所有其他传入边缘丢弃到B'和C'但我们离开B' - > E边缘因为它远离禁止路线 . 我们也放弃C' - > F边缘 .