题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66569#problem/B
代码:
#include<stdio.h>
#include<string.h>
#include<cmath>
using namespace std;
const int maxn=205;
float x[maxn],y[maxn];
float maps[maxn][maxn];
int main()
{
int t,cnt=0;
while(~scanf("%d",&t))
{
if(t==0)
break;
for(int i=1;i<=t;i++)
{
scanf("%f%f",&x[i],&y[i]);
}
for(int i=1;i<=t;i++)
{
for(int j=1;j<=t;j++)
{
maps[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
}
for(int k=1;k<=t;k++)
{
for(int i=1;i<=t;i++)
{
for(int j=1;j<=t;j++)
{
if(maps[i][j]>maps[i][k]&&maps[i][j]>maps[k][j])
{
if(maps[i][k]>maps[k][j])
{
maps[i][j]=maps[i][k];
}
else
{
maps[i][j]=maps[k][j];
}
}
}
}
}
printf("Scenario #%d\nFrog Distance = %.3f\n\n",++cnt,maps[1][2]);
}
}
题意是找这样一条边 在从起点到终点的所有路径中, 找一条最大的一段路径(一段一段一段) 使这段路径最小。
弗洛伊德求两两之间的最短路。 每次更新maps【i】【j】为maps【i】【k】和maps【k】【j】中最大的 这样就会将一段路径中最大一条边存到 maps【i】【j】(即这段路径中)。