#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
const int MAXN = 100 + 10;
struct Node
{
int next;
int to;
int val;
}edge[MAXN*2];
int head[MAXN];
int tot = 0;
int dp[MAXN][550];
int val[MAXN];
int n;
int tim;
void init()
{
tot = 0;
memset(head, -1, sizeof(head));
}
void AddEdge(int u, int v, int w)
{
edge[tot].to = v;
edge[tot].next = head[u];
edge[tot].val = w;
head[u] = tot++;
edge[tot].to = u;
edge[tot].next = head[v];
edge[tot].val = w;
head[v] = tot++;
}
bool dfs(int u, int pre)
{
if(u == n) return true;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v = edge[i].to;
if(v == pre) continue;
if(dfs(v, u))
{
tim += edge[i].val;
edge[i].val = 0;
return true;
}
}
return false;
}
int t;
void DP(int u, int pre)
{
for(int i=0;i<=t;i++) dp[u][i] = val[u];
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v = edge[i].to;
if(v == pre) continue;
DP(v, u);
int cost = edge[i].val * 2;
for(int i=t;i>=cost;i--)
{
for(int j=0;j<=i-cost;j++)
{
dp[u][i] = max(dp[u][i], dp[v][j] + dp[u][i-j-cost]);
}
}
}
}
int main()
{
while(scanf("%d%d", &n, &t)!=EOF)
{
int u, v, w;
init();
for(int i=1;i<n;i++)
{
scanf("%d%d%d", &u, &v, &w);
AddEdge(u, v, w);
}
for(int i=1;i<=n;i++) scanf("%d", &val[i]);
tim = 0;
dfs(1, -1);
//cout<<tim<<endl;
if(t < tim)
{
printf("Human beings die in pursuit of wealth, and birds die in pursuit of food!\n");
continue;
}
t -= tim;
DP(1, -1);
printf("%d\n", dp[1][t]);
}
return 0;
}
HDU 4276 The Ghost Blows Light(树型DP)
最新推荐文章于 2015-09-03 23:52:49 发布