题目的意思很明白, 就是每次都找最近的一点, 有点类似于prim算法, 是dijkstra的一个小变形, 就是最后输出的时候不知道为什么要用%f
而不能用%lf,因为这个地方想了好久,郁闷。。
#include <cmath>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef pair<int, int> PII;
const int N = 1010;
struct E
{
int x, y;
}edgs[N];
int n, starx, stary, endx, endy;
double bis[N][N], res;
bool vis[N][N];
double check(int a, int b, int c, int d)
{
double n = (a - c), m = (b - d);
return sqrt(n * n + m * m);
}
void dijkstra()
{
memset(vis, 0, sizeof vis);
memset(bis, 127, sizeof bis);
bis[starx][stary] = 0;
for (int i = 1; i <= n; i ++)
{
int t = -1;
for (int j = 0; j < n; j ++)
{
if (!vis[edgs[j].x][edgs[j].y] && (t == -1 || bis[edgs[j].x][edgs[j].y] < bis[edgs[t].x][edgs[t].y])) t = j;
}
int a = edgs[t].x, b = edgs[t].y;
res = max(bis[a][b], res);
if (t == 1) break;
vis[a][b] = true;
for (int j = 0; j < n; j ++)
{
bis[edgs[j].x][edgs[j].y] = min(bis[edgs[j].x][edgs[j].y],check(a, b, edgs[j].x, edgs[j].y));
//cout << bis[edgs[j].x][edgs[j].y] << endl;
}
}
return;
}
int main()
{
int t = 1;
while (cin >> n && n)
{
res = 0;
memset(edgs, 0, sizeof edgs);
cin >> starx >> stary >> endx >> endy;
edgs[0] = { starx, stary }, edgs[1] = { endx, endy };
for (int i = 2; i < n; i++)
{
int a, b; scanf("%d %d", &a, &b);
edgs[i] = { a, b };
}
dijkstra();
printf("Scenario #%d\nFrog Distance = %.3f\n\n", t++, res);
}
return 0;
}