poj3037
首先到每个点的速度实际上是一个定值,就是v0*2^(起点与当前点高度差)
所以当前点i到任意一个相邻点的时间都是一个定值,
不难想到构图最短路径
const dx:array[..] of integer=(-,,,);
dy:array[..] of integer=(,,-,);
inf=; type link=^node;
node=record
po:longint;
len:double;
next:link;
end;
point=record
num:longint;
dis:double;
end; var num,a:array[..,..] of longint;
d:array[..] of double;
w:array[..] of link;
heap:array[..] of point;
where:array[..] of longint;
t,i,j,n,m,k,x,y:longint;
v,vn,mid:double;
p:link; procedure add(x,y:longint;c:double);
var p:link;
begin
new(p);
p^.po:=y;
p^.len:=c;
p^.next:=w[x];
w[x]:=p;
end; procedure swap(var a,b:point);
var c:point;
begin
c:=a;
a:=b;
b:=c;
end; function calc(x:longint):double;
var i:longint;
begin
calc:=;
if x> then
begin
for i:= to x do
calc:=calc*;
end
else if x< then
begin
for i:= to abs(x) do
calc:=calc/;
end;
end; procedure sift(i:longint);
var j,x,y:longint;
begin
j:=i shl ;
while j<=t do
begin
if (j+<=t) and (heap[j].dis>heap[j+].dis) then inc(j);
if heap[i].dis>heap[j].dis then
begin
x:=heap[i].num;
y:=heap[j].num;
where[x]:=j;
where[y]:=i;
swap(heap[i],heap[j]);
i:=j;
j:=i shl ;
end
else break;
end;
end; procedure up(i:longint);
var j,x,y:longint;
begin
j:=i shr ;
while j> do
begin
if heap[i].dis<heap[j].dis then
begin
x:=heap[i].num;
y:=heap[j].num;
where[x]:=j;
where[y]:=i;
swap(heap[i],heap[j]);
i:=j;
j:=j shr ;
end
else break;
end;
end; begin
readln(v,n,m);
for i:= to n do
begin
for j:= to m do
begin
read(a[i,j]);
inc(k);
num[i,j]:=k;
end;
end;
for i:= to n do
for j:= to m do
begin
vn:=v*calc(a[,]-a[i,j]);
for k:= to do
begin
x:=i+dx[k];
y:=j+dy[k];
if num[x,y]> then add(num[i,j],num[x,y],/vn);
end;
end; n:=n*m;
t:=n;
for i:= to n do
begin
if i= then d[i]:= else d[i]:=inf;
heap[i].num:=i;
heap[i].dis:=d[i];
where[i]:=i;
end;
for i:= to n do
begin
x:=heap[].num;
mid:=heap[].dis;
if mid=inf then break;
y:=heap[t].num;
where[y]:=;
swap(heap[],heap[t]);
dec(t);
sift();
p:=w[x];
while p<>nil do
begin
y:=p^.po;
if d[y]>mid+p^.len then
begin
d[y]:=mid+p^.len;
k:=where[y];
heap[k].dis:=d[y];
up(k);
end;
p:=p^.next;
end;
end;
writeln(d[n]::);
end.
poj3037的更多相关文章
- 【POJ3037】Skiing 最短路
题意: 有个n*m的滑雪场,bessie要从(1,1)滑到(n,m),问最小时间. 起始有一个速度v,然后每从一个点A到一个点B(仅仅能上下左右走,每次一格),速度就会乘上2^(权值A-权值B). 然 ...
- POJ3037 Skiing
Skiing 题目大意: 给定一个M*N的网格,已知在每个网格中的点可以向上下左右四个方向移动一个单位,每个点都有一个高度值. 从每个点开始移动时存在一个速度值,从A点移动到B点,则此时B点的速度为& ...
- poj练习题的方法
poj1010--邮票问题 DFSpoj1011--Sticks dfs + 剪枝poj1020--拼蛋糕poj1054--The Troublesome Frogpoj1062--昂贵的聘礼poj1 ...
- POJ 3037 Skiing(如何使用SPFA求解二维最短路问题)
题目链接: https://cn.vjudge.net/problem/POJ-3037 Bessie and the rest of Farmer John's cows are taking a ...
随机推荐
- HeadFirst设计模式-前言总结
1 鸭子抽象类 class Duck { quack(); swim(); virtual display()=0 }; 现在如果让鸭子能够飞 class Duck { quack(); swim() ...
- mysql 相关环境配置
1. mysql 版本要求 5.5 以上, 否则不支持 emoji 表情. $ sudo apt-get install mysql-server $ sudo vim /etc/mysql/my.c ...
- bat文件的妙用1-一键开启所有开发软件
每天早上来的第一件事情,就是打开电脑,然后开一堆的软件 1.wamp 开发环境 2.钉钉 通讯工具 3.PHPstrom 开发工具 4.nodejs.bat Nodejs的扩展(node D:/w ...
- Yii 关于 find findAll 查找出制定的字段的方法
总所周知 modelName::model() -> find() //找出的是一个对象 modelName::model() -> findALL() //找出的是一个对象集合的数组 如 ...
- Javascript中的迭代、归并方法
迭代方法 在Javascript中迭代方法个人觉得尤为重要,在很多时候都会有实际上的需求,javascript提供了5个迭代方法来供我们操作,它们分别为: every() 对数组中的每一个项运用给定的 ...
- jtemplate使用笔记
最近的项目中用到了jtemplate, 它是客户端基于javascript的模板引擎,绑定的数据为json对象.以前我在页面上显示数据列表时最喜欢用Repeater控件了,因为它相对与其它几个服务端控 ...
- Linux是一门真正的黑客高手艺术
黑客这个词从诞生到现在,从来就没有解释为“高级入侵者”.“病毒制造者”或者“QQ盗号者”过.我至今不清楚在中国是谁先把黑客和这些无聊的词汇联系在了一起,导致如此多的人被误导.但有一点是肯定的,不负责任 ...
- (转载)delphi 中如何调用sql 存储过程
delphi 中如何调用sql 存储过程 使用TADOStoredProc组件,可以,给你举个例子好了 with ADOStoredProc1 do begin Close; Parameters.C ...
- Oracle datafile特殊字符处理
1.发现数据库的数据文件有特殊字符: 2.尝试在sqlplus下用将tablespace offline后修改 SQL> alter tablespace WST_DATA rename dat ...
- TypeScript学习指南第二章--接口(Interface)
接口(Interface) TypeScript的核心机制之一在于它的类型检查系统(type-checker)只关注一个变量的"模型(shape)" 稍后我们去了解这个所谓的形状是 ...