POJ 2502(floyd)
从家到学校,可以步行,可以地铁,最少时间?典型的最短路径。令人纠结的是输入的处理非常的麻烦啊!
迄今为止,我感觉输入最麻烦的一个吧!!!
注意三点:
一、每两点可达,即使没有地铁,也可以步行的;
二、相邻地铁可达,不相邻不用管(换乘);
三、地铁线不一定是直的。(这个没注意到,WA了好几次)
代码:
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> typedef struct point { double x,y; } Point; Point p[205]; double dis[205][205]; double distance(Point a,Point b);//计算两点间距离 double floyd(int tot); int main() { double ax,bx; int i,j,k,stop; memset(dis,0,sizeof(dis)); scanf("%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y); dis[0][1] = dis[1][0] = distance(p[0],p[1]); i = 2; while(1) { if(scanf("%lf%lf",&ax,&bx) != 2) break; k = i ; do { p[i].x = ax ; p[i].y = bx ; for(j = 0 ; j < i ; ++j)//计算新的点到其余各点的距离 dis[i][j] = dis[j][i] = distance(p[i],p[j]); ++i; }while(scanf("%lf%lf",&ax,&bx)&&(ax != -1 || bx != -1)); for(j = k ; j < i-1 ; ++j)//地铁,距离缩小4倍,因为速度快4倍 dis[j][j+1] = dis[j+1][j] = distance(p[j],p[j+1])*0.25; } stop = i; printf("%.0lf\n",0.006*floyd(stop)); //换算成时间 //system("pause"); return 0; } double floyd(int tot) { int i,j,k; double t; for(k = 0 ; k < tot ; ++k) for(i = 0 ; i < tot ; ++i) for(j = 0 ; j < tot ; ++j) { if(dis[i][k] && dis[k][j]) { t = dis[i][k] + dis[k][j]; if(t < dis[i][j]) dis[i][j] = t; } } return dis[0][1]; } double distance(Point a,Point b) { return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); }