トピック:https://www.luogu.org/problemnew/show/P1991
問題の意味:S点の間の無制限の通信が存在してもよいように、点P、S点の座標。
(間接的であってもよい)は、通信経路を有するように、通信路の最長セクションでは、すべての点間二十から二長さです。
アイデア:最近の問題はよく見ていません。前の質問を見ていない-1、この問題はああやって、小数点以下2桁正確で表示されませんでした。
最初のマップに内蔵され、その後、第一PS大きな経路長の最小スパニングツリーを見つけます。
1の#include <cstdioを> 2の#include <cstdlib> 3の#include <地図> 4の#include < 設定 > 5の#include <CStringの> 6の#include <アルゴリズム> 7の#include <ベクトル> 8の#include <cmath> 9# <積層体>含む 10の#include <キュー> 11の#include <iostreamの> 12 13 の#define INF 0x3f3f3f3f 14 使って 名前空間STDを、 15 typedefの長い 長いLL。 16のtypedefペア< int型、int型 > PR。 17 18 INT S、N。 19 CONST INT MAXN = 505 。 20 構造体ノード{ 21 のint X、Y。 22 } [MAXN]ノード。 23 ダブルG [MAXN] [MAXN]。 24 25 二重 DIST(int型 I、INT J) 26 { 27 リターン(ノード[J] .X)+ - SQRT((ノード[I] .X -ノード[J] .X)*(ノード[I] .Xノード[i]は.Y -ノード[J] .Y)*(ノード[I] .Y - ノード[J] .Y))。 28 } 29 30 BOOLVIS [MAXN]。 31 ダブルD [MAXN]。 32ベクター< ダブル > ANS。 33 ボイドプリム(INT X) 34 { 35 のmemset(D、0x3fを、はsizeof (d)参照)。 36 D [X] = 0 。 37 VIS [X] = 真。 38 のためには、(int型 i = 1 ; iがn = <; iは++ ){ 39 D [I] = G [X] [I]; 40 } 41 42 のために(INTT = 1。T <N。T ++ ){ 43 二分= INF。 44 int型minid。 45 のためには、(int型 i = 1 ; iがn = <; iは++ ){ 46 であれば(VIS [I] && D [i]は、<!分){ 47 分= D [i]は、 48 minid = I; 49 } 50 } 51 VIS [minid] = 真。 52 ans.push_back(分)。 53 のための(int型 I =1 ; I <= N。私は++ ){ 54 であれば(Dの[I]> G [minid] [I]){ 55 D [I] = G [minid] [I]。 56 } 57 } 58 } 59 } 60 61 のint main()の 62 { 63 のscanf(" %d個の%のD "、&S&N) 64 のために(int型 i = 1 ; iが<= N; iが++ ){ 65 のscanf(" %d個の%のD "、およびノード[i]は.X、およびノード[I] .Y)。 66 } 67 のための(int型 i = 1 ; iが<= N; iが++ ){ 68 のための(int型 J = I + 1、J <= nであり、j ++ ){ 69 G [I] [J] = G [j]を[ I] = DIST(i、j)は、 70 // のprintf( "%LFを\ n"、G [I] [J])。 71 } 72 } 73 74 プリム(1 )。 75 ソート(ans.begin()、ans.end())。 76 のprintf(" %.2lfする\ n "、ANS [N - S - 1 ])。 77 リターン 0 ; 78 }