题目大意:有n个石头,以下n行是n个石头的坐标,编号1~n。要从1号石头到达2号石头,中间过程只能从一个石头跳到另一个石头上,问在跳的过程中,跳的两块石头的最短距离的最大值(以下简称fdis)
floyd算法
dp[i][j]表示从起点i到达终点j的fdis
初始值:i到j的距离
状态转移方程:枚举中间点k,起点i, 终点j
if(dp[i][j] > max(dp[i][k], dp[k][j])
dp[i][j] = max(dp[i][k], dp[k][j]);
最后输出dp[1][2]
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 210;
const int INF = 999999999.9;
typedef struct node{double x, y;}node;
node nn[maxn];
int n;
double dp[maxn][maxn];
double getdis(int u, int v)
{
double tx = nn[u].x - nn[v].x;
double ty = nn[u].y - nn[v].y;
return sqrt(tx*tx+ty*ty);
}
void floyd()
{
int i, j, k;
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
dp[i][j] = getdis(i, j);
for(k = 1; k <= n; ++k)
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
if(dp[i][j] > max(dp[i][k], dp[k][j]))
dp[i][j] = max(dp[i][k], dp[k][j]);
}
int main()
{
int i, j, cas = 0;
while(~scanf("%d", &n) && n)
{
++cas;
for(i = 1; i <= n; ++i)
scanf("%lf %lf", &nn[i].x, &nn[i].y);
floyd();
printf("Scenario #%d\n", cas);
printf("Frog Distance = %.3f\n\n", dp[1][2]);
getchar();
getchar();
}
return 0;
}