您的位置:首页 > 其它

poj 2502最短路subway

2016-05-26 11:39 501 查看
题目大体意思:

有一个人要去学校,一共有两种出行方式。

分别是:1.走路10km/h

2.坐地铁40km/h

已知 家、地铁站、学校的坐标。

求最短时间

这道题的大体方法是dijkstra,先求出他在个路段的时间注意要化成米,在裸dijkstra,要注意d和ans数组要定义成double。

# include<stdio.h>
# include<stdlib.h>
# include<math.h>//应为要用sqrt所以要开math
double d[1010][1010],ans[1000000],t[10000],x[10000],y[10000];
char s[10000];
int main(){
int n,i,j,k,l=1,sum=0,x1,x2,y1,y2,b,c,s=0;
double m,o;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);//读入学校坐标和家坐标
x[1]=x1; y[1]=y1;
while(scanf("%d%d",&b,&c)!=EOF){
if(b==-1 && c==-1){
s=0;
continue;
}
x[++l]=b; y[l]=c;
if(s==1){

d[l][l-1]=sqrt((x[l]-x[l-1])*(x[l]-x[l-1])+(y[l]-y[l-1])*(y[l]-y[l-1]))*60.0/40000.0;//求地铁时间
d[l-1][l]=d[l][l-1];
}
s=1;
}
x[++l]=x2;y[l]=y2;

for(i=1;i<=l;i++)
for(j=1;j<=l;j++){
m=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]))*60.0/10000.0;//步行时间
if(!d[i][j])d[i][j]=m;
else{
d[i][j]=m<d[i][j]?m:d[i][j];
}
}
for(i=1;i<=l;i++)ans[i]=1000000000.0;//裸dijkstra
ans[1]=0;
for(i=1;i<=l;i++){
o=1000000000.0;
for(j=1;j<=l;j++){
if(!t[j]&&ans[j]<o){
o=ans[j];
k=j;
}
}
t[k]=1;
for(j=1;j<=l;j++){
if(!t[j] && d[k][j] && ans[j]>ans[k]+d[k][j]){
ans[j]=ans[k]+d[k][j];
}
}
}
sum=(int)(ans[l]+0.5);//四舍五入
printf("%d\n",sum);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dijkstra poj