zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",(int)(dis[2]+0.5));
        return 0;
    }
  • 相关阅读:
    组合模式
    C#+ArcEngine中com对象的释放问题
    备忘录模式
    C#中的DataSet添加DataTable问题
    jenkins从节点
    jenkins Publish over SSH
    jenkins凭据
    jenkins maven项目
    jenkins部署-docker
    zabbix api
  • 原文地址:https://www.cnblogs.com/tombraider-shadow/p/11184054.html
Copyright © 2011-2022 走看看