题意
第一行给定 两个x y 坐标表分别示 家 和 学校 的位置
后边每一行表示一条地铁线的多个站点坐标 , 同一地铁线的站点间可以做地铁到达,不同地铁线间只能先步行到比较近的站点再坐地铁。输出从家到达学校的最短时间。
思路
算出所有站点到其他任意站点的时间,以时间代替路程
注意
给的速度是 km/h 给的坐标是以 米 为单位 而要求的时间是以 分钟 为单位 记得转换单位
建图时要注意坐标
本题的输入比较特殊 想看运行结果需要在输入完数据后按 Ctrl+z 然后按回车键
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define inf 0x3f3f3f3f
using namespace std;
double map[305][305],d[305];
int n=305;
bool vis[305];
struct node
{
int x,y;
}p[2000];
int main()
{
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
if(i==j)
map[i][i]=0;
else
map[i][j]=map[j][i]=inf;
}
}
scanf("%d%d%d%d",&p[0].x,&p[0].y,&p[1].x,&p[1].y);
int m,k;
m=k=2;
while(~scanf("%d%d",&p[m].x,&p[m].y))
{
if(p[m].x==-1 && p[m].y==-1)
{
k=m;
continue;
}
if(k!=m)
{
map[m][m-1]=map[m-1][m]=(sqrt(1.0*(p[m].x-p[m-1].x)*(p[m].x-p[m-1].x)+1.0*(p[m].y-p[m-1].y)*(p[m].y-p[m-1].y)))*3.0/2000;
}
m++;
}
for(int i=0;i<=m;i++)
{
for(int j=0;j<=m;j++)
{
if(map[i][j]==inf)
map[i][j]=map[j][i]=(sqrt(1.0*(p[i].x-p[j].x)*(p[i].x-p[j].x)+1.0*(p[i].y-p[j].y)*(p[i].y-p[j].y)))*3.0/500;
}
}
for(int i=0;i<=m;i++)
{
d[i]=map[0][i];
vis[i]=0;
}
int u;
double minn;
for(int i=0;i<m;i++)
{
minn=inf;
for(int j=0;j<=m;j++)
{
if(!vis[j]&&d[j]<minn)
minn=d[u=j];
}
if(minn==inf)
break;
vis[u]=1;
for(int j=0;j<=m;j++)
{
if(!vis[j] && d[j]>d[u]+map[u][j])
d[j]=d[u]+map[u][j];
}
}
printf("%.0lf\n",d[1]);
return 0;
}