POJ - 宇宙ステーションの構築2031(プリム)

問題の意味:数所与球状ステーション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はワれる場合
    } 
}

 

おすすめ

転載: www.cnblogs.com/Tianwell/p/11302317.html