题意:从0号点,到1号点,找一条能通过的路,使得这条路中的最大的边,比其它所有可能的路中的边都小。
分析:用floyd算法求两点最短值。再求出从每个点开始的最长路,最后从这n个最长路中求出最小的那个即为所求。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAX_N 205
using namespace std;
double dp[MAX_N][MAX_N];
const double inf=2000.0;
struct node
{
double x,y;
}pos[MAX_N];
int n;
void warshall_floyd()
{
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
}
}
}
int main(void)
{
int t=0;
while(scanf("%d",&n)==1)
{
if(n==0)
break;
for(int i=0;i<n;i++)
scanf("%lf%lf",&pos[i].x,&pos[i].y);
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
{
if(i==j)
dp[i][j]=0;
else
dp[i][j]=dp[j][i]=sqrt((pos[i].x-pos[j].x)*(pos[i].x-pos[j].x)+(pos[i].y-pos[j].y)*(pos[i].y-pos[j].y));
}
}
warshall_floyd();
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(dp[i][k]<dp[i][j]&&dp[k][j]<dp[i][j])
{
if(dp[i][k]<dp[k][j])
dp[i][j]=dp[j][i]=dp[k][j];
else
dp[i][j]=dp[j][i]=dp[i][k];
}
}
}
}
printf("Scenario #%d\nFrog Distance = %.3lf\n\n",++t,dp[0][1]);
}
return 0;
}