• poj 2502 Subway


    题目链接:

      http://poj.org/problem?id=2502

    题目大意:

      一个学生去上学,从家到学校,可以有若干个地铁路线,每个地铁路线有若干站,给出步行和地铁的速度,问:最短用多长时间从家到达学校?

    解题思路:

      有地铁的两点建立地铁路线,没有的步行,求最短路,但是有一点坑的是地铁线有可能是曲线,也就是说从a站到b站再到c站的距离和大于a站直接到c站的距离

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <queue>
     5 #include <cmath>
     6 #include <vector>
     7 #include <iostream>
     8 #include <algorithm>
     9 using namespace std;
    10 
    11 #define maxn 310
    12 #define INF 0x3f3f3f3f
    13 #define walk (10000.0/60)
    14 #define sub (40000.0/60)
    15 double map[maxn][maxn], dist[maxn];
    16 int k = 2;
    17 
    18 void init ();
    19 void dijkstra ();
    20 
    21 int main ()
    22 {
    23     int i, j, s;
    24     double x[maxn], y[maxn];
    25 
    26     init ();
    27     while (scanf ("%lf %lf %lf %lf", &x[0], &y[0], &x[1], &y[1]) != EOF)
    28     {
    29         while (scanf ("%lf %lf", &x[k], &y[k]) != EOF)
    30         {
    31             s = k;
    32             while (x[k]!=-1 || y[k] != -1)
    33             {
    34                 k ++;
    35                 scanf ("%lf %lf", &x[k], &y[k]);
    36             }
    37 
    38             for (i=s+1; i<k; i++)
    39                     map[i-1][i] = map[i][i-1] = sqrt((x[i] - x[i-1])*(x[i] - x[i-1]) + (y[i] - y[i-1])*(y[i] - y[i-1])) / sub;
    40 
    41         }
    42         for (i=0; i<k; i++)
    43             for (j=i+1; j<k; j++)
    44                 map[i][j] = map[j][i] = min (map[j][i], sqrt((x[i] - x[j])*(x[i] - x[j]) + (y[i] - y[j])*(y[i] - y[j])) / walk);
    45         dijkstra ();
    46         printf ("%.0f
    ", dist[1]);
    47     }
    48     return 0;
    49 }
    50 
    51 void init ()
    52 {
    53     for (int i=0; i<maxn; i++)
    54         for (int j=0; j<maxn; j++)
    55             if (i == j)
    56                 map[i][j] = 0;
    57             else
    58                 map[i][j] = INF;
    59 }
    60 void dijkstra ()
    61 {
    62     bool vis[maxn];
    63     int temp, index, i, j;
    64     memset (vis, false, sizeof(vis));
    65     vis[0] = 1;
    66     for (i=0; i<k; i++)
    67         dist[i] = map[0][i];
    68     for (i=1; i<k; i++)
    69     {
    70         temp = INF;
    71         for (j=0; j<k; j++)
    72             if (!vis[j] && temp > dist[j])
    73             {
    74                 temp = dist[j];
    75                 index = j;
    76             }
    77 
    78         vis[index] = true;
    79 
    80         for (j=0; j<k; j++)
    81             if (!vis[j])
    82                 dist[j] = min(dist[j], dist[index]+map[index][j]);
    83     }
    84 }
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    discuz方法赏析
    rpm安装软件(需管理员权限)
    php.ini修改php上传文件大小限制
    grep 基于关键字搜索
    网络排查的原则
    Sublime Text快捷键
    表格无边框,有内框,在table嵌套时,防止出现重复边线
    文件(图片)强制下载
    网络相关配置文件的位置
    ip,子网掩码,网关,DNS
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4242892.html
Copyright © 2020-2023  润新知