记录编号 590953 评测结果 AAAAAAAAAA
题目名称 [HAOI 2015]树上染色 最终得分 100
用户昵称 Gravatar袁书杰 是否通过 通过
代码语言 C++ 运行时间 0.531 s
提交时间 2024-07-13 21:58:36 内存使用 34.10 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,k,etot,head[2005],w[2005],size[2005],dp[2005][2005];
struct Edge {
	long long u,v,w,nxt;
} e[4005];
void adde(long long u,long long v,long long w) {
	e[++etot] = (Edge) {u,v,w,head[u]},head[u] = etot;
}
void dfs(long long u,long long fa) {
	size[u]=1;
	dp[u][0]=dp[u][1]=0;
	for (long long i = head[u]; i; i = e[i].nxt) {
		long long v = e[i].v;
		if(v==fa) {
			continue;
		}
		dfs(v,u);
		size[u]+=size[v];
		for(long long j=min(k,size[u]); j>=0; j--) {
			if(dp[u][j]==-1e18) {
				for(long long k1=min(j,size[v]); k1>0; k1--) {
					if(dp[u][j-k1]!=-1e18) {
						long long tot=(k1*(k-k1)+(size[v]-k1)*(n-k-size[v]+k1))*e[i].w;
						dp[u][j]=max(dp[u][j],dp[v][k1]+dp[u][j-k1]+tot);
					}
				}
			} else {
				dp[u][j]+=(size[v]*e[i].w*(n-k-size[v])+dp[v][0]);
				for(long long k1=min(j,size[v]); k1>0; k1--) {
					if(dp[u][j-k1]!=-1e18) {
						long long tot=(k1*(k-k1)+(size[v]-k1)*(n-k-size[v]+k1))*e[i].w;
						dp[u][j]=max(dp[u][j],dp[v][k1]+dp[u][j-k1]+tot);
					}
				}
			}
		}
	}
}
int main() {
	freopen("haoi2015_t1.in","r",stdin);
	freopen("haoi2015_t1.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>k;
	if(n-k<k) {
		k=n-k;
	}
	for(long long i=1; i<=2000; i++) {
		for(long long j=1; j<=2000; j++) {
			dp[i][j]=-1e18;
		}
	}
	for(long long i=1; i<=n-1; i++) {
		long long u,v,w;
		cin>>u>>v>>w;
		adde(u,v,w);
		adde(v,u,w);
	}
	dfs(1,0);
	cout<<dp[1][k];
	return 0;
}