2019瀋陽ネットゲーム木のDP

 

https://nanti.jisuanke.com/t/41403

2019瀋陽Dネットワークゲームタイトル

木のDP。ツリーは、任意の2点の距離を求めると。UVとvuが二度数えました。3つのカテゴリに分類2点間の距離は、金型0,1の三種類が3に等しく、これら三つの和が最終的な出力です。

第一の方法。累積直接。ポイントに横断するとき。最初の答えを計算します。答えは、彼の距離に素敵なプラスのすべてのポイントを通過しなければならないと。一方、ポイントは、値を追加する必要があり、その数を追加します。最終的にはすべての統計ダウン最初の検索トラバーサル、その後、統計バックトラック

値をバックトラック。ちょうど彼の距離を計算したポイントの前に毎回そのため、紫外線でVU二回数えので、その最終的な結果は、2を掛けています。

たびにプラス一点からの彼との距離を計算するための時間、およびエッジの右側0+現在のポイントの前に。0,1,2はゼロが何を示している場合、蓄積しません、プレスを蓄積します。

 

 

#include <ビット/ STDC ++ H.>
 の#define LLロングロング
 使用 名前空間STD;
 のconst  int型 N = 1E4 + 5。 CONST  INT MOD = + 1E9 。7 ; 
typedefの対 < int型、LL> PII;
 int型N-、
ベクトル <PII> G [N]; 
LLのANSの[ 4 ]; //結果のアレイ
 構造体ノード{ 
    LLのvalupの[ 4 ]; //再帰後戻り
    LLのvaldownの[ 4 ]; //再帰ダウン場合
    LL cntdown [ 4 ]、cntup [ 4。ボイド ]; //再帰バックトラッキングダウンポイントの数。
}ノード[N]。

 MOD。DFS(INT U、INT F){
     int型 LEN = G [U] .size()。
    以下のためにint型 i = 0 ; iがLEN <; iは++ ){
         int型、V = G [U] [i]は1次回。
        LL W = G [U] [I] .second。
        もし(vは== f)を続けます
        ノード[V] .valdown [W 3 ] =(ノード[V] .valdown [%W 3 + W])%MOD。
        ノード[V] .cntdown [W 3 ] =(ノード[V] .cntdown [%W 3 ] + 1)%の
        ANS [W 3 ] =([重量%ANS 3 + W])%MOD。
        INT J = 0 ; J < 3 ; J ++ ){ 
            LL WW =(ノード[U] .valdown [J] +ノード[U] .valup [J])%MOD。
            LLのCNT =(ノード[U] .cntdown [J] +ノード[U] .cntup [J])%MOD。
            もし(WWは== 0続けます
            LLのMoは =(J + W)%3 
            ノード[V] .valdown [MO] =(ノード[V] .valdown [MO] + WW)%MOD。
            ノード[V] .valdown [MO] =(ノード[V] .valdown [MO] + W * CNT)% MOD。
            ノード[V] .cntdown [あなた] =(ノード[V] .cntdown [あなた] + CNT)%MOD。
            オズ[U] =(オンス[あなた] + WW)%のMOD。
            オズ[U] =(オンス[あなた] + W * CNT)%のmod。
        } 
        のDFS(V、U)。
        ノード[U] .valup [W 3 ] =(ノード[U] .valup [%W 3 + W])%MOD。
        ノード[U] .cntup [W 3 ] =(ノード[U] .cntup [%W 3 +] 1)%MOD。
        INT J = 0 ; J < 3; J ++ ){
            LL WW = ノード[V] [j]を.valup。
            LLのCNT = ノード[V] .cntup [J]。
            もし(WWは== 0続けます
            LLのMoは =(J + W)%3 
            ノード[U] .valup [MO] =(ノード[U] .valup [MO] + WW)%MOD。
            ノード[U] .valup [MO] =(ノード[U] .valup [MO] +のW *のCNT)%MOD。
            ノード[U] .cntup [MO] =(ノード[U] .cntup [MO] + CNT)%MOD。
        } 
    } 
} 

int型のmain(){
     ながら(〜のscanf(" %dの "、&N)){
         int型Uを、V。
        ワットLL; 
        ANS [ 0 ] =のANS [ 1 ] =のANSは、[ 2 ] = 0 以下のためにint型私= 0 ; iがN <; Iは++ ){ 
            G [I] .clear(); 
            INT J = 0 ; J < 4 ; J ++)ノード[i]は.valup [J] =ノード[I] .valdown [J] =ノード[I] .cntdown [J] =ノード[I] .cntup [ J] = 0 ; 
        } 
        のためにint型 i = 1 ; iがN <; Iは++ ){ 
            scanf関数("%D%D%LLD "、&​​U&V、およびW)
            G [U] .push_back(PII(V)、W)。
            G [V] .push_back(PII(U、W))。
        } 
        DFS(0、 - 1 )。
        以下のためにint型 i = 0 ; iは< 3 ; iは++ ){ 
            のprintf(" %のLLD%のCを"、(ANS [I] * 2)%のMOD、I == 2' \ n ''  ' )。
        } 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/downrainsun/p/11528832.html