一、内容

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. 按键1按下数码管显示1,按键2按下数码管显示2,按键3按下8个LED灯实现流水灯效果;

    #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 #include<intrins.h> //因为要用到左右移函数,所以加入这个头文件 ...

  2. html字间距怎么设置?

    在HTML中,可以通过CSS来设置字间距.字间距指的是字符之间的空白区域,在网页设计中,修改字间距可以改变文字的外观和排版效果.下面详细介绍如何使用CSS来设置字间距. 使用letter-spacin ...

  3. jmeter工具中vars与props命令的区别和使用

    话不多说直接干活!!!!! vars 和 props命令存在于"jsr223 预处理器"."BeanShell 预处理程序"."JSR223 后置处理 ...

  4. 渐进式web全栈:blazor web app

    前言 本文要说的这种开发模式,这种模式并不是只有blazor支持,js中有一样的方案next.js nuxt.js:blazor还有很多其它内容,本文近关注渐进式开发模式. 是的,前后端是主流,不过以 ...

  5. python3使用pandas备份mysql数据表

    操作系统 :CentOS 7.6_x64 Python版本:3.9.12 MySQL版本:5.7.38 日常开发过程中,会遇到mysql数据表的备份需求,需要针对单独的数据表进行备份并定时清理数据. ...

  6. .NET8 AOT和JIT的性能,谁更高呢?

    一: 有人问:.NET8 AOT和JIT的性能,谁更高呢? 原文:.NET8 AOT和JIT的性能,谁更高呢? 其实这个答案非常明显,那就是JIT的性能更高.为什么?原因在哪?因为JIT是随时可能分层 ...

  7. Mybatis大于、小于....转义写法

    描述 转义前 转义后 大于 > > 大于等于 >= >= 小于 < < 小于等于 <= <= 和 & & 单引号 ' &apos ...

  8. 安卓之各种Adapter优劣分析

    文章摘要 在 Android 开发中,适配器(Adapter)是一种非常重要的设计模式,它用于将数据与视图组件进行绑定.适配器可以帮助我们在不同的视图组件(如 ListView.GridView.Re ...

  9. 解密Prompt系列21. LLM Agent之再谈RAG的召回信息密度和质量

    话接上文的召回多样性优化,多路索引的召回方案可以提供更多的潜在候选内容.但候选越多,如何对这些内容进行筛选和排序就变得更加重要.这一章我们唠唠召回的信息密度和质量.同样参考经典搜索和推荐框架,这一章对 ...

  10. C++ Qt开发:MdiArea多窗体组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍MdiArea ...