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;
}
posted @ 2021-04-02 21:51  IdiotNe  阅读(39)  评论(0编辑  收藏  举报