1の#include <iostreamの> 2の#include <アルゴリズム> 3の#include <CStringの> 4 使って 名前空間STDを、 5 6 構造体ノード 7 { 8 INT に、NXT W。 9 ノード(){}。 10 ノード(int型、int型 B、INT c)の 11 { 12 =に、 13 = WをB。 14 NXT = C。 15 } 16 }。 17 18ノードg [ 3001 ]。 19 INT S [ 3001 ]。 20 int型のCNT; 図21は、 int型 [Uを3001 ]。 22 int型N、M。 23 int型 DP [ 3001 ] [ 3001 ]。 24 25 ボイド追加(int型の F、int型の T、INT W) 26 { 27 G [++ CNT = ノード(T、W、S [F])。 28の S [F] = CNT。 29 } 30の 31 INTの DFS(INT T) 32 { 33 もし(T> N - M) 34 { 35 DP [T] [ 1 ] = U [t]は、 36 DP [T] [ 0 ] = 0 。 37 リターン 1 。 38 } 39 DP [T] [ 0 ] = 0 。 40 int型の合計= 0 ; 41 のために(int型、I> I = sで[T] 0 ; I = G [i]が.nxt) 42 { 43 INTV = G [i]の.TO。 44 INT = W G [i]は.W。 45 のint NUM = DFS(V)。 46 + =合計NUM。 47 のために(INT J =和あり、j> 0 ; j-- ) 48 { 49 のための(int型のk = 0 ; K <=分(J、NUM); kは++ ) 50 DP [T] [J] = MAX(DP [T] [J]、DP [T] [J - K] + DP [V] [K] - W)。 51 } 52 } 53 リターン和。 54 } 55 56 のint main()の 57 { 58 // COUT << 0x8f << ENDL。 59 CIN >> N >> M。 60 のためには、(int型 i = 1 ; iがn = < - M; iは++ ) 61 { 62 のint numは、 63 cinを>> NUM。 64 のために(INT J = 0 ; J <NUM; J ++ ) 65 { 66 int型V、NXT。 67 CIN >> V >> NXT。 68 アドオン(I、V、NXT)。 69 } 70 } 71 のための(int型 I = N - M + 1 ; iが<= N; I ++ ) 72 CIN >> U [I]を、 73 のmemset(DP、0x8f、はsizeof (DP))。 74 のmemset(DP、0、はsizeof(DP [ 0 ])); 75の DFS(1 )。 76 のために(int型 ; I> = I = Mを0 ; i-- ) 77 { 78 であれば(DP [ 1 ] [I]> = 0) 79 { 80 COUT << I << ENDL。 81 ブレーク; 82 } 83 } 84 }