poj 2253 Frogger
题意:一只青蛙在湖中1号石头上, 它想去2石头号上去找另外一只青蛙,但是 湖里的水很脏,它不愿意游泳,所以它要跳过去;
给出 两只青蛙所在石头的坐标, 及湖里其他石头的坐标;任一两个坐标点间都是双向连通的。显然从A到B存在至少一条的通路,每一条通路的元素都是这条通路中前后两个点的距离,这些距离中又有一个最大距离。
现在要求求出所有通路的最大距离,并把这些最大距离作比较,把最小的一个最大距离作为青蛙的最小跳远距离。
解法一:用克鲁斯卡尔:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }
解法二:用地杰斯特拉
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }