#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int to,next,val;
}e[1000];
int head[1000],cnt,n,vis[1000],num[1000];
int dp[560][560][2];
void add_edge(int from,int to,int val)
{
e[cnt].to=to;
e[cnt].val=val;
e[cnt].next=head[from];
head[from]=cnt++;
}
void dfs(int u)
{
vis[u]=num[u]=1;
dp[u][1][0]=dp[u][1][1]=0;
for(int i=head[u];i!=-1;i=e[i].next)
{
int to=e[i].to;
int val=e[i].val;
if(vis[to])
continue;
dfs(to);
num[u]+=num[to];
for(int j=num[u];j>1;j--)
for(int k=1;k<=j&&k<=num[to];k++)
{
dp[u][j][1]=min(dp[u][j][1],dp[u][j-k][1]+dp[to][k][1]+2*val);
dp[u][j][0]=min(dp[u][j][0],dp[u][j-k][1]+dp[to][k][0]+val);
dp[u][j][0]=min(dp[u][j][0],dp[u][j-k][0]+dp[to][k][1]+2*val);
}
}
}
int main()
{
int t=1;
while(~scanf("%d",&n)&&n)
{
memset(vis,0,sizeof(vis));
memset(dp,0x3f,sizeof(dp));
memset(head,-1,sizeof(head));
cnt=0;
for(int i=1;i<n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add_edge(b,a,c);
}
dfs(0);
printf("Case %d:\n",t++);
int q;
scanf("%d",&q);
while(q--)
{
int x;
scanf("%d",&x);
for(int i=n;i>=0;i--)
if(dp[0][i][0]<=x||dp[0][i][1]<=x)
{
printf("%d\n",i);
break;
}
}
}
}
LA 4015 树形DP 在路程不超过k的情况下,求最多可到达多少节点
最新推荐文章于 2020-11-18 13:02:07 发布