记录编号 568308 评测结果 AAAAAAAAAA
题目名称 [HAOI 2015]树上染色 最终得分 100
用户昵称 GravatarZRQ 是否通过 通过
代码语言 C++ 运行时间 0.783 s
提交时间 2021-12-23 20:41:51 内存使用 36.47 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
int n,m,head[2005],e[4005],nxt[4005],w[4005],cnt,siz[2005];
ll f[2005][2005];
char ch;
inline void read(int &x){x=0;ch=getchar();while(ch<48||ch>57)ch=getchar();while(ch>47&&ch<58)x=(x<<3)+(x<<1)+(ch^48),ch=getchar();}
inline void add(int x,int y,int z){nxt[++cnt]=head[x],head[x]=cnt,e[cnt]=y,w[cnt]=z;}
void DFS(int nw,int fa)
{
	siz[nw]=1; f[nw][0]=f[nw][1]=0;
	for(int i=head[nw];i;i=nxt[i])
	{
		if(e[i]==fa) continue;//防止重复 
		DFS(e[i],nw); siz[nw]+=siz[e[i]];
		for(int j=min(siz[nw],m);j>=0;--j)//最多染色j个点 
		{
			if(f[nw][j]!=-1) f[nw][j]+=f[e[i]][0]+(ll)siz[e[i]]*(n-m-siz[e[i]])*w[i];
			for(int k=min(j,siz[e[i]]);k;--k) if(f[nw][j-k]!=-1)  f[nw][j]=max(f[nw][j],f[nw][j-k]+f[e[i]][k]+(ll)(k*(m-k)+(siz[e[i]]-k)*(n-m-siz[e[i]]+k))*w[i]);
		}
	}
}
int main()
{
	freopen("haoi2015_t1.in","r",stdin);
	freopen("haoi2015_t1.out","w",stdout);
	int x,y,z;
	read(n),read(m); if(n-m<m) m=n-m; 
	for(int i=1;i<n;++i) read(x),read(y),read(z),add(x,y,z),add(y,x,z);
	memset(f,-1,sizeof(f));
	DFS(1,-1);
	printf("%lld\n",f[1][m]);
	return 0;
}