Dijkstra 的单源最短路径,带有额外的边,权重为“w”

Posted

技术标签:

【中文标题】Dijkstra 的单源最短路径,带有额外的边,权重为“w”【英文标题】:Dijkstra's Single Source Shourtest Path with an extra edge with weight of 'w' 【发布时间】:2016-10-17 15:10:48 【问题描述】:

在最近的一次采访中,我被要求实现单源最短路径算法(用于无向和正加权图)并稍作修改,即我们获得了一个额外的边,权重为“w”。我们必须通过在两个尚未连接的节点之间连接权重为“w”的额外边来找到是否可以找到比 SSSP 算法计算的路径更短的路径。 Here's an image. As according to SSSP the shortest path between A(source) & D(destination)is A-B-C-D i.e. total of 8.

但考虑到额外的优势。它可以连接在尚未连接的 A 和 D 之间,以最小化通过 SSSP 算法产生的最短路径。 Image of graph with extra edge contributing the shortest path

我试着思考解决方案。但到目前为止,什么都没有发生。我已经实现了 Dijkstra 算法来找到最短路径。但是这个小小的修改让我感到困惑。所以你能帮忙吗?

【问题讨论】:

【参考方案1】:

有两种选择:

    我们不需要额外的优势。这种情况由标准的 Dijkstra 算法处理。

    带有额外边的最短路径如下所示:shortest_path(start, V) + (V, U) + shortest_path(U, target)。也就是说,我们通过原始图中的最短路径从起点到达某个顶点V,然后通过添加这条额外边(VU)到达U(同样,一个任意顶点)一定不能连接),然后我们从U按照原图中的最短路径到达目标节点。

    我们可以使用路径的结构来获得O(n ^ 2) 解决方案:我们可以计算从起始节点到所有其他节点的最短路径(Dijkstra 算法的一次运行)以及到目标的所有最短路径节点到所有其他节点(再运行一次)。现在我们可以遍历所有可能的对 (V, U) 并选择最好的一对。

    奖励:我们可以在O(m log n) 中解决稀疏图。思路如下:不是检查所有的(U, V)对,我们可以找到这样的U,它在degree(V) * log V中所有未连接到V的顶点中与目标的距离最小(甚至是线性的) ) 时间(这个问题被称为寻找不在集合中的最小元素)。

【讨论】:

【参考方案2】:

我不确定我是否理解你的问题。你有一个加权图,可以用 w 添加一条边,添加到最短路径的位置。 我认为我们可以使用 spfa + dp 来解决问题。将所有其他边设置为 w 并创建布尔矩阵 m,m[i,j] =1 表示 i,j 之间没有边,dp[u,0] 表示当我们到达 u 时的最短距离而不使用额外的边,dp[u ,1] 表示使用额外的边缘。我不写 dp 传递方程。所以我们可以在 spfa 中迭代,也可以回溯 dp 的最佳方式,得到在哪里设置额外的边缘。

我们在上述解决方案中没有使用 Dijkstra 算法。

spfa也是Single Source Shourtest Path算法,它可以处理负加权边缘,但不能处理负循环。

这只是我的想法,我没有尝试过。但我认为这是一个解决它的想法。 如有不妥,请告诉我。

【讨论】:

以上是关于Dijkstra 的单源最短路径,带有额外的边,权重为“w”的主要内容,如果未能解决你的问题,请参考以下文章

Dijkstra 的单源最短路径算法能否检测到图中的无限循环?

贪心算法(Dijkstra)解决单源最短路径问题(C++)

单源最短路径

单源最短路径

Bellman-ford 单源最短路径算法

单源最短路径Dijkstra算法