poj2502

最短路

View Code
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;

#define maxn 205

struct Point
{
double x, y;
}point[maxn];

double map[maxn][maxn];
double subv, walkv;
int n;

double dist(Point &a, Point &b)
{
Point p;
p.x = a.x - b.x;
p.y = a.y - b.y;
return sqrt(p.x * p.x + p.y * p.y);
}

void input()
{
for (int i = 0; i < 2; i++)
scanf("%lf%lf", &point[i].x, &point[i].y);
n = 2;
Point last, now;
last.x = last.y = -1;
while (~scanf("%lf%lf", &now.x, &now.y))
{
if (!(now.x == -1 && now.y == -1))
{
point[n++] = now;
if (!(last.x == -1 && last.y == -1))
map[n - 1][n - 2] = map[n - 2][n - 1] = dist(point[n - 1], point[n - 2]) / subv;
}
last = now;
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (map[i][j] == -1)
map[i][j] = dist(point[i], point[j]) / walkv;
}

void floyd()
{
for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
}

int main()
{
//freopen("t.txt", "r", stdin);
for (int i = 0; i < maxn; i++)
for (int j = 0; j < maxn; j++)
map[i][j] = -1;
subv = 40 * 1000.0 / 60;
walkv = 10 * 1000.0 / 60;
input();
floyd();
printf("%.0f\n", map[0][1]);
return 0;
}

你可能感兴趣的:(poj)