http://codeforces.com/contest/1245/problem/D
質問の意味がある:あなたはすべての都市には電気を持っているようにする必要があり、あなたはまた、彼は力を持っているように、市が発電所を建設見て、あなたは、電気的にそれを作る、他の都市で彼をリンクすることができます
ソリューション:
私たちは今、自分の発電所の各都市と同様に、独自のコストを構築することができ、他の都市は、構造に追いつく、シーケンス行し、その後も、設定を確認してください。
#include <ビット/ STDC ++。H> に#define numm CH-48 の#define PDのputchar( ' ') の#define PNのputchar('の\ n') の#define PB一back の#defineデバッグ(引数...)COUT <<#引数<< " - >" <<引数<< ENDL の#defineバグはcout << "************" 名前空間stdを使用。 テンプレート<型名T> ボイドリード(T&RES){ BOOLフラグ= FALSE;チャーCH。 しばらく(CH == ' - ')&&(フラグ=真)(isdigit(CH = getchar関数())!)。 用(RES = numm; isdigit(CH = GETCHAR()); RESの=(RES << 1)+(RES << 3)+ numm)。 フラグ&&(RES = -res)。 } テンプレート<型名T> ボイドライト(T x)から{ IF(X <0)のputchar( ' - ')、X = -x。 IF(X> 9)書き込み(X / 10)。 putchar(Xの10%+ '0')。 } typedefの長い長いLL。 typedef long double型のLD。 const int型+ 10 MAXN = 2000; CONST LL MOD = 1E9 + 7。 const int型INF = 0x3f3f3f3f。 CONSTダブルアルファ= 0.7。 #define PB一back の#define PII対<整数、整数> の#define融点make_pair の#define Fiの第一 の#define SE第二の 構造体ノード{ UをINT、V。 ワットLL; ノード(){} ノード(INT U、INT V、W LL):U(U)、V(V)、W(W){} ブール演算子<(constのノード&A){ リターンAW <W。 } } E [MAXN * MAXN + MAXN]。 構造体{ LLのX、Y。 int型のPOS。 } [MAXN]。 LL C [MAXN]、[MAXN] kは、 【MAXN] F INT。 ベクトル<整数> VEC1。 ベクトル<PII> VEC2。 INT GETF(INT V){ 戻りF [V] == V V:F [V] = GETF(F [V])。 } メインINT() { int型のn; (n)を読み出します。 以下のために(iは++; iが<= N I = 1 INT) F [I] = I。 以下のために{(INT i = 1; iが++; iが<= N) ([i]は.X)、読み取る読み取り([I] .Y)。 // [i]は.POS = I。 } のために(iは++; iがn = <I = 1 INT) 読み出す(C [I])。 以下のために(INT i = 1; iが<= N; iは++) 読み出す(K [I])。 int型CNT = 0; 以下のために(INT i = 1; iが<= N; iは++){ E [++ CNT] =ノード(0、I、C [I])。 (; J <= N J ++のint J = I + 1)用 E [++ CNT =ノード(I、J、(K [I] + K [J])*(ABS([I] .xa [J] .X)+ ABS([I] .ya [J] .Y)))。 } ソート(E + 1、E + 1本の+ CNT)。 int型NUM = 0; LL合計= 0; 以下のために(INT i = 1; iは= CNTを<; iは++){ int型U = E [I] .U、V = E [I]は.V; int型GETF = A(U); INT = BのGETF (V); IF(!A = B){//のみ三角枠の三辺がわから例えば異なる父、3点を計算する必要がありますが、実際には唯一のライン上に2つの側面、第三のでなければなりません認識される共通の父 ; F [B]は= IF(U == 0) vec1.pb(V); 他{ vec2.pb(MP(U、V)); } NUMを++; //ますかコネクタ有する電気、追加のみの既定の正面であるとして、または自分の基地局を構築するために、接続されている 。SUM = E + [I] .W IF(N == NUM)BREAKは、n個の都市が明るいことを保証するために、// } } 書き込み(SUM); PN; (vec1.size())を書く; PN; IF(vec1.size()){ 以下のために(INT i = 0; i)は(vec1.sizeを<; I ++の) 書き込み(VEC1 [I])、PD。 PN; } 書き込み(vec2.size()); PN; IF(vec2.size()){ ための式(I = 0 int型、iがvec2.sizeを<(); I ++)は 、書き込み(VEC2 [i]が.fi)、PD、書き込み(VEC2 [I] .SE)、PN。 ; PN; } 0を返します。 }