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 2024-07-10 11:42  itdef  阅读(13)  评论(0编辑  收藏  举报

导航