题目描述
找出青蛙在最短路径中的最长距离(所谓蛙跳距离)。
输入
输入含有多组测试数据。每组测试资料的第一列有1个整数n,代表石头的数目(2 <= n <= 200)。接下来的n列每列有2个整数xi,yi(0 <= xi,yi <= 1000)代表第i颗石头的坐标。其中第一颗为Freddy所在的石头,第二颗为Fiona所在的石头。每组测试数据后有一空白列,当n=0时代表输入结束
输出
对每一组测试数据,输出一列这是第几组测试数据,以及一列蛙跳距离。
样例输入
2
0 0
3 4
3
17 4
19 4
18 5
0
样例输出
Scenario #1
Frog Distance = 5.000
Scenario #2
Frog Distance = 1.414
算法讨论
其实就是找最短路中的最长部分。在Dijkstra算法中顺便算出就好。
const
maxn=200;
var
a:array[1..maxn,1..maxn] of real;
z:array[1..maxn,1..2] of longint;
l:array[0..maxn] of real;
v:array[1..maxn] of 0..1;
i,j,n,m,t:longint;
min,s:real;
begin
while true do
begin
readln(n);
if n=0
then break;
inc(m);
for i:=1 to n do
begin
read(z[i,1],z[i,2]);
for j:=1 to i-1 do
begin
a[i,j]:=sqrt(sqr(z[i,1]-z[j,1])+sqr(z[i,2]-z[j,2]));
a[j,i]:=a[i,j]
end;
end;
for i:=1 to n do
l[i]:=a[1,i];
fillchar(v,sizeof(v),0);
v[1]:=1;
s:=-maxlongint;
for i:=1 to n-1 do
begin
min:=maxlongint;
for j:=1 to n do
if (l[j]<min) and (l[j]<>0)
then begin
min:=l[j];
t:=j
end;
if s<min
then s:=min;
if t=1
then break;
l[t]:=0;
for j:=1 to n do
if a[t,j]<l[j]
then l[j]:=a[t,j];
if l[2]=0
then break;
end;
writeln('Scenario #',m);
writeln('Frog Distance = ',s:0:3);
writeln;
end;
end.
Pixiv ID:60367069