比赛 2024暑假C班集训D 评测结果 AAAAAWWWWW
题目名称 树上染色 最终得分 50
用户昵称 flyfree 运行时间 0.134 s
代码语言 C++ 内存使用 8.31 MiB
提交时间 2024-07-13 10:57:52
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 2010
#define MAXM 5010
ll dp[MAXN][MAXN],siz[MAXN],pro[MAXN][MAXN];
ll hd[MAXM],nxt[MAXM],ed[MAXM],val[MAXM];
ll n,m,k,idx;
void build(int x,int y,int z){
    nxt[++idx]=hd[x];
    hd[x]=idx;
    ed[idx]=y;
    val[idx]=z;
}
void dfs(int now,int fa){
//    siz[now]++;
    dp[now][0]=0,dp[now][1]=0;
    siz[now]++;
    for(int i=hd[now];i;i=nxt[i]){
        int y=ed[i];
        if(y!=fa){
            dfs(y,now);
            for(ll j=siz[now];j>=0;j--){
                for(int u=siz[y];u>=0;u--){
                    dp[now][j+u]=max(dp[now][j+u],dp[y][u]+dp[now][j]+val[i]*(k-u)*u+val[i]*(m-siz[y]+u)*(siz[y]-u));
                }
            }
            siz[now]+=siz[y];
        }
    }
//    dp[now][min(siz[now],k)]=dp[now][min(siz[now],k)-1];
}
int main(){
    freopen("haoi2015_t1.in","r",stdin);
    freopen("haoi2015_t1.out","w",stdout); 
    scanf("%d%d",&n,&k);
    m=n-k;
    for(int i=1;i<n;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        build(x,y,z);
        build(y,x,z);
    }      
    dfs(1,1);
    printf("%d",dp[1][k]);
    return 0;
}