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 ...
随机推荐
- C++学习之路,漫长而遥远
一.C/C++语言 如果你的基础很差, 建议不要一开始就学C++语言,从C开始学起,对程序有个初步的认识,循序渐进.C语言的书嘛,先买一本 300 页以内的,把书中的每一个例子都通过键盘敲打进去到 V ...
- 九度OJ 1510 替换空格
题目地址:http://ac.jobdu.com/problem.php?pid=1510 题目描述: 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We ...
- RabbitMQ RPC问题
1.服务器端代码:https://github.com/rabbitmq/rabbitmq-tutorials/blob/master/python/rpc_server.py 2.客户端代码:htt ...
- [C#]对象深拷贝
关键代码: /// <summary> /// 对象深拷贝 /// </summary> /// <typeparam name="T">泛型& ...
- if (!floor) 小明.跳楼(); 请问小明会在哪些楼层跳楼?
博客已经迁移到www.imyzf.com,本站不再更新,请谅解! 看到标题请先思考一下这个奇葩的问题..答案在文章最后揭晓.. 会出现这个问题的起源是这样的,一个同学问我: int main() { ...
- 如何在JS中获取Request方法
方法 function GetRequest() { var url = location.search; //获取url中"?"符后的字串 var theRequest = ne ...
- 一步步学习ASP.NET MVC3 (1)——基础知识
请注明转载地址:http://www.cnblogs.com/arhat 首先在这里我想声明一下,这个ASP.NET MVC3系列是我在授课过程中的一些经验,有什么不对的地方,请大家指出,我们共同的学 ...
- iOS 页面间传值 之 单例传值 , block 传值
ios 页面间传值有许多,前边已经分享过属性传值和代理传值,今天主要说一下单例传值和 block 传值 单例传值:单例模式一种常用的开发的模式,单例因为在整个程序中无论在何时初始化对象,获取到的都是同 ...
- CSS的绝对定位和相对定位
css定位标签position包括两个值:relative(相对定位)和absolute(绝对定位),position样式一般都是和top.bottom.left.right一起使用来确定一个标签的位 ...
- GC的代机制
1.代为CLR垃圾回收器采用的一种机制,基于以下几点假设:对象越新,生存期越短:对象越老,生存期越长: 2.托管堆仅支持3代(GC.MaxGeneration,第0代.第1代.第2代),CLR初始化会 ...