【问题标题】:Dijkstra Monotonic PathDijkstra 单调路径
【发布时间】:2020-10-06 16:32:30
【问题描述】:

我确实有一个关于使用 Dijkstra 检查最短路径是否严格单调的问题。 这是我检查下一个未访问的最近节点的函数:

private static Node nearestUnvisitedNode(HashMap<Node, Integer> shortestPathMap) {
    int shortestDistance = Integer.MAX_VALUE;
    Node nearest = null;

    for (Node node : Graph.nodes) {
        if (node.isVisited()) {
            continue;
        }

        int currentDistance = shortestPathMap.get(node);

        if (currentDistance == Integer.MAX_VALUE) {
            continue;
        }

        if (currentDistance < shortestDistance) {
            shortestDistance = currentDistance;
            nearest = node;
        }
    }

    return nearest;
}

连接到每个节点的边被排序并存储在 LinkedList&lt;Edge&gt; edges;shortestPathMap 是一个实用程序,用于存储从起始节点到结束节点的整个路径。

我应该对nearestUnvisitedNode 方法应用哪些更改以确保路径权重严格增加或减少?

谢谢!

【问题讨论】:

  • 您是要检查路径是否是单调的,还是要强制搜索以选择单调的下一条边?
  • @c0der 最终结果应该是严格单调的最短路径
  • 你能把剩下的相关代码贴出来吗?
  • 每条边都有源、目的和权重,每个节点都有一个连接边列表,图包含节点的信息。

标签: java algorithm data-structures computer-science dijkstra


【解决方案1】:

可以通过根据权重按顺序松弛边缘来找到严格单调的最短路径。

假设我们要找到最短的上升路径。我们将按升序对边进行排序,然后按该顺序放松它们。 “放松”只是意味着如果总和小于当前值,则将边缘端点处节点的权重更新为边缘的权重加上其起点节点的权重。这与在 Dijkstra 中放松优势相同。这将始终产生最短的上升路径(如果我们同时更新所有等值边的节点权重,它可以严格上升)。

我们还可以通过对边进行降序排序来找到最短的下降路径。这两条路径之一将是最短的单调路径。

我认为使用这种循环排序边的方法(在 n logn 时间内)比尝试在上述方法中循环节点更幸运——如果您只需要通过更新你向我们展示的方法,它变成了一个更难的问题。

【讨论】:

  • 当然,我明白这一点。每个节点的边按降序排列。您的意思是在某个有序列表中获取所有边吗?然后放松边缘;并假设我们更新了所有节点的权重,接下来呢?您是否可以更新上面的代码 sn-p 以显示您的逻辑?
  • 另请参阅上面关于 Edge、Node 和 Graph 结构包含什么的评论。
  • 首先将节点权重设置为除起始节点外的 max_value,然后将图中的所有边放在一个有序列表中,然后按该顺序放松它们。一旦你这样做了,每个节点的权重将是从一开始就通过单调路径的最短距离。如果您想知道实际的最短路径,您还可以将前面的节点存储在图的每个节点的路径上。我可能会误解——我不知道nearestUnvisitedNode 方法的作用。
猜你喜欢
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多