ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

POJ 2502 SUBWAY(最短路)

2019-07-14 13:55:50  阅读:265  来源: 互联网

标签:int vis maxn SUBWAY POJ include 2502 dis


                                                                     POJ 2502 SUBWAY

题目链接:http://poj.org/problem?id=2502

题目大意:求从a点到b点所需要的最短时间。

题目思路:用最短路来求,把各个点之间的时间看作所需要的路程。然后用

dij求最短路就可以了,感觉输入有点坑,还有在每条地铁线上,只有相同地铁线上的

点可以互相到达。

#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int maxn=310;
const int inf=1e9;
struct nod
{
    double x,y;
}node[maxn];
double cost[maxn][maxn],dis[maxn];
bool vis[maxn];
void dij(int n,int u)
{
    for(int i=2;i<=n;i++)
    {
        dis[i]=inf;
    }
    int start=u;
    vis[1]=1;
        for(int i=1;i<=n;i++)
        {
          dis[i]=(cost[start][i]<=dis[i])?cost[start][i]:dis[i];    
        }  
    // printf("%d\n",start);
    for(int i=1;i<=n-1;i++)
    { //找到理起始点最近的点
     int min=9999999;
     for(int i=1;i<=n;i++)
     {

                     if(min>=dis[i]&&vis[i]==0)
            {
                min=dis[i];
                 start=i;
            }    
     } 
     vis[start]=1;
           
            for(int i=1;i<=n;i++)
    {
        if(vis[i]!=1)
        dis[i]= (dis[i]<=(dis[start]+cost[start][i]))?dis[i]:(dis[start]+cost[start][i]);
    }
    }

}
double dist(nod a,nod b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
    double v1=10000.0/60;
    double v2=40000.0/60;
    scanf("%lf%lf%lf%lf",&node[1].x,&node[1].y,&node[2].x,&node[2].y);
    int n=2;
    int cnt1=3;
    for(int i=1;i<=300;i++)
    {
        for(int j=1;j<=300;j++) 
        {
            if(i==j) cost[i][j]=0;
            else cost[i][j]=inf;
        }
    }
    double x,y;
    while(scanf("%lf%lf",&x,&y))
    {
        if(x==-1&&y==-1)
        {
            cnt1=n+1;
            break;
        }
        n++;
        node[n].x=x;
        node[n].y=y;
        if(n!=cnt1) cost[n][n-1]=cost[n-1][n]=min(cost[n][n-1],dist(node[n],node[n-1])/v2);
    }
    while(scanf("%lf%lf",&x,&y)!=EOF)
    {
        n++;
        node[n].x=x;
        node[n].y=y;
        while(scanf("%lf%lf",&x,&y)!=EOF)
        {
            if(x==-1&&y==-1) break;
                n++;
                node[n].x=x;
                node[n].y=y;
        }
        if(n!=cnt1) cost[n][n-1]=cost[n-1][n]=min(cost[n][n-1],dist(node[n],node[n-1])/v2);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cost[i][j]=min(cost[i][j],dist(node[i],node[j])/v1);
        }
    }
    dij(n,1);
    printf("%d\n",(int)(dis[2]+0.5));
    return 0;
}

 

标签:int,vis,maxn,SUBWAY,POJ,include,2502,dis
来源: https://www.cnblogs.com/tombraider-shadow/p/11184054.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有