首先到每个点的速度实际上是一个定值,就是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的更多相关文章

  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. java集合 collection-list-LinkedList

    import java.util.*; /* LinkedList:特有方法: addFirst(); addLast(); getFirst(); getLast(); 获取元素,但不删除元素.如果 ...

  2. Pascal Language: Recommended Materials

    Recommended materials: http://www.marcocantu.com/epascal/

  3. 解决VS2008打开假死或者打开设计模式假死的问题

    我昨天刚装完OFFICE 2010一直也没重启,vs2008是可以使用的.今早来到办公室,打开工程发现开了半天VS2008一般空白,查看应用程序显示正在运行,再查看进程发现里面多一个setup.exe ...

  4. 不使用border-radius,实现一个可复用的高度和宽度都自适应的圆角矩形

    现在css3支持圆角矩形,但是为了兼容性问题,虽然比较麻烦,但还是有必要了解一下以下方法. 在一个div内,包含8个div,控制这个8个div的height.margin以及border属性值,以达到 ...

  5. mysql 查看数据库大小

    select table_schema, concat(truncate(sum(data_length)/1024/1024,2),' mb') as data_size,concat(trunca ...

  6. 机器学习实战:数据预处理之独热编码(One-Hot Encoding)

    问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的三个特征: ["male", "female"] ["from ...

  7. python with关键字学习

    1.with语句时用于对try except finally 的优化,让代码更加美观, 例如常用的开发文件的操作,用try except finally 实现: f=open('file_name', ...

  8. Python设计模式——代理模式(Proxy)

    书中的例子是:男A喜欢女A,但是不敢向其表白,所以委托男B为代理,代他送礼物给女A,实现这个需求的重点是,男A和女A是不互相直接接触的,都是通过代理男B,实现间接接触. #encoding=utf-8 ...

  9. 【BZOJ】1925: [Sdoi2010]地精部落 DP+滚动数组

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1925 题意:输入一个数N(1 <= N <= 4200),问将这些数排列成折线 ...

  10. 【Groovy】入门布道ppt

    Groovy Outline• Hello world• Smooth Java integration• Flat learning curve• Powerful features 跟 Java ...