質問の意味:
300回のピット、他のピット、または自分の水から各ピットの水は、私がjから飲む価格を持って、各ピット自分の飲み水も価格です、ピットの最小コストを持つすべての人に尋ねます
アイデア:
我々が確保できるように、最初のn個の完全グラフを構築し、[i]は、MSTランwが接続された各点のために、スーパーシンクポイントを構築するすべてのピットがユニコムと、少なくとも1つの水孔その
コード:
書式#include <iostreamの> の#include <cstdioを> する#include <アルゴリズム> 書式#include <cmath> の#include <CStringの> の#include < 文字列 > の#include <スタック> の#include <キュー> の#include <両端キュー> の#include < 設定 > #include <ベクトル> の#include <地図> の#define FST最初 の#define SC第二 の#define PB一back の#define MEM(A、B)のmemset(A、B、はsizeof(A)) の#define LSON Lを、中間、ルート< < 1 の#define rson半ば+ 1、R、根<< 1 | 1 #define LCルート<< 1つ の#define RCルート<< 1 | 1 // の#define lowbit(x)は((X)&( - x))を 使用して 名前空間はstd; typedefをダブルデシベル。 typedefの長い ダブルLDB。 typedefの長い 長いLL。 typedefの符号なしの長い 長いULL。 typedefのペア < int型、int型 > PI; typedefの対 <-1,11,11-> PLL。 CONST DB EPS = 1E- 6 。 const int型 MOD = 1E9 + 7 。 CONST int型 MAXN = 2E6 + 100 。 const int型 MAXM = 2E6 + 100 。 const int型 INF = 0x3f3f3f3f 。 CONST dBのPI = ACOS( - 1.0 )。 INT P [ 333 ] [ 333 ]。 INT W [ 333 ]。 int型のn; INT [MAXN] F。 int型の検索(INT X){ 戻り F [X] == X X:F [X] = 検索(F [X])。 } 構造体ノード{ int型X、Y。 int型のw; }エッジ[MAXN]。 BOOL CMP(ノードA、ノードB){ 戻り AW < BW。 } INT TOT。 INT追加(int型のx、int型の Y、INT W){ エッジ[ ++ TOT] .X =のX。 エッジ【TOT] .Y = Y。 エッジ【TOT] .W = W。 } int型のmain(){ scanf関数(" %のD "、&N) 以下のために(int型 i = 1 ; iが<= N; iが++ ){ scanf関数(" %dは"、& W [I])。 追加(0 、I、W [I])。 } のために(int型 i = 1 ; iが<= N; iが++ ){ ため(INT J = 1 ; J <= nであり、j ++ ){ scanf関数(" %のD "、&P [I] [J])。 (I、J、P [I] [J])を追加します。 } } のために(int型 i = 0 ; iがn = <; iは++)F [I] = I。 ソート(エッジ + 1、エッジ+ 1回の + TOT、CMP)。 int型の CNT = 0; int型 ANS = 0 ; 以下のために(int型 I = 1 ; I <= TOT iは++ ){ int型のx = エッジを[I] .X。 INT Y = エッジ[I] .Y。 INT W = エッジ[I] .W。 INTの T1 = (X)を求めます。 INTの T2 = (y)を見つけます。 もし(!T1 = T2){ F [T1] = T2。 ANS + = W。 CNT ++ ; } であれば(CNT == N)ブレーク; } のprintf(" %dの" 、ANS)。 リターン 0 ; } / * 4 5 4 4 3 0 2 2 2 2 0 3 3 2 3 0 4 2 3 4 0 * /