#2485.党(カンプ)

説明タイトル
ツリーポイント$ 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 = 0INTの 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(10)、DP(100 )。
    int型 i = 1 ; iが<= N; iが++ 
        のprintf(" %LLDする\ n " 、ANS [I])。
    リターン0 ; 
} 

 

おすすめ

転載: www.cnblogs.com/xjqxjq/p/11317469.html