记录编号 160715 评测结果 AAAAAAAAAA
题目名称 [HAOI 2015]树上染色 最终得分 100
用户昵称 GravatarChenyao2333 是否通过 通过
代码语言 C++ 运行时间 0.149 s
提交时间 2015-04-29 10:47:46 内存使用 31.18 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int L_N=2000+10;
int N,K;
vector<PII> G[L_N];
LL f[L_N][L_N];
int size[L_N];

LL calc_val(int k,int tk){
	return 1ll*k*(tk-k);
}

LL tf[L_N];
void dp(int u,int fa){
	size[u]=1;
	f[u][0]=f[u][1]=0;
	
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i].first,c=G[u][i].second; if(v==fa) continue;
		dp(v,u);
		
		for(int vk=0;vk<=size[v];vk++){
			for(int uk=0;uk<=size[u] && uk+vk<=K;uk++){
				LL tmp=(calc_val(vk,K)+calc_val(size[v]-vk,N-K))*c+f[v][vk];
				tf[vk+uk]=max(tf[vk+uk],f[u][uk]+tmp);
			}
		}
		
		for(int k=0;k<=K;k++){
			f[u][k]=tf[k];
			tf[k]=0;
		}
		
		size[u]+=size[v];
	}
	
	//for(int i=0;i<=K;i++){
	//	printf("f[%d][%d]=%d\n",u,i,f[u][i]);
	//}
}
int main(){
	freopen("haoi2015_t1.in","r",stdin);
	freopen("haoi2015_t1.out","w",stdout);
	scanf("%d %d",&N,&K);
	if(K>(N/2)) K=N-K;
	for(int i=1;i<N;i++){
		int u,v,c; scanf("%d %d %d",&u,&v,&c);
		G[u].push_back(PII(v,c));
		G[v].push_back(PII(u,c));
	}
	dp(1,0);
	printf("%lld\n",f[1][K]);
	return 0;
}