P2515 [HAOI2010]软件安装
树形背包
1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<cstring> 5 #include<vector> 6 #define MAXN 110 7 #define MAXM 510 8 #define pii pair<int,int> 9 #define rint register int 10 #define mp make_pair 11 #define pb push_back 12 using namespace std; 13 int read(){ 14 int x=0,f=1;char ch=getchar(); 15 while(ch<'0'||ch>'9'){if('-'==ch)f=-1;ch=getchar();} 16 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 17 return x*f; 18 } 19 int tot,m; 20 int C[MAXN],V[MAXN]; 21 vector<int> G[MAXN]; 22 int dfn[MAXN],low[MAXN],sta[MAXN],b[MAXN],top,idx; 23 int c[MAXN],v[MAXN],cmp[MAXN],n; 24 int fst[MAXN],nxt[MAXN],from[MAXN],to[MAXN],cnt,pin[MAXN]; 25 void add(int x,int y){ 26 nxt[++cnt]=fst[x],fst[x]=cnt,from[cnt]=x,to[cnt]=y; 27 pin[y]++; 28 } 29 void tarjan(int x){ 30 dfn[x]=low[x]=(++idx); 31 sta[++top]=x,b[x]=1; 32 int y; 33 for(rint i=0;i<G[x].size();i++){ 34 y=G[x][i]; 35 if(!dfn[y]){ 36 tarjan(y); 37 low[x]=min(low[x],low[y]); 38 } 39 else if(b[y]){ 40 low[x]=min(low[x],dfn[y]); 41 } 42 } 43 if(dfn[x]==low[x]){ 44 n++; 45 while(sta[top+1]!=x){ 46 c[n]+=C[sta[top]]; 47 v[n]+=V[sta[top]]; 48 cmp[sta[top]]=n; 49 b[sta[top]]=0; 50 top--; 51 } 52 } 53 } 54 int f[MAXN][MAXM],dep[MAXN]; 55 int H[MAXM],H1[MAXM],H2[MAXM]; 56 void work(int x,int vl){ 57 if(vl<c[x]){f[x][vl]=0;return;} 58 vl-=c[x]; 59 memset(H,0,sizeof(H)); 60 memset(H1,0,sizeof(H1)); 61 int y,r=0; 62 for(rint e=fst[x];e;e=nxt[e]){ 63 y=to[e]; 64 for(rint i=0;i<=vl;i++){ 65 H[i]=max(H[i],H1[i]+f[y][vl-i]); 66 r=max(r,H[i]); 67 } 68 memcpy(H1,H,sizeof(H)); 69 } 70 f[x][vl+c[x]]=r+v[x]; 71 } 72 void dp(int x){ 73 b[x]=1; 74 int y; 75 for(rint e=fst[x];e;e=nxt[e]){ 76 y=to[e]; 77 if(!b[y]){ 78 dp(y); 79 for(rint j=m-c[x];j>=0;j--){ 80 for(rint k=0;k<=j;k++){ 81 f[x][j]=max(f[x][j],f[x][k]+f[y][j-k]); 82 } 83 } 84 } 85 } 86 for(rint j=m;j>=0;j--){ 87 if(j>=c[x]){ 88 f[x][j]=f[x][j-c[x]]+v[x]; 89 } 90 else{ 91 f[x][j]=0; 92 } 93 } 94 } 95 int main() 96 { 97 // freopen("data.in","r",stdin); 98 tot=read();m=read(); 99 for(rint i=1;i<=tot;i++)C[i]=read(); 100 for(rint i=1;i<=tot;i++)V[i]=read(); 101 int tmp; 102 for(rint i=1;i<=tot;i++){ 103 tmp=read(); 104 if(tmp)G[tmp].pb(i); 105 } 106 for(rint i=1;i<=tot;i++){ 107 if(!dfn[i])tarjan(i); 108 } 109 for(rint i=1;i<=tot;i++){ 110 for(rint j=0;j<G[i].size();j++){ 111 int x=i,y=G[i][j]; 112 if(cmp[x]!=cmp[y]){ 113 add(cmp[x],cmp[y]); 114 } 115 } 116 } 117 for(rint i=1;i<=n;i++){ 118 if(!pin[i]){ 119 add(0,i); 120 } 121 } 122 // for(rint i=1;i<=cnt;i++){ 123 // printf("%d %d\n",from[i],to[i]); 124 // } 125 memset(b,0,sizeof(b)); 126 dp(0); 127 printf("%d\n",f[0][m]); 128 return 0; 129 }