题目大意,湖中有n个石头,一只青蛙要从一号石头上跳到2号石头上,要使所有可行路径中最大边最小,并输出该最大边。
同zoj1952类似,动态规划,用dist[ i ][ j ]表示从 i 到 j 路径中的最长边,则枚举中间节点 k ,则状态转移方程为dist[ i ][ j ] = min( dist[ i ][ j ] , max(dist[ i ][ k ],dist[ k ][ j ])) ,形式同floyd相同。
#include <stdio.h>
#include <math.h>
double min(double a,double b)
{
if(a>b) return b;
else return a;
}
double max(double a,double b)
{
if(a>b) return a;
else return b;
}
int n;
double dist[210][210];
double x[210],y[210];
int main()
{
int i,j,k,sum=0;
while(1)
{
sum++;
scanf("%d",&n);
if(n==0)
break;
for(i=0;i<n;i++)
scanf("%lf%lf",&x[i],&y[i]);
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
dist[i][j]=dist[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
dist[i][j]=min(dist[i][j],max(dist[i][k],dist[k][j]));
printf("Scenario #%d\n",sum);
printf("Frog Distance = %.3lf\n",dist[0][1]);
printf("\n");
}
return 0;
}