ロスP1265バレー高速道路建設--prim

独力リンクにhttps://www.luogu.com.cn/problem/P1265 

この質問は、本質的に最小全域木で、対象の説明はプリムのアイデアです

TIP:図の密集と疎なグラフの違いに注意してください

書式#include <cstdioを> 
する#include <CStringの> 
の#include <アルゴリズム> 
書式#include <キュー> 
の#include <cmath>
 使用して 名前空間をSTD。
const  int型 M = 1E5 + 7 constの ダブル INF = 10000007 ;
INTはREAD(){
     int型 ANS = 0、F = 1、C = GETCHAR()。
    一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')、F = - 1; C = GETCHAR();}
     一方、(C> = ' 0 ' && C <= ' 9 '){ANS = ANS * 10 +(C- ' 0 ')。C = GETCHAR();}
     戻り ANS * F。
}
整数nは、X [M]、Y [M]、VIS [M]。
ダブルANS、D [M]。
二重 G_d(int型int型 B){ 戻り SQRT(1.0 *(X [A] -x [B])*(X [A] -x [B])+ 1.0 *(Y [A] -y [B ])*(Y [A] - Y [B]));}
 ボイドPRM(){
    VIS [ 1 ] = 1D [ 1 ] = 0.0 以下のためにINT iが= 2 ; I <= N; I ++)D [I] = G_d(1 、I)。
//     ため(INT iは1 =、iが<= N; I ++)のprintf( "%2LF。"、D [I])。プット( ""); 
    以下のためにINT iが= 2 ; I <= N; I ++ ){
         int型の ID、MN = INF。
        INT J = 2、J <= N; J ++)場合(!VIS [J] && D [j]が<MN)MN = D [j]が、ID = J。
        VIS [ID] = 1 INT J = 2、J <= N; J ++)場合(!VIS [J])D [J] = 分(D [j]は、G_d(ID、J))。
    }
}
INT メイン(){
    N = )(読み取ります。
    以下のためにINT iが= 1 ; I <= N; I ++)X [I] = read()は、Y [I] = )(読み取ります。
    PRM();
    以下のためにINT iが= 1 ; I <= N; I ++)ANS + = D [i]は、
    printf(" %.2lf \ n " 、ANS)。
    リターン 0 ;
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/yourinA/p/12000346.html