タオ、ヨーロッパの最短(三次元座標)

リンク: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」(二重引用符なし)
例1

エントリー

コピー
4 5
0 0 6 0 6 
-1 1 0
5 6 0
3 4 0 
6 1 0

輸出

コピー
8.606
スタート3終了

備考:

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 ;
}

 




おすすめ

転載: www.cnblogs.com/-citywall123/p/11924277.html