题意: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 <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
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 ;
}
349

被折叠的 条评论
为什么被折叠?



