リンク:https://ac.nowcoder.com/acm/contest/1168/C
出典:牛オフネットワーク
タイトル説明
スタートと航空機とnの休憩の既知の座標のエンドポイントは、どのくらいの最後にされ始めて最短経路を求めますか?
制限事項:長期的な航空機が飛ぶことができない、あなたが停止し、接合部の途中で休まなければなりません。(すなわち、連続的な飛行距離はMより小さくなければなりません)
ジュニア姉妹見習いの前でその気概を見せたかった王タオ兄弟が、あなたは彼がこの問題を解決することができますか?
説明を入力します。
二つの数値、整数と浮動小数点数の第一の入力線は、N M
第二の入力線6浮動点X1、Y1、Z1、X2、 Y2、Z2を。開始座標(X1、Y1、Z1)と終了点(X2、Y2、Z2)を表す
直ちに、各行順次入力浮動小数点数3、休憩の座標(AI、BI、CI)で表される残り続くn行をコードステーションは、1,2-続く...... N。
出力説明:
最短距離(結果3つの小数点)の長さの端に出力を開始条件を満たす。
航空機(終了端コーディング、スタート符号化開始、nは休憩1としてエンコード)を順次出力する符号化されたステーション
が出力の最後に到達できない場合「-1」(二重引用符なし)
備考:
N <= 600
前処理経路重みと連携します
#include <iostreamの> する#include <アルゴリズム> の#include <math.h>の 書式#include <スタック> の#include < ストリング > の#include < 文字列・H> に#define LL長い長 の#define M 999999999 使用して 名前空間STDを、 構造体のノード { ダブルX; ダブルY; ダブルZ; } P [ 1000年]。 二重の道[ 1000年 ] [ 1000年 ]、DIS [ 1000年]。 int型の next1 [ 1000年 ]、VIS [ 1000年]。 int型のn; ダブルメートル; スタック < int型 > S; 二重LEN(ノードA、ノードB) { 戻り SQRT((AX-BX)*(AX-BX)+(AY-によって)*(AY-によって)+(AZ-BZ)*(az- BZ))。 } 無効ダイクストラ(int型秒) { 以下のために(INT iが= 0 ; I <= N + 1 ; I ++ ) { DIS [I] = 道[S] [I]。 } VIS [S] = 1 。 以下のために(INT iが= 0 ; I <= N + 1 ; I ++ ) { INTミネソタ州= M、K = 0 。 用(INT J = 0 ; J <= N + 1、J ++ ) { もし(!VIS [J] && DIS [J] < ミネソタ州) { A = DIS [i]は、 K = J; } } もし(ミネソタ州== M) { 休憩; } VIS [K] = 1 。 用(INT J = 0 ; J <= N + 1、J ++ ) { もし(!VIS [J]) { もし(DIS [J]>方法[K] [J] + DIS [K]) { 伝える[J] =道[K] [J] + [K]を言います。 next1 [J] = K。 } } } } } int型のmain() { CIN >> N >> M。 next1 [ 0 ] = - 8 。 memset(方法、M、はsizeof (方法))。 CIN >> P [ 0 ] .X >> P [ 0 ] .Y >> P [ 0 ] .Z >> P [N + 1 ] .X >> P [N + 1 ] .Y >> P [N + 1 ] .Z; 以下のために(INT iが= 1 ; I <= N; I ++ ) CIN >> P [i]は.X >> P [i]は.Y >> P [i]は.Z。 以下のために(INT iが= 0 ; I <= N + 1 ; I ++ ) { 用(INT J = 0 ; J <= N + 1、J ++ ) { 方法[I] [J] = LEN(P [I]、P [J])。 もし(方法[I] [J]> M) 道[I] [J] = M; } } // ため(INT iは= 0; iが<= N + 1; I ++) // のための(INT J = 0であり、j <= N + 1、J ++) // COUT <<方法[I] [J] << endl; ダイクストラ(0 )。 もし(DIS [N + 1 ] == M) COUT << - 1 << てendl; 他 { // COUT << DIS [N + 1] << ENDL。 printf(" %.3lf \ n "、DIS [N + 1 ])。 INT CNT = N + 1 。 しばらく(! - next1 [CNT] = 8 ) { s.push(CNT)。 CNT = next1 [CNT]。 } 裁判所未満 << 「スタート」。 しばらく(s.size()!= 1 ) { coutの << ' ' << s.top(); s.pop(); } 裁判所未満 << " " << " 終了" << てendl; } リターン 0 ; }