题意:首先给予家和学校的坐标,接下来是诺干条地铁线,也由诺干个坐标组成,步行10km/h,坐地铁40km/h,输出从家到学校的最短距离
思路:考虑用地铁的时候就用subwey,不能用地铁的时候用walk,剩下的就是求最短路径
#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<stack>
#include<queue>
#include <map>
#include<cmath>
#include<vector>
#include <iomanip>
#define MAX_N 1000000
#define INF 0x3f3f3f3f
#define SIZE 1000
#define pai 3.14159265358979323
#define atm 1000000007
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
struct edge
{
int x;
int y;
}p[MAX_N];
int n;
double G[500][1000];
double walk(int a, int b)
{
double m = sqrt((double)(p[a].x - p[b].x) * (p[a].x - p[b].x) + (double)(p[a].y - p[b].y) * (p[a].y - p[b].y));
return m * 3 / 500;
}
double subwey(int a, int b)
{
double m = sqrt((double)(p[a].x - p[b].x) * (p[a].x - p[b].x) + (double)(p[a].y - p[b].y) * (p[a].y - p[b].y));
return m * 3 / 2000;
}
void solve()
{
for (int k = 1; k <= n; k++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
G[i][j] = min(G[i][j], G[i][k] + G[k][j]);
}
}
}
}
int main()
{
int a, b;
int j = 0;
n = 3;
scanf("%d%d%d%d", &p[1].x, &p[1].y, &p[2].x, &p[2].y);
G[1][2] = G[2][1] = walk(1, 2);
while (scanf("%d%d", &a, &b) != EOF)
{
if (a == -1 && b == -1)
j = 0;
else
{
p[n].x = a;
p[n].y = b;
for (int i = 1; i < n - j; i++)
{
G[i][n] = G[n][i] = walk(i, n);
}
for (int i = n - j; i < n; i++)
{
G[i][n] = G[n][i] = subwey(i, n);
}
j = 1;
n++;
}
}
n--;
solve();
printf("%.0f\n", G[1][2]);
return 0;
}