首先到每个点的速度实际上是一个定值,就是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].dis0 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.