問題の意味:なし、図エッジに対するM n個の点を考慮すると、危険性がある各エッジ、クエリーQがあり、それぞれ所定の2点S、Tは、方法を見つけるような上部経路は、その最小限の最大のリスク
ランクによってばらばらセットをマージ
パス圧縮は、そうでない場合は、そのツリー構造を弱体化させることはできません
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 // BXDによる入力 の#define担当者(iは、b)のための(; iは=(b)の<I ++はiは(A)= INT) の#defineためreppを(I、B)(I =(A int型); I> =(B); - I) の#defineが長い長いちゃう の#define(X)(CERR <<(#xを)参照<< '=' <<(X)<< ENDL) の#define PB一back #define INF 0x3f3f3f3f の#define CLR(A、V)のmemset(A、V、Aはsizeof) のtypedef対 < INT、INT > PII。 ///////////////////////////////// / CONSTの INT N = 1E6 + 10 。 int型F [N]、X、Y、Q、N、M、SIZ [N]、W [N]。 構造体のエッジ { int型U、V、W。 }エッジ[N]。 INT find1(INT X) { 戻り F [X] == X?X:find1(F [X])。 } ボイドkruscal() { (ソートエッジ + 1、エッジ+ 1 + M、[](エッジA、エッジB){ 戻り AW < BW;}); int型 CNT = 0 ; 担当者(I、1、N)F [I] = I、SIZ [I] = 1 。 CLR(W 0 )。 担当者(I、1 、M) { int型X = find1(エッジ[I] .U)、Y = find1(エッジ[I] .V)。 もし(x == y)を続けます。 もし(SIZは、[X] < SIZ [Y]) { fは[X] = Y。 SIZ [Y] = MAX(SIZ [Y]、SIZ [X] + 1 )。 W [X] = エッジ[I] .W。 } エルス { [Y] F =のX。 SIZ [X] = MAX(SIZ [x]は、SIZ [Y] + 1 )。 W [Y] = エッジ[I] .W。 } CNT ++ 。 もし(CNT == n個1)ブレーク。 } } INT [N] C。 INTクエリ(int型のx、int型のY) { 担当者(I、1、N)C [I] = - 1 。 int型 ANS = 0、温度= 0 ; 一方、(1 ) { C [X] = TEMP。 もし(F [X] == x)のブレーク。 TEMP = MAX(温度、W [X])。 X = F [X]。 } 一方、(1 ) { もし、(C [Y]> = 0){ANS = MAX(ANS、C [Y])。ブレーク ;} // LCA相同时就退出 する場合(F [Y] == y)のブレーク。 ANS = MAX(ANS、W [Y])。 Y = F [Y]。 } 戻りANS。 } int型のmain() { int型 OK = 0 。 一方、(scanf関数(" %D%dの"、&N、&M)== 2 ) { 場合(OK)のprintf(" の\ n " ); OK = 1; 担当者(I、1 、M) のscanf(" %D%D%D "、およびエッジ[I] .U、&エッジ[I] .V、&エッジ[I] .W)。 kruscal(); scanf関数(" %のD "、&Q)。 一方、(q-- ) { scanf関数(" %D%dの"、およびX&Y)。 printf(" %d個の\ n " 、クエリ(X、Y))。 } } 戻り 0 。 }