【最短路】Subway POJ - 2502
Subway POJ - 2502
题意:
给定家与学校的坐标,以及若干条地铁路线各站点的坐标,还有人的速度与地铁的速度。一到达站点就可以立刻上车,不同地铁路线之间可以随意换乘。问从家到学校花费的最小时间。
思路:
懒鬼宗旨:能写floyd绝对不写dijkstra和SPFA……
唯一要注意的是,本题中所有节点两两之间都是可以走路抵达的,不存在不可抵达的情况。而同一条路线的地铁站之间花费的时间一定比走路少,所以遍历时取最小值即可。
double d[maxn][maxn];
int n;
const double hv = 10000.0;
const double sv = 40000.0;
struct node {
int x, y;
}N[maxn];
double count(node t1,node t2) {
int x1 = t1.x, y1 = t1.y, x2 = t2.x, y2 = t2.y;
double p = x1 - x2, q = y1 - y2;
p *= p; q *= q;
return sqrt(p + q);
}
void floyd() {
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
}
}
}
int main()
{
// ios::sync_with_stdio(false);
// int t; cin >> t; while (t--) {
n = 0;
for (int i = 0; i < maxn; i++) {
for (int j = 0; j < maxn; j++) {
d[i][j] = 1000000;
}
}
node h, s, temp;
cin >> h.x >> h.y >> s.x >> s.y;
N[++n] = h;//1是家
N[++n] = s;//2是学校
int px = -1, py = -1;
while (cin >> temp.x >> temp.y) {
if (temp.x == -1 && temp.y == -1) {
px = py = -1;
continue;
}
N[++n] = temp;
if (px == -1 && py == -1){
px = temp.x; py = temp.y;
continue;
}
else {
double dis = count(N[n-1],N[n]) / sv;
d[n - 1][n] = d[n][n - 1] = dis;
px = temp.x; py = temp.y;
}
}
//注意所有点两两之间都是可以走路过去的
//因为地铁站之间花费的时间一定比走路快,遍历所有点时取最小值即可
for (int i = 1; i <= n; i++) {
d[i][i] = 0;
for (int j = i + 1; j <= n; j++) {
d[i][j] = d[j][i] = min(count(N[i],N[j]) / hv, d[i][j]);
}
}
floyd();
cout << int(d[1][2]*60 + 0.5);
// }
return 0;
}