[cf1184E] Daleks'侵略

最初任意のスパニングツリー最小値を見つけ、その後、分類辺が論じ
、リングのツリー最小全域の最長辺に、すなわち回答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対< INTINT > 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(1000 );
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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/PYWBKTDA/p/11842540.html