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;
}

 

posted @ 2012-07-01 10:28  wutaoKeen  阅读(231)  评论(0编辑  收藏  举报