Algorithm 迪克斯特拉';s具有额外边且权重为';w';

Algorithm 迪克斯特拉';s具有额外边且权重为';w';,algorithm,data-structures,graph,Algorithm,Data Structures,Graph,在最近的一次采访中,我被要求实现单源最短路径算法(对于无向和正加权图),只需稍加修改,即给我们一条额外的边,权重为“w”。我们必须找到是否能找到比SSSP algo计算的路径更短的路径,通过在两个尚未连接的节点之间连接额外的边,权重为“w”。 但考虑到额外的优势。它可以连接在尚未连接的A和D之间,以最小化通过SSSP algo产生的最短路径。 我试着想办法。但到目前为止,什么也没有发生。我已经实现了Dijkstra算法来寻找最短路径。但是这个小小的修改让我困惑。你能帮点忙吗。有两种选择: 我

在最近的一次采访中,我被要求实现单源最短路径算法(对于无向和正加权图),只需稍加修改,即给我们一条额外的边,权重为“w”。我们必须找到是否能找到比SSSP algo计算的路径更短的路径,通过在两个尚未连接的节点之间连接额外的边,权重为“w”。

但考虑到额外的优势。它可以连接在尚未连接的A和D之间,以最小化通过SSSP algo产生的最短路径。

我试着想办法。但到目前为止,什么也没有发生。我已经实现了Dijkstra算法来寻找最短路径。但是这个小小的修改让我困惑。你能帮点忙吗。

有两种选择:

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

  • 具有额外边的最短路径如下所示:
    最短路径(开始,V)+(V,U)+最短路径(U,目标)
    。也就是说,我们通过原始图中的最短路径从起点到某个顶点
    V
    ,然后通过添加此额外边(
    V
    U
    不得连接)到
    U
    (同样是任意顶点)然后我们通过原始图中的最短路径从
    U
    到达目标节点

  • 我们可以使用路径的结构得到一个
    O(n^2)
    解决方案:我们可以计算从开始节点到所有其他节点的最短路径(Dijkstra算法的一次运行)和从目标节点到所有其他节点的所有最短路径(再运行一次)。现在我们可以迭代所有可能的对
    (V,U)
    ,然后选择最好的一个

  • 好处:对于稀疏图,我们可以在
    O(mlogn)
    中求解它。其思想如下:不必检查所有
    (U,V)
    对,我们可以找到这样的
    U
    ,即在
    degree(V)*log V
    (甚至线性)时间内,在所有未连接到
    V
    的顶点中,它到目标的距离最小(这个问题称为查找集合中不存在的最小元素)


  • 我不确定我是否理解你的问题。您有一个加权图,可以添加一条带w的边,添加到where make shortest path。 我想我们可以用spfa+dp来解决这个问题。将所有其他边设置为w,并创建布尔矩阵m,m[i,j]=1表示在i,j之间没有边,dp[u,0]表示在不使用额外边的情况下到达u时的最短距离,dp[u,1]表示使用额外边。我不写dp传递方程。因此,我们可以在spfa中进行迭代,也可以回溯dp的最佳方式,并获得设置额外边缘的位置

    在上述解决方案中,我们不使用Dijkstra算法

    spfa也是一种单源Shourtest路径算法,它可以处理负加权边,但不能处理负循环

    这只是我的想法,我没有试过。但我认为这是一个解决问题的办法。 如果有错,请告诉我