POJ_2253_Frogger(Floyd 两点间最短路径算法)
http://poj.org/problem?id=2253
/*题目大意:有一只青蛙想跳到另一只青蛙那里去,有很多点可以从1点跳到2点;
那么就形成很多跳跃路径在这些路径当中存在两点他们的距离最大,题目中称作frog distance
计算这些frog distance当中最小的那一个。
Floyd 算法简单的应用,看看Floyd算法就会了。
Floyd 算法的主要思想就是:在i到j的路径中,我k从1-n开始。如果i-k + k-j要比
i-j优化的话那么更新i-j为 i-k与k-j的和、积、最大值、最小值。具体情况看题目。
*/
1 # include <stdio.h> 2 # include <string.h> 3 # include <math.h> 4 # include <iostream> 5 using namespace std; 6 double e[230][230]; 7 struct node 8 { 9 double x; 10 double y; 11 }point[230]; 12 int main() 13 { 14 int i,j,k,n; 15 int leag=1; 16 while(scanf("%d",&n) != EOF) 17 { 18 if(!n)break; 19 for(i=1;i<=n;i++) 20 cin>>point[i].x>>point[i].y; 21 for(i=1;i<n;i++) 22 { 23 for(j=i+1;j<=n;j++) 24 { 25 double x1=(point[i].x-point[j].x); 26 double y2=(point[i].y-point[j].y); 27 e[i][j]=e[j][i]=sqrt(x1*x1+y2*y2);//注意对称性。 28 } 29 } 30 for(k=1;k<=n;k++)//Floyd 算法主体部分。 31 { 32 for(i=1;i<n;i++) 33 { 34 for(j=i+1;j<=n;j++) 35 { 36 if(e[i][k]<e[i][j] && e[k][j]<e[i][j]) 37 { 38 if(e[i][k]>e[k][j]) 39 e[i][j]=e[j][i]=e[i][k]; 40 else 41 e[i][j]=e[j][i]=e[k][j]; 42 } 43 } 44 } 45 } 46 printf("Scenario #%d\n",leag++); 47 printf("Frog Distance = %.3f\n\n",e[1][2]); 48 } 49 return 0; 50 }