問題の意味:数所与球状ステーションN、および各ステーションのX、Y、Zと半径rの三次元座標は、(コスト局との間の距離に等しい)接続されているすべてのステーションへの最小コストを見つけた場合、接触、含む、または交差します私たちは橋を構築する必要はありません。
アイデア:または最小スパニングツリーの問題は、我々は最初の接触の場合には、含まれている場合はすべてが、接続された各宇宙ステーションのための情報、宇宙ステーション二十から二記録、または交差点我々は、コストが1に設定され、さもなければ、距離半径を入れそして、。
示すためにラベルを持つ各宇宙ステーションは、その後、前方の星を記録しました。プリム最小スパニングツリーアルゴリズムを見つけるために使用することができます。
G ++使用不可能%fが%LFを使用するには:注意すべきもう一つのポイントは、最後の結び目の出力はということです
完全なコード;
書式#include <iostreamの> の#include <CStringの> の#include <cstdioを> する#include <キュー> の#include <ベクトル> の#include <cmath> の#include <アルゴリズム> 使用して 名前空間はstd; const int型 MAXN = 1000年。 const int型 MAXM = 1E5; INTのN、M。 ダブルANS; typedefのペア < ダブル、int型 > PII。 構造体EGDE { int型、U、V、次; ダブルワット; }エッジ[MAXM]。 構造体ノード{ ダブルX、Y、Z、R。 }スペース[MAXN]。 構造体CMP { ブール 演算子()(PII A、PII b)は{ リターン > a.first b.first。 } }。 int型のヘッド[MAXN]。 int型VIS [MAXN]。 ダブルdistの[MAXN]。 int型のトップ。 ボイドのinit(){ memsetの(頭、 - 1、はsizeof (ヘッド))。 memsetの(VIS、0、はsizeof (VIS))。 memset(DIST、 - 1、はsizeof (DIST))。 トップ= 0 ; ANS = 0 ; } ボイド追加を(int型 Uは、int型 V、ダブル{w)の int型のI。// 更新最小边权值 ため(I =ヘッド[U];〜I; I = エッジ[I] .next){ 場合(エッジ[I] .V == V){ 場合(エッジ[I] .W > w)のエッジ[I] .W = W。 返します。 } } エッジ[トップ] .U = U。 エッジ[トップ] .V = V。 エッジ[トップ] .W = = W。 エッジ[トップ] .next ヘッド[U]。 ヘッド[U] =トップ++ 。 } ボイドプリム(int型の){ int型のI。 PRIORITY_QUEUE <PII、ベクトル<PII>、CMP> Q。 VIS [S] = 1 。 DIST [S] = 0 ; 以下のための(I =ヘッド[S];〜I; I = エッジ[I] .next){ int型 V = エッジ[I] .V。 DIST [V] = エッジ[I] .W。 q.push(make_pair(DIST [V]、V))。 } ながら(!q.empty()){ PII T =q.top(); q.pop(); もし(VIS [t.second])続けます。 ANS + = t.first。 VIS [t.second] = 1 。 以下のための(I =ヘッド[t.second];〜I; I = エッジ[I] .next){ int型 V = エッジ[I] .V。 もし(!VIS [V] &&(DIST [V]>エッジ[I] .W)|| DIST [V] == - 1 ){ DIST [V] = エッジ[I] .W。 q.push(make_pair(DIST [V]、V))。 } } } } ダブル getDist(int型 Iを、int型J){ ダブルSX =(スペース[I] .Xスペース[J] .X)*(スペース[I] .x- スペース[J] .X)。 二重 SY =(スペース[I] .Yスペース[J] .Y)*(スペース[I] .y- スペース[J] .Y)。 二重 SZ =(スペース[I] .Zスペース[J] .Z)*(スペース[I] .z- スペース[J] .Z)。 ダブル DIS =のSQRT(SX + SY + SZ)。 もし(DIS <=(スペース[I] .R +容量[J] .R))を返す 0.00 。 他に 返すディス(スペース[I] .R + スペース[J] .R)。 } int型のmain(){ 一方(CIN >> N && N){ // CIN >> M。 その中に(); 以下のための(int型 I = 0 ; iがn <; iは++ ){ CIN >>スペース[I] .X >>スペース[I] .Y >>スペース[I] .Z >> スペース[I] .R。 } のための(int型 i = 0 ; iがN <; Iは++ ){ ため(INT J = 0 ; J <nであり、j ++ ){ 場合(I == j)は続けます。 (I、J、getDist(i、j)は)追加します。 (J、I、getDist(J、I))を追加します。 } } プリム(0 )。
printf(" %.3f \ N- " 、ANS); //注意:G ++精度出力での出力との使用の%fが%LFはワれる場合 } }