博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj3037
阅读量:6202 次
发布时间:2019-06-21

本文共 2711 字,大约阅读时间需要 9 分钟。

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

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

不难想到构图最短路径

1 const dx:array[1..4] of integer=(-1,1,0,0);  2       dy:array[1..4] of integer=(0,0,-1,1);  3       inf=999999999999;  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[0..110,0..110] of longint; 17     d:array[0..10010] of double; 18     w:array[0..10010] of link; 19     heap:array[0..10010] of point; 20     where:array[0..10010] 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:=1; 47     if x>0 then 48     begin 49       for i:=1 to x do 50         calc:=calc*2; 51     end 52     else if x<0 then 53     begin 54       for i:=1 to abs(x) do 55         calc:=calc/2; 56     end; 57   end; 58  59 procedure sift(i:longint); 60   var j,x,y:longint; 61   begin 62     j:=i shl 1; 63     while j<=t do 64     begin 65       if (j+1<=t) and (heap[j].dis>heap[j+1].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 1; 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 1; 84     while j>0 do 85     begin 86       if heap[i].dis
0 then add(num[i,j],num[x,y],1/vn);120       end;121     end;122 123   n:=n*m;124   t:=n;125   for i:=1 to n do126   begin127     if i=1 then d[i]:=0 else d[i]:=inf;128     heap[i].num:=i;129     heap[i].dis:=d[i];130     where[i]:=i;131   end;132   for i:=1 to n do133   begin134     x:=heap[1].num;135     mid:=heap[1].dis;136     if mid=inf then break;137     y:=heap[t].num;138     where[y]:=1;139     swap(heap[1],heap[t]);140     dec(t);141     sift(1);142     p:=w[x];143     while p<>nil do144     begin145       y:=p^.po;146       if d[y]>mid+p^.len then147       begin148         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]:0:2);157 end.
View Code

 

转载于:https://www.cnblogs.com/phile/p/4473202.html

你可能感兴趣的文章
paper 101:图像融合算法及视觉艺术应用
查看>>
绘图笔记
查看>>
MySQL replace into 用法(insert into 的增强版)
查看>>
CMP-5013A Architectures and Operating Systems
查看>>
html5,单击文字自动获得焦点
查看>>
Android Volley
查看>>
科技发烧友之单反佳能700d中高端
查看>>
NANDflash和NORflash的区别(设计师在使用闪存时需要慎重选择)
查看>>
直接插入排序算法的学习
查看>>
<记录> PHP监控进程状态,完成掉线自动重启
查看>>
去掉二级页面 tabs 菜单, 修改返回按钮
查看>>
大白话系列之C#委托与事件讲解(二)
查看>>
c# 扩展方法奇思妙用高级篇四:对扩展进行分组管理
查看>>
Dev GridControl GridView常用属性
查看>>
铁大好青年一队项目总结
查看>>
Linux下常用命令
查看>>
Python 正则表达式学习
查看>>
快速排序、堆排序、归并排序----算法小结
查看>>
python学习笔记:(四)tuple(元组)常用方法
查看>>
___________________________________温故而知新_____________
查看>>