题解 最短路问题 POJ 2502
题意:乘坐地铁从家到学校,地铁40km/h 步行10km/h , 已知各个站点的x,y坐标,输入的信息每个列次用-1,-1隔开,要求花费的时间最少。
做法:用Dijkstra算法。数据类型为double。
代码:
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #define INF 0x3fffffff using namespace std; const int MAX=1010; struct pos{ double x,y;}dot[MAX]; double a[MAX][MAX],dis[MAX]; bool v[MAX]; int n,T,l; double x,y; double len(double x1,double x2,double y1,double y2) { return sqrt(pow((x1-x2),2)+pow((y1-y2),2)); } void Dijkstra() { int i,j,k; for(j=1;j<=n;j++) dis[j]=a[1][j]; dis[1]=0;v[1]=1; int u,cnt=0;double minn; for(k=1;k<n;k++) { minn=INF; for(i=1;i<=n;i++) if(!v[i]&&minn>dis[i]) minn=dis[i],u=i; cnt+=minn; v[u]=1; for(i=1;i<=n;i++) if(!v[i]&&(dis[i]>a[u][i]+minn)) dis[i]=a[u][i]+minn; } printf("%.0f\n",dis[n]); } int main() { int i,j,flag=1; n=1; memset(v,0,sizeof(v)); memset(a,0,sizeof(a)); double x1,y1,x0,y0; scanf("%lf%lf%lf%lf",&x0,&y0,&x1,&y1); dot[n].x=x0,dot[n].y=y0,n++; while(scanf("%lf%lf",&x,&y)!=EOF) { if(x<0||y<0) {flag=1;continue;} dot[n].x=x,dot[n].y=y; if(flag==0) a[n][n-1]=a[n-1][n]=len(dot[n].x,dot[n-1].x,dot[n].y,dot[n-1].y)*3/2000; flag=0;n++; } dot[n].x=x1,dot[n].y=y1; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(a[i][j]==0) a[i][j]=len(dot[i].x,dot[j].x,dot[i].y,dot[j].y)*3/500; Dijkstra(); return 0; }
错误:WA 输出格式必须为%.0f,原因未知(卧槽。。。)