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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值