http://poj.org/problem?id=2253
这题与前面POJ2263(在我的前一篇解题报告中有)类似,都是关于Floyd解法的变种,这个需要注意的就是递推式如下:
temp = max { map[i][k] , map[k][j]} , map[i][j] = min{temp , map[i][j]} 。map[i][j]表示的是从i到j的所有路径的最大距离的最小值(意思就是,到达j的每条路径中的最大石子间距中最小值)。不过此处开用g++交没过,想了半天没想出来原因,就看了一下讨论,说是编译器对g++中double的输出,要用".3f",改了之后,就过了,然后又用c++交了下,用c++交的时候可以直接用“.3lf”。
源代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std ;
struct Point{
int x ;
int y ;
} ;
Point point[205] ;
double dist(Point , Point ) ;
double map[205][205] ;
int n ;
void floyd() ;
int main()
{
int test ;
int i ;
int j ;
test = 0 ;
while(scanf("%d" , &n)!=EOF && n)
{
for(i = 1 ; i <= n ; i ++)
{
point[i].x = 0 ;
point[i].y = 0 ;
for(j = 1 ; j <= n ; j ++)
map[i][j] = 0.0 ;
}
for(i = 1 ; i <= n ; i ++)
scanf("%d %d" , &point[i].x , &point[i].y ) ;
for(i = 1 ; i <= n ; i ++)
for(j = i ; j <= n ; j ++)
map[i][j] = map[j][i] = dist(point[i] , point[j]) ;
floyd() ;
printf("Scenario #%d\n" , ++test) ;
printf("Frog Distance = %.3f\n" , map[1][2]) ;
putchar('\n') ;
}
return 0 ;
}
double dist(Point x ,Point y )
{
return (double)sqrt(double((x.x - y.x)*(x.x - y.x) + (x.y - y.y) * (x.y - y.y))) ;
}
void floyd()
{
int i ;
int j ;
int k ;
double temp ;
for(k = 1 ; k <= n ; k ++)
{
for(i = 1 ; i <= n ; i ++)
{
for(j = 1 ; j <= n ; j ++)
{
temp = map[i][k] > map[k][j] ? map[i][k] : map[k][j] ;
if(temp < map[i][j])
map[i][j] = temp ;
}
}
}
}