Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 图上的最短(和最小危险)路径_Python_Algorithm - Fatal编程技术网

Python 图上的最短(和最小危险)路径

Python 图上的最短(和最小危险)路径,python,algorithm,Python,Algorithm,我正在做一项任务,让我遍历一个简单的方形图,目标是将危险累积到最少。端点很简单:从左上角顶点到右下角。我被限制在顶点之间水平和垂直移动。地牢中的每个房间(图中的每个顶点)都有一个指定的危险级别 例如: 0 7 2 5 4 0 -> 1 -> 1 -> 2 -> 2 -> 1 -> 3 -> 1 -> 0 1 5 1 2 1 1 2 2 1 1 1 9 5 3 5 1 1 9 1 0 我一直在胡思乱想使用优先级队列,但我仍然不知道如何确切地

我正在做一项任务,让我遍历一个简单的方形图,目标是将危险累积到最少。端点很简单:从左上角顶点到右下角。我被限制在顶点之间水平和垂直移动。地牢中的每个房间(图中的每个顶点)都有一个指定的危险级别

例如:

0 7 2 5 4    0 -> 1 -> 1 -> 2 -> 2 -> 1 -> 3 -> 1 -> 0
1 5 1 2 1
1 2 2 1 1 
1 9 5 3 5
1 1 9 1 0
我一直在胡思乱想使用优先级队列,但我仍然不知道如何确切地说,我会首先使用该p.Q


我可以试试Dijkstra的算法,但我不是在计算节点之间的距离;相反,我是在计算最小化的危险。也就是说,我假设一个房间的危险是两个节点之间边缘的重量,对吗


我希望有人能给我一个如何解决这个问题的想法。如果有帮助的话,我将用Python编写程序

我已经有一段时间没有做这些问题了,但我很确定这里使用的算法是Dijkstra的。来自维基百科:

对于图中给定的源节点,该算法将查找 该节点与其他节点之间的最短路径。它也可以被使用 用于查找从单个节点到单个节点的最短路径 目的节点通过停止算法一次到达最短路径 目标节点已确定。。。[执行基于 在最小优先级队列上]是渐近已知的最快的 任意有向图的单源最短路径算法 具有无限非负权重


你的直觉是正确的,但在这种情况下,你被“距离”的定义绊倒了。不要从危险的角度思考问题,只需在头脑中将“危险”转换为“距离”。在图的左上角和右下角节点之间找到最小危险路径的问题就变成了在这些节点之间找到最短路径的问题,这正是Dijkstra所要解决的问题。

在这里使用Dijkstra算法时,如果目标不仅是打印总危险,还包括如何到达途中危险最小的目的地的路线,则可以为每个到达的节点存储完整路线(如果不考虑空间),或者存储上一个节点,然后在到达终点后返回(首选解决方案)


此外,如果您需要打印危险最小的所有路线,则情况完全不同。

“也就是说,我是否正确地假设一个房间中的危险是两个节点之间边缘上的重量?”是的。您可以使用Dijkstra算法,将危险设置为两个节点之间的“距离”。这在数学上是相同的。是的,你正确地假设一个房间的危险可以被用作进入它的边缘的重量。移动受到任何限制吗?e、 g.只能左右移动?seaotternerd,samgak,感谢您的反馈。我一直在尝试实现这个算法。我将继续努力@AndyG,是的,这是一个重要的音符。我一定会在中编辑它。我只限于垂直和水平运动。不是对角线。非常感谢你的帮助。我最终得到了正确的输出,而且作业出人意料地简单(回头看)。唯一让我烦恼的是,我最终在这个过程中粗暴地降低了程序的效率。当我有更多时间时,我将不得不重新审视作业并优化它。在这种规模下,效率并不重要。但用于为作业评分的输入是10000个房间+。