スパニングツリーをEZOJ#386最小

分析

まず、最小スパニングツリーに組み込まれて

各乗算は、リングを見つけることができた後、

コード

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
#defineは長いlong int型
 構造体ノード{
     int型 X、Y、Zは、であり、ID。
}。
ノードD [ 400100 ]。
int型のヘッド[ 800100 ]、NXT [ 800100 ]、[へ800100 ]、[W 800100 ]、CNT、RES、DEP [ 400100 ]。
INT PR [ 400100 ] [ 23 ]、和[ 400100 ] [ 23 ]、N、M、ANS [ 400100 ]、FA [ 400100 ]、TOT。
インラインボイドアドオン(int型のx、int型の Y、int型Z){ 
    NXT [ ++ CNT] = 頭部[X]。
    ヘッド[X] = CNT。
    [CNT]へ = Y。
    W [CNT] = Z; 
    NXT [ ++ CNT] = 頭部[Y]。
    ヘッド[Y] = CNT。
    [CNT]に =のX。
    W [CNT] = Z; 
} 
インラインボイド DFS(int型のx、int型FA){ 
    DEP [X] = DEP [FA] + 1 
    PR [X] [ 0 ] = FA。
    ためにint型 I =ヘッド[X]; I; I = NXT [I])
       であれば(!の[I] = FA)和[I] [へ] [ 0 ] = [i]は、DFS([I]にwを、バツ); 
} 
インラインINT LCA(int型のx、int型のY){
     場合(DEP [X] < DEP [Y])スワップ(X、Y)
    INT LEN = DEP [X] -dep [Y]、WH = 0 以下のためにint型 i = 0 ; iは<= 20 ; I ++ 場合((1 << I)およびLEN)WH = MAX(WH、和[X] [i])と、X = PR [X] [I];
    もし(x == y)は戻りWH。
    以下のためのint型 = Iを20 ; I> = 0 ; i-- もし!(PR [X] [I] = PR [Y] [I]){ 
          WH = MAX(WH、MAX(和[X] [i]は、和[Y] [I]))。
          X = PR [X] [I]; 
          Y = PR [Y] [I]。
      } 
    WH = MAX(WH、MAX(和[X] [ 0 ]、和[Y] [ 0 ]));
    返すWH; 
} 
インラインブール CMP(CONSTノードA、CONSTノードb){ 戻り <AZをBZ;} 
インラインINT SF(INT X){戻り FA [X] == X X:FA [X] = SFは(FAが[X]);} 
)(主符号付き{ 
    int型I、J、K。
    scanf関数(" %のLLDの%のLLD "、&​​N、&M)。
    (i = 1 ; I <= M; iは++ ){ 
      scanf関数(" %LLD%LLD%LLD "、&​​D [i]は.X、&D [i]は.Y、&D [i]の.Z)。
      D [i]は.ID = iは、
    } 
    ため(i = 1 ; iが<= N; iは++)FA [I] = I。
    ソート(D + 1、D + M + 1 、CMP)。
    (i = 1 ; iが<= M; iは++ ){
       int型X = D [i]を.X、Yは= D [i]の.Yと、
      もし(SF(X)== SF(Y))続けます
      FA [SF(Y)] = SF(X)
      追加(X、Y、D [i]は.Z)。
      RES + = D [i]は.Z。
      TOT ++ ; 
      D [i]を。ある = 1 もし(TOT == N- 1破ります
    } 
    DFS(10 );
    (i = 1 ; iは<= 20 ; iは++ のために(J = 1 ; J <= N; J ++ 
        PR [J] [I]= PR [PR [J] [I- 1 ]] [I- 1 ]、
        和[J] [I] = MAX(和[j]は[I- 1 ]、和[PR [J] [I- 1 ] ] [I- 1 ])。
    (i = 1 ; I <= M; iは++ ){
       場合(D [I] である)ANS [D [i]は.ID] =のRES。
         ANS [dは[I] .ID] =のRES + D [i]は.z- LCA(D [i]が.X、D [i]の.Y)。
    } 
    のための(i = 1 ; I <= M; iは++)のprintf(" %LLDする\ n " 、ANS [I])。
    リターン 0 ; 
}

おすすめ

転載: www.cnblogs.com/yzxverygood/p/11520492.html