2019ICPC銀川ネットワークゲームG.工場(gym102222 G)

実際に、私は主にこのぶら下げについて読んでおきたいです。実際、主に父親に息子を転送し、100×100 N *ツリーリュックことは明らかであり、かつ、正しい考え方をシフトアップ時に、このエッジの貢献、エッジの貢献を考慮することである(KJ)* jは* wが、それということです工場やサブツリー外。その後、判断は特場合、N = 2、N = 1、K = 1で十分であるのに注意すべきです。

<ビット/ STDC ++ H>の#include 
の#define PB一back 
の#define LL長い長
の#define MP make_pair 
の#define _min(x、y)は(x> = Y Y:X)
名前空間stdを使用。
CONST int型N = 1E5 + 7。
const int型M = 720; 
constのLL INF = 1E18; 
インラインチャーNC(){ 
    静的チャーBUF [100000]、* = BUF、*端= BUFを開始します。
    場合(開始==端)始める= BUF、端= BUF +のfread(BUF、1,100000、STDIN)。
    場合は、戻りEOF(==エンドを開始)。
    ++ *返し始めます。
} 
テンプレート<型名T> 
インラインBOOL読み出す(T&X){ 
    チャーC = NC()。
    (C == EOF)がfalseを返す場合は、
    X = 0。
    一方、((> = '0' && C C <= '9' || C == ' - ')!)C = NC()。
    ブールフラグ= C == ' - '
    (C> = '0'ながら&
    (フラグ)は、x = -xであれば、
    trueを返します。
} 
int型のT。
N INT、M、K。
LL DP [N] [105]。
int型のCNT; 
INT FIR [N]、NXT [N * 2]、[* 2 N]であり; 
LLヴァル[N * 2]。
ボイドadd_e(int型のx、int型のY、LLのW){ 
    ++ CNT; NXT [CNT] =モミ[X];モミ[X] = CNT;に[CNT] = Y;ヴァル[CNT] = W。
    ++ CNT; NXT [CNT] =モミ[Y];モミ[Y] = CNT; [CNT] = xと;ヴァル[CNT] = W。
} 
int型U、V、W。
INTデュ[N]。
INT LEF [N]。
ボイドDFS(int型のx、int型FA){ 
    // COUT << X << "の\ n"。
    もし(DU [X] == 1){ 
        DPは、[X] [0] = DP [X] [1] = 0; 
        LEF [X] = 1。
        返します。
    } 
    DP [X] [0] = 0。
    以下のために(INT i = 1; iは= Kを<; iは++)DP [X] [I] = INF。
    以下のために(INT I = FIR [X]; I; I = NXT [I]){ 
        int型V =乃至[I];(V == FA)が続けば、
        DFS(V、X)
        [X] + = LEF LEF [V]。
        QW LL =ヴァル[I]。
        INT PQ =分(LEF [V]、K)。
        用(INT R = _min(LEF [X]、K)であり; R> = 0; R - ){ 
            ための(int型J = 0であり、j <= PQ && J <= R; J ++){ 
                DP [X] [R] = _min(DP [X] [R]、DP [X] [RJ] + DP [V] [J] +(KJ)* jは*のQW)。
            } 
        } 
    } 


} 
ボイドのinit()は{ 
    フィル(FIR + 1、FIR + 1 + N、0); 
    フィル(DU + 1、デュ+ 1 + N、0); 
    //(; iが<= N; I = 1をint型私は++)のためのFIR [I] =デュ[I] =のLEF [I] = 0; 
    CNT = 0; 
} 
メインINT(){ 
    (T)を読み出します。
    一方、(T - ){
    int型CAS = 0; DP [ST] [K] << "の\ n"。
        (n)を読み出す;(k)を読み出す;のinit(); 
        {ため(; iがn <I ++はI = 1 INT)
            (U)を読み出す;(V)を読み出す;(W)を読み取ります。
            add_e(U、V、W)。
            デュ[U] ++;デュ[V] ++; 
        } 
        coutの<< "ケース#" << ++ CAS << ":"; 
        IF(N == 1つの|| K == 1){ 
            COUT << 0 << "の\ n"。
            持続する; 
        } 
        IF(N == 2){ 
            COUT << W << "の\ n"。
            持続する; 
        } 
        ST = 0 int型。
        以下のために{(INT i = 1; iは++; iが= N <)
            であれば(DU [I] = 1!){ST = I;ブレーク;} 
        } 
        DFS(ST、0); 
        COUT << DP [ST] [K] << "の\ n"。

  

おすすめ

転載: www.cnblogs.com/intwentieth/p/11459249.html