题目大意:有个小朋友要从家里到学校,可以通过走路或者乘地铁的方式到达,走路每小时10KM,乘地铁每小时40KM,他可以走路+换乘地铁等多种方式到达,给出家,地铁站和学校的坐标,请问他到达学校的最短时间是多少分钟(四舍五入),假设没有等待地铁时间。
题解:本题是一道要转换模型的最短路题,要将距离转化成时间,将家,每个地铁站,学校转换成点,最后求家到学校的最短时间,需要注意的是,地铁线不是直的,譬如1~2,2~3是距离/40KM/H,但是1~3不是。代码如下:
#include<stdio.h> #include<stdlib.h> #include<math.h> const int maxn=210; const double inf=100000000.0; struct point{ int x,y; }; double a[maxn][maxn],d[maxn]; int p[maxn]; struct point e[maxn]; double dist(int x1,int y1,int x2,int y2){ return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } int main(){ int i,j,k,m,n; int sx,sy,tx,ty; int x,y,s; scanf("%d%d%d%d",&sx,&sy,&tx,&ty); e[1].x=sx;e[1].y=sy; n=1;s=0; while(scanf("%d%d",&x,&y)!=EOF){ if(x==-1 && y==-1){ s=0; continue; } n++; e[n].x=x;e[n].y=y; if(s){ a[n][n-1]=dist(e[n-1].x,e[n-1].y,e[n].x,e[n].y)*60/40000; a[n-1][n]=a[n][n-1]; } s=1; } n++; e[n].x=tx;e[n].y=ty; double ds; for(i=1;i<=n;i++) for(j=1;j<=n;j++){ ds=dist(e[i].x,e[i].y,e[j].x,e[j].y)*60.0/10000.0; if(!a[i][j]) a[i][j]=ds; else a[i][j]=ds<a[i][j]?ds:a[i][j]; } for(i=1;i<=n;i++)d[i]=inf; d[1]=0; double mins; for(i=1;i<=n;i++){ mins=inf; for(j=1;j<=n;j++) if(!p[j] && d[j]<mins){ mins=d[j]; k=j; } p[k]=1; for(j=1;j<=n;j++) if(!p[j] && a[i][j]!=0 && d[j]>d[k]+a[k][j]) d[j]=d[k]+a[k][j]; } int ans=(int)(d[n]+0.5); printf("%d ",ans); system("pause"); return 0; }