题目: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 }
……呃,这个方法还是不大能理解呀