P2515- [HAOI2010]ソフトウェアのインストール

  1の#include <iostreamの>
   2の#include <ベクトル>
   3  の#define(I、B)(I =(A)がINTレジスタiが++; iがBを<)ため_for
   4  の#define、_rep(I、 B)は(レジスタI =(A INT); I> B; I - )
   5  の#define INF 0x3f3f3f3f
   6  の#define MOD 100000000
   7  の#define MAXN 1503年
   8  の#define PBの一back
   9  の#defineデバッグ()のprintf( "ミク!OK \ n "は)チェック
 10 typedefの長い 長いLLを。
11  
12  使って 名前空間STDを、
13のtypedef対<int型int型 > P;
14  インラインLLリード()
 15  {
 16      のLLのANS = 0 17      CHAR CH = GETCHAR()、=最後'  ' 18      しばらく(!isdigit(CH))最後の= CH、CH = getchar関数();
19      一方(isdigit(CH))ANS =(ANS << 1)+(ANS << 3)+ CH - ' 0 '、CH = GETCHAR()。
20      であれば(最後== ' - ')ANS = - ANS。
21      リターンANS;
22  }
 23インラインボイドライト(LLのX)
 24  {
 25の     場合(X < 0)は、x = -x、のputchar(' - ' )。
26      であれば(X> = 10)のライト(X / 10 )。
27      のputchar(Xの%10 + ' 0 ' )。
28  }
 29  整数N、M。
30  INT [MAXN]、次に[MAXN]、ヘッド[MAXN] [MAXN]、[MAXN] DFN、低い版
31  INT [MAXN] Gver [MAXN]、GNext、Ghead [MAXN]、Gtot。
32 INTのスタック[MAXN]、イン[MAXN]、[MAXN] C。
33ベクター< INT > SCC [MAXN]。
34  INTのTOT、上部、CNT、NM。
35  INTは、我々は[MAXN]、[MAXN]、W [MAXN]をVeは、V [MAXN]。
36  INT iopW [MAXN]、ブルームバーグ・IOPV [MAXN]、iopD [MAXN]。
37  INT ; MAXN] indeg
38  INT DP [MAXN] [MAXN]。
39  ボイド addori(int型のx、int型のY)
 40  {
 41      [++ TOT = Y、次に[TOT =頭部[X]、ヘッド[X] =版TOT。
42  }
 43  空隙 tarjan(INTx)の
 44  {
 45の      DFNは、[X] = L [X] = ++ NM。
46      スタック[++トップ] = xで、インは、[X] = 1 47      のためにint型 I =ヘッド[X]; I; I = 次に[I])
 48      {
 49          のint Y = 版[I];
50          であれば(!DFN [Y])
 51          {
 52              tarjan(Y)。
53              低[X] = 分(低[x]は、低[Y])。
54          }
 55          そう であれば(INS [Y])
 56              低[X] =分(低[x]は、DFN [Y])。
57      }
 58      であれば(DFN [X] == 低[X])
 59      {
 60          CNT ++ 61          のint Y;
62          行う
63          {
 64              、Y =スタック[トップ- ]、イン[Y] = 0 ;
65個の              C [Y] = CNT、SCC [CNT] .pb(Y)。
66          }
 67          ながら(!X = Y)。
68      }
 69  }
 70  空隙 addAft(int型のx、int型のY)
 71 {
 72      Gver [++ Gtot] = Y。
73      GNext [Gtot] = Ghead [X]。
74      Ghead [X] = Gtot。
75  }
 76  空隙シュリンク()
 77  {
 78      _for(I、1、N + 1 )、
 79      であれば(![I] DFN)
 80          tarjan(I)。
81  
82      _for(X、1、N + 1 83      のためのint型 I =ヘッドを[X]; I; I = 次に[I])
 84      {
 85          INTY = [I]版。
86          もし(C [X] == C [Y])続けます87          addAft(C [Y]、[X] C)。
88          indeg [C [X]] ++ ;
89      }
 90      _for(I、1、CNT + 1 91      _for(j、0 、SCC [I] .size())
 92      W [I] + =我々 [SCC [I]、[J]、V [i]は+ =はVeの[SCC [I] [J]。
93  
94      _for(I、1、CNT + 1 95      であれば(!indeg [i])と
 96          addAft(0 、I)。
97 }
 98の 空隙 DFS(INT U)
 99  {
 100      _for(I、W [U]、M + 1 101          DP [U] [I] = V [U]。
102      のためのINT P = Ghead [U]; P; P = GNext [P])
 103      {
 104          INTの Y = Gver [P]。
105の         DFS(Y)。
106          INTの K = M - W [U]。
107          _rep(I、K、 - 1 108              _for(j、0、I + 1 109                 DP [U] [iがWを+ [U] = MAX(DP [U] [iが+ 、W [U]
 110                                       DP [Y] [J] + DP [U]を[iがW [U] + - jは]);
111      }
 112  }
 113  INT メイン()
 114  {
 115      N = (読み取り)
116      M = )(読み取ります。
117      _for(I、1、N + 1 118      iopW [I] = 読み取ります();
119      _for(I、1、N + 1 120      ブルームバーグ・IOPV [I] = 読み取ります();
121      _for(I、1、N + 1 122      iopD [I] = (読み取り)
123  
124      _for(I、1、N + 1 125      {
 126          我々 [I] = iopW [I]。
127は          Veを[I] = ブルームバーグ・IOPV [I]。
128          であれば(iopD [i])と
 129              addori(I、iopD [I])。
130      }
 131      シュリンク()。
132の      DFS(0 )。
133      ライト(DP [ 0 ] [M])。
134      戻り 0 ;
135 }

 

おすすめ

転載: www.cnblogs.com/Asurudo/p/11628343.html