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 }

 

posted on 2013-08-15 16:02  随风浪子的博客  阅读(130)  评论(0编辑  收藏  举报

导航