从家到学校,可以步行,可以地铁,最少时间?典型的最短路径。令人纠结的是输入的处理非常的麻烦啊!
迄今为止,我感觉输入最麻烦的一个吧!!!
注意三点:
一、每两点可达,即使没有地铁,也可以步行的;
二、相邻地铁可达,不相邻不用管(换乘);
三、地铁线不一定是直的。(这个没注意到,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));
}