需要帮助解决这种最短路径算法的变化

时间:2017-01-14 08:01:48

标签: algorithm shortest-path

以下图片是三星访谈期间向我询问的问题的代表。我必须编写程序来找到I和M之间的最小距离。还有一个额外的约束,我们可以改变其中一个边缘。例如,可以移动边缘FM以连接边缘L和M,边缘值仍然是4。

如果您注意到,I和M之间的距离通过I-> E - > F - > G - > M是20.但是,如果我们改变其中一个边缘,使得L到M的边缘值现在是4。我们现在必须移动边缘FM以加入L和M.通过这种方法,I和M之间的距离是20。

任意边u,v可以改为u,t或t,v。它不能改为x,y。因此,边缘中的一个顶点必须相同。

请查看下面的图片来说明情景 -

enter image description here

所以我的问题是我必须为此编写程序。为了找到两个顶点之间的最小距离,我想到了使用Djikstra的算法。但是,我不知道如何处理附加约束,我可以选择更改其中一个顶点。如果我能得到一些帮助来解决这个问题,我将非常感激。

2 个答案:

答案 0 :(得分:0)

  1. 如果我们移动边(A, B),则新结尾应该是起始S或目标T顶点(否则,答案不是最佳的)。< / p>

  2. 我们假设我们移动边(A, B),新结尾是T(同样处理S的情况) 。我们需要知道SA之间没有使用此边缘的最短路径(一旦我们知道,我们就可以使用S->A->T路径更新答案)。< / p>

  3. 让我们使用Dijkstra算法计算从S到所有其他顶点的最短路径。

  4. 让我们修复一个顶点A并计算与dist[B] + weight(A, B)相邻的所有B的两个最小值A。让我们迭代A附近的所有边。让当前边缘为(A, B)。如果dist[B] + weight(A, B)等于第一个最小值,请d为第二个最小值。否则,让d成为第一个最小值。我们需要使用d + weight(A, B)更新答案(这意味着(A, B)现在变为(A, T)

  5. 此解决方案在图表的大小上是线性的(不计算Dijkstra算法的运行时间)。

    为了避免代码重复,我们可以通过交换SS并运行相同的算法(最终答案是最小值)将边缘重定向到T来处理这种情况。这两次运行的结果)。

答案 1 :(得分:0)

在您显示的图表中,我看到的最短路径为I -> E -> F -> M,长度为13。

enter image description here

移动边F -> M以使其连接L -> M只会让事情变得更糟。新的最短路径为I -> E-> F -> L -> M,长度为18。

enter image description here

显而易见的答案是移动边F -> M,以便将I直接连接到M,长度为4。

enter image description here

换句话说,找到与IM相关联的最短边,并使用它将I直接连接到M

为了将来参考,在面试中你被要求从记忆中实施Djikstra算法的可能性很小。所以你需要寻找更简单的东西。