滑雪
( skiing.pas/c/cpp)
【题目描述】
MM 参加一个滑雪比赛,滑雪场是一个 N×M 的矩形, MM 要从起点( 1, 1)滑到( N,M)。矩形中每个单位格子有一个海拔高度值 hi,从一个格子走到另一个格子速度就会变成 v*2^(hi-hj),已知 MM 的初始速度是 v,请问最少需要多少时间。(从一格到另一格的路程为1,只能向四周滑雪)
【输入格式】
第一行输入三个整数 V, N, M。
接下来 N 行 M 列描述滑雪场每个单位格子的海拔高度。
【输出格式】
输出只有一行,表示从起点到终点的最少花费时间。答案保留 2 位小数。
【输入样例】
1 3 3
1 5 3
6 3 5
2 4 3
【输出样例】
29.00
【数据范围】
1<=N,M<=100
-25<=hi<=25
这是一道图论的题目,想必大家也看出来了。
但是要如何解决呢?
首先知道我们要从(1,1)点到(n,m)点,而且移动的时候是会变速的
对于每一个点,都有四个点可以滑雪,那很无疑,这就是一道最短路径问题
但对于这种移动时会变速的最短路径问题很多算法无法很好的解决
这个时候就要请我们的SPFA大爷出山了。
SPFA的队列实现方式可以很好地解决这种问题,对于每次的路径变速处理,只需要在队列中多加一个记录速度的一格就好了。
代码就不展示了。。。。