分析
まず、最小スパニングツリーに組み込まれて
各乗算は、リングを見つけることができた後、
コード
#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(1、0 );
用(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 ;
}