java - Dijkstra 单调路径
问题描述
我确实有一个与使用 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<Edge> edges;
一个shortestPathMap
实用程序中,用于存储从起始节点到结束节点的整个路径。
我应该对该方法进行哪些更改nearestUnvisitedNode
以确保路径权重严格增加或减少?
谢谢!
解决方案
可以通过根据权重按顺序放松边缘来找到严格单调的最短路径。
假设我们想找到最短的上升路径。我们将按升序对边进行排序,然后按该顺序放松它们。“放松”只是意味着如果总和小于当前值,则将边缘端点处节点的权重更新为边缘的权重加上其起点节点的权重。这与在 Dijkstra 中放松优势相同。这将始终产生最短的上升路径(如果我们同时更新所有等值边的节点权重,它可以严格上升)。
我们还可以通过按降序排列边来找到最短的下降路径。这两条路径之一将是最短的单调路径。
我认为使用这种在排序边上循环的方法(在 n logn 时间内)比尝试在上述方法中循环节点更幸运——如果您只需要通过更新您拥有的方法来解决问题向我们展示,它变成了一个更难的问题。
推荐阅读
- c# - 显示下一个营业日和营业时间
- javascript - 如何使用 nuxtjs 重新加载路由
- angular - 了解 Angular HTTP 调用何时完成
- c# - 如何使用 c# 从 azure 存储容器中恢复数据库
- android - 什么是已弃用的 getSupportLoaderManager() 的适当替换?
- html - 页面上的居中文本+按钮不起作用
- python-2.7 - 生成器理解中的 range() 是否在 python 2.7.x 中占用内存
- java - py4j 无法在 Docker 容器中运行
- python - 使用迭代器解包可变长度列表
- c# - “LinkAssemblies”任务意外失败。错误:XA2006