BZOJ 1601 [Usaco2008 10月]灌漑(図+ MSTを内蔵)

質問の意味:

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 
 * /

 

おすすめ

転載: www.cnblogs.com/wrjlinkkkkkk/p/11140540.html