题意:
给出多条地铁的路线以及人和车的速度,求起点到终点的最短时间(可以在任意站点上下车)。
思路:
关键在于人和车速度不同的处理,因为人走路比地铁慢,所以在输入地铁站点的时候,就可计算出每两个站点之间花费的时间,不会影响到后面的松弛操作。
之后spfa就可以求出答案。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std;
const double pr=10.0*1000/60;
const double cr=40.0*1000/60;
#define mx 100000000
int vis[202],cen;
double d[202],ma[202][202];
struct aa{
int x,y;
}cor[202];
double com(int x1,int y1,int x2,int y2){
double te=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
return sqrt(te);
}
void mem(){
memset(vis,0,sizeof(vis));
for(int i=1;i<202;i++)
d[i]=mx;
for(int i=1;i<202;i++)
for(int j=1;j<202;j++)
ma[i][j]=mx;
}
void spfa(){
queue<int>q;
q.push(1);
d[1]=0;
while(!q.empty()){
int x=q.front();
q.pop();
vis[x]=0;
for(int i=1;i<cen;i++){
if(i==x) continue;
double t= com(cor[x].x,cor[x].y,cor[i].x,cor[i].y)/pr;
t=min(t,ma[x][i]);
if(d[i]>d[x]+t){
d[i]=d[x]+t;
if(!vis[i]){
vis[i]=1;
q.push(i);
}
}
}
}
}
int main(){
scanf("%d%d%d%d",&cor[1].x,&cor[1].y,&cor[2].x,&cor[2].y);
cen=3;
mem();
int a,b,ta,tb;
while(scanf("%d%d",&a,&b)!=EOF){
cor[cen].x=a;cor[cen].y=b;
cen++;
while(scanf("%d%d",&a,&b),a!=-1&b!=-1){
cor[cen].x=a;cor[cen].y=b;
ma[cen][cen-1]=ma[cen-1][cen]=com(a,b,cor[cen-1].x,cor[cen-1].y)/cr;
cen++;
}
}
spfa();
printf("%d\n",(int)(d[2]+0.5));
return 0;
}