独力リンクに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 ] = 1。D [ 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 ; }