以下图片是三星访谈期间向我询问的问题的代表。我必须编写程序来找到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。因此,边缘中的一个顶点必须相同。
请查看下面的图片来说明情景 -
所以我的问题是我必须为此编写程序。为了找到两个顶点之间的最小距离,我想到了使用Djikstra的算法。但是,我不知道如何处理附加约束,我可以选择更改其中一个顶点。如果我能得到一些帮助来解决这个问题,我将非常感激。
答案 0 :(得分:0)
如果我们移动边(A, B)
,则新结尾应该是起始S
或目标T
顶点(否则,答案不是最佳的)。< / p>
我们假设我们移动边(A, B)
,新结尾是T
(同样处理S
的情况) 。我们需要知道S
到A
之间没有使用此边缘的最短路径(一旦我们知道,我们就可以使用S->A->T
路径更新答案)。< / p>
让我们使用Dijkstra算法计算从S
到所有其他顶点的最短路径。
让我们修复一个顶点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)
。
此解决方案在图表的大小上是线性的(不计算Dijkstra算法的运行时间)。
为了避免代码重复,我们可以通过交换S
和S
并运行相同的算法(最终答案是最小值)将边缘重定向到T
来处理这种情况。这两次运行的结果)。
答案 1 :(得分:0)