BZOJ4033 HAOI2015ツリー着色

ある子供たちの質問[霧]

だから、難しいことではありません

木の貢献DPのシンプル右側

LONGLONGを開くには右サイドを与えませんでした

コードワットを見てもよいかのEMMの詳細

唯一の詳細は、おそらくあなたはWJ更新をしたいので、後方に再循環された最初であります

双方向側の配列...そして二回(開くことを忘れないでください

// 愛と自由。
#include <cstdioを> 
する#include <cmath> 
の#include <アルゴリズム> 
の#include <CStringの>
 に#define LL長い長
 の#define INF 20021225
 の#define N 2001
 使用して 名前空間STDを、
構造体 EDG { INTに、LT、V;} E [N << 1 ]。
LL F [N]、[N]。INT CNT、[N]、K、SZ [N]、N。
ボイド追加(int型のx、int型の Y、INT V)
{ 
    E [ ++ CNT] .TO = Y。E [CNT] .LT = [バツ]; E [CNT] .V = V。 [X] = CNT。
    E [ = xで.TO ++ CNT]。E [CNT] .LT =  [Y]。E [CNT] .V = V。 [Y] = CNT。
} 
ボイド DFS(int型のx、int型FA)
{ 
    SZ [X] = 1memsetの([x]は、F - 1はsizeof(F [X]))。F [X] [ 0 ] = F [X] [ 1 ] = 0 ;
    以下のためにint型私は=  [X]; I; I = E [I] .LT)
    { 
        int型、Y = E [i]を.TO、V = E [I] .V。もし(Y == FA)     続行; 
        DFS(Y、X)。SZ [X] + = SZ [Y]。INTトップ= 分(K、SZ [X])。
        INT W =頂;〜W; w-- のためのint型 J = 0 ; J <=分(W、SZ [Y]); J ++ 
            { 
                場合(F [X] [WJ] == - 1継続; 
                F [X] [W] = MAX(F [X]、[W] [X] [WJ] + F [Y] [J] + 1LL * V×(SZ [Y] -j)*(F N- SZ [Y] -k + J)+ 1LLの*のV *のJ×(K- J))。
            } 
    } 
} 
int型のmain()
{ 
    scanf関数(" %D%dの"、&​​N&K)。int型X、Y、V。
    以下のためにint型 i = 1 ; iがn <I ++の
        のscanf(" %D%D%D "、およびX&Yを、&V)、追加(X、Y、V)。
    DFS(11 )。
    printf(" %LLDする\ n "、F [ 1 ] [K])。
    リターン 0 ; 
}
コードの表示

 

ます。https://www.cnblogs.com/hanyuweining/p/11075942.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34075551/article/details/93651776