SSL P1615 Frogger

来源:互联网 发布:乡村旅游数据统计 编辑:程序博客网 时间:2024/06/07 16:51

Description
Freddy一次能跳的距离必须至少和这一串石头间的距离最大的距离一样。因此,介于石头间的蛙跳距离定义为要从Freddy所在的石头跳到Fiona所在的石头的路径中,最小必须要跳的距离。给你Freddy所在的石头、Fiona所在的石头,以及湖中所有其它石头的坐标,你的任务是算出介于Freddy和Fiona所在石头间的蛙跳距离。

Input

输入含有多组测试数据。每组测试资料的第一列有1个整数n,代表石头的数目(2 <= n <= 200)。接下来的n列每列有2个整数xi,yi(0 <= xi,yi <= 1000)代表第i颗石头的坐标。其中第一颗为Freddy所在的石头,第二颗为Fiona所在的石头,其它的n-2颗石头上则是空的。
每组测试数据后有一空白列,当n=0时代表输入结束。请参考Sample Input。

Output

对每一组测试数据,输出一列这是第几组测试数据,以及一列蛙跳距离。
每组测试数据后亦输出一空白列。请参考Sample Output。

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

floyd:
1.勾股定理求出每一块石头到各个石头的距离。
2.如果从i到k和从k到j的距离都比直接从i到j小,那么从i到j每一步要跳的最小距离就是i到k和k到j中最大的值。
3.floyd。

var    a:array [0..201,0..201] of extended;    p,q:array [0..201] of longint;    i,j,k,n,t:longint;begin     t:=0;     while not(eof) do           begin               fillchar(a,sizeof(a),0);               fillchar(p,sizeof(p),0);               fillchar(q,sizeof(q),0);               readln(n);               if n=0 then halt;               for i:=1 to n do readln(p[i],q[i]);               for i:=1 to n-1 do                   for j:=i+1 to n do                       begin                           a[i,j]:=sqrt((p[i]-p[j])*(p[i]-p[j])+(q[i]-q[j])*(q[i]-q[j]));                           a[j,i]:=a[i,j];                       end;               for k:=1 to n do                   for i:=1 to n-1 do                       for j:=i+1 to n do                           if (a[i,j]>a[i,k]) and (a[i,j]>a[k,j]) then                              if a[i,k]>a[k,j]                              then begin                                     a[i,j]:=a[i,k];                                     a[j,i]:=a[i,k];                                   end                              else begin                                     a[i,j]:=a[k,j];                                     a[j,i]:=a[k,j];                                   end;               inc(t);               writeln('Scenario #',t);               writeln('Frog Distance = ',a[1,2]:0:3);               writeln;           end;end.

PRIM+dfs:
1.勾股定理求出每个点到各个点的距离。
2.PRIM。
3.dfs搜到Fiona所在的石头的路径找最大。

var  a:array[0..201,0..201] of extended;  g:array[0..201,0..201] of longint;  x,y,v,b:array[0..201] of longint;  n,p,k,i,j:longint;  max:extended;procedure prim;  var    i,j,k,xy,pq:longint;    min:extended;  begin    for k:=1 to n-1 do      begin        min:=maxlongint;        for i:=1 to n do          if v[i]=1 then            for j:=1 to n do              if (v[j]=0) and (min>a[i,j]) and (a[i,j]<>0)                then begin                       min:=a[i,j];                       xy:=i;                       pq:=j;                     end;        if min<>maxlongint          then begin                 v[pq]:=1;                 g[xy,pq]:=1;                 g[pq,xy]:=1;               end;      end;  end;procedure dfs(i:longint);  var    j:longint;  begin    if i=2 then begin                  for j:=2 to p do if a[b[j],b[j-1]]>max then max:=a[b[j],b[j-1]];                  exit;                end;    for j:=1 to n do      if (v[j]=0) and (g[i,j]=1)        then begin               inc(p);               b[p]:=j;               v[j]:=1;               dfs(j);               v[j]:=0;               dec(p);             end;  end;begin  k:=0;  while not(eof) do    begin       readln(n);       if n=0 then halt;       fillchar(v,sizeof(v),0); fillchar(g,sizeof(g),0);       fillchar(a,sizeof(a),0); fillchar(b,sizeof(b),0);       fillchar(x,sizeof(x),0); fillchar(y,sizeof(y),0);       max:=0;       for i:=1 to n do readln(x[i],y[i]);       for i:=1 to n-1 do           for j:=i+1 to n do               begin                  a[i,j]:=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));                  a[j,i]:=a[i,j];               end;       v[1]:=1;       prim;       fillchar(v,sizeof(v),0);       p:=1; v[1]:=1; b[1]:=1;       dfs(1);       inc(k);       writeln('Scenario #',k);       writeln('Frog Distance = ',max:0:3);       writeln;    end;end.
1 0
原创粉丝点击