[JZOJ5344]【NOIP2017模擬9.3A組】摘果子
阿新 • • 發佈:2019-01-26
Description
Solution
樹形依賴揹包裸模型
F[i][j]表示表示DFS序上第i~N個已經做完了,重量為j
Code
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
#define N 2005
using namespace std;
int fs[N],dt[2*N],nt[2*N],f[N][N],n,m,m1,vl[N],pr[N],dfn[N],n1,sz[N];
void link(int x,int y)
{
nt[++m1]=fs[x];
dt[fs[x]=m1]=y;
}
void dfs(int k,int fa)
{
dfn[++n1]=k;
sz[k]=1;
for(int i=fs[k];i;i=nt[i])
{
int p=dt[i];
if(p!=fa) dfs(p,k),sz[k]+=sz[p];
}
}
int main()
{
cin>>n>>m;
fo(i,1,n) scanf("%d%d",&vl[i],&pr[i]);
fo(i,1,n-1)
{
int x,y;
scanf("%d%d",&x,&y);
link(x,y),link(y,x);
}
dfs(1,0);
fod(i,n,1)
{
fod(j,m,0)
{
f[i][j]=f[i+sz[dfn[i]]][j];
if(j>=pr[dfn[i]]) f[i][j]=max(f[i][j],f[i+1][j-pr[dfn[i]]]+vl[dfn[i]]);
}
}
int ans=0;
fo(i,0,m) ans=max(ans,f[1][i]);
printf("%d\n",ans);
}