zoukankan      html  css  js  c++  java
  • POJ 2502 Subway(最短路径)

    题意:

    只有一组数据,第一行给的是家的坐标和学校的坐标,接着后面的都是地铁线路上各个站的坐标,以(-1,-1)结束。已知步行速度为10km/h,地铁速度为40km/h,求家里到学校的最短时间(分钟,四舍五入到整数)。

     

    注意:

    1. 给的坐标单位是米,给的速度的单位是km/h,要求的结果是分钟。
    2. 注意在求地铁从1号站到3号站所花费的时间,是从1号站到2号站的距离除以速度,再加上从2号站到3号站的距离除以速度。而不是直接求从1号站到3号站的距离除以速度。(之前就是因为这个WA了几次(-.-!!) )
    #include <cstdio>
    #include <math.h>
    #include <algorithm>
    using namespace std;
    const int N = 1000, INF = 0x3f3f3f3f;
    struct POINT
    {
        int x;
        int y;
    }vertex[N];
    double time[N][N] = {0};
    bool cnt[N] = {0};
    void qwe(int& n)
    {
        int x, y, start, end;
        while(1)
        {
            start = n;
            for(; ; ++n)
            {
                if(!~scanf("%d %d", &x, &y))
                    return ;
                if(x == -1 && y == -1)
                {
                    end = n;
                    break;
                }
                else
                {
                    vertex[n].x = x;
                    vertex[n].y = y;
                }
            }
            for(int i=start+1; i<end; ++i)
            {
                double dx = (vertex[i].x - vertex[i-1].x) / 1000.0;
                double dy = (vertex[i].y - vertex[i-1].y) / 1000.0;
                time[i][i-1] = sqrt(dx*dx + dy*dy) * 1.5;
                time[i-1][i] = time[i][i-1];
            }
        }
    }
    int main(void)
    {
        scanf("%d %d %d %d", &vertex[0].x, &vertex[0].y, &vertex[1].x, &vertex[1].y);
        int n = 2, mintag;
        qwe(n);
        for(int i=0; i<n; ++i)
        {
            time[i][i] = INF;
            for(int j=0; j<n; ++j)
            {
                if(time[i][j] == 0)
                {
                    double dx = (vertex[i].x - vertex[j].x) / 1000.0;
                    double dy = (vertex[i].y - vertex[j].y) / 1000.0;
                    time[i][j] = sqrt(dx*dx + dy*dy) * 6;
                    time[j][i] = time[i][j];
                }
            }
        }
        cnt[0] = true;
        for(int i=1; i<n; ++i)
        {
            mintag = 0;
            for(int j=1; j<n; ++j)
                if(!cnt[j] && time[0][j] < time[0][mintag])
                    mintag = j;
            cnt[mintag] = true;
            for(int j=1; j<n; ++j)
                if(!cnt[j])
                    time[0][j] = min(time[0][j], time[0][mintag] + time[mintag][j]);
        }
        printf("%.0lf
    ", time[0][1]);
    }
  • 相关阅读:
    异步非阻塞
    jdbc简单入门
    网络编程
    多线程
    java方法
    java之面向对象
    java-多线程
    Java之反射机制
    使用C#完成冒泡排序
    TextEdit不能空验证设置
  • 原文地址:https://www.cnblogs.com/corvey/p/4780202.html
Copyright © 2011-2022 走看看