ツリー[] P1273のケーブルテレビネットワーク・パケット・バックパック

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]> = 079          {
 80              COUT << I << ENDL。
81              ブレーク;
82          }
 83      }
 84 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/thjkhdf12/p/11641146.html