poj 2253 Frogger(最短路 floyd)

题目:http://poj.org/problem?id=2253

题意:给出两只青蛙的坐标A、B,和其他的n-2个坐标,任一两个坐标点间都是双向连通的。显然从A到B存在至少一条的通路,每一条通路的元素都是这条通路中前后两个点的距离,这些距离中又有一个最大距离。

现在要求求出所有通路的最大距离,并把这些最大距离作比较,把最小的一个最大距离作为青蛙的最小跳远距离。

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<stack>
 6 #include<queue>
 7 #include<algorithm>
 8 #include<cmath>
 9 #include<iomanip>
10 using namespace std;
11 
12 double map[250][250];
13 int n;
14 void floyd()
15 {
16     int i,j,k;
17     for(k=0; k<n; k++)
18         for(i=0; i<n-1; i++)
19             for(j=i+1; j<n; j++)
20                 if(map[i][k]<map[i][j] && map[k][j]<map[i][j])  //map表示从i到j 上各个通路中最大的一条当中的 最小的的
21                 {
22                     if(map[i][k]<map[k][j])
23                         map[i][j]=map[j][i]=map[k][j];
24                     else
25                         map[i][j]=map[j][i]=map[i][k];
26                 }
27 }
28 
29 int main()
30 {
31     int x=1,i,j;
32     double a[250],b[250];
33     while(~scanf("%d", &n) && n)
34     {
35         memset(map,0,sizeof(map));
36         for(i=0; i<n; i++)
37             scanf("%lf%lf",&a[i],&b[i]);
38 
39         for(i = 0; i < n; i++)
40             for(j = i+1; j < n; j++)
41             {
42                 map[j][i]= sqrt((a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]));
43                 map[i][j] = map[j][i];
44             }
45 
46         floyd();
47         cout<<"Scenario #"<<x++<<endl;
48         cout<<fixed<<setprecision(3)<<"Frog Distance = "<<map[0][1]<<endl<<endl;
49     }
50     return 0;
51 }

 ……呃,这个方法还是不大能理解呀

posted @ 2013-08-09 21:15  水门  阅读(170)  评论(0编辑  收藏  举报