#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int pos,n,m,list[200],bug[200],brain[200],dp[200][200];
struct P{
int u,v,next;
}point[1000];
void add(int u,int v){
point[pos].u=u;
point[pos].v=v;
point[pos].next=list[u];
list[u]=pos++;
}
void dfs(int son,int fa){
for(int i=(bug[son]+19)/20;i<=m;i++)
dp[son][i]=brain[son];
int now=list[son];
while(now!=-1){
if(point[now].v==fa){
now=point[now].next;
continue;
}
dfs(point[now].v,son);
for(int i=m;i>=(bug[son]+19)/20;i--){
for(int j=1;j+i<=m;j++){
if(dp[point[now].v][j]){
dp[son][i+j]=max(dp[son][i+j],dp[son][i]+dp[point[now].v][j]);
}
}
}
now=point[now].next;
}
return;
}
int main(){
while(scanf("%d%d",&n,&m)&&(n!=-1&&m!=-1)){
pos=0;
memset(list,-1,sizeof(list));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
scanf("%d%d",&bug[i],&brain[i]);
}
for(int i=1;i<n;i++){
int a,b;
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
if(m==0){
printf("%d\n",m);
continue;
}
dfs(1,0);
printf("%d\n",dp[1][m]);
}
return 0;
}
hdu 1011 树型dp+背包
最新推荐文章于 2020-01-16 19:27:37 发布