首页 > 代码库 > POJ 2253 (Frogger)
POJ 2253 (Frogger)
题目大意:
青蛙A在一块石头上想通过一系列的跳跃跳到青蛙B的石头上,这里会给出池塘里所有石头的坐标,其中第一个给出的是青蛙A的石头坐标,第二个给出的坐标上衣青蛙B的坐标,这里让你求所有可能的路径中最小的frog distance。 这里的frog distance的定义是一条路径跳跃最大的距离。
举个例子:17 4 、19 4 、18 5
这是青蛙A的坐标是17 4,青蛙B 的坐标是 19 4.另一块可以跳跃的石头坐标是18 5.
所以青蛙A到青蛙B的路径可以有两条17 4—>19 4 这个路径的frog distance(最大的跳跃路径)是 2。 另一条的路径是 17 4—>18 5 —>19 4 的跳跃距离是1.414、 1.414 ,所以青蛙A的最大跳跃路径是1.414 。 所以所有路径的最小 frog distance 是1.414 。
解题思路:
简单的pirm算法。 求不完全的最小生成树青蛙A-青蛙B的最小生成树。 求出最小生成树说明每段的跳跃距离都是最小的,最后输出最小生成树的最大的权值即可!
今天学到了一个小知识:
fabs里的数必须是浮点数,abs里的数是整形。可以通过编译器但OJ会编译错误,我是有多水,今天才知道。 还有就是sqrt里面的也是double,如果是整形的话可以在函数里*1.0或者+0.0 都可以。
代码:
1 #include <algorithm> 2 #include <iostream> 3 #include <sstream> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cstdio> 7 #include <string> 8 #include <bitset> 9 #include <vector> 10 #include <queue> 11 #include <stack> 12 #include <cmath> 13 #include <list> 14 //#include <map> 15 #include <set> 16 using namespace std; 17 /***************************************/ 18 #define ll long long 19 #define int64 __int64 20 /***************************************/ 21 const int INF = 0x7f7f7f7f; 22 const double eps = 1e-8; 23 const double PIE=acos(-1.0); 24 const int d1x[]= {0,-1,0,1}; 25 const int d1y[]= {-1,0,1,0}; 26 const int d2x[]= {0,-1,0,1}; 27 const int d2y[]= {1,0,-1,0}; 28 const int fx[]= {-1,-1,-1,0,0,1,1,1}; 29 const int fy[]= {-1,0,1,-1,1,-1,0,1}; 30 /***************************************/ 31 void openfile() 32 { 33 freopen("data.in","rb",stdin); 34 freopen("data.out","wb",stdout); 35 } 36 /**********************华丽丽的分割线,以上为模板部分*****************/ 37 struct Node 38 { 39 double x,y; 40 }node[520]; 41 int n; 42 double lowcost[520],map[520][520]; 43 double m; 44 double minn; 45 int vis[520]; 46 void prim() 47 { 48 int i,j,k; 49 minn=-1; 50 for(i=1;i<=n;i++) 51 { 52 lowcost[i]=map[1][i]; 53 vis[i]=0; 54 } 55 vis[1]=1; 56 for(i=1;i<=n-1;i++) 57 { 58 m=INF; 59 for(j=1;j<=n;j++) 60 { 61 if (lowcost[j]<m&&!vis[j]) 62 { 63 k=j; 64 m=lowcost[j]; 65 } 66 } 67 vis[k]=1; 68 if (minn<m) 69 minn=m; 70 if (k==2) 71 break; 72 for(j=1;j<=n;j++) 73 { 74 if (lowcost[j]>map[k][j]&&!vis[j]) 75 lowcost[j]=map[k][j]; 76 } 77 } 78 return ; 79 } 80 int main() 81 { 82 int cas=1; 83 while(scanf("%d",&n)&&n) 84 { 85 int i,j; 86 for(i=1;i<=n;i++) 87 { 88 scanf("%lf%lf",&node[i].x,&node[i].y); 89 } 90 for(i=1;i<=n;i++) 91 for(j=1;j<=n;j++) 92 map[i][j]=INF; 93 for(i=1;i<=n;i++) 94 for(j=1;j<=n;j++) 95 { 96 map[i][j]=sqrt(fabs(node[j].x-node[i].x)*fabs(node[j].x-node[i].x)+fabs(node[j].y-node[i].y)*fabs(node[j].y-node[i].y))*1.000; 97 } 98 prim(); 99 printf("Scenario #%d\n",cas++);100 printf("Frog Distance = %.3f\n\n",minn);101 }102 return 0;103 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。