码迷,mamicode.com
首页 > 其他好文 > 详细

【最短路】Subway POJ - 2502

时间:2020-08-01 09:18:51      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:不同   存在   pre   als   false   int   ble   时间   with   

Subway POJ - 2502

题意:

给定家与学校的坐标,以及若干条地铁路线各站点的坐标,还有人的速度与地铁的速度。一到达站点就可以立刻上车,不同地铁路线之间可以随意换乘。问从家到学校花费的最小时间。

思路:

懒鬼宗旨:能写floyd绝对不写dijkstra和SPFA……

唯一要注意的是,本题中所有节点两两之间都是可以走路抵达的,不存在不可抵达的情况。而同一条路线的地铁站之间花费的时间一定比走路少,所以遍历时取最小值即可。

double d[maxn][maxn];
int n;
const double hv = 10000.0;
const double sv = 40000.0;

struct node {
    int x, y;
}N[maxn];

double count(node t1,node t2) {
    int x1 = t1.x, y1 = t1.y, x2 = t2.x, y2 = t2.y;
    double p = x1 - x2, q = y1 - y2;
    p *= p; q *= q;
    return sqrt(p + q);
}

void floyd() {
    for (int k = 1; k <= n; k++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
            }
        }
    }
}

int main()
{
    // ios::sync_with_stdio(false);
   // int t; cin >> t; while (t--) {
    n = 0;
    for (int i = 0; i < maxn; i++) {
        for (int j = 0; j < maxn; j++) {
            d[i][j] = 1000000;
        }
    }
    node h, s, temp;
    cin >> h.x >> h.y >> s.x >> s.y;
    N[++n] = h;//1是家
    N[++n] = s;//2是学校
    int px = -1, py = -1;
    while (cin >> temp.x >> temp.y) {
        if (temp.x == -1 && temp.y == -1) {
            px = py = -1;
            continue;
        }
        N[++n] = temp;
        if (px == -1 && py == -1){
            px = temp.x; py = temp.y;
            continue;
        }
        else {
            double dis = count(N[n-1],N[n]) / sv;
            d[n - 1][n] = d[n][n - 1] = dis;
            px = temp.x; py = temp.y;
        }
    }
    //注意所有点两两之间都是可以走路过去的
    //因为地铁站之间花费的时间一定比走路快,遍历所有点时取最小值即可
    for (int i = 1; i <= n; i++) {
        d[i][i] = 0;
        for (int j = i + 1; j <= n; j++) {
            d[i][j] = d[j][i] = min(count(N[i],N[j]) / hv, d[i][j]);
        }
    }

    floyd();
    cout << int(d[1][2]*60 + 0.5);
 //   }
    return 0;
}

【最短路】Subway POJ - 2502

标签:不同   存在   pre   als   false   int   ble   时间   with   

原文地址:https://www.cnblogs.com/streamazure/p/13412949.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!