POJ 2253
一开始的思路错误了,想着利用贪心策略自然的转到了dijkstra或Prim。
因为想要学习堆优化所以想去借鉴kuangbin大佬模板,结果看到思路的一道解析才知道自己多粗浅,若是起初选择贪心的策略,对于后续距离优化你是看不出积累优势的,反而可能因为你起初贪心了几步,导致离最终的目的地跑远乃至于后期不得不选一个距离远的,前期的贪心可能在这种特殊情况下,会使得你偏离正确的方向。举个反例,也许在始末点之间有个最优点,如果遇到题目设置的很有陷阱,在始末方向之外,但是相较于中间点距离较近的点,这样它可以一步一步的将你引导到越来越远,最终,没石头可以跳的时候你只能蹦很远才能到终点。
自然的,这种全局思考的思想,最适合利用DP思路,所以就自然转到了Floyd算法
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <stack>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const double eps= 1e-9;
const double INF= 1e6;
const int maxn= 205;
const int frd= 0;
const int fio= 1;
int n;
int x[maxn], y[maxn];
double fv[maxn][maxn];
inline double Dist(int a, int b)
{
return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}
int main()
{
int kase= 0;
while (~scanf("%d", &n) && n){
for (int i= 0; i< n; ++i){
scanf("%d %d", x+i, y+i);
}
for (int i= 0; i< n; ++i){
fv[i][i]= 0;
}
for (int k= 0; k< n; ++k){
for (int i= 0; i< n; ++i){
for (int j= i+1; j< n; ++j){
if (j== i){
continue;
}
else if (0== k){
fv[i][j]= fv[j][i]= Dist(i, j);
}
else{
fv[i][j]= fv[j][i]= min(fv[i][j], max(fv[i][k], fv[k][j]));
}
}
}
}
printf("Scenario #%d\n", ++kase);
printf("Frog Distance = %.3f\n\n", fv[0][1]);
}
return 0;
}