当前位置: 代码迷 >> 综合 >> POJ2502 subway(spfa)
  详细解决方案

POJ2502 subway(spfa)

热度:30   发布时间:2023-11-06 18:39:42.0

题意:

给出多条地铁的路线以及人和车的速度,求起点到终点的最短时间(可以在任意站点上下车)。

思路:

关键在于人和车速度不同的处理,因为人走路比地铁慢,所以在输入地铁站点的时候,就可计算出每两个站点之间花费的时间,不会影响到后面的松弛操作。

之后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;
}