题目链接:

https://cn.vjudge.net/problem/POJ-3037

Bessie and the rest of Farmer John's cows are taking a trip this winter to go skiing. One day Bessie finds herself at the top left corner of an R (1 <= R <= 100) by C (1 <= C <= 100) grid of elevations E (-25 <= E <= 25). In order to join FJ and the other cows at a discow party, she must get down to the bottom right corner as quickly as she can by travelling only north, south, east, and west.

Bessie starts out travelling at a initial speed V (1 <= V
<= 1,000,000). She has discovered a remarkable relationship between
her speed and her elevation change. When Bessie moves from a location of
height A to an adjacent location of eight B, her speed is multiplied by
the number 2^(A-B). The time it takes Bessie to travel from a location
to an adjacent location is the reciprocal of her speed when she is at
the first location.

Find the both smallest amount of time it will take Bessie to join her cow friends.

Input

* Line 1: Three space-separated integers: V, R, and C, which
respectively represent Bessie's initial velocity and the number of rows
and columns in the grid.

* Lines 2..R+1: C integers representing the elevation E of the corresponding location on the grid.

Output

A single number value, printed to two exactly decimal places: the
minimum amount of time that Bessie can take to reach the bottom right
corner of the grid.

Sample Input

1 3 3
1 5 3
6 3 5
2 4 3

Sample Output

29.00

Hint

Bessie's best route is:
Start at 1,1 time 0 speed 1

East to 1,2 time 1 speed 1/16

South to 2,2 time 17 speed 1/4

South to 3,2 time 21 speed 1/8

East to 3,3 time 29 speed 1/4
 /*
题意描述
第一行输入(1,1)处的初始速度v,和高度矩阵的大小r,c
接下来输入一个高度矩阵
问从(1,1)处出发,走到(r,c)所需要的最短时间
时间的计算规则是,从A点到B点,假设高度是HA,HB,到达B点的速度是A点的速度乘以2^(HA-HB),而该过程所需要的时间是到达B点度的倒数 解题思路
读完题感觉像是搜索题的最短路,由于花费时间不同,导致同层拓展的结点优先级不同,再采用优先队列保证每次弹出的是最短时间结点,求
出最短时间,有点模拟的意思。
不过仔细读题发现,其实不用像模拟那样随时更新速度,因为只要有了(1,1)点的速度,其他点的速度都能求出来。假设a,b,c三点的高度
分别是h1,h2,h3, a点的速度为v1,求v2和v3。易得v2=v1*2^(h1-h2);将v2代入v3=v2*2(h2-h3)=v1*2^(h1-h2)*2(h2-h3)=v1*2(h1-h3);故有
有了初始速度其他点的速度是固定的,那么可以将其看成是一个邻接矩阵,求(1,1)到(r,c)的最短路径,权值就是每条边花费的时间。
这里使用SPFA,
1.初始化二维数组t为最短路径的估计值,除了(1,1)外,全部都是INF
在这里需要注意的是,因为是浮点数造成之前的int最大值不适用了,要变为原来的二倍
2.在队列中加入一个起始顶点
每次弹出一个顶点,以该点为中心,四周的最短距离如果能够被该点松弛,就更新。
如果四周的点没有被用过,就加入队列
3.最终队列为空的时候,计算出从(1,1)处出发,走到(r,c)所需要的最短时间。
POJ精度问题使用%.2f输出,用%.2lf精度太小,舍入不正确
*/
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std; const double INF = 0x7fffffff;//double是int的二倍,故0x3f3f3f3f的二倍
const int maxn = ;
int dir[][] = {,, ,, -,, ,-};
struct NODE{
int x, y;
};
bool vis[maxn][maxn];
double e[maxn][maxn];
double t[maxn][maxn];
double v;
int r, c;
void SPFA(); int main()
{
while(scanf("%lf%d%d", &v, &r, &c) != EOF) {
for(int i = ; i <= r; i++) {
for(int j = ; j <= c; j++) {
scanf("%lf", &e[i][j]);
}
}
SPFA();
}
return ;
} void SPFA() {
for(int i = ; i <= r; i++) {
for(int j = ; j <= c; j++) {
t[i][j] = INF;
}
}
t[][] = ; memset(vis, , sizeof(vis));
vis[][] = ;
queue<NODE> q;
q.push((NODE){,});
while(!q.empty()) {
NODE tmp = q.front();
q.pop();
vis[tmp.x][tmp.y] = ;//清除标记
double w = 1.0 / (v * pow(2.0, e[][] - e[tmp.x][tmp.y]));
for(int k = ; k < ; k++) {
int tx = tmp.x + dir[k][];
int ty = tmp.y + dir[k][]; if(tx < || tx > r || ty < || ty > c)
continue;
if(t[tmp.x][tmp.y] < INF && t[tx][ty] > t[tmp.x][tmp.y] + w) {
t[tx][ty] = t[tmp.x][tmp.y] + w;
if(!vis[tx][ty]) {
vis[tx][ty] = ;
q.push((NODE){tx,ty});
}
}
}
} printf("%.2f\n", t[r][c]);
}

POJ 3037 Skiing(如何使用SPFA求解二维最短路问题)的更多相关文章

  1. POJ 2029 Get Many Persimmon Trees (二维树状数组)

    Get Many Persimmon Trees Time Limit:1000MS    Memory Limit:30000KB    64bit IO Format:%I64d & %I ...

  2. poj 3625 Building Roads(最小生成树,二维坐标,基础)

    题目 //最小生成树,只是变成二维的了 #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> ...

  3. POJ 2029 Get Many Persimmon Trees 【 二维树状数组 】

    题意:给出一个h*w的矩形,再给出n个坐标,在这n个坐标种树,再给出一个s*t大小的矩形,问在这个s*t的矩形里面最多能够得到多少棵树 二维的树状数组,求最多能够得到的树的时候,因为h,w都不超过50 ...

  4. POJ - 3037 Skiing SPFA

    Skiing Bessie and the rest of Farmer John's cows are taking a trip this winter to go skiing. One day ...

  5. POJ 3037 Skiing

    Skiing Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4810   Accepted: 1287   Special ...

  6. POJ 3037 Skiing(Dijkstra)

    Skiing Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4668   Accepted: 1242   Special ...

  7. [BZOJ1579][Usaco2009 Feb]Revamping Trails 道路升级(二维最短路问题)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1579 分析: 设d[i][j]表示从1走到i.改了j条边的最短路径长度 如果设i相连的 ...

  8. [luogu4479][BJWC2018]第k大斜率【二维偏序+二分+离散化+树状数组】

    传送门 https://www.luogu.org/problemnew/show/P4479 题目描述 在平面直角坐标系上,有 n 个不同的点.任意两个不同的点确定了一条直线.请求出所有斜率存在的直 ...

  9. POJ_1195 Mobile phones 【二维树状数组】

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013912596/article/details/33802561 题目链接:id=1195&qu ...

随机推荐

  1. boost asio 学习(一)io_service的基础

    原文  http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio/ 编译环境 b ...

  2. docker安装radis

    sudo docker search redis sudo docker pull redis sudo docker run --name redis6379 -p 6379:6379 -v /op ...

  3. JavaScript:原生模拟$.ajax以及jsonp

    现实项目中,常常会用到请求,但是在考虑低版本的浏览器时,promise相关的axios,fetch这类第三方库的支持率就不那么好了,再考虑到最大的一个问题,跨域,更是让人头痛,虽然也有fetch-js ...

  4. sql 百万级或千万级数据分页处理

    笔记来源 https://blog.csdn.net/zhenyuanjie/article/details/7778102

  5. nginx启动或者重启失败,报错nginx: [error] open() "/usr/local/var/run/nginx.pid" failed (2: No such file or directory)

    第一种方案: 1. 执行命令 :open /usr/local/etc/nginx 打开nginx安装目录 nginx安装目录默认位置有:(找到适合你的) /etc/nginx/nginx.conf, ...

  6. Html5与Css3知识点拾遗(九)

    css布局 控制元素的显示类型和可见性 块级元素 dispaly:block: 行内元素(不能设置宽度) display:inline: 不接受padding设置,但padding-top和paddi ...

  7. 基于esp32的IIC通讯

    本文源码地址在:http://download.csdn.net/download/noticeable/9962029 IIC 通讯应该是当代比较常用的几种通讯方式之一,其无需特殊的IO接口,连线方 ...

  8. Python序列结构--列表(一)

    列表 列表**包含若干元素的有序连续内存空间**,当列表增加或删除元素时,**列表对象自动进行内存的扩展或收缩**,从而**保证相邻元素之间没有缝隙**.但插入和删除非尾部元素时涉及列表元素大量的移动 ...

  9. 「NOI2018」屠龙勇士(EXCRT)

    「NOI2018」屠龙勇士(EXCRT) 终于把传说中 \(NOI2018D2\) 的签到题写掉了... 开始我还没读懂题目...而且这题细节巨麻烦...(可能对我而言) 首先我们要转换一下,每次的 ...

  10. 十进制转化为二进制Java实现

    提取2的幂 这个方法用代码实现貌似有点麻烦,需要探测大小,我只实现了整数十进制到二进制的转化 /* * 提取2的幂 */ public static String TenToBin1(int ten) ...