1575 二叉苹果树
// 1575:【例 1】二叉苹果树.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
http://ybt.ssoier.cn:8088/problem_show.php?pid=1575
https://loj.ac/p/10153
有一棵二叉苹果树,如果数字有分叉,一定是分两叉,即没有只有一个儿子的节点。
这棵树共 N 个节点,标号 1 至 N,树根编号一定为 1。
我们用一根树枝两端连接的节点编号描述一根树枝的位置。一棵有四根树枝的苹果树,因为树枝太多了,需要剪枝。
但是一些树枝上长有苹果,给定需要保留的树枝数量,求最多能留住多少苹果。
【输入】
第一行两个数 N 和 Q
,N表示树的节点数,Q表示要保留的树枝数量。
接下来 N−1行描述树枝信息,每行三个整数,前两个是它连接的节点的编号,第三个数是这根树枝上苹果数量。
【输出】
输出仅一行,表示最多能留住的苹果的数量。
【输入样例】
5 2
1 3 1
1 4 10
2 3 20
3 5 20
【输出样例】
21
5 3
1 2 0
1 5 1
5 3 100
5 4 1
数据范围与提示
对于 100\% 的数据,1<= Q <= N <= 100, N!= 1,每根树枝上苹果不超过 30000 个。
*/
#include <iostream>
#include <cstring>
using namespace std;
const int N = 105;
int h[N], e[2 * N], ne[2 * N], w[2 * N];
int idx;
int q, n;
int dp[N][2*N];
//void add(int a, int b, int c) {
// e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
//}
void add(int a, int b, int c) {
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
void dfs(int curr, int prev) {
int a = -1; int b = -1;
int an = 0; int bn = 0;
for (int i = h[curr]; i != -1; i = ne[i]) {
int j = e[i]; int c = w[i];
if (j == prev) continue;
if (a == -1) { a = j; an = c; }
else { b = j; bn = c; }
dfs(j, curr);
}
//计算 只有a
if (a != -1) {
for (int i = 1; i < n; i++) {
dp[curr][i] = max(dp[curr][i], dp[a][i - 1] + an);
}
}
if (b != -1) {
for (int i = 1; i < n; i++) {
dp[curr][i] = max(dp[curr][i], dp[b][i - 1] + bn);
}
}
if (a != -1 && b != -1) {
for (int len = 2; len < n; len++) {
for (int i = 0; i <= len-2; i++) {
int j = len -2- i;
dp[curr][len] = max(dp[curr][len], dp[a][i]+dp[b][j] + an + bn);
dp[curr][len] = max(dp[curr][len], dp[a][j]+ dp[b][i] + an + bn);
}
}
}
}
int main() {
memset(h, -1, sizeof h);
cin >> n >> q;
for (int i = 1; i < n; i++) {
int a, b, c; cin >> a >> b >> c;
add(a, b, c); add(b, a, c);
}
dfs(1, -1);
int ans = 0;
for (int i = 0; i <= q; i++) {
ans = max(ans, dp[1][i]);
}
cout << ans << endl;
return 0;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
![阿里打赏](https://files.cnblogs.com/files/itdef/ali2.bmp)
![微信打赏](https://files.cnblogs.com/files/itdef/weixin2.bmp)