您的位置:首页 > 其它

POJ2253《Frogger》方法:Floyd-Wallshall

2013-02-28 10:36 375 查看
将Floyd算法中求每对顶点间的最小距离,条件换成每对顶点间最长序列的最大跳数,所以要多加进去k。

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

using namespace std;

class coordinate {
public:
	double x, y;
} points[201];

double path[201][201];

int main()
{
	//freopen("temp.txt", "r", stdin);
	int n;
	int cnt = 1;
	while (cin >> n) {
		if (n == 0)
			break;
		for (int i = 1; i <= n; ++i) 
			cin >> points[i].x >> points[i].y;
		for (int i = 1; i <= n-1; ++i) {
			for (int j = i+1; j <= n; ++j) {
				double x = points[i].x - points[j].x;
				double y = points[i].y - points[j].y;
				path[i][j] = path[j][i] = sqrt(x*x + y*y); //双向性
			}
		}

		// Floyd-Wallshall
		// 这里将原本的求两点间最短路径,变为求两点间路径的最大跳数
		for (int k = 1; k <= n; ++k) {
			for (int i = 1; i <= n-1; ++i) {
				for (int j = i+1; j <= n; ++j) {
					if (path[i][k] < path[i][j] && path[k][j] < path[i][j]) {
						if (path[i][k] < path[k][j]) {
							path[i][j] = path[j][i] = path[k][j]; //不要忘了双向性
						} else {
							path[i][j] = path[j][i] = path[i][k];
						}
					}
				}
			}
		}
		cout << "Scenario #" << cnt++ << endl;
		cout << "Frog Distance = " << fixed << setprecision(3) << path[1][2] << endl << endl;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: