Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 27020 | Accepted: 8797 |
Description
Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her, but since the water is dirty and full of tourists' sunscreen, he wants to avoid swimming and instead reach her by jumping.
Unfortunately Fiona's stone is out of his jump range. Therefore Freddy considers to use other stones as intermediate stops and reach her by a sequence of several small jumps.
To execute a given sequence of jumps, a frog's jump range obviously must be at least as long as the longest jump occuring in the sequence.
The frog distance (humans also call it minimax distance) between two stones therefore is defined as the minimum necessary jump range over all possible paths between the two stones.
You are given the coordinates of Freddy's stone, Fiona's stone and all other stones in the lake. Your job is to compute the frog distance between Freddy's and Fiona's stone.
Unfortunately Fiona's stone is out of his jump range. Therefore Freddy considers to use other stones as intermediate stops and reach her by a sequence of several small jumps.
To execute a given sequence of jumps, a frog's jump range obviously must be at least as long as the longest jump occuring in the sequence.
The frog distance (humans also call it minimax distance) between two stones therefore is defined as the minimum necessary jump range over all possible paths between the two stones.
You are given the coordinates of Freddy's stone, Fiona's stone and all other stones in the lake. Your job is to compute the frog distance between Freddy's and Fiona's stone.
Input
The input will contain one or more test cases. The first line of each test case will contain the number of stones n (2<=n<=200). The next n lines each contain two integers xi,yi (0 <= xi,yi <= 1000) representing the coordinates of stone #i. Stone #1 is Freddy's stone, stone #2 is Fiona's stone, the other n-2 stones are unoccupied. There's a blank line following each test case. Input is terminated by a value of zero (0) for n.
Output
For each test case, print a line saying "Scenario #x" and a line saying "Frog Distance = y" where x is replaced by the test case number (they are numbered from 1) and y is replaced by the appropriate real number, printed to three decimals. Put a blank line after each test case, even after the last one.
Sample Input
2 0 0 3 4 3 17 4 19 4 18 5 0
Sample Output
Scenario #1 Frog Distance = 5.000 Scenario #2 Frog Distance = 1.414
Source
Ulm Local 1997
由于是参考了别人的博客以及照着floyd算法模板敲出来的,所以就当是转载了,以后不是自己独立完成的(不参考其他资料),都不会选原创了。这道题目最关键的是松弛时的变形,其他的照模板来就行了。这个有个考基本功的地方,由于自己基础不扎实,不知道printf时double类型的格式也是%f,导致自己WA了三发,还死活找不到原因,最后还是在别人博客看到这点的,不然我能在这个坑里躺半年。
补充:准确地说,输出double类型时编译器选C++是可以用%lf的,G++则要用%f。务必牢记,这个坑不容易爬出来。
由于是参考了别人的博客以及照着floyd算法模板敲出来的,所以就当是转载了,以后不是自己独立完成的(不参考其他资料),都不会选原创了。这道题目最关键的是松弛时的变形,其他的照模板来就行了。这个有个考基本功的地方,由于自己基础不扎实,不知道printf时double类型的格式也是%f,导致自己WA了三发,还死活找不到原因,最后还是在别人博客看到这点的,不然我能在这个坑里躺半年。
补充:准确地说,输出double类型时编译器选C++是可以用%lf的,G++则要用%f。务必牢记,这个坑不容易爬出来。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 220;
int n, x[maxn], y[maxn];
double map[maxn][maxn];
void floyd()
{
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
map[i][j] = min(map[i][j], max(map[i][k], map[k][j]));//求所有可行路径中弹跳的最大的跨度的最小值
}
int main()
{
//freopen("Text.txt", "r", stdin);
int kcase=0;
double tmp;
while (scanf("%d",&n)==1&&n)
{
memset(map, 0, sizeof(map));
for (int i = 1; i <= n; i++)
{
scanf("%d%d", &x[i], &y[i]);
}
for (int i = 1; i <= n; i++)
for (int j = i ; j <= n; j++)
{
map[i][j] = map[j][i] = sqrt((double)(x[i] - x[j])*(x[i] - x[j]) + (double)((y[i] - y[j])*(y[i] - y[j])));
}
floyd();
if (kcase) printf("\n");
printf("Scenario #%d\nFrog Distance = %.3f\n", ++kcase, map[1][2]);
}
return 0;
}