E73 樹形DP P3177 [HAOI2015] 樹上染色

董晓發表於2024-10-28

影片連結:E73 樹形DP P3177 [HAOI2015] 樹上染色_嗶哩嗶哩_bilibili

P3177 [HAOI2015] 樹上染色 - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

// 樹形DP O(n^2)
#include <iostream>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;

const int N=2005;
int idx,head[N];
struct E{int v,ne;LL w;}e[N<<1];
void add(int u,int v,int w){
  e[++idx]={v,head[u],w};head[u]=idx;
}
int n,m,siz[N];
LL f[N][N],t;

void dfs(int u,int fa){
  siz[u]=1;
  for(int i=head[u];i;i=e[i].ne){
    int v=e[i].v; LL w=e[i].w;
    if(v==fa) continue;
    dfs(v,u);
    for(int j=min(siz[u],m);j>=0;--j)
      for(int k=min(siz[v],m);k>=0;--k)
      if(j+k<=m){
        t=k*(m-k)*w+(siz[v]-k)*(n-siz[v]-m+k)*w;
        f[u][j+k]=max(f[u][j+k],f[u][j]+f[v][k]+t);
      }
    siz[u]+=siz[v];
  }
}
int main(){
  scanf("%d%d",&n,&m);
  for(int i=1,u,v,w;i<n;++i){
    scanf("%d%d%d",&u,&v,&w);
    add(u,v,w), add(v,u,w);
  }
  dfs(1,0);
  printf("%lld\n",f[1][m]);
}

相關文章