L - Subway POJ - 2502 建图

题意

第一行给定 两个x y 坐标表分别示 家 和 学校 的位置

后边每一行表示一条地铁线的多个站点坐标  , 同一地铁线的站点间可以做地铁到达,不同地铁线间只能先步行到比较近的站点再坐地铁。输出从家到达学校的最短时间。

思路

算出所有站点到其他任意站点的时间,以时间代替路程

注意

给的速度是  km/h  给的坐标是以 为单位 而要求的时间是以 分钟 为单位  记得转换单位

建图时要注意坐标

本题的输入比较特殊  想看运行结果需要在输入完数据后按  Ctrl+z 然后按回车键

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define inf 0x3f3f3f3f
using namespace std;
double map[305][305],d[305];
int n=305;
bool vis[305];
struct node
{
    int x,y;
}p[2000];
int main()
{
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=n;j++)
        {
            if(i==j)
                map[i][i]=0;
            else
                map[i][j]=map[j][i]=inf;
        }
    }
    scanf("%d%d%d%d",&p[0].x,&p[0].y,&p[1].x,&p[1].y);
    int m,k;
    m=k=2;
   while(~scanf("%d%d",&p[m].x,&p[m].y))
    {
        if(p[m].x==-1 && p[m].y==-1)
        {
            k=m;
            continue;
        }
        if(k!=m)
        {
            map[m][m-1]=map[m-1][m]=(sqrt(1.0*(p[m].x-p[m-1].x)*(p[m].x-p[m-1].x)+1.0*(p[m].y-p[m-1].y)*(p[m].y-p[m-1].y)))*3.0/2000;
        }
        m++;
    }
    for(int i=0;i<=m;i++)
    {
        for(int j=0;j<=m;j++)
        {
            if(map[i][j]==inf)
                map[i][j]=map[j][i]=(sqrt(1.0*(p[i].x-p[j].x)*(p[i].x-p[j].x)+1.0*(p[i].y-p[j].y)*(p[i].y-p[j].y)))*3.0/500;
        }
    }
    for(int i=0;i<=m;i++)
    {
        d[i]=map[0][i];
        vis[i]=0;
    }
    int u;
    double minn;
    for(int i=0;i<m;i++)
    {
        minn=inf;
        for(int j=0;j<=m;j++)
        {
            if(!vis[j]&&d[j]<minn)
                minn=d[u=j];
        }
        if(minn==inf)
            break;
        vis[u]=1;
        for(int j=0;j<=m;j++)
        {
            if(!vis[j] && d[j]>d[u]+map[u][j])
                d[j]=d[u]+map[u][j];
        }
    }
    printf("%.0lf\n",d[1]);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41837216/article/details/82902947