P2015 二叉苹果树
我在本地跑没有问题,交到 洛谷 上就 RE 了
#include <bits/stdc++.h>
using namespace std;
int hd[105], nxt[205], v[205], to[205], tot;
void add(int x, int y, int z)
{
tot++;
to[tot] = y;
v[tot] = z;
nxt[tot] = hd[x];
hd[x] = tot;
}
int n, m;
int f[105][105];
bool vis[105];
int dp(int k)
{
int sm = 0, sonl, sonr, underl = 0, underr = 0;
vis[k] = 1;
for(int i = hd[k]; i; i = nxt[i])
{
if(!vis[to[i]])
{
if(!sm)
{
sonl = i;
underl = min(m - 1, dp(to[i]));
}
else
{
sonr = i;
underr = min(m - 1, dp(to[i]));
}
sm++;
}
}
for(int j = 0; j <= underl; j++)
f[k][j + 1] = max(f[k][j + 1], f[to[sonl]][j] + v[sonl]);
for(int j = 0; j <= underr; j++)
f[k][j + 1] = max(f[k][j + 1], f[to[sonr]][j] + v[sonr]);
for(int i = 0; i <= underl; i++)
for(int j = 0; j <= underr && i + j <= m - 2; j++)
f[k][i + j + 2] = max(f[k][i + j + 2], f[to[sonl]][i] + f[to[sonr]][j] + v[sonl] + v[sonr]);
return underl + underr + sm;
}
int main()
{
scanf("%d%d", &n, &m);
int a, b, c;
for(int i = 1; i < n; i++)
{
scanf("%d%d%d", &a, &b, &c);
add(a, b, c);
add(b, a, c);
}
dp(1);
printf("%d\n", f[1][m]);
return 0;
}