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

时间:2015-05-12 03:20:03

标签: 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

我一直在考虑使用优先级队列,但我仍然不知道如何使用P.Q.首先。

我可以尝试Dijkstra的算法,但我不计算节点之间的距离;相反,我正在计算最小化的危险。话虽如此,我是否正确地假设一个房间的危险是两个节点之间边缘的重量?

我希望有人可以告诉我如何解决这个问题。如果有任何帮助,我将用Python编写程序。

2 个答案:

答案 0 :(得分:2)

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

  

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

http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

你的直觉是正确的,但在这种情况下你被“距离”的定义绊倒了。不要在危险方面考虑问题,只需将“危险”转换为“距离”即可。在图的左上角和右下角节点之间找到最不危险路径的问题就是找到这些节点之间的最短路径,这正是Dijkstra应该解决的问题。

答案 1 :(得分:0)

当在这里使用Dijkstra算法时,如果目标不仅是打印总危险,而且还要路由如何到达目的地且风险最小的目的地,您可以为每个到达的节点存储完整路线(如果空间不是关注),或者存储前一个节点,然后在达到完成后再向后(首选解决方案)。

此外,如果您需要以最小的危险打印所有路线,这是一个完全不同的故事。