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 }