一、内容

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
1

二、思路

  • 点编号为0,终点编号为201(因为最多200个站台)。从起点到所有站台,所有站台到终点都建立一条步行的边。两两站台之间也要建立一条步行的边。

  • 然后就是一条航线中的相邻站台建立一条40km/h的花费的边。

  • 题目给出的坐标算出来的距离单位是m, 给出的速度是km/h。

  • 答案输出应该四舍五入。 有点坑。 int(d + 0.5)

三、代码

#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 205, M = 5e4 + 5;
struct E {
int v, next;
double w;
} e[M];
struct Stop {
int x, y;
} stop[N];
int id = 1, x, y, lx, ly, sx, sy, ex, ey, len = 1, h[N];//id代表点的标号
bool vis[N]; //起点是0 终点的编号是201 因为最多有200个站点
double d[N];
double getD(int x1, int y1, int x2, int y2, int t) {
double x = x1 - x2;
double y = y1 - y2;
return sqrt(x*x + y*y) / t / 1000 * 60;
}
void add(int u, int v, double w) {
e[len].v = v;
e[len].w = w;
e[len].next = h[u];
h[u] = len++;
}
//若a > b 返回true a <= b 返回false
bool cmp(double a, double b) {
if (a - b > 1e-4) return true;
return false;
}
void spfa() {
for (int i = 1; i < id; i++) d[i] = 1e18;
d[0] = 0; d[201] = 1e18;
queue<int> q;
q.push(0);
while (!q.empty()) {
int u = q.front();
q.pop();
vis[u] = false;
for (int j = h[u]; j; j = e[j].next) {
int v = e[j].v;
double w = d[u] + e[j].w;
if (cmp(d[v], w)) {
d[v] = w;
if (!vis[v]) q.push(v), vis[v] = true;
}
}
}
}
int main() {
scanf("%d%d%d%d", &sx, &sy, &ex, &ey);
while (~scanf("%d%d", &stop[id].x, &stop[id].y)) {
x = stop[id].x, y = stop[id].y;
add(0, id, getD(x, y, sx, sy, 10));
add(id, 201, getD(x, y, ex, ey, 10));
++id;
while (scanf("%d%d", &stop[id].x, &stop[id].y), stop[id].x != -1) {
x = stop[id].x, y = stop[id].y;
lx = stop[id - 1].x, ly = stop[id - 1].y;
//从站点步行到终点 和起点
add(0, id, getD(x, y, sx, sy, 10));
add(id, 201, getD(x, y, ex, ey, 10));
//建立与前一个站点的边
add(id, id - 1, getD(x, y, lx, ly, 40));
add(id - 1, id, getD(x, y, lx, ly, 40));
++id; //-1的时候id不变
}
}
//每个站台之间可以步行 总共的标号是【1, id-1】
for (int i = 1; i < id; i++) {
for (int j = i + 1; j < id; j++) {
x = stop[i].x, y = stop[i].y;
lx = stop[j].x, ly = stop[j].y;
add(i, j, getD(x, y, lx, ly, 10));
add(j, i, getD(x, y, lx, ly, 10));
}
}
spfa();
printf("%d", int(d[201] + 0.5));//四舍五入
return 0;
}

POJ2502 Subway 最短路的更多相关文章

  1. POJ-2502 Subway( 最短路 )

    题目链接:http://poj.org/problem?id=2502 Description You have just moved from a quiet Waterloo neighbourh ...

  2. L - Subway(最短路spfa)

    L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ...

  3. POJ2502:Subway(最短路)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14634   Accepted: 4718 题目链接:http ...

  4. (poj 2502) Subway 最短路

    题目链接: 题意:在一个城市里有许多地铁,现在你知道每条地铁的起点  终点与停站点的坐标,知道我们的起始坐标与终点坐标,问加上走路最快到达终点的时间是多少? 方法:求出任意两点的车速时间与步行时间,再 ...

  5. POJ 2502 Subway ( 最短路 && 最短路建图 )

    题意 : 给出二维平面上的两个点代表起点以及终点,接下来给出若干条地铁线路,除了在地铁线路上行进的速度为 40km/h 其余的点到点间都只能用过步行且其速度为 10km/h ,现问你从起点到终点的最短 ...

  6. poj2502 Subway

    思路: 需要注意的地方:一条地铁线路并不一定和样例描述的那样是直的:同一条线路上的两个站点步行可能更快. 实现: #include <iostream> #include <cstd ...

  7. poj图论解题报告索引

    最短路径: poj1125 - Stockbroker Grapevine(多源最短路径,floyd) poj1502 - MPI Maelstrom(单源最短路径,dijkstra,bellman- ...

  8. POJ 2502 Subway (最短路)

    Subway 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/L Description You have just moved ...

  9. POJ-2502(Dijikstra应用+最短路)

    Subway POJ-2502 这里除了直接相连的地铁站,其他图上所有的点都要连线,这里是走路的速度. 记住最后的结果需要四舍五入,否则出错. #include<iostream> #in ...

  10. poj2502 最短路

    //Accepted 504 KB 16 ms //spfa最短路 //把n个地铁站作为n个顶点,边权为从一个站到另一个站的时间 //注意:地铁在相邻的两站之间是直线行驶,但其他的就不是了 #incl ...

随机推荐

  1. C语言假设今天是星期日,编写一个程序,求2019天后是星期几。

    #include<stdio.h> void main() { int n = 2019, d;//定义变量和常量 d = n % 7;//计算余数 switch (d)//选择星期 { ...

  2. vue 组件之间的自定义方法互相调用

    1,先定义一个中间通信文件js globalBus.js import Vue from 'vue'; export const globalBus = new Vue(); 2,A.vue组件的方法 ...

  3. 【Javaweb】六-servlet层

    AdminServlet.jap @WebServlet("/AdminServlet") public class AdminServlet extends HttpServle ...

  4. Android学习day03【跑马灯】

    这个学习内容很简单,说一下自己笨蛋的点吧 要实现这种情况,我始终没有办法实现(也就是跑马灯,图片没办法显示) 后来发现 android:layout_width="wrap_content& ...

  5. 3D 高斯喷溅 🤗 为什么图形永远不会相同

    高斯喷溅 (Gaussian Splatting) 技术是一种翻天覆地的渲染手段,能够以 144 帧每秒的速度渲染出高质量的场景,这和传统的图形处理流程截然不同 这种将高斯数据转换成图像的过程,与训练 ...

  6. Python实现贪吃蛇大作战

    贪吃蛇 初始版本 初始版本,只存在基本数据结构--双向队列. 游戏思路 贪吃蛇通过不断得吃食物来增长自身,如果贪吃蛇碰到边界或者自身则游戏失败. 食物是绿色矩形来模拟,坐标为随机数生成,定义一个蛇长变 ...

  7. 华企盾DSC邮件白名单问题常见处理方法

    1.先检查邮件白名单服务器配置测试连接的通(不通可能是协议未开或者账号密码错误) 2.检查邮件发送端口是否配置(常见的有25和s465.s587) 3.邮件是否到发件箱或者收件箱的垃圾邮件里面了 4. ...

  8. MinIO客户端之ping

    MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc ping 检查指定的MinIO节点的服务是否可用. 不带参数,命令如下: ./mc ping local1 ...

  9. Python——第五章:time模块、datetime模块

    time模块 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime,calendar(很少用,不讲),下面分别来介绍. 我们写程序时对时间 ...

  10. 单位换算详解:bit、Byte、bps、Bps、pps、Gbps的单位详细说明及换算

    当谈论计算机存储和数据传输时,"bit"(比特)和"Byte"(字节)是两个常见的术语,它们具有不同的含义和用途. 位(bit):"位"来自 ...