説明タイトル
ツリーポイント$ N- $、$ N-1 $エッジ各エッジは、ある程度の時間を要した後、任意の2点がユニコムあります。
ポイントパーティーに集中する必要があります$ K $の個人($ K異なる点で配布$)があります。
会議が終わった後に開催された出発集会のこの時点から、車が必要、この$ K $の個人が送り返されました。
$でのパーティーは、私は、それが家庭を送信する$ K $の個人の最小値を取るどのくらいのドライバを番目の点を$場合、$ I = 1、\ cdots、N $のために、答えてください
数据范围
$ K \ N \ 500000.1 \ \ルX、Y \ N、Z 1 \ $ 1万人以上が
問題を解決するに
戻って強制的に、そして、二回のパスを通して見ることができるならば、その答えは二回、最長チェーンのパスの長さを減算した結果であります
だから、DP $ $を考慮すると、$ F_iとは$ $ I $は出発点を示して、そしてサブツリーが戻って旅を完了した、G_i $ $ $ I $はサブツリー、可能遠い点からキーの長さを表し、各点に対する暴力がルートの$のDFS $であり、最終的な答えは$ F_ {ルート} -g_ {ルート} $です
Dpの式が記載されていることができます:
$ F_iと= \ + SUM f_v 2 \ {I W_タイムズ、V} $
$ G_i =最大\ {{I W_ g_vの+、V} \} $
ルートに操作を変更するだけで$ DFS $一回、その後、正の解決策を考えてみましょう
コード
#include <ビット/ STDC ++ Hが> の#define LL長い長い 使用して 名前空間STDを、 CONSTの INT N = 5E5 + 5、M = N << 1 。 INTのN、K、T、SZ [N]、FL [N]、HD [N]、V [M]、W [M]、NX [M]。 LLをF [N]、G [N]、ANS [N]。 ボイド追加(int型 U、int型 V、INT W){ V [ ++のT] = V; NX、[T] = HD [U]; HD [U] =さt; W [T] = W。 } ボイド DFS(int型のx、int型FR){ SZ [X] = FL [X]、F [X] = G [X] = 0 ; 以下のために(int型 I = HD [X]; I; I =NX [i])と する場合(V [I] =!FR){ DFS(V [i]は、X); SZ [X] + = SZ [V [I]]。 もし(SZ [V [I]) F [X] + = F [V [I]] + 2LL * W [i]は、 G [X] = MAX(G [X]、G [V [I] + W [I])。 } } ボイド DP(int型のx、int型 FR、INT W){ ANS [X] = F [X] - G [X]。 LLのAX1 = 0、AX2 = 0。INTの ID = 0 。 以下のために(int型 I = HD [X]; I; I =NX [i])と する場合(V [I]!= FR && SZ [V [I]]){ 場合(AX1 <G [V [I] + W [i])と AX2 = AX1、AX1 = G [V [I] + W [i]は、ID = V [i]は、 他 AX2 = MAX(AX2、G [V [I] + W [I])。 } もし(SZ [FR]){ 場合(AX1 <G [FR] + W) AX2 = AX1、AX1 = G [FR] + W、ID = FR。 他 AX2 = MAX(AX2、G [FR] + W)。 } のために(int型 I = HD [X]; I; I = NX [I]) であれば(!Vを[I] = FR){ もし(SZ [V [I]]){ F [X]- = F [V [I]] + 2LL * W [i]は、 もし(ID == V [i])とG [X] = AX2。 F [V [I] + = F [X] + 2LL * W [i]は、 G [V [I] = MAX(G [V [I]、G [X] + W [I])。 } 他 F [V [I] = F [X] + 2LL * W [i]は、G [V [I] = G [X] + W [i]は、 SZ [X] - = SZ [V [I]]; SZ [V [I] + = SZ [X]; DP(V [i]は、X、W [I])。 SZ [V [I]] - = SZ [X]; SZ [X] + = SZ [V [I]]。 もし(SZ [V [I]]){ F [V [I]] - = F [X] + 2LL * W [i]は、 F [X] + = F [V [I]] + 2LL * W [i]は、G [X] = AX1。 } } } INT メイン(){ scanf関数(" %d個の%のD "、&N&K)。 用(intは X、Y、Z、I = 1 ; iがn <I ++は) scanf関数(" %D%D%D "、およびX&Y、およびZ)、 追加(X、Yを、Z)、追加(Y 、X、Z)。 用(INT X、I = 1 iが++; iは= Kを< ) のscanf(" %dの" FL、&x)は、[X] = 1 。 DFS(1、0)、DP(1、0、0 )。 int型 i = 1 ; iが<= N; iが++ ) のprintf(" %LLDする\ n " 、ANS [I])。 リターン0 ; }