dp[i][j]表示以i点为根的子树中选j个黑点,所能达到的最大价值。
#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 2005
#define LL long long
using namespace std;
struct E{
int to,nxt,d;
}b[maxn<<1];
int fst[maxn],tot;
void insert(int f,int t,int d)
{
b[++tot]=(E){t,fst[f],d};fst[f]=tot;
b[++tot]=(E){f,fst[t],d};fst[t]=tot;
}
LL dp[maxn][maxn];
LL tmp[maxn];
int sz[maxn];
int n,m;
void dfs(int x,int f)
{
sz[x]=1;
for(int i=fst[x];i;i=b[i].nxt)
{
int v=b[i].to;
if(v!=f)
{
dfs(v,x);
memset(tmp,0,sizeof(tmp));
for(int j=0;j<=sz[x];j++)
for(int k=0;k<=sz[v];k++)
{
if(j+k>m) continue;
tmp[j+k]=max(tmp[j+k],dp[x][j]+dp[v][k]+(LL)b[i].d*(k*(m-k)+(sz[v]-k)*(n-m-sz[v]+k)));
}
sz[x]+=sz[v];
for(int j=0;j<=sz[x];j++)
dp[x][j]=tmp[j];
}
}
}
int main()
{
scanf("%d%d",&n,&m);
int u,v,d;
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&u,&v,&d);
insert(u,v,d);
}
dfs(1,0);
printf("%lld",dp[1][m]);
return 0;
}