L - Subway - POJ 2502

题意:在一个城市里,分布着若干条地铁线路,每条地铁线路有若干个站点,所有地铁的速度均为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;
}

 

你可能感兴趣的:(poj)