POJ_2253_floyd

POJ 2253
1.floyd

  • The frog distance (humans also call it minimax distance) between two stones therefore is defined as the minimum necessary jump range over all possible paths between the two stones.
  • 青蛙距离是两个石头极大距离中的最小跳跃距离,(所有通路中的最大跳跃距离中的最小值)
  • floyd 求的是多源最短路径,即任意两点之间的最短路径 思想是:通过一个点k,来更新ij两点之间的距离
  • 通过floyd枚举k点,max(e[i][k],e[k][j])找到通路之间 的最大跳跃距离,更新其中的最小距离
e[i][j] = min(e[i][j],max(e[i][k],e[k][j]));

#include <iostream>
#include <string.h>
#include <math.h>

using namespace std;

const int maxn = 300;
double e[maxn][maxn];
int n;
int cnt;

void floyd() {
	for (int k=1; k<=n; k++) 
		for (int i=1; i<=n; i++)
			for (int j=1; j<=n; j++) // e[i][j] 保存的就是 i 到 j 通路中的最短边 
				e[i][j] = min(e[i][j],max(e[i][k],e[k][j])); 
			
	printf("Scenario #%d\n",++cnt);
	printf("Frog Distance = %.3f\n\n",e[1][2]);
}
void read() {
	int a,b;
	int x[maxn],y[maxn];
	for (int i=1; i<=n; i++) 
		scanf("%d%d",&x[i],&y[i]); // 把坐标系化成点的方法,先存点,在转化
	for (int i=1; i<=n; i++)
		for (int j=i+1; j<=n; j++) {
			e[i][j] = e[j][i] = sqrt( double(x[i]-x[j])*(x[i]-x[j]) + double(y[i]-y[j])*(y[i]-y[j]) );
		}
}
void init() {
	memset(e,0,sizeof e);
}
int main() {
	freopen("a.txt","r",stdin);
	while (scanf("%d",&n) && n) {
		init();
		read();
		floyd();
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43580151/article/details/90732146