あなたは、n個のセンチネル座標点を与え、その後、通信接続がどのように最小コストを求めたように、Mは、最小のコストの最長辺与えられ、衛星に対応するがある
費やすことなく、直接接続することができる衛星を持っています2つのポスト
のアイデアを:として、最小コストの最長辺を必要とし、我々は、M-1の最大エッジストリップを除去する、すなわち出力側NM物品はまた、所望される
NMエッジコネクタを見つけるために、我々は、クラスカルを解決するためにアルゴリズムを使用します
完全なコード:(精度の出力に、またはG ++注目%のF、C ++%LFを使用)を使用します
#include <iostreamの> する#include <cstdioを> する#include <CStringの> する#include <アルゴリズム> の#include <cmath> 使用して 名前空間STD。 const int型 MAXN = 1E4; // 点数 のconst int型の MAXM = 1E6 + 10。// 边数 のint [MAXN]事前; 構造体のエッジ{ int型Uを、V。 ダブルワット; }エッジ[MAXM]。 int型のトップ。 int型のCNT; ダブルANS; INTのN、M。 構造体のスポット{ ダブルX、Y。 } [MAXN]見つけます。 ボイド addedge(INT U、INT V、ダブルW){ エッジ[トップ] .U = U。 エッジ[トップ] .V = V。 エッジ[トップ。++]、W = W。 } BOOL CMP(エッジA、エッジB){ 戻り AW < BW。 } INT(見つけるINT X) { 場合(!X =事前[X])リターン [X] =事前(予め[X])を見つけます。 他に 戻る前の[X]を。 } BOOL団結(int型のx、int型Y){ int型の FX = 検索(X); int型 FY = 検索(Y); IF!(FX = FY){ [FX]前 = FY; CNTを ++ ; 返す trueに; } それ以外の リターン falseにする; } ダブルクラスカルを( ){ ソート(エッジ、エッジ +トップ、CMP); // 使い捨てのすべてのエッジが並んでいる INT U、V、 ダブルW; のための(int型 I = 0 ; Iはトップ<; Iは++ ){ Uを =エッジ[I] .U。 V = エッジ[I] .V。 W = エッジ[I] .W。 団結(U、V); もし(CNT == N- M){ ANS = W。 破ります; } } もし(CNT <nm)のリターン - 1 。 戻るANSを。 } ボイドのinit(int型N){ memsetの(エッジ、0、はsizeof (エッジ))。 以下のために(int型 i = 0 ; iが<= N; iは++ ) 事前[I]= I; ANS =人気= CNT = 0 。 } 二重 getDist(int型 I、int型のJ){ 二重 SX =(スポット[I] .Xスポット[J] .X)*(スポット[I] .x- スポット[J] .X)。 ダブル SY =(スポット[I] .Yスポット[J] .Y)*(スポット[i]の.y- スポット[J] .Y)。 ダブル DIS =のSQRT(SX + SY)。 返すDISを。 } int型のmain(){ int型のT。 CIN >> T; int型、B、W; 一方、(T-- ){ CIN >> M >> N。 INIT(N) トップ = CNT = 0 。 以下のために(int型 i = 0 ; iがn <I ++は{) CIN >>スポット[I] .X >> スポットを[I] .Y。 } のために(int型 I = 0 ; iがN <; Iは++ ){ ため(int型 J = I + 1、J <nであり、j ++ ){ 二重コスト= getDist(i、j)は、 addedge(I、J、コスト)。 addedge(J、I、コスト)。 } } のprintf(" %.2fする\ n"、クラスカル())。 } 戻り 0 。 }