POJ2502 subway(spfa)

来源:互联网 发布:npm 淘宝镜像安装教程 编辑:程序博客网 时间:2024/05/29 10:05

题意:

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

思路:

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

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


原创粉丝点击