树形背包
cpp
void dfs(int u,int fa){
siz[u]=1;
f[u][0]=f[u][1]=0;
if(adj[u].size()==1&&u!=1)return;
for(auto [v,w]:adj[u]){
if(v==fa)continue;
dfs(v,u);
for(int j=min(m,siz[u]);j>=0;j--){
for(int k=min(m-j,siz[v]);k>=0;k--){
int val=w*((m-k)*k+(siz[v]-k)*(n-m-siz[v]+k));
f[u][j+k]=max(f[u][j+k],f[u][j]+f[v][k]+val);
}
}
siz[u]+=siz[v];
}
}