B - フロッガー(spfa)
トピックへのリンク:https://vjudge.net/contest/66569#problem/B
トピック:
フレディカエルは湖の真ん中に石の上に座っています。突然、彼は他の石の上に座っているフィオナカエルに気づきます。彼は彼女を訪問する予定ですが、水が汚れや観光客の日焼け止めに満ちているので、彼は水泳を避け、代わりにジャンプして、彼女に到達したいと考えています。
残念ながら、フィオナの石が彼のジャンプの範囲外です。したがって、フレディは中間停止など、他の石を使用して、いくつかの小さなジャンプのシーケンスによって彼女に到達すると考えています。
ジャンプの所定のシーケンスを実行するには、カエルのジャンプ範囲は明らかにシーケンスの中で最も長いジャンプoccuringと少なくとも同じ長さでなければなりません。
二つの石の間のカエルの距離が(ヒトはまた、ミニマックス距離それを呼び出す)従って二つの石の間のすべての可能な経路上最低限必要なジャンプ距離として定義されます。
あなたはフレディの石、フィオナの石、湖内の他のすべての石の座標を与えられています。あなたの仕事は、フレディさんとフィオナの石の間カエルの距離を計算することです。
入力
残念ながら、フィオナの石が彼のジャンプの範囲外です。したがって、フレディは中間停止など、他の石を使用して、いくつかの小さなジャンプのシーケンスによって彼女に到達すると考えています。
ジャンプの所定のシーケンスを実行するには、カエルのジャンプ範囲は明らかにシーケンスの中で最も長いジャンプoccuringと少なくとも同じ長さでなければなりません。
二つの石の間のカエルの距離が(ヒトはまた、ミニマックス距離それを呼び出す)従って二つの石の間のすべての可能な経路上最低限必要なジャンプ距離として定義されます。
あなたはフレディの石、フィオナの石、湖内の他のすべての石の座標を与えられています。あなたの仕事は、フレディさんとフィオナの石の間カエルの距離を計算することです。
入力は、1つ以上のテストケースが含まれています。各テストケースの最初の行は、石の数N(2 <= N <= 200)を含むであろう。次のn行はそれぞれ石#iの座標を表す2つの整数XI、YI(0 <= XI、YI <= 1000)を含みます。ストーン#1は、フレディの石で、石#2は、フィオナの石、他のn-2石が占有されていないです。各テストケース以下の空白行があります。入力は、nはゼロ(0)の値によって終了されます。
出力
各テストケースのために、「シナリオ#X」、xはテストケースの数(これらは1から番号が付けられている)によって置換され、Yは、適当な実数で置き換えられている、「カエルの距離= Y」を言うラインを言うラインを印刷します、 3つの小数に印刷されました。でも最後の後、各テストケースの後に空白行を入れてください。
サンプル入力
2 0 0 3 4 3 17 4 19 4 18 5 0サンプル出力
#1シナリオ カエル距離= 5.000 シナリオ#2 カエル距離= 1.414 イタリアこと: 2匹のカエルおよびいくつかの石があり、これらのものは、現在知られている座標である、2匹のカエルAとBの座標は、最初のカエルを調整し、第二座標は、今カエルがBに行きたいカエル、カエルのジャンプは任意の石を使用することができますが、AからBへのパスの数が存在し、AからBへのすべてのパス上で最大のエッジを聞いて、例えば、2つあります経路1(4)5(3)側辺3と4 1-5、5-2、物品通路ジャンプ範囲(二つの石の間の最大距離)4との間で表し、 他のパス1(6)4(1)2、物品6の経路ホッピング範囲、ジャンプの範囲二つの経路4、6、それぞれ、我々は必要である最小ジャンプ範囲、即ち4、と三つの方法が解決することができるアイデア:最短経路問題テンプレート、少し変更し、選択された各パスの最大で、最小の複数のパスを選択し、そのテンプレートD [I]> D [今 ] +のLU [ 今] [i]はDへの[I]> MAX(D [今]、LUの[今] [i])とライン上で、初期化のためにWA何度も、開始後 あるいは、次のようにそれのサイクル、spfaアルゴリズムのコードを初期化しよう:
// // 2019年7月14日に羽生によって作成されます。 // する#include <iostreamの> の#include <アルゴリズム> 書式#include <キュー> の#include <マップ> 書式#include <CStringの> の#include <cstdioを> する#include <math.h>の 使用して 名前空間はstd; typedefの長い 長いLL。 #define MAX 0x3f3f3f3f のconst int型 MAXN = 1005 ; ダブルD [MAXN]。 ダブルLU [MAXN] [MAXN]。 ブールブック[MAXN]。 int型のn; 無効 spfa(INT A) { ため(int型 I = 2 ; I <= N; I ++は){ D [I] = MAX; ブック[I]は = falseに; } // 偽へのmemset(書籍、、はsizeof(書籍)) // のmemset (D、MAX、はsizeof(D)) // エラーを見つけるために2時間、このために多くの時間を、上記のコメントとWAを初期化を行う キュー< 整数 > 屈原を; Dは、[A] = falseに、 ブック[ A] = trueに、 qu.push(A)は、 int型になりました; 一方(!qu.empty()) { 今 = qu.front()。 qu.pop(); ブック[今] = 偽; 以下のために(int型 i = 1 ; iが<= N; iは++ ) { 場合(D [i]は> MAX(D [今]、LU [今] [I])) { D [i]は = MAX(D [今] 、LU [今] [I])。 もし(!ブック[i])と { qu.push(I); この本は、[I] = 真; } } } } } int型メイン() { int型のk = 0 。 int型[MAXN] B、[MAXN]。 一方、(〜のscanf(" %d個"、&N)){ 場合(N == 0 ) ブレーク。 以下のために(int型 i = 1 ; iが<= N; iが++ ){ scanf関数(" %d個の%dを"&[i]は、&B [I])。 } のために(int型 i = 1 ; iがn = <; iは++ ){ ため(INT J = 1; J <= I; J ++ ){ LU [I] [J] = LUの[jを] [I] SQRT =(二重([I] - [J])*([I] - [J])+ 二重の(B [ I] - B [J])*(B [I] - B [J]))。 } } spfa(1 )。 K ++ ; printf(" シナリオ#%d個の\ n " 、K)。 printf(" カエル距離=%.3lf \ n \ n "、D [ 2 ])。 } 戻り 0 。 }