Frog Distance(poj2253)flo…

来源:互联网 发布:linux远程桌面工具 编辑:程序博客网 时间:2024/06/05 08:15
题目大意:
青蛙要从一个石头(二维坐标点)跳到另外一个石头上,有其他n-2块石头可以作为跳跃的媒介。起码有一条可以跳跃的路线到达,指定石头上。在每条路线上,距离最大的一个跳跃段最为青蛙的跳跃能力底线---FrogDistance,求在所有的路线中最短的那个Frog Distance,并按指定格式输出。

解题思路:mindis[i][j]记录着点i与点j之间的Frog Distance。并利用点k来松弛;
mindis初始化为两点之间直接距离;
 核心代码:for(inti=0;i
         for(int j=0;j
         for(int k=0;k
         if(mindis[j][i]
          mindis[k][j]=mindis[j][k]=max(mindis[j][i],mindis[i][k]);//j-k松弛为j-i和i-k之间的更大者(FrogDistance的定义为一条路线中的距离最大的一个跳跃段)
#include
#include
#include
#include
#include
#define inf 0x6FFFFFFF

using namespace std;

struct point
{
    double x,y;
};
vector points;
double mindis[210][210];

double getdis(point a,point b)
{
    returnsqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
    int m;
    int p=1;
   while(scanf("%d",&m)!=EOF&&m!=0)
    {
       points.clear();
       memset(mindis,inf,sizeof mindis);
       for(int i=0;i
       {
           pointa;
          scanf("%lf%lf",&a.x,&a.y);
          points.push_back(a);
       }
       for(int i=0;i
       for(int j=i+1;j
       {
          mindis[i][j]=getdis(points[i],points[j]);
          mindis[j][i]=mindis[i][j];
       }
       for(int i=0;i
       for(int j=0;j
       for(int k=0;k
       {
          if(mindis[j][i]
           mindis[k][j]=mindis[j][k]=max(mindis[j][i],mindis[i][k]);
       }
       printf("Scenario #%d\nFrog Distance =%.3f\n\n",p++,mindis[0][1]);
    }
    return 0;
}
0 0
原创粉丝点击