poj2253 解题报告

题意:Freddy Frog暗恋Fiona Frog,在他们之间有n快石头,告诉你这n快石头的坐标,第一快为Freddy Frog的坐标,第n块为Finoa Frog的坐标,Freddy可以借助石头经过任何路径到达Fiona那里,问他最小的弹跳距离是多少

题解:用最短路dij做,额,这样说不准确,也可以用最小生成树的prim做,==!这两个本来就是一种思想,只不过松弛方法不一样,其实还可以floyed做,,,针对这道题都要改一下松弛条件,,dis[i]表示i到原点的路径中的极小最大值,,然后松弛条件if ( dis[j] > max ( dis[x] , map[x][j] ) && v[j] == 0 ) dis[j] = max ( dis[x] , map[x][j] ) ;这样就好了,,我居然sb地不仔细看题,先直接输出答案,没有格式错了一次,后来居然只保留两位小数错了一次,,我已经脑残了,没救了

代码:

#include 
#include 
#include 
#include 
using namespace std ;

const int MAXN = 405     ;
double INF = 999999999.0 ;

struct Point
{
    int  x , y ;
} point[MAXN] ;

int  n ;

double map[MAXN][MAXN] , dis[MAXN] ;

double dij() ;

int  main()
{
    int  i , j , k , Count = 0 ;
    while( scanf( "%d" , & n ) && n )
    {
        Count ++ ;
        memset( map , 0 , sizeof( map ) ) ;
        for( i = 0 ; i < n ; i ++ )
            scanf( "%d%d" , & point[i].x , & point[i].y ) ;

        for( i = 0 ; i < n ; i ++ )
            for( j = 0 ; j < n ; j ++ )
            {
                if( i == j ) continue ;
                map[i][j] = sqrt( double ( ( point[i].x - point[j].x ) * ( point[i].x - point[j].x ) + ( point[i].y - point[j].y ) * ( point[i].y - point[j].y ) ) ) ;
            }
        dij() ;
        printf( "Scenario #%d\nFrog Distance = %.3f\n\n" , Count ,  dis[1] ) ;
    }
    return 0 ;
}

double dij()
{
	int   i , j , x ;
	bool  v[MAXN] ;
	double  m = INF ;
	memset( v , 0 , sizeof( v ) ) ;
	for ( i = 0 ; i < n ; i ++ ) dis[i] = INF ;
	dis[0] = 0 ;
	for ( i = 0 ; i < n ; i ++ )
	{
		m = INF ;
		x = 0 ;
		for ( j = 0 ; j < n ; j ++ )
		{
			if ( dis[j] < m && v[j] == 0 )
			{
				m = dis[j] ;
				x = j ;
			}
		}
		v[x] = 1 ;
		for ( j = 0 ; j < n ; j ++ )
		{
			if ( dis[j] > max ( dis[x] , map[x][j] ) && v[j] == 0 ) dis[j] = max ( dis[x] , map[x][j] ) ;
		}
	}
	return m ;
}

你可能感兴趣的:(poj2253 解题报告)