ツリー、右辺値のN個のノード与えられます。ルート点1は、次数1の外部点がリーフノードであることを除いて、第1号です。
すべての葉と1点との間のリンクを破壊し、カッティングエッジが価格に対応するこのエッジ重み値をとる必要、コストが要求されたm個を超えません。
カッティングエッジの重みの要件を満たすためには、この前提に最大最小値を、この最小値が得られます。10 ^ 5 $≤$ N
前半この最大肯定的な答えが、その後、ツリーは、この二分法の右側を超えない限度DP側、セット$ Fを切断された[i]は$は、最小限のサブツリーのルートとのリンクを破るすべての葉での限界を表しています価格。
F次に$ [I] = MAX(W_ {父}、\和\ [Y] F limits_ {Y})$。つまり、または他の父親の側に身を切るか、あるいはすべての人の息子と自身がカットオフしましょう。不正スキームは、INFで転送します。
その後、裁判官[1] \ルメートル$ができ$ Fかどうかを確認します。
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <アルゴリズム> 5の#include <cmath> 6 の#define DBG(X)CERR << #X << "=" << X <<てendl 7 使って 名前空間はstdを、 8 typedefの長い 長いLL。 9 typedefをダブルデシベル。 10のtypedef対< INT、INT > PII。 11テンプレート<型名T>インラインT _min(TA、TB){ 戻り A <Bを?:B;} 12テンプレート<型名T>インラインT _max(TA、TB){ 戻り A> B?:B;} 13テンプレート<型名T>インラインチャー MIN(T&A、TB){ 戻り A> B(A = B、?1):0 ;} 14テンプレート<型名T>インラインチャー MAX(T&A、TB) { 戻り <Bを(A = B、?1):0 ;} 15テンプレート<型名T>インラインボイド _swap(T&A、T&B){A ^ = B ^ = A ^ = B;} 16テンプレート<型名T>インラインTリード(T&X){ 17 、X = 0。int型の F = 0 ;char型の C; しばらく(isdigit(C = getchar関数())!)の場合(C == ' - ')は、f = 1 ; 18 一方(isdigit(c)参照)、X = X * 10 +(C&15)、C = GETCHAR()。返す fはX = - ?X:X; 19 } 20 のconst int型 N = 1E5 + 7、INF = 0x1f1f1f1f 。 21 int型N、中間、L、R、M。 22 構造体 STOthxORZ { INT Wに、NXT;} G [N << 1 ]。 23 int型ヘッド[N]、TOT。 24インライン無効 Addedge(int型のx、int型の Y、int型Z){ 25 Gを【++ TOT] .TO = Y、G [TOT] .nxt =ヘッド[X]、ヘッド[X] = TOT、G [TOT] .W = Z。 26 G [++ TOT] .TO = X、G [TOT] .nxt =ヘッド[Y]、ヘッド[Y] = TOT、G [TOT] .W = Z。 27 } 28 のint F [N]。 29 の#define Y G [j]は.TO 30インラインボイド DP(int型のx、int型 FA、int型のval)を{ 31 INT RET = 0 。 32 のために(登録INT ; J; J = G [j]が.nxt J =ヘッド[X])場合(Y ^ FA)DP(Y、X、G [j]が.W)、RET + = F [Y]、(RET> = INF)&&(RET = INF)。 33 F [X] = _分((ヴァル>中間INF:ヴァル)、(RET?RET:INF))。 34 } 35 の#undef Y 36 INTメイン(){ // freopenは( "test.in"、 "R"、STDIN)。// freopenは( "test.ans"、 "W"、STDOUT)。 37 一方(READ(n)は、()Mを読み取り、N || M){ 38 のmemset(ヘッド、0、はsizeofヘッド); TOT = 0、L = 1 ; R = 0 。 39 のための登録(int型 I = 1 iがn <;、X、Y、Z ++I))Z(リード)(X)、Y(読み取りを読み取り、Addedge(X、Y、Z)、MAX(R、Z)。 40 INT TMP = ++ R。 41 一方(L < R){ 42 のmemset(F、0x1Fの、はsizeof F)。 43 ミッド= L + R >> 1 ; DP(1、0 、INF)。 44 であれば(F [ 1 ] <= M)R = ミッド。 45 他の L =ミッド+ 1 ; 46 } 47 のprintf(" %Dを\ n "、L == TMP - ?1 :L)。 48 } 49 リターン 0 ; 50 }