P3177 50 分求调
  • 板块学术版
  • 楼主Fishmaster
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/9/29 15:01
  • 上次更新2023/10/27 09:33:54
查看原帖
P3177 50 分求调
531258
Fishmaster楼主2022/9/29 15:01
#include <bits/stdc++.h>
#define ll long long
using namespace std;

struct edge {
	ll to, next, val;
} g[2005];
ll n, cnt, h[2005];
ll k, s[2005], dp[2005][2005];

void add(ll x, ll y, ll z) {
	g[++cnt].to = y;
	g[cnt].val = z;
	g[cnt].next = h[x];
	h[x] = cnt;
}

void dfs(ll x) {
	s[x] = 1;
	for (ll i = h[x]; i; i = g[i].next) {
		ll y = g[i].to;
		if (s[y])
			continue;
		dfs(y);
		ll z = g[i].val;
		for (ll a = s[x]; a >= 0; a--)
			for (ll b = s[y]; b >= 0; b--)
				dp[x][a + b] = max(dp[x][a + b], dp[x][a] + dp[y][b] + b * z * (k - b) + z * (n - k + b - s[y]) * (s[y] -
				                   b));
		s[x] += s[y];
	}
}

int main() {
	cin >> n >> k;
	for (ll i = 1; i < n; i++) {
		ll u, v, w;
		cin >> u >> v >> w;
		add(u, v, w);
		add(v, u, w);
	}
	dfs(1);
	cout << dp[1][k];
	return 0;
}
2022/9/29 15:01
加载中...