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
",cas++);
100         printf("Frog Distance = %.3f

",minn);
101     }
102     return 0;
103 }
View Code
屌丝终有逆袭日,*******。
原文地址:https://www.cnblogs.com/ZhaoPengkinghold/p/3787579.html