zoukankan      html  css  js  c++  java
  • POJ-2502_Subway

    Subway

    Time Limit: 1000MS Memory Limit: 65536K

    Description

    You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. Instead of getting to ride your bike to school every day, you now get to walk and take the subway. Because you don't want to be late for class, you want to know how long it will take you to get to school.
    You walk at a speed of 10 km/h. The subway travels at 40 km/h. Assume that you are lucky, and whenever you arrive at a subway station, a train is there that you can board immediately. You may get on and off the subway any number of times, and you may switch between different subway lines if you wish. All subway lines go in both directions.

    Input

    Input consists of the x,y coordinates of your home and your school, followed by specifications of several subway lines. Each subway line consists of the non-negative integer x,y coordinates of each stop on the line, in order. You may assume the subway runs in a straight line between adjacent stops, and the coordinates represent an integral number of metres. Each line has at least two stops. The end of each subway line is followed by the dummy coordinate pair -1,-1. In total there are at most 200 subway stops in the city.

    Output

    Output is the number of minutes it will take you to get to school, rounded to the nearest minute, taking the fastest route.

    Sample Input

    0 0 10000 1000
    0 200 5000 200 7000 200 -1 -1
    2000 600 5000 600 10000 600 -1 -1

    Sample Output

    21

    Source

    Waterloo local 2001.09.22

    题意:输入家的位置,学校的位置,然后知道几条地铁的站点,然后求到学校的时间最短时间。

    题解:这道题有点懵逼,首先是输入,没有告知地铁的条数,知道告诉每条地铁到(-1,,1)结束。也就是说地铁输入到EOF才会结束。难点就在如何输入上,剩下的就是模板了。注意他的时速单位是KM,但是坐标单位是M。注意:地铁站点只能一个站点到下一个站点。(从1站到3三站,你必须经过2站才能到3站)

    附上代码

    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <queue>
    #include <stack>
    #include <cmath>
    #include <map>
    
    using namespace std;
    const int maxn = 205;
    const int INF = 1e9+7;
    const double h = 40*1000.0/60.0;
    const double r = 10*1000.0/60.0;
    
    struct node
    {
        double x,y;
    }p[maxn];
    
    double s[maxn][maxn];
    int num;
    
    int judge(double x,double y)
    {
        int i;
        for(i=0;i<num;i++)
            if(p[i].x==x&&p[i].y==y)
                return i;
        if(i==num)
        {
            p[num].x = x;
            p[num++].y = y;
        }
        return i;
    }
    
    double get_dis(node a,node b)
    {
        return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    }
    
    void dijkstra()
    {
        double dis[maxn],MIN;
        int i,j,f[maxn],k;
        for(i=0;i<num;i++)
        {
            f[i] = 0;
            dis[i] = s[0][i];
        }
        f[0] = 1;
        for(i=0;i<num;i++)
        {
            MIN = INF;
            k = -1;
            for(j=0;j<num;j++)
            {
                if(!f[j]&&dis[j]<MIN)
                {
                    MIN = dis[j];
                    k = j;
                }
            }
            if(MIN == INF)
                break;
            f[k] = 1;
            for(j=0;j<num;j++)
                if(!f[j]&&dis[k]+s[k][j]<dis[j])
                    dis[j] = dis[k] + s[k][j];
        }
        printf("%.0f
    ",dis[1]);
    }
    
    int main()
    {
        int i,j,a,b;
        int link[maxn],n;
        double dis;
        for(i=0;i<maxn;i++)
            for(j=0;j<maxn;j++)
                s[i][j] = (i==j)?0:INF;
        node q;
        scanf("%lf%lf",&p[0].x,&p[0].y);
        scanf("%lf%lf",&p[1].x,&p[1].y);
        num = 2;
        //int k = 0;
        while(scanf("%lf%lf",&q.x,&q.y)!=EOF)
        {
            n = 0;
            link[n++] = judge(q.x,q.y);
            while(scanf("%lf%lf",&q.x,&q.y))
            {
                if(q.x==-1&&q.y==-1)
                    break;
                link[n++] = judge(q.x,q.y);
            }
            for(i=0;i<n-1;i++)
            {
                a = link[i];
                b = link[i+1];
                dis = get_dis(p[a],p[b]);
                s[a][b] = s[b][a] = min(s[a][b],dis/h);
            }
    //        for(i=0;i<n;i++)
    //        {
    //            a = link[i];
    //            cout<<a<<":";
    //            printf("%.0f %.0f
    ",p[a].x,p[a].y);
    //        }
    //        k++;
    //        if(k==2)
    //            break;
        }
        for(i=0;i<num;i++)
            for(j=0;j<i;j++)
            {
                dis = get_dis(p[i],p[j]);
                s[i][j] = s[j][i] = min(s[i][j],dis/r);
            }
    //    for(i=0;i<num;i++)
    //    {
    //        for(j=0;j<num;j++)
    //            printf("%.0f ",s[i][j]);
    //        printf("
    ");
    //    }
        dijkstra();
        return 0;
    }
    
  • 相关阅读:
    App_Data文件夹的用处.
    .net工资管理系统 C#2.0开发
    红警2尤里的复仇 无限金钱 无限电力修改器
    用bho方式拦截中国电信流氓广告
    仙剑4按键取钱的东东。
    多浏览器测试的利器IETester,自带IE5.5,IE6,IE7,IE8等多个内核.
    dataGridView使用指南系列一、回车换行或换列完美解决方案
    红警2共和国之辉无限金钱修改器,造东西不花钱还赚钱。
    UpdatePanel控件,你真的会用了吗?
    XP+WIN7共享动态磁盘的一点收获
  • 原文地址:https://www.cnblogs.com/luoxiaoyi/p/9708392.html
Copyright © 2011-2022 走看看