题目大意
题目链接
给你起始坐标s和终点坐标e, 然后给你地铁线(EOF结束)每条地铁线以EOF结束, 相邻的地铁线可以双向通, 问s到t的最短时间(min)。
其中地铁的速度是 40 km/h , 步行的速度是10 km/h, 然后单位是m,要转化,两点的距离是欧几里得距离, 不是曼哈顿距离。
分析
最关键的是建图。
因为最多总共200个地铁站, 用邻接矩阵存就行, 因为求最短时间, 用邻接矩阵存时间就行。
起点是0号,终点是1号, 地铁站依次类推。
因为地铁快, 输入的过程中,把相邻两地铁站的时间存起来。
然后计算两两坐标步行的距离,取最小值就行, 最多202个点跑floyd完全没问题。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
#include <map> #include <set> #include <ctime> #include <cmath> #include <queue> #include <stack> #include <bitset> #include <cctype> #include <cstdio> #include <vector> #include <utility> #include <cstdlib> #include <cstring> #include <sstream> #include <iostream> #include <algorithm>
#define eps 1e-8 using namespace std; #define ms(a, b) memset((a), (b), sizeof(a)) typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> P; const int N = 1e5 + 5; const int M = 1e6 + 5; const int INF = 0x3f3f3f3f; const ll ll_max = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 + 7;
inline ll read() { ll res = 0;bool f = 0;char ch = getchar(); while (ch < '0' || ch > '9') {if (ch == '-') f = 1;ch = getchar();} while (ch <= '9' && ch >= '0') {res = (res << 3) + (res << 1) + ch - '0';ch = getchar();} return f ? (~res + 1) : res; } double ma[1003][1003]; double dis[1003]; int vis[1003]; inline double d(P a, P b){ return sqrt((a.first - b.first) * (a.first - b.first) + (a.second - b.second) * (a.second - b.second)); } P a[1003], s, e; int cnt; int main(){ s.first = read(), s.second = read(), e.first = read(), e.second = read(); P tmp; a[cnt++] = s; a[cnt++] = e; for (int i = 0; i < 1000; ++i) for (int j = 0; j < 1000; ++j) if (i == j) ma[i][j] = 0; else ma[i][j] = 1e9; P lst = P(-1, -1); while(~scanf("%d%d", &tmp.first, &tmp.second)){ if (tmp.first != -1) { a[cnt++] = tmp; if (lst.first != -1) ma[cnt - 1][cnt - 2] = ma[cnt - 2][cnt - 1] = min(ma[cnt - 2][cnt - 1], d(tmp, lst) * 3 / 2000); } lst = tmp; } for (int i = 0; i < cnt; ++i){ for (int j = 0; j < cnt; ++j){ ma[i][j] = min(ma[i][j], d(a[i], a[j]) * 3 / 500); } }
for (int k = 0; k < cnt; ++k) for (int i = 0; i < cnt; ++i) for (int j = 0; j < cnt; ++j) ma[i][j] = min(ma[i][j], ma[i][k] + ma[k][j]);
printf("%.0f\n", ma[0][1]);
return 0; }
|
后继
- 让我知道了
不满足条件就continue
和 满足条件在执行
的区别, 大多数是没区别的, 但是如果循环中, 有不论什么条件都要执行的语句时, 就不能用continue。
恰似你一低头的温柔,较弱水莲花不胜寒风的娇羞, 我的心为你悸动不休。 --mingfuyan
千万不要图快——如果没有足够的时间用来实践, 那么学得快, 忘得也快。