poj 2502最短路subway

题目大体意思:

有一个人要去学校,一共有两种出行方式。
 分别是:1.走路10km/h
               2.坐地铁40km/h
已知 家、地铁站、学校的坐标。
求最短时间

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

# include
# include
# include//应为要用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]=mfor(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]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; 
}

你可能感兴趣的:(C,题解,最短路算法)