poj 2502 subway (最短路)

来源:互联网 发布:java进销存系统源码 编辑:程序博客网 时间:2024/05/22 13:46

人走路的速度是10km/h,地铁的速度是40km/h

题目给出一个起点,一个终点,
以及几条地铁线路运行的站点。
 
题目给的点的做坐标单位是m
把速度统一为m/min
 
答案输出从起点到终点的时间,分钟数。
 
10km/h= 10000/60 m/min
40km/h= 40000/60 m/min
 
所有的点直接以步行的速度建边。
地铁线路两站相邻的以地铁速度建边

/*********************************************** * Author: fisty * Created Time: 2015/2/24 20:10:15 * File Name   : L.cpp *********************************************** */#include <iostream>#include <cstring>#include <deque>#include <cmath>#include <queue>#include <stack>#include <list>#include <map>#include <set>#include <string>#include <vector>#include <cstdio>#include <bitset>#include <algorithm>using namespace std;#define Debug(x) cout << #x << " " << x <<endl#define Memset(x, a) memset(x, a, sizeof(x))const int INF = 0x3f3f3f3f;typedef long long LL;typedef pair<int, int> P;#define FOR(i, a, b) for(int i = a;i < b; i++)#define MAX_N 2520int n;double G[MAX_N][MAX_N];struct Point{    int x;    int y;}p[MAX_N];double walk(int i, int j){    double l = sqrt((double)(p[i].x - p[j].x) * (p[i].x - p[j].x) + (double)(p[i].y - p[j].y) * (p[i].y - p[j].y));    return  l * 60 / 10000.0;}double subway(int i, int j){    double l = sqrt((double)(p[i].x - p[j].x) * (p[i].x - p[j].x) + (double)(p[i].y - p[j].y) * (p[i].y - p[j].y));    return l * 60.0 / 40000.0;}void solve(){    for(int k = 1; k <= n; k++){        for(int i = 1;i <= n; i++){            for(int j = 1;j <= n; j++){                G[i][j] = min(G[i][j], G[i][k] + G[k][j]);            }        }    }}   int main(){    //freopen("in.cpp", "r", stdin);    scanf("%d%d%d%d", &p[1].x, &p[1].y, &p[2].x, &p[2].y);    G[1][2] = G[2][1] = walk(1, 2);    int j = 0;n = 3;    int a, b;    while(scanf("%d%d",&a,&b) != EOF){          if(a == -1 && b == -1)               j = 0;          else{               p[n].x = a, p[n].y = b;              for(int i = 1;i < n - j; i++){                   G[i][n] = G[n][i] = walk(i,n);              }               for(int i = n-j; i < n; i++){                  G[i][n] = G[n][i] = subway(i,n);              }              j = 1, n++;           }       }        n--;    solve();    printf("%.0f\n", G[1][2]);    return 0;}


0 0
原创粉丝点击