poj3037
只有一点转化就是一路上的速度在每一段是有变化的,但是实质上到达每一点的速度是一定的v*2^(1-h),那么也就是边权确定,可以用spfa求解,还有一点就是初始化要大,应为可以-25 <= E <= 25,也就是可能存在2^(50)这种数据。
View Code
1 #include <stdio.h>
2 #include <string.h>
3 #include <math.h>
4 #include <queue>
5 using std::queue;
6 #define INF 11258999068426240000
7 #define MAXN 11000
8 #define clup(i,j) ((i)*(c+2)+(j))
9 struct node
10 {
11 int d,next;
12 double c;
13 }edge[5*MAXN];
14 int head[2*MAXN],p;
15 bool vis[2*MAXN];
16 double dist[2*MAXN];
17 int v,r,c,h;
18 queue <int> q;
19 void add(int a,int b,double c)
20 {
21 edge[p].d=b;
22 edge[p].c=c;
23 edge[p].next=head[a];
24 head[a]=p++;
25 }
26 void spfa()
27 {
28 vis[clup(1,1)]=true;
29 q.push(clup(1,1));
30 dist[clup(1,1)]=0;
31 int k;
32 while(!q.empty())
33 {
34 k=q.front();
35 q.pop();
36 vis[k]=false;
37 for(int i=head[k];i!=-1;i=edge[i].next)
38 if(dist[edge[i].d]>dist[k]+edge[i].c)
39 {
40 dist[edge[i].d]=dist[k]+edge[i].c;
41 if(!vis[edge[i].d])
42 {
43 vis[edge[i].d]=true;
44 q.push(edge[i].d);
45 }
46 }
47 }
48 }
49 int main()
50 {
51 //freopen("test.txt","r",stdin);
52 while(scanf("%d %d %d",&v,&r,&c)==3)
53 {
54 memset(head,-1,sizeof(head));
55 memset(vis,false,sizeof(vis));
56 p=0;
57 for(int i=1,a;i<=r;++i)
58 for(int j=1;j<=c;++j)
59 {
60 scanf("%d",&a);
61 if(i==1&&j==1) h=a;
62 add(clup(i,j),clup(i-1,j),pow(2.0,(double)(a-h))/v);
63 add(clup(i,j),clup(i,j-1),pow(2.0,(double)(a-h))/v);
64 add(clup(i,j),clup(i+1,j),pow(2.0,(double)(a-h))/v);
65 add(clup(i,j),clup(i,j+1),pow(2.0,(double)(a-h))/v);
66 }
67 for(int i=0;i<=(r+2)*(c+2);dist[i++]=INF);
68 spfa();
69 printf("%.2f\n",dist[clup(r,c)]);
70 }
71 return 0;
72 }