题目大意是找出一次需要跳的最短的长度,其实是最短路径的变形
通过dijs算法找到最短的距离即可
开始时sqrt那里用的整数,vs没错poj会报错,有点难受...
#pragma warning (disable:4996)
/*
coded by fgtmiao
time:2019/6/29
使用dijstras(?)算法
*/
#include<iostream>
#include<algorithm>
#include<math.h>
#define inf 0x3f3f3f3f
using namespace std;
const int maxnum = 205;
pair<int, int>pos[maxnum];
float caldis(pair<int, int>a, pair<int, int>b)
{
return sqrt(float((a.first - b.first)*(a.first - b.first) + (a.second - b.second)*(a.second - b.second)));
}
float dist[maxnum];
float map[maxnum][maxnum] = {};
bool vis[maxnum];
float MAx;
int n;
void dij()
{
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; i++)
{
dist[i] = inf;
}
dist[0] = 0;//起始点嗷
for (int i = 0; i < n; i++)
{
int minn=inf, node;
for (int j = 0; j < n; j++)
{
if (!vis[j] && dist[j] < minn)
{
minn = dist[j];//未检索的余下的最短的
node = j;
}
}
//node 为最短的点
vis[node] = 1;
for (int j = 0; j < n; j++)
{
MAx = max(dist[node], map[node][j]);
dist[j] = min(dist[j], MAx);//为0号石头到其他石头的最长边的最小边
}
}
}
int main()
{
int case_num = 0;
while (1)
{
case_num++;
cin >> n;
if (n == 0)
{
return 0;
}
for (int i = 0; i < n; i++)
{
cin >> pos[i].first >> pos[i].second;
map[i][i] = 0;
for (int j = 0; j < i; j++)
{
map[i][j] = map[j][i] = caldis(pos[i], pos[j]);
}
// dist[i] = caldis(pos[i], pos[0]);
}
dij();
printf("Scenario #%d\n", case_num);
printf("Frog Distance = %.3lf\n\n", dist[1]);
}
}