//求每条通路中的最大跳跃距离(即最大的两点间距)中的最小值(所谓minimax), //即为frog distance, //且青蛙跳到任意点, //因此用的是稍作改变的folyd算法, //folyd算法用于求解任意两点之间的最短路; #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; double lowcost[210][210]; struct xy { int x,y; }s[210]; void floyd(int n) { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(lowcost[i][j]>lowcost[i][k]&&lowcost[i][j]>lowcost[k][j]) lowcost[i][j]=lowcost[j][i]=max(lowcost[i][k],lowcost[k][j]); } double dis(int a,int b) { return sqrt((double)(s[a].x-s[b].x)*(s[a].x-s[b].x)+(double)(s[a].y-s[b].y)*(s[a].y-s[b].y)); } int main() { int n,Case=0; while(scanf("%d",&n)&&n!=0) { Case++; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) lowcost[i][j]=10000000; for(int i=1;i<=n;i++) scanf("%d%d",&s[i].x,&s[i].y); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) lowcost[i][j]=lowcost[j][i]=dis(i,j); floyd(n); printf("Scenario #%d\nFrog Distance = %.3lf\n\n",Case,lowcost[1][2]); } return 0; }
原文:http://www.cnblogs.com/atmacmer/p/5196881.html