最短経路変更POJ 2253

フレディカエルは湖の真ん中に石の上に座っています。突然、彼は他の石の上に座っているフィオナカエルに気づきます。彼は彼女を訪問する予定ですが、水が汚れや観光客の日焼け止めに満ちているので、彼は水泳を避け、代わりにジャンプして、彼女に到達したいと考えています。 
残念ながら、フィオナの石が彼のジャンプの範囲外です。したがって、フレディは中間停止など、他の石を使用して、いくつかの小さなジャンプのシーケンスによって彼女に到達すると考えています。 
ジャンプの所定のシーケンスを実行するには、カエルのジャンプ範囲は明らかにシーケンスの中で最も長いジャンプ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 

タイトル効果:最初の点が開始点である、第二の点は、終点ポイントを最初から最後までの最短経路を求め、始点と終点との間の余りであります最も遠い距離。
これは、アレイがもはや点にDIS最短パスに格納され、最短の変形ではないが、二点間の最も離れた経路上の
転送方程式DIS [I] =分(DIS [i]は、MAX( ANS、ARR [POS] [I ]))
#include <iostreamの> 
する#include <cstdioを> 
する#include <アルゴリズム> 
の#include <CStringの> 
する#include <cmath>
 使用して 名前空間STD。
CONSTの INT N = 1E4 + 7 constの ダブル INF = 1E7 + 7 int型のn;
構造体STU {
     int型、B。
} P [N]。
int型のマーク[N]。
二重ARR [N] [N]。
二重DIS [N]。
ボイドdjstrea(){ 
    memsetの(マーク、0はsizeof (商標))。
    にとってint型 i = 1 ; iがn = <; iは++ ){ 
        DIS [I] =のARR [ 1 ] [i]は、
    } 
    DIS [ 1 ] = 0 
    マーク[ 1 ] = 1 int型 iは= 1 ; iが<= N iが++ ){
         ダブル = ANS INF。
        int型秒;
        以下のためにint型 i = 1 ; iが<= N; iは++ 場合(マーク[I] == 0 && ANS> DIS [I]){ 
                ANS =DIS [i]は、
                S = I; 
            } 
        マーク[S] = 1 以下のためにint型 i = 1 ; iは= N <; iは++ ){
             場合(マーク[I] == 0 ){ 
                DIS [i]は = 分(DIS [i]は、MAX(ANS、ARR [S] [I]) ); //转移方程变啦
            } 
        } 
    } 
} 
int型のmain(){
     int型のk = 0 INT X、Y。
    一方、(scanf関数(" %のD "、&​​N)&& N){ 
        K++ ;
        以下のためにint型 i = 1 ; iが<= N; iが++ ){ 
            CIN >> X >> Yと、
            P [i]は.A =のX。
            P [i]は.B = Y。
        } 
        のためにint型 i = 1 ; iがn = <; I ++ のためのINT J = 1 ; J <= N; J ++ 
                ARR [I] [J] =のARR [J] [I] = INF。
        
                
        以下のためにint型 i = 1 ; iがn <; iは++ ){
             ためINTJ = iは+ 1、J <= nであり、j ++ ){ 
                ARR [j]は[I] =のARR [I] [J] = SQRT((P [i]は.AP [J] .A)*(P [i]は.AP [J] .A)+(P [i]は.BP [J] .B)*(P [i]は.BP [J] .B))。
            } 
        } 
        djstrea()。
        printf(" シナリオ#%d個の\ n " 、K)。
        printf(" カエル距離=%の.3fする\ n "、DIS [ 2 ])。
        coutの << てendl; 
    } 
    戻り 0 
}

またflord書き込みを使用することができます。

#include <cstdioを> 
する#include <CStringの> 
する#include < ストリング > 
の#include <iostreamの> 
する#include <スタック> 
の#include <キュー> 
の#include <ベクトル> 
の#include <cmath> 
の#include <アルゴリズム>
 の#define MEM(A 、B)のmemset(A、B、はsizeof(A))
 の#define MAXNUM 300
 の#define 0x3f3f3f3f INF
 使用して 名前空間STDを、
INT X [MAXNUM]、Y [MAXNUM]、N。
ダブルマップ[MAXNUM] [MAXNUM]。
ボイドフロイド()
{ 
    int型 K =。1 ; K <= N; K ++ のためのINT I = 1 I <= N; I ++ のためのINT J = 1。 ; J <= N; J ++ 
                マップ[I] [J] =分(マップ[I ] [J]、MAX(マップ[I] [K]、マップ[K] [J])); // 多くの最小エッジの通路最長辺
 //                 マップ[I] [J] =分(MAP [I]、[J]、MAX(マップ[I] [K]、マップ[K] [J])); 
}
 int型のmain()
{ 
    int型 Q = 1。;
     ながら(〜scanfの(" %のD "、およびN-) && N-)
    { 
        MEM(地図、0);
        以下のためにint型私= 1 ; iが<= N; iが++ 
            のscanf(" %D%D "、およびX [i]は、&Y [I])。
        int型 i = 1 ; iが<= N; iが++ のためのint型 J = I + 1、J <= nであり、j ++ 
                [I] [j]をマッピング =マップ[j]は[I] = SQRT(二重(X [I] -x [J])*(X [I] -x [J])+ 二重(Y [I] -y [J])*(Y [I] - Y [J]))。
        フロイド(); 
        printf(" シナリオ#%D \ nFrog距離=%.3lf \ N \ N "、Q ++、地図[ 1 ] [ 2 ])。
    } 
    戻り 0 

 }

 



おすすめ

転載: www.cnblogs.com/Accepting/p/11324896.html