POJ 2253 Frogger(floyd)

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

 

 

你可能感兴趣的:(floyd)