poj 2253 Frogger

 题意:一只青蛙在湖中1号石头上, 它想去2石头号上去找另外一只青蛙,但是 湖里的水很脏,它不愿意游泳,所以它要跳过去;

给出 两只青蛙所在石头的坐标, 及湖里其他石头的坐标;任一两个坐标点间都是双向连通的。显然从A到B存在至少一条的通路,每一条通路的元素都是这条通路中前后两个点的距离,这些距离中又有一个最大距离。

现在要求求出所有通路的最大距离,并把这些最大距离作比较,把最小的一个最大距离作为青蛙的最小跳远距离。

解法一:用克鲁斯卡尔:

View Code
#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<algorithm>

#include<cmath>

#include<queue>

#include<map>

#include<cstring>

using namespace std;

class Kru

{

public:

      int x,y;

      double dis;    

}kru[40024];

class Node

{

public:

      int x,y;    

}node[224];

int set[224];

bool cmp( Kru a, Kru b )

{

   return a.dis < b.dis;    

}

int find( int x )

{

   return set[x] == x ? x : set[x] = find( set[x] );    

} 

double Kruscal( int N )

{

   int X,Y;

   double ans = 0;

   for( int i = 0 ; i < N ; i ++ )

   {

      if( find( 1 ) != find(2) )//判断1,2是否连通 

      {

          ans = kru[i].dis;

          if( ( X = find( kru[i].x ) ) != ( Y = find( kru[i].y ) )) 

          set[X] = Y;         

      }    

      else return ans;    

   }

   return ans;    

}

double Dis( Node a, Node b )

{

    return sqrt( ( a.x - b.x )*( a.x - b.x ) + ( a.y - b.y )*( a.y - b.y ) );    

}

int main(  )

{

    int N,Case=1;

    while( scanf( "%d",&N ),N )

    {

        for( int i = 1 ; i <= N ; i ++ )

        {

           set[i] = i;

           scanf( "%d %d",&node[i].x,&node[i].y );    

        }

        int count=0;

        for( int i = 1; i <= N ; i ++ )

        {

           for( int j = i + 1 ; j <= N ; j ++ )

           {

              kru[count].x = i; kru[count].y = j;

              kru[count].dis = Dis( node[i] , node[j] );

              count++;        

           }    

        }

        sort( kru , kru + count , cmp );

        printf( "Scenario #%d\n",Case ++);

        printf( "Frog Distance = %.3f\n\n",Kruscal( count ) );

    }

    //system( "pause" );

    return 0;

}

 

解法二:用地杰斯特拉

View Code
#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<algorithm>

#include<cmath>

#include<queue>

#include<set>

#include<cstring>

#include<vector>

using namespace std;

class Node

{

public:

     int x,y;

}node[224];

double map[224][224];

double Dis( Node a , Node b )

{

  return sqrt( ( a.x - b.x )*( a.x - b.x ) + ( a.y - b.y )*( a.y - b.y ) );

}

double Max( double a , double b )

{

    return a > b? a : b;    

}

double Min( double a , double b )

{

    return a < b? a : b;    

}

double Dijkstra( int N )

{

   bool hash[224]  = {0};

   double dis[224];

   for( int i = 0 ; i <= N; i++)

   {

       dis[i] = 100000000;

   }

   dis[1] = 0;

   for( int i = 1 ; i <= N ; i ++  )

   {

      double min = 100000000;int t;

      for( int j = 1 ; j <= N ;j ++ )

      {

         if( !hash[j] && min > dis[j] )

         {

            min = dis[j] ; t = j;

         }        

      }        

      if( t == 2 ) return dis[2];

      hash[t] = true;

      for( int j = 1 ; j <= N ;j ++ )

      {

         if( !hash[j] )

         {

           double tt = Max( min , map[t][j] );

           dis[j] = Min( tt , dis[j] ); 

         }        

      }

   }    

}

int main(  )

{

    int N,Case=1;

    while( scanf( "%d",&N ),N )

    {

        for( int i = 1; i <= N ; i++ )

        {

           scanf( "%d %d",&node[i].x ,&node[i].y );    

        }    

        for( int i = 1 ; i <= N ; i ++ )

        {

            map[i][i] = 0x7fffffff;

           for( int j = i + 1 ; j <= N ; j ++ )

           {

                map[i][j] = map[j][i] = Dis( node[i] , node[j] );

           }    

        }

        printf( "Scenario #%d\n",Case ++);

        printf( "Frog Distance = %.3f\n\n",Dijkstra( N  ) );

    }

    //system( "pause" );

    return 0;

}

 

你可能感兴趣的:(poj)