题意:给出家和学校的坐标,从家出发,沿途经过地铁站,一些地铁站是一条线上的,可以如果到地铁站的话,可以随便上车,步行和地铁的速度也给出,求家到学校的最短时间。
注意:地铁线不一定是直的,所以只要在一条地铁线并且是相邻的两站那么就建乘地铁的边,否则就步行。
思路:建图+floyd
#include<iostream>
#include<cmath>
#define INF 0x7ffffff
using namespace std;
struct point
{
int x,y;
int ans;
}P[210];
double get_dist(int i,int j)
{
return sqrt(double((P[i].x-P[j].x)*(P[i].x-P[j].x)+(P[i].y-P[j].y)*(P[i].y-P[j].y)));
}
double dist[210][210];
int main()
{
point start,end;
//freopen("data.txt","r",stdin);
//freopen("shuchu.txt","w",stdout);
scanf("%d%d%d%d",&start.x,&start.y,&end.x,&end.y);
P[0].x=start.x;P[0].y=start.y;
P[0].ans=0;
int tx,ty,h=1,line=1,i,j,k,m=0;
while(scanf("%d%d",&tx,&ty)!=EOF)
{
//if(line==3) break;
if(tx==-1&&ty==-1) {line++;continue;}
P[h].x=tx;P[h].y=ty;
P[h].ans=line;
h++;
}
P[h].ans=line;
P[h].x=end.x;
P[h].y=end.y;//输入完毕
for(i=0;i<=h;i++)
{
for(j=i+1;j<=h;j++)
{
if(P[i].ans==P[j].ans&&j-i==1)//相邻地铁线需要的时间
{
dist[i][j]=dist[j][i]=get_dist(i,j)/(40000/60.0);
}
else dist[i][j]=dist[j][i]=get_dist(i,j)/(10000/60.0);//不相邻的话,不能够直接建图,只能步行、
}
}
for(i=0;i<=h;i++)
dist[i][i]=0;//建图
for(k=0;k<=h;k++)
for(i=0;i<=h;i++)
for(j=0;j<=h;j++)
if(dist[i][k]+dist[k][j]<dist[i][j])
dist[i][j]=dist[i][k]+dist[k][j];
printf("%d\n",int(dist[0][h]+0.5));
//system("pause");
}