アイデア:互いに素セット+スパニングツリー
提出:2(サンプルもののしかし、気持ちは$ QwQ $(裁判官側が失われた)右だったことはありません)
ソリューション:
重量を記録も最初$ N-K + 1つの$側(ケースに対応するが、$ K $最短側通信部を破断する)までの小から大プラス側へ、次に$ $ソート再び接続されたエッジとの間のすべてのポイント、、、、値が答えです。
#include <cstdioを> する#include <iostreamの> する#include <CStringの> する#include <アルゴリズム> の#include <cmath> の#define ULL符号なし長い長 の#defineが長い長いちゃう の#define RレジスタINT 使用して 名前空間STD。 #define(; iは= 10000000000を<++ I)(R I = 1の場合)一時停止 の#define freopenはIN( "NOIPAK ++である。"、 "R"、STDIN) の#defineアウトfreopenは( "out.out"、」 W」、STDOUT) 名前空間FREAD { 静的 チャー B [ 1 << 15 ]、* S = B * D = B。 GETCHAR()(S == D &&(D =(S = B)+関数fread(B、1,1 << 15、STDIN)、S == D)EOF:* S ++) #endifの インラインINT G(){ R RET = 0、=解決1。登録のchar chのを。しばらく(!isdigit(CH = getchar関数()))修正= CH == ' - ' - ?1 :修正します。 もし(CH == EOF)の戻り EOF; DO RET = RET * 10 +(CH ^ 48)。一方、(isdigit(CH = GETCHAR()))。リターンのRET *の修正。 }インラインブールのisEmpty(CONST チャー&CH){リターン(CH <= 36 || CH> = 127 );} インラインボイド GS(チャー *のS){ 登録チャー CHと、一方(のisEmpty(CH = GETCHAR()))。 やる * S ++ = CHを; しばらく(!のisEmpty(CH = getchar関数())); } } 使用 FREAD :: Gと、使用FREAD :: GSを。 名前空間Luitaryi { CONSTの 整数 N = 1010、M = N * N。 INTのN、K、CNT、TOT、FA [N]。 ダブルANS; 構造体ノード{ INTX、Y;} P [N]。 #define X(I)P [i]は.X の#define Y(I)P [i]は.Yの 構造体の縁{ int型 Uを、V。ダブルワット; エッジ(){} エッジ(INT UU、INT VV、ダブル WW){U = UU、V = VV、W = WW;} インラインブール 演算子 <(constのエッジ&こと){ リターン <W that.w;} }電子[M]。 インラインINT GETF(INT X){ 戻り X == FA [x]はx:FA [X] = GETF(FA [X]);} インラインボイドメイン(){ N = G()、K =G()。 ための(R i = 1 ; iが= N <; ++ I)X(I)= G()、Y(I)= G(); 以下のための(R i = 1 ; iが<= N; I ++)のための(R jを= I + 1 ; J <= N ++ j)は E [ ++ CNT =エッジ(I、J、SQRT((X (I)-X(J))*(X(I)-X(J))+(Y(I)-y(J))*(Y(I) - Y(J))))。 ソート(E + 1、E + CNT + 1)。以下のための(R iは= 1 FA [I] =; iが<= N ++ I)I。 以下のための(R i = 1 ; iは= CNTを<; ++ I){R U = E [I] .U、V = E [I] .V。登録二重 W = Eを[I] .W。 R UF = GETF(u)は、VF = GETF(V)。 もし(UF == VF)続けます。 他{ ANS = W。++ TOT; FA [UF] = VFを、 もし(TOT N-K + == 1)ブレーク。 } }のprintf(" %の.2lf " 、ANS)。 } } (){主署名さ Luitaryi ::メイン()。 }
2019年7月22日