题目大意

题目链接

给你起始坐标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
/*
power by Solo_Dance
*/

#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;
}

后继

  1. 让我知道了不满足条件就continue满足条件在执行 的区别, 大多数是没区别的, 但是如果循环中, 有不论什么条件都要执行的语句时, 就不能用continue。
恰似你一低头的温柔,较弱水莲花不胜寒风的娇羞, 我的心为你悸动不休。  --mingfuyan

千万不要图快——如果没有足够的时间用来实践, 那么学得快, 忘得也快。