题意:在一个城市里,分布着若干条地铁线路,每条地铁线路有若干个站点,所有地铁的速度均为40km/h。现在你知道了出发地和终点的坐标,以及这些地铁 线路每个站点的坐标,你的步行速度为10km/h,且你到了地铁的任意一个站之后就刚好有地铁出发。问你从出发点到终点最少需要多少时间。
有很多站点,给的数据只是一条条线路,所以需要先预处理数据,增加任意两点人走需要的时间。数据预先处理比较麻烦......
#include<stdio.h> #include<vector> #include<stack> #include<algorithm> #include< string.h> #include<math.h> using namespace std; const int maxn = 100005; const int oo = 0xfffffff; const double vs = 40* 1000/ 60.0; // 每分钟走多少米 const double vp = 10* 1000/ 60.0; struct node { int u, v, next; double c; // 两点之间所需时间 }e[maxn]; struct point { int x, y; }p[ 1005]; int nPoint, head[ 1005]; double dis[ 1005]; bool vis[ 1005]; double Len(point a, point b, double v) { return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) ) / v; } void Add( int u, int v, double len, int k) { e[k].u = u; e[k].v = v; e[k].c = len; e[k].next = head[u]; head[u] = k; } void spfa() { stack< int> sta; sta.push( 1); while(sta.size()) { int i = sta.top();sta.pop(); vis[i] = false; for( int j=head[i]; j!= 0; j=e[j].next) { int u = e[j].u, v = e[j].v; double c = e[j].c; if(dis[u]+c < dis[v]) { dis[v] = dis[u] + c; if(vis[v] == false) { vis[v] = true; sta.push(v); } } } } } int main() { int i, j, flag= 0, k= 1; scanf( " %d%d%d%d ", &p[ 1].x, &p[ 1].y, &p[ 2].x, &p[ 2].y); nPoint = 3; while(scanf( " %d%d ", &p[nPoint].x, &p[nPoint].y) != EOF) { if(p[nPoint].x != - 1) { if(flag == 0) flag = 1; else { double c = Len(p[nPoint], p[nPoint- 1], vs); Add(nPoint, nPoint- 1, c, k++); Add(nPoint- 1, nPoint, c, k++); } nPoint++; } else flag = 0; } for(i= 1; i<nPoint; i++) for(j=i+ 1; j<=nPoint; j++) { double c = Len(p[i], p[j], vp); Add(i, j, c, k++); Add(j, i, c, k++); } for(i= 2; i<nPoint; i++) dis[i] = oo; spfa(); printf( " %.0f\n ", dis[ 2]); return 0; }