BZOJ 2654:最小全域木のツリー半分+

コード: 

#include <cstdioを> 
する#include <アルゴリズム> 
の#define N 50020   
の#defineっ長い長
の#define setIO(複数可)(S ".IN"、 "R"、STDIN)freopenは
名前空間stdを使用します。      
構造体データ
{ 
    int型のX、Y、Z。
    データ(INT A = 0、INT B = 0、INT C = 0){X = Y = B、Z = C;}     
    ブール演算子<(CONSTデータA)のconst {戻りZ <AZ。}    
} B [N << 1]、W [N << 1]。  
INT TB、TW、N、F [N]、合計。   
INT検索(INT X)
{ 
    戻りF [X] == X X:F [X] =検索(F [X])?
}    
解決INT(INTのMID)
{ 
    int型I、PB = 1、PW = 1、ANS = 0。     
    合計= 0; 
    ための式(I = 0; iが<N; ++ I)F [I] = I。
    (PB <= TB || PW <しばらく
        (PW> TW ||(PB <= TB && B [PB] .Z <W [PW] .Z + MID))なら
        、{ 
            もし(見つける(B [PB] .X)!=を見つける(B [PB] .Y ))
            { 
                合計+ = B [PB] .Z。  
                F [F [B [PB] .X] = F [B [PB] .Y]。        
            } 
            ++ PB。
        } 
        { 
            (!)(W [PW] .X)=を見つける(W [PW] .Yを見つける。)であれば
            { 
                和+ = W [PW] .Z。  
                F [F [W [PW] .X] = F [W [PW] .Y]。       
                ++ ANS;   
            } 
            ++ PW。
        } 
    } 
    ANSを返します。
} 
メインINT()
{
    // setIO( "入力");  
    INT I、J、M、K、X、Y、Z、P、L = -100、R = 100、中間、ANS。   
    scanf関数( "%D%D%D"、&N、&M、およびK);   
    (; I <= M ++ iは= 1)のための
    { 
        scanf関数( "%D%D%D%D"、およびX&Y、およびZ、&P)。    
        もし(P)B [++ TB] =データ(X、Y、Z)。
        他W [++ TW] =データ(X、Y、Z)。   
    } 
    ソート(B + 1、B + 1 + TB)。
    ソート(1 + W W + 1 + TW)。    
    (L <= r)は、一方
    { 
        1半ば=(L + R)>>。    
        IF(解く(MID)> = K)ANS =中間、L =ミッド+ 1。
        他に、R =半ば1; 
    } 
    (ANS)を解きます。
    printf( "%dの\ n"は、合計)。
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/12084584.html