dp 20 pts 求调
查看原帖
dp 20 pts 求调
688783
SilverLi楼主2023/9/10 11:18
#include <iostream>
#include <cstring>
#include <vector>
#define int long long
using namespace std;
constexpr int N = 2e3 + 5;
int f[N][N];
int n, k, si[N];
vector<int> g[N], W[N];
void init(int u, int fa) {
	si[u] = 1;
	for (int l = 0; l < g[u].size(); ++l) {
		int i = g[u][l];
		if (i != fa) {
			init(i, u);
			si[u] += si[i];
		}
	}
}
void dfs(int u, int fa) {
	f[u][0] = 0, f[u][1] = 0;
	for (int l = 0; l < g[u].size(); ++l) {
		int v = g[u][l], w = W[u][l];
		if (v != fa) {
			dfs(v, u);
			for (int i = min(si[u], k); i >= 0; --i)
				for (int j = 0; j <= i; ++j)
					if (f[u][i - j] != 0x3f3f3f3f)
						f[u][i] = max(f[u][i], f[u][i - j] + f[v][j] +
							j * (k - j) * w + (si[v] - j) * ((n - k) - (si[v] - j)) * w);
		}
	}
}
signed main() {
	cin >> n >> k;
	for (int i = 1; i < n; ++i) {
		int u, v, w;
		cin >> u >> v >> w;
		g[u].push_back(v);
		W[u].push_back(w);
		g[v].push_back(u);
		W[v].push_back(w);
	}
	memset(f, 0x3f, sizeof(f));
	init(1, 0);
	dfs(1, 0);
	cout << f[1][k];
	return 0;
}
2023/9/10 11:18
加载中...