Frogger POJ - 2253 最短路变形 Bellman-Ford

传送门

题目大意: 题意很简单就是有一个公青蛙想要去找母青蛙, 然后水上有n个石头, 公青蛙在第一个上, 母青蛙在第二个. 然后给出n个石头的坐标, 求一个最小的跳跃距离, 这个跳跃距离是它所有的跳跃中距离最大的. 也就是说要找一条路径, 这个路径不是求最短路了, 而是这个路径中距离最大的两个点尽量的小.

题目分析: 还是用最短路搜索, 不过要稍微改进,这次维护的不是总路长, 而是路中每一段中的最大值. 每个点维护最小的路径最大值即可. 算法用Bellman-Ford写起来方便, 时间足够.

代码:

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;
double d[205];
double mp[205][205];
int X[205], Y[205];
int n;
void Bellman_Ford()
{
	for(int i=0; i<205; ++i) d[i] = 3000000.0;
	d[0] = 0;

	for(int k=0; k<n; ++k)
		for(int i=0; i<n; ++i)
			for(int j=0; j<n; ++j)
				d[j] = min(d[j], max(d[i], mp[i][j]));
}


int main()
{
	int Case = 1;
	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)
			for(int j=0; j<n; ++j)
				mp[i][j] = mp[j][i] = sqrt(double(X[i]-X[j])*(X[i]-X[j]) + double(Y[i]-Y[j])*(Y[i]-Y[j]));

		Bellman_Ford();
		printf("Scenario #%d\nFrog Distance = %.3f\n\n", Case++, d[1]);
	}

	return 0;
}
    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/lcuwb/article/details/79325992
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞