二叉苹果树
作者:
wyatt
,
2022-04-05 20:59:23
,
所有人可见
,
阅读 198
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 300;
int e[N],ne[N],h[N],idx = 0;
int f[N][N];// 以 i 为根,体积 为j 的
int s[N]; // 表示 x 有 几个儿子
int n,t;
int v[N],w[N];
void add(int a, int b, int c) // 添加一条边a->b,边权为c
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}
void dfs(int u)
{
for(int i = h[u] ; i != -1 ; i = ne[i])
{
int son = e[i];
dfs(son);
for(int j = t; j >= 0 ; j --)
{
for(int k = 0; k < j ; k++)
{
f[u][j] = max(f[u][j],f[u][j - k - 1] + f[son][k] + w[i]); // 画图可得知 需要减去 son-u 这条边,然后在加上这条边的价值
}
}
}
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> t;
for (int i = 1; i <= n - 1; i ++ )
{
int a,b,c;
cin >> a >> b >>c;
add(a, b, c);
}
dfs(1);
cout << f[1][t] << endl;
return 0;
}