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\n",cnt);
68         printf("Frog Distance = %.3f\n\n",map[0][1]);
69     }
70     return 0;
71 }
View Code

 

 

posted on 2013-08-16 11:12  枫、  阅读(255)  评论(0编辑  收藏  举报