poj 2502最短路subway

39 篇文章 0 订阅
3 篇文章 0 订阅

题目大体意思:

有一个人要去学校,一共有两种出行方式。
 分别是: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; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值