intsiz[si];inthson[si];// u 的重儿子i64dp[si][si],ans[si][si];// 预处理重儿子voiddfs1(intu,intfa){intkot=0;siz[u]=1,hson[u]=0;for(inti=head[u];~i;i=e[i].Next){intv=e[i].ver;if(v==fa)continue;dfs1(v,u),siz[u]+=siz[v];if(siz[v]>kot)kot=siz[v],hson[u]=v;}}// 暴力加以 u 为根的子树当中的所有物品voiddfs2(intu,intfa,i64*f){for(inti=m;i>=a[u];--i)f[i]=max(f[i],f[i-a[u]]+w[u]);for(inti=head[u];~i;i=e[i].Next){intv=e[i].ver;if(v==fa)continue;// 这里是暴力加就不要判重儿子了(实测会WA)dfs2(v,u,f);}}// dp 的过程voiddfs3(intu,intfa){for(inti=head[u];~i;i=e[i].Next){intv=e[i].ver;if(v==fa)continue;dfs3(v,u);}memcpy(dp[u],dp[hson[u]],sizeofdp[u]);for(inti=head[u];~i;i=e[i].Next){intv=e[i].ver;if(v==fa||v==hson[u])continue;dfs2(v,u,dp[u]);}for(inti=m;i>=a[u];--i){dp[u][i]=max(dp[u][i],dp[u][i-a[u]]+w[u]);}// i64 *kot = dp[hson[u]]; // 直接继承重儿子// for(int i = head[u]; ~i; i = e[i].Next) {// int v = e[i].ver;// if(v == fa || v == hson[u]) continue;// dfs2(v, u, kot);// }// for(int i = m; i >= a[u]; --i) // kot[i] = max(kot[i], kot[i - a[u]] + w[u]);// for(int i = 0; i <= m; ++i) // ans[u][i] = kot[i];// 因为是离线且自底向上更新,所以不用考虑直接用重儿子的数组修改后会影响答案。// memcpy 虽然很快,但是复杂度不对,但是这个指针写法似乎有问题? // TODO : fix it.}