http://poj.org/problem?id=2253
题意 : 题目是说,有这样一只青蛙Freddy,他在一块石头上,他呢注意到青蛙Fiona在另一块石头上,想去拜访,但是两块石头太远了,所以他只有通过别的石头跳过去,所以,从他的石头到Fiona的石头每一条可走的路,假设是n条,就需要你求出frog distance,这个所谓的距离就是指这n条路中,每条路选取组成这条路中最长的那边,最后一共有n条边,找这n条边里最短的那一条输出。
思路 : 就是一个最短路的问题,不过不需要求最短路的权值和,只需要求出最大跳即可,还要注意,不管几行坐标,前两行分别是Freddy的位置和Fiona的位置,最后输出,不过很多人倒是用了克鲁斯卡尔和prim做的,我一直不明白这个题为什么会转化成最小生成树.........好吧,我才疏学浅..........
这是几组测试数据:
2 0 0 3 4 3 17 4 19 4 18 5 8 1 1 4 0 1 2 2 2 3 2 4 2 3 0 5 1 3 9 10 10 10 100 10 6 5 5 100 100 4 4 3 3 2 2 1 1 5 1 2 2 1 3 2 4 1 5 2 3 999 999 1 1 3 3 0
Scenario #1 Frog Distance = 5.000 Scenario #2 Frog Distance = 1.414 Scenario #3 Frog Distance = 1.414 Scenario #4 Frog Distance = 1.000 Scenario #5 Frog Distance = 134.350 Scenario #6 Frog Distance = 1.414 Scenario #7 Frog Distance = 1408.557
对了,每一行输出有一空行,因为一开始没注意结果PE了一次,又一次证明了我有多粗心。。。。。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 8 const int maxn = 1011; 9 const int oo = 1 << 28 ; 10 11 double map[maxn][maxn]; 12 int n,m; 13 double x[maxn],y[maxn]; 14 15 void floyd() 16 { 17 for(int k = 0 ; k < n ; k++) 18 { 19 for(int i = 0 ; i < n ; i++) //主要针对由i到j的松弛,最终任意两点间的权值都会被分别松弛为最大跳的最小(但每个两点的最小不一定相同) 20 { 21 for(int j = 0 ; j < n ; j++) 22 { 23 if(map[i][j] > map[i][k]&&map[i][j] > map[k][j])//当边ik,kj的权值都小于ij时,则走i->k->j路线,否则走i->j路线 24 { 25 if(map[i][k] > map[k][j]) //当走i->k->j路线时,选择max{ik,kj},只有选择最大跳才能保证连通 26 map[i][j] = map[i][k]; 27 else 28 map[i][j] = map[k][j]; 29 } 30 31 } 32 } 33 } 34 } 35 36 void Init() 37 { 38 for(int i = 0 ; i < n ; i++) 39 { 40 for(int j = 0; j < n ; j++) 41 { 42 map[i][j] = oo ; 43 } 44 map[i][i] = 0 ; 45 } 46 } 47 48 int main() 49 { 50 int cnt = 0; 51 while(~scanf("%d",&n)&&n) 52 { 53 cnt++; 54 Init(); 55 for(int i = 0 ; i < n ; i++) 56 { 57 scanf("%lf %lf",&x[i],&y[i]); 58 } 59 for(int i = 0 ; i < n ; i++) 60 { 61 for(int j = 0 ; j < n ; j++) 62 { 63 map[i][j] = sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); 64 } 65 } 66 floyd(); 67 printf("Scenario #%d ",cnt); 68 printf("Frog Distance = %.3f ",map[0][1]); 69 } 70 return 0; 71 }