最初任意のスパニングツリー最小値を見つけ、その後、分類辺が論じ
、リングのツリー最小全域の最長辺に、すなわち回答1.非ツリーエッジ
ツリーの2辺を、順番に各点の場合と同等であると考えパスは分を取って、マーカーでマーク
チェーン2は、ツリーの分割/マージ差分ヒューリスティック+かもしれないが、彼らは2件のログが必要なため、直接維持するために、1による乗算のために、とても不思議なアプローチがある
大規模な作品に小さいと考えは、非ツリーエッジのために、そして暴力複雑さは、(M)Oであるように変更側は、変更されていません見つけることは容易で、修正、問題はすぐ側に変更されていない見つける方法である、あなたは互いに素-セットが変更されます使用することができます側、その後すぐに縮小し登ります
1の#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 の#define N 100005 4 の#define中間(L + R >> 1) 5 構造体JI { 6 int型のX、Y、Z、ID。 7 } E [N * 10 ]。 8 構造体JI2 { 9 int型NEXに、LEN、ID。 10 }エッジ[N << 1 ]。 11 int型アップE、N、M、X、Y、ヘッド[N]、SH [N]、FF [N]、[N]、VIS [N * 10 ]、ANS [N * 10 ]、F [N] [ 21 ]、MX [N] [ 21 ]。 12 BOOLCMP(JI X、JI Y){ 13 リターン XZ < YZ。 14 } 15 int型の検索(int型K){ 16 であれば(K == FF [K])戻りK。 17個の 戻り FF [K] = (FF [K])を見つけます。 18 } 19 空隙追加(int型のx、int型 Y、INT Z、int型のID){ 20 エッジ[E] .nex = 頭部[X]。 21 エッジ[E] .TO = Y。 22 エッジ[E] .LEN = Z。 23 エッジ[E] .ID = ID。 24 ヘッド[X] = E ++ 。 25 } 26 空隙 DFS(int型 K、INT FA、INT ID、INT S){ 27 、SH [K] = S。 28 アップ[K] = ID。 29 F [k]が[ 0 ] = FA。 30 のために(INT iは= 1 ; iは<= 20 ; I ++ ){ 31 F [k]は[I] = F [F [k]は[I- 1 ]] [I- 1 ]。 32 MX [K] [I] = MAX(MX [K] [I- 1 ]、MX [F [k]は[I- 1 ] [I-1 ])。 33 } 34 のために(INT iは=頭部[K]; I =! - 1 ; iは= エッジを[I] .nex) 35 であれば(!エッジ[I] .TO = FA){ 36 MX [エッジ[I]。 ] [に対して0 ] = エッジ[I] .LEN。 37の DFS(エッジ[I] .TO、K、エッジ[I] .ID、S + 1 )。 38 } 39 } 40対< INT、INT > LCA(int型のx、int型のY){ 41 であれば(SH [X] < SH [Y])スワップ(X、Y) 42 int型 ANS =0 ; 43 のための(INTは私= 20 ; I> = 0 ; i-- ) 44 であれば(SH [F [X] [I]]> = SH [Y]){ 45の ANS = MAX(ANS、MX [X]を[私]); 46 X = F [X] [I]。 47 } 48 であれば(x == y)は戻りmake_pair(X、ANS)。 49 のための(INTは私= 20 ; I> = 0 ; i-- ) 50 であれば(!F [x]は[I] = F [Y] [I]){ 51 ANS =MAX(ANS、MAX(MX [X] [i]は、MX [Y] [I]))。 52 X = F [X] [I]。 53 、Y = F [Y] [I]。 54 } 55 リターン make_pair(F [X] [ 0 ]、MAX(ANS、MAX(MX [X] [ 0 ]、MX [Y] [ 0 ])))。 56 } 57 INT メイン(){ 58 のscanf(" %D%D "、&N、&M)。 59 のために(INT iが= 1 ; iが<= M; I ++ ){ 60 のscanf(" %D%D%D "、&E [I] .X、&E [I]・Y、&E [I] .Z)。 61 E [I] .ID = I。 62 } 63 ソート(E + 1、E + M + 1 、CMP)。 64 のmemset(ヘッド、 - 1、はsizeof (ヘッド))。 65 のために(INT iは= 1 ; iが<= N; I ++)FF [I] = I。 66 のために(INT iは= 1 ; iが<= M; I ++ ){ 67 、X = 見つける(E [I] .X)。 68 、Y = 見つける(E [I] .Y)。 69 であれば(!X = {y)が 70 [X] FF =Y; 71 追加(E [I] .X、E [I] .Y、E [i]が.Z、E [I] .ID)。 72 追加(E [I]・Y、E [I] .X、E [i]が.Z、E [I] .ID)。 73 VIS [I] = 1 。 74 } 75 } 76 DFS(1、0、0、0 ); 77 のために(INT iは= 1 ; iが<= M; I ++)ANS [I] = 1000000000 。 78 のために(INT iは= 1 ; iが<= N; I ++)FF [I] = I。 79 のための(int型 I = 1; I <= M; I ++ ) 80 であれば(!VIS [I]){ 81 、X = LCA(E [I] .X、E [I] .Y)1次回。 82の ANS [E [I] .ID] = LCA(E [I] .X、E [I] .Y).second。 83 一方(見つける(E [I] .X)=!見つける(X)){ 84 E [I] .X = 見つける(E [I] .X)。 85の ANS [Eアップ[I] .X]] = E [I] .Z。 86 であれば(検索(E [I] .X)!=検索(F [E [I] .X] [ 0 ]))FF [検索(E [I] .X)] =検索(F [E [I ] .X] [ 0 ])。 87 } 88 ながら((E [I] .Y)を見つける!= {(X)を見つける。) 89 E [i]は.Y = 見つける(E [I] .Y)。 90の ANS [Eアップ[I] .Y]] = E [I] .Z。 91 であれば(検索(E [I] .Y)!=検索(F [E [I] .Y] [ 0 ]))FF [検索(E [I] .Y)] =検索(F [E [I ] .Y] [ 0 ])。 92 } 93 } 94 のために(INTは iは= 1 ; I <= M; I ++)のprintf(" %D \ n " 、ANS [I])。 95 }