2019年夏の合宿で最大のサブツリー

タイトル説明

暁明数学の完全な関心、そして勤勉学生では、常に先生にいくつか質問をするクラスの後、教室に滞在します。彼は朝に乗っに学校に行ってきました。ある日、老人を参照するには、道路が突然花を剪定についての質問を考え、剪定植物や花です。だから、放課後の日は、暁明は、教師との問題を提起します:

さえの合計持っている上に奇妙な花、N個の花を、あるN - 1本のTiaoの枝は花にリンクされ、剪定されていないとき、すべての花が隔離されていませんが。それぞれの花は「美しいインデックス」、花の数も大きく、より美しくするだけでなく、「美しいインデックスは、」すべての嫌な見て花を示し、負のを持っています。意味は、いわゆる「剪定」は、:それらの枝を取り除くので、花は2、1つのスローになりました。「剪定」の一連の後、彼は(おそらく)最後の花を残しました。教師の仕事は、以下のとおりです(何が行われていない「トリミング」することができます)、「剪定」のシリーズを通じて、親族(花)の残りのような花「ビューティフル指数」と最大の合計のすべての花。

一瞬思った先生は、正のソリューションを提供します。暁明は、問題は非常に不幸、簡単に壊れているので、彼はあなたを尋ねるために使用される参照してください。

入力形式

整数の最初のラインN 1 N 1 。6 0 0 0 )。それは、合計で成長しているオリジナルの花を表すNの花を。

第二の線が有するN個の整数を、第Iの整数を表し、私は美容インデックスを-flowered。

次いで、N-1 ラインの各2つの整数を接続の存在を示すB、花及びB花の枝を。

出力フォーマット

「剪定」の一連の後に最大値を表す数値は「ビューティフルインデックス」の合計を得ることができます。絶対値以下である2 。1 。4 。7 。4 。8 。3 。6 。4 7

サンプル入力と出力

入力#1
7 
-1 -1 -1 1 1 1 0 
1 4 
2 5 
3 6 
4 7 
5 7 
6 7
出力#1
3

説明/ヒント

スケールデータと[合意]

ため。6 0 データの%、あるN 1。0 0 0。

以下のために。1 0 0 データの%、あるN 1 。6 0 0 0。

元のタイトル羅区P1122


アートワークは、ツリーを取得することが容易であり、木の剪定は、どのように彼の父の子に影響するので、木のDPを考慮していません

 

それらの各xを根と木のために、私たちはそのサブツリーのチェックのすべて/(DPは、[x]はxにサブツリーの最大の美しさの指標のルートである)、その値のDPをオフに考えます
まず、[X] = MAX(DP [X] -subtree [Y]、DP [X] -subtree [Y [x]は、xが切断されていないルートとするサブツリー、DPである初期値DPを表すサブツリーを使用します] + DP [Y])
サブツリーが減算されなければならない原因[Y]はxのそれぞれのサブツリーは、我々はむしろ、そのサブツリーの値より、いずれのDP値をとるか否かについて議論します
更新はDPを意味している場合は、[x]はそのすべてのDP [y]は、我々は、最適解の各サブツリーのために作られていますたびに更新されました
コード
#include <iostreamの> 
する#include <cstdioを> 
する#include <CStringの> 
する#include <climits>
 使用して 名前空間STD。
INTのサブツリー[ 100500 ]、DP [ 100500 ]、N、ヘッド[ 100500 ]、NUM、C [ 100500 ]。
構造体の
{ 
    int型、U、V、NXT。
} E [ 200500 ]。
ボイド追加(INT U、INT V)
{ 
    E [ ++ NUM] .U = U、E [NUM] .V = V。
    E [NUM] .nxt =頭部[U];頭部[U] = NUM。
} 
のボイドINIT(int型のx、int型FA)
{ 
    int型 ANS = C [X]。
    以下のためにint型 ST =頭部[X]; ST =! - 1 ; ST = E [ST] .nxt)
    { 
        int型 = Y E [ST] .V。
        もし(Y == FA)続けます
        INIT(Y、X)。
        ANS + = サブツリー[Y]。
    } 
    サブツリー[X] = ANS。
    返します
} 
INT DP(int型のx、int型FA)
{ 
    DP [X] = サブツリー[X]。
    にとってint型 - ;!ST = ST =頭部[X] 1 ; ST = E [ST] .nxt)
    { 
        int型、Y = E [ST] .Vと、
        もし(Y == FA)続けます
        DP(Y、X)。
        DP [X] = MAX(DP [X] -subtree [Y]、DP [X] -subtree [Y] + DP [Y])。
    } 
    戻りDP [X]。
} 
int型のmain()
{ 
    memsetの(頭、 - 1はsizeof ヘッド)
    scanf関数(" %のD "、&N)
    int型 iは= 1のscanf(私は++; iが<= N)"%のD "& C [i]は);
     int型、B;
     のためint型 i = 1 ; iがn <; iは++ 
    { 
        scanf関数(" %d個の%のD "、&​​、&B); 
        (A、Bを追加)
        ;(B、A)を追加
    } 
    INIT(1、 - 1 ); 
    DP(1 - 1 );
     INT ANS = INT_MIN;
     のためint型 I = 1は iがn = <; iは++ 
        ANS = MAX(ANS 、DP [I]); 
    のprintf(" %のD " 、ANS)。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/qxds/p/11373551.html