在最近的一次采访中,我被要求实施单源最短路径算法(对于无向和正加权图),略微修改,即我们给予额外的权重' w。'。我们必须找到一个比SSSP算法计算的路径更短的路径,通过在两个尚未连接的节点之间连接额外的边缘,重量为“w”。 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算法来找到最短路径。但这个小修改让我感到困惑。那么你可以帮一下吗?
答案 0 :(得分:3)
有两种选择:
我们不需要额外的优势。这种情况由标准的Dijkstra算法处理。
带有额外边缘的最短路径如下所示:shortest_path(start, V) + (V, U) + shortest_path(U, target)
。也就是说,我们从原始图中的最短路径开始到某个顶点V
,然后我们通过添加这个额外边({{1}来转到U
(再次,一个任意顶点) }}和V
不能连接),而不是我们通过原始图表中的最短路径从U
转到目标节点。
我们可以使用路径的结构来获得U
解决方案:我们可以计算从起始节点到所有其他路径的最短路径(Dijkstra算法的一次运行)和从目标节点到所有其他节点的所有最短路径(再运行一次)。现在我们可以迭代所有可能的对O(n ^ 2)
并选择最好的对。
奖励:我们可以在(V, U)
中为稀疏图解决它。这个想法如下:我们可以找到O(m log n)
,而不是检查所有(U, V)
对,它在U
中未与V
连接的所有顶点中与目标的距离最小{1}}(或甚至线性)时间(此问题称为查找不在集合中的最小元素)。
答案 1 :(得分:0)
我不确定我是否理解你的问题。你有一个加权图,可以用w添加边,添加到最短路径的位置。 我想我们可以使用spfa + dp来解决这个问题。将所有其他边设置为w并创建布尔矩阵m,m [i,j] = 1意味着当我们到达u而不使用额外边缘时,i,j,dp [u,0]之间没有边缘意味着最短距离,dp [u ,1]意味着使用额外的边缘。我不写dp传递方程。所以我们可以在spfa中迭代,我们也可以回溯dp的最佳方式并获得设置额外优势的位置。
我们不在上述解决方案中使用Dijkstra算法。
spfa也是单源Shourtest路径算法,它可以处理负加权边缘,但不是负循环。
这只是我的想法,我没有尝试过。但我认为这是一个解决它的想法。 如果有任何错误,请告诉我。