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 ...
随机推荐
- JS原型与原型链终极详解(转)
JavaScript原型及原型链详解 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object,Function 是JS自带的函数对象. ...
- 英语中的 姓氏/Surname
.Chomsky (Belarusian: Хомскі, Russian: Хомский, Ukrainian: Хомський, Hebrew: חומסקי, "from (V ...
- HDOJ 1176 免费馅饼 -- 动态规划
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1176 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小 ...
- C#语法需要注意的地方
笔试中遇到的一些C#语法方面的问题,由于平时很少用到,笔试的时候模棱两可,现在做一个笔记. using System; using System.Collections.Generic; using ...
- Json概述以及python对json的相关操作《转》
什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...
- Javascript中的迭代、归并方法
迭代方法 在Javascript中迭代方法个人觉得尤为重要,在很多时候都会有实际上的需求,javascript提供了5个迭代方法来供我们操作,它们分别为: every() 对数组中的每一个项运用给定的 ...
- Control character in cookie value, consider BASE64 encoding your value , java操作cookie遇到中文会报错的解决方案
项目当中用到cookie保存中文,但是会报如下错误: Control character in cookie value, consider BASE64 encoding your value 大概 ...
- Django基本操作命令
1.新建一个django项目 django-admin.py startproject project-name 2.新建一个app python manage.py startapp app-nam ...
- linux点滴:rsync
rsync(remote sync)是一款远程同步工具,可以实现全量备份.增量备份.本地备份.删除,核心功能是远程数据备份. 工作原理 rsync核心算法 1.分块checksum算法 首先,把文件平 ...
- CGAL Manual/tutorial_hello_world.html
Hello World Author CGAL Editorial Board 本教程是为知道C++和几何算法的基本知识的CGAL新手准备的.第一节展示了如何特化点和段CGAL类,以及如何应用几何谓词 ...