/*
* p4276.cpp
*
* Created on: 2013-7-24
* Author: zy
*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;
int dp[110][510], value[110];
vector<pair<int, int> > son[110];
int n, m;
int time1;
void init()
{
memset(dp, 0, sizeof(dp));
for (int i = 0; i <= n; i++)
son[i].clear();
}
bool dfs1(int u, int pa)
{
if (u == n)
return true;
for (int i = 0; i < son[u].size(); i++)
{
int v = son[u][i].first;
if (v == pa)
continue;
if (dfs1(v, u))
{
time1 += son[u][i].second;
son[u][i].second = 0;
return true;
}
}
return false;
}
void dfs2(int u, int pa)
{
for (int i = 0; i <= m; i++)
dp[u][i] = value[u];
for (int i = 0; i < son[u].size(); i++)
{
int v = son[u][i].first;
int l = son[u][i].second;
if (v == pa)
continue;
dfs2(v, u);
for (int j = m; j >= 0; j--)
for (int k = 0; k <= j; k++)
if (j - k - 2 * l >= 0)
dp[u][j] = max(dp[u][j], dp[u][j - k - 2 * l] + dp[v][k]);
}
}
int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
init();
int x, y, t;
for (int i = 1; i < n; i++)
{
scanf("%d%d%d", &x, &y, &t);
son[x].push_back(make_pair(y, t));
son[y].push_back(make_pair(x, t));
}
for (int i = 1; i <= n; i++)
scanf("%d", &value[i]);
time1 = 0;
dfs1(1, -1);
m -= time1;
if (m < 0)
{
printf(
"Human beings die in pursuit of wealth, and birds die in pursuit of food!\n");
continue;
}
dfs2(1, -1);
printf("%d\n", dp[1][m]);
}
return 0;
}
hdu 4276
最新推荐文章于 2019-03-03 04:28:05 发布