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;
}

posted on   itdef  阅读(25)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2021-07-10 Leetcode 123. 买卖股票的最佳时机 III dp

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示