题目大意,湖中有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 ",sum); printf("Frog Distance = %.3lf ",dist[0][1]); printf(" "); } return 0; }