题意梗概:青蛙王子最近喜欢上了另一只经常坐在荷叶上的青蛙公主。不过这件事不小心走漏了风声,被某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 }