记录编号 |
590931 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HAOI 2015]树上染色 |
最终得分 |
100 |
用户昵称 |
flyfree |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.124 s |
提交时间 |
2024-07-13 14:29:58 |
内存使用 |
8.32 MiB |
显示代码纯文本
#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,long long 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;
long long z;
scanf("%d%d%lld",&x,&y,&z);
build(x,y,z);
build(y,x,z);
}
dfs(1,1);
printf("%lld",dp[1][k]);
return 0;
}