POJ 2502 SUBWAY(最短路)

Posted tombraider-shadow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2502 SUBWAY(最短路)相关的知识,希望对你有一定的参考价值。

                                                                     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;

 

以上是关于POJ 2502 SUBWAY(最短路)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2502 Subway-经过预处理的最短路

POJ 2502 Subway ( 最短路 && 最短路建图 )

Subway---poj2502(最短路)

Subway POJ - 2502 最短路

最短路Subway POJ - 2502

POJ - 2502 Subway