首先到每个点的速度实际上是一个定值,就是v0*2^(起点与当前点高度差)

所以当前点i到任意一个相邻点的时间都是一个定值,

不难想到构图最短路径

  1. const dx:array[..] of integer=(-,,,);
  2.       dy:array[..] of integer=(,,-,);
  3.       inf=;
  4.  
  5. type link=^node;
  6.      node=record
  7.        po:longint;
  8.        len:double;
  9.        next:link;
  10.      end;
  11.      point=record
  12.        num:longint;
  13.        dis:double;
  14.      end;
  15.  
  16. var num,a:array[..,..] of longint;
  17.     d:array[..] of double;
  18.     w:array[..] of link;
  19.     heap:array[..] of point;
  20.     where:array[..] of longint;
  21.     t,i,j,n,m,k,x,y:longint;
  22.     v,vn,mid:double;
  23.     p:link;
  24.  
  25. procedure add(x,y:longint;c:double);
  26.   var p:link;
  27.   begin
  28.     new(p);
  29.     p^.po:=y;
  30.     p^.len:=c;
  31.     p^.next:=w[x];
  32.     w[x]:=p;
  33.   end;
  34.  
  35. procedure swap(var a,b:point);
  36.   var c:point;
  37.   begin
  38.     c:=a;
  39.     a:=b;
  40.     b:=c;
  41.   end;
  42.  
  43. function calc(x:longint):double;
  44.   var i:longint;
  45.   begin
  46.     calc:=;
  47.     if x> then
  48.     begin
  49.       for i:= to x do
  50.         calc:=calc*;
  51.     end
  52.     else if x< then
  53.     begin
  54.       for i:= to abs(x) do
  55.         calc:=calc/;
  56.     end;
  57.   end;
  58.  
  59. procedure sift(i:longint);
  60.   var j,x,y:longint;
  61.   begin
  62.     j:=i shl ;
  63.     while j<=t do
  64.     begin
  65.       if (j+<=t) and (heap[j].dis>heap[j+].dis) then inc(j);
  66.       if heap[i].dis>heap[j].dis then
  67.       begin
  68.         x:=heap[i].num;
  69.         y:=heap[j].num;
  70.         where[x]:=j;
  71.         where[y]:=i;
  72.         swap(heap[i],heap[j]);
  73.         i:=j;
  74.         j:=i shl ;
  75.       end
  76.       else break;
  77.     end;
  78.   end;
  79.  
  80. procedure up(i:longint);
  81.   var j,x,y:longint;
  82.   begin
  83.     j:=i shr ;
  84.     while j> do
  85.     begin
  86.       if heap[i].dis<heap[j].dis then
  87.       begin
  88.         x:=heap[i].num;
  89.         y:=heap[j].num;
  90.         where[x]:=j;
  91.         where[y]:=i;
  92.         swap(heap[i],heap[j]);
  93.         i:=j;
  94.         j:=j shr ;
  95.       end
  96.       else break;
  97.     end;
  98.   end;
  99.  
  100. begin
  101.   readln(v,n,m);
  102.   for i:= to n do
  103.   begin
  104.     for j:= to m do
  105.     begin
  106.       read(a[i,j]);
  107.       inc(k);
  108.       num[i,j]:=k;
  109.     end;
  110.   end;
  111.   for i:= to n do
  112.     for j:= to m do
  113.     begin
  114.       vn:=v*calc(a[,]-a[i,j]);
  115.       for k:= to do
  116.       begin
  117.         x:=i+dx[k];
  118.         y:=j+dy[k];
  119.         if num[x,y]> then add(num[i,j],num[x,y],/vn);
  120.       end;
  121.     end;
  122.  
  123.   n:=n*m;
  124.   t:=n;
  125.   for i:= to n do
  126.   begin
  127.     if i= then d[i]:= else d[i]:=inf;
  128.     heap[i].num:=i;
  129.     heap[i].dis:=d[i];
  130.     where[i]:=i;
  131.   end;
  132.   for i:= to n do
  133.   begin
  134.     x:=heap[].num;
  135.     mid:=heap[].dis;
  136.     if mid=inf then break;
  137.     y:=heap[t].num;
  138.     where[y]:=;
  139.     swap(heap[],heap[t]);
  140.     dec(t);
  141.     sift();
  142.     p:=w[x];
  143.     while p<>nil do
  144.     begin
  145.       y:=p^.po;
  146.       if d[y]>mid+p^.len then
  147.       begin
  148.         d[y]:=mid+p^.len;
  149.         k:=where[y];
  150.         heap[k].dis:=d[y];
  151.         up(k);
  152.       end;
  153.       p:=p^.next;
  154.     end;
  155.   end;
  156.   writeln(d[n]::);
  157. end.

poj3037的更多相关文章

  1. 【POJ3037】Skiing 最短路

    题意: 有个n*m的滑雪场,bessie要从(1,1)滑到(n,m),问最小时间. 起始有一个速度v,然后每从一个点A到一个点B(仅仅能上下左右走,每次一格),速度就会乘上2^(权值A-权值B). 然 ...

  2. POJ3037 Skiing

    Skiing 题目大意: 给定一个M*N的网格,已知在每个网格中的点可以向上下左右四个方向移动一个单位,每个点都有一个高度值. 从每个点开始移动时存在一个速度值,从A点移动到B点,则此时B点的速度为& ...

  3. poj练习题的方法

    poj1010--邮票问题 DFSpoj1011--Sticks dfs + 剪枝poj1020--拼蛋糕poj1054--The Troublesome Frogpoj1062--昂贵的聘礼poj1 ...

  4. POJ 3037 Skiing(如何使用SPFA求解二维最短路问题)

    题目链接: https://cn.vjudge.net/problem/POJ-3037 Bessie and the rest of Farmer John's cows are taking a ...

随机推荐

  1. JS原型与原型链终极详解(转)

    JavaScript原型及原型链详解 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object,Function 是JS自带的函数对象. ...

  2. 英语中的 姓氏/Surname

    .Chomsky (Belarusian: Хомскі, Russian: Хомский, Ukrainian: Хомський, Hebrew: חומסקי‎‎, "from (V ...

  3. HDOJ 1176 免费馅饼 -- 动态规划

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1176 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小 ...

  4. C#语法需要注意的地方

    笔试中遇到的一些C#语法方面的问题,由于平时很少用到,笔试的时候模棱两可,现在做一个笔记. using System; using System.Collections.Generic; using ...

  5. Json概述以及python对json的相关操作《转》

    什么是json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...

  6. Javascript中的迭代、归并方法

    迭代方法 在Javascript中迭代方法个人觉得尤为重要,在很多时候都会有实际上的需求,javascript提供了5个迭代方法来供我们操作,它们分别为: every() 对数组中的每一个项运用给定的 ...

  7. Control character in cookie value, consider BASE64 encoding your value , java操作cookie遇到中文会报错的解决方案

    项目当中用到cookie保存中文,但是会报如下错误: Control character in cookie value, consider BASE64 encoding your value 大概 ...

  8. Django基本操作命令

    1.新建一个django项目 django-admin.py startproject project-name 2.新建一个app python manage.py startapp app-nam ...

  9. linux点滴:rsync

    rsync(remote sync)是一款远程同步工具,可以实现全量备份.增量备份.本地备份.删除,核心功能是远程数据备份. 工作原理 rsync核心算法 1.分块checksum算法 首先,把文件平 ...

  10. CGAL Manual/tutorial_hello_world.html

    Hello World Author CGAL Editorial Board 本教程是为知道C++和几何算法的基本知识的CGAL新手准备的.第一节展示了如何特化点和段CGAL类,以及如何应用几何谓词 ...