BZOJ 4033: [HAOI2015]树上染色

树形DP

复杂度为树上链的个数

即O(n^2) 

#include<cstdio>
#include<algorithm>
using namespace std;
int cnt,n,k,last[2005],sz[2005];
long long F[2005][2005];
struct node{
	int to,next,val;
}e[4005];
void add(int a,int b,int c){
	e[++cnt].to=b;
	e[cnt].val=c;
	e[cnt].next=last[a];
	last[a]=cnt;
}
void dfs(int x,int fa,int val){
	sz[x]=1;
	for (int i=last[x]; i; i=e[i].next){
		int V=e[i].to;
		if (V==fa) continue;
		dfs(V,x,e[i].val);
		for (int a=min(k,sz[x]); a>=0; a--)
			for (int b=min(k,sz[V]); b>=0; b--)
				F[x][a+b]=max(F[x][a+b],F[x][a]+F[V][b]);
		sz[x]+=sz[V];
	}
	for (int i=0; i<=min(k,sz[x]); i++) F[x][i]+=1ll*val*(i*(k-i)+(sz[x]-i)*(n-k-(sz[x]-i)));
}
int main(){
	scanf("%d%d",&n,&k);
	for (int i=1; i<n; i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	dfs(1,0,0);
	printf("%lld\n",F[1][k]);
	return 0;
}

  

posted @ 2018-11-04 13:06  ~Silent  阅读(148)  评论(0编辑  收藏  举报
Live2D