暑假集训(3)第四弹 -----Frogger(Poj2253)

题意梗概:青蛙王子最近喜欢上了另一只经常坐在荷叶上的青蛙公主。不过这件事不小心走漏了风声,被某fff团团员知

道了,在青蛙王子准备倾述心意的那一天,fff团团员向湖泊中注入大量的充满诅咒力量的溶液。这种溶液最初练成需整

整十一年的时间,在每一个剁手节,都要向其中融入珍贵魔法材料“辛格多格的哀怨“。有“一碰到就会告白失败的”功用。

不过幸运的是,青蛙王子居然很快发现到i这一点,所以他准备通过某种神秘仪式,来驱散这个诅咒。但是这个仪式还需

要一个关键数来触发,那就是从青蛙王子所在荷叶跳到青蛙公主的,每一条路径中的最大跳跃步数的集合中的最小数。

有了它,”信仰之跃“仪式就可以开始发挥作用,破除”辛格多格的哀怨“的魔法力量。

为了保护真善美,为了爱与和平,你决定帮助青蛙王子得到那个最小数。

问题分析:我觉得这个星期做题都快做成懵逼了,好多种乱七八遭的算法,碰到题目都没怎么思考,就开始”套模板“,这

个题目,我套啊套,也没整出个名堂,最后还是百度了,用floyd算法或者prim什么的都行,然而我还是不会做,这真的很

难受。唉.....

 1 #include <cstdio>
 2 #include <cmath>
 3 int stone[204][204];
 4 int x[204],y[204];
 5 int n,cas=0;
 6 void mbegin()
 7 {
 8     int i;
 9     for(i = 0;i < n;i++)
10         scanf("%d%d",&x[i],&y[i]);
11 }
12 int max(int va,int vb)
13 {
14     return va > vb ? va : vb;
15 }
16 int square(int x1,int y1,int x2,int y2)
17 {
18     return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
19 }
20 void init()
21 {
22     int i,j;
23     for(i = 0;i < n;i++)
24       for(j = 0;j < n;j++)
25         stone[i][j] =stone[j][i] = square(x[i],y[i],x[j],y[j]);
26 
27 }
28 double Floyd()
29 {
30     int i,j,k;
31     init();
32     for(k = 0;k < n;k++)
33       for(i = 0;i < n;i++)
34         for(j = 0;j < n;j++)
35           {
36             if(stone[i][j] > stone[i][k] && stone[i][j] > stone[k][j])
37                     stone[i][j] = max(stone[i][k],stone[k][j]);
38             stone[j][i] = stone[i][j];
39           }
40     return sqrt(double(stone[0][1]));
41 }
42 int main(void)
43 {
44     while(scanf("%d",&n) && n)
45     {
46         mbegin();
47         printf("Scenario #%d
Frog Distance = %.3lf

",++cas,Floyd());
48     }
49     return 0;
50 
51 }
View Code
原文地址:https://www.cnblogs.com/huas-zlw/p/5712693.html