#include<cstdio>
#include<cstring>
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MIN(x,y) ((x)>(y)?(y):(x))
struct node
{
int to,next;
}e[2100];
int cnt,head[1010],v[1010][210],w[1010][210],m,n,dp[1010][210],len[1010];
void add_edge(int from,int to)
{
e[cnt].to=to;
e[cnt].next=head[from];
head[from]=cnt++;
}
void dfs(int u,int from)
{
int flag=0;
for(int i=head[u];i!=-1;i=e[i].next)
{
int to=e[i].to;
if(to==from)
continue;
dfs(to,u);
if(!flag)
{
flag=1;
for(int j=0;j<=m;j++)
dp[u][j]=dp[to][j];
continue;
}
for(int j=m;j>=0;j--)
{
int t=0;
for(int k=0;k<=j;k++)
t=MAX(t,MIN(dp[u][j-k],dp[to][k]));
dp[u][j]=t;
}
}
int tem[1010];
for(int i=0;i<=m;i++)
tem[i]=dp[u][i];
for(int j=m;j>=0;j--)
for(int i=1;i<=len[u];i++)
if(j>=w[u][i])
dp[u][j]=MAX(dp[u][j],tem[j-w[u][i]]+v[u][i]);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
cnt=0;
memset(head,-1,sizeof(head));
for(int i=1;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add_edge(a,b);
add_edge(b,a);
}
scanf("%d",&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&len[i]);
for(int j=1;j<=len[i];j++)
scanf("%d%d",&w[i][j],&v[i][j]);
}
memset(dp,0,sizeof(dp));
dfs(1,-1);
printf("%d\n",dp[1][m]);
}
}
hdu 4044
最新推荐文章于 2020-03-12 20:44:33 发布