您的位置:首页 > 其它

poj 3037(最短路)

2012-08-29 17:14 302 查看
题意:

Bessie在一个row*col的矩形区域内滑雪,起点为左上角,已知初始速度v,从a点到b点时,速度变为v(a)*2^(A-B)(A,B为对应点的高度),从a到b所需的时间为a的速度的倒数,她可向前后左右四个方向移动,求其到右下角的最少时间。

分析:

每点的速度是固定的:例如从a->b->c;则c出发的速度就是V*2^(A-B)*2^(B-C)=V*2^(A-C);时间则是速度的倒数。

注意:

1、inf要足够大

2、因为矩阵内的值范围[-25,25],如果用1<<x的方式求2的幂,很显然这个数会整数超出范围。所以要用
__int64
t=1;


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>

usingnamespacestd;

#defineinf99999999999LL
intdx[]={0,0,-1,1};
intdy[]={-1,1,0,0};

structpoint
{
intx;
inty;
};

doubledis[103][103];
intmap[103][103];
boolvis[103][103];
intV,R,C;

boolisok(pointpo)
{
if(po.x>0&&po.x<=R&&po.y>0&&po.y<=C)
returntrue;
returnfalse;
}

voidspfa(intr,intc,intv)
{
queue<point>Q;
__int64t=1;
doublek;
dis[1][1]=0;
pointp={1,1};
Q.push(p);
vis[1][1]=1;
while(!Q.empty())
{
p=Q.front();
Q.pop();
vis[p.x][p.y]=0;
ints=map[1][1]-map[p.x][p.y];
if(s>=0)
k=(t<<s)*v;
else
k=1.0/(t<<(-s))*v;
for(inti=0;i<4;i++)
{
pointnext;
next.x=p.x+dx[i];
next.y=p.y+dy[i];
if(isok(next))
{
if(dis[next.x][next.y]>dis[p.x][p.y]+1.0/k)
{
dis[next.x][next.y]=dis[p.x][p.y]+1.0/k;
if(!vis[next.x][next.y])
{
vis[next.x][next.y]=1;
Q.push(next);
}
}
}
}
}
}

intmain()
{
while(scanf("%d%d%d",&V,&R,&C)!=EOF)
{
memset(vis,0,sizeof(vis));
for(inti=1;i<=R;i++)
for(intj=1;j<=C;j++)
{
scanf("%d",&map[i][j]);
dis[i][j]=inf;
}
spfa(R,C,V);
printf("%.2f\n",dis[R][C]);

}
return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: