【问题标题】:Finding second shortest path in a graph(With Backtracking)在图中找到第二条最短路径(使用回溯)
【发布时间】:2016-10-31 06:35:20
【问题描述】:

我在 LightOJ 中发现了一个问题,问题是在图中找到从节点 1 到节点 n 的第二条最短路径(图中从 1 到 n 标记有 n 个节点)。现在,问题表明我可以回溯以找到第二条最短路径。其中一个样例是这样的:

  • 从节点 1 到 2 的边,成本 100。
  • 从节点 2 到 3 的边,成本 300。
  • 从节点 1 到 3 的边,成本 50。

对于这条路径 1->2->1->3,这个测试的答案是 150。 我知道 Dijkstra 算法。但是我找不到有关如何执行此操作的任何信息。如果这是一个老话题,我很抱歉,但是当我用谷歌搜索它时,我找不到任何东西。

更新:我读过这个问题。 Which algorithm can I use to find the next to shortest path in a graph? 我的问题与它不同,因为在这个问题中,我可以使用两次边缘。我从节点 1 到 2 一次,然后回到 1。这使用边缘 1->2 两次。

【问题讨论】:

  • 在遍历图表时,您需要保留最便宜的两条路径的成本向量。
  • 我看到了这个问题。但我需要一个算法来回溯@500-InternalServerError
  • 你可以通过迭代加深找到两个节点之间所有可能的路径,保持它们的成本。这些成本可以排序,列表中的第二个可以返回。
  • 任何伪代码或算法都会有所帮助。另外,问题出在 Dijkstra 之下。所以我正在寻找一个使用 Dijkstra 算法的解决方案

标签: c++ algorithm graph-theory shortest-path dijkstra


【解决方案1】:

我认为这可能有效:

维护两个数组:shortest[i]sec_shortest[i],分别表示顶点i的最短路径长度和第二最短路径长度。

现在,您只需以稍微不同的方式修改 Dijkstra 算法的update 部分中的方法:

for v in adj(u):
    if shortest[u] + cost(u, v) < shortest[v]:
        sec_shortest[v] = shortest[v]
        shortest[v] = shortest[u] + cost(u, v)
    else if shortest[u] + cost(u, v) < sec_shortest[v]:
            sec_shortest[v] = shortest[u] + cost(u, v)

最后,sec_shortest[i] 将包含从固定源到顶点i 的第二最短路径长度。

【讨论】:

    【解决方案2】:

    我认为对此有更好的解决方案。首先找到最短路径。假设这条最短路径有 k 条边。

    有一个从 i = 1 到 k 的循环,然后每次将路径的第 i_th 边的值设置为无穷大。在此之后,运行最短路径算法。并返回您获得的所有 k 个新最短路径的最小值。

    请注意,您将每一条边都设置为无穷大。为什么这行得通?因为您将在一个边缘获得与原始路径不同的最短路径。

    但是,您的问题有点模棱两可,因为第二最短路径意味着下一条最短路径具有更高的成本。或者这可能意味着只找到两条不同的最短路径。我在回答中假设了后一种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 2014-04-14
      • 1970-01-01
      相关资源
      最近更新 更多