记录编号 |
590953 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HAOI 2015]树上染色 |
最终得分 |
100 |
用户昵称 |
袁书杰 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.531 s |
提交时间 |
2024-07-13 21:58:36 |
内存使用 |
34.10 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,k,etot,head[2005],w[2005],size[2005],dp[2005][2005];
struct Edge {
long long u,v,w,nxt;
} e[4005];
void adde(long long u,long long v,long long w) {
e[++etot] = (Edge) {u,v,w,head[u]},head[u] = etot;
}
void dfs(long long u,long long fa) {
size[u]=1;
dp[u][0]=dp[u][1]=0;
for (long long i = head[u]; i; i = e[i].nxt) {
long long v = e[i].v;
if(v==fa) {
continue;
}
dfs(v,u);
size[u]+=size[v];
for(long long j=min(k,size[u]); j>=0; j--) {
if(dp[u][j]==-1e18) {
for(long long k1=min(j,size[v]); k1>0; k1--) {
if(dp[u][j-k1]!=-1e18) {
long long tot=(k1*(k-k1)+(size[v]-k1)*(n-k-size[v]+k1))*e[i].w;
dp[u][j]=max(dp[u][j],dp[v][k1]+dp[u][j-k1]+tot);
}
}
} else {
dp[u][j]+=(size[v]*e[i].w*(n-k-size[v])+dp[v][0]);
for(long long k1=min(j,size[v]); k1>0; k1--) {
if(dp[u][j-k1]!=-1e18) {
long long tot=(k1*(k-k1)+(size[v]-k1)*(n-k-size[v]+k1))*e[i].w;
dp[u][j]=max(dp[u][j],dp[v][k1]+dp[u][j-k1]+tot);
}
}
}
}
}
}
int main() {
freopen("haoi2015_t1.in","r",stdin);
freopen("haoi2015_t1.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>k;
if(n-k<k) {
k=n-k;
}
for(long long i=1; i<=2000; i++) {
for(long long j=1; j<=2000; j++) {
dp[i][j]=-1e18;
}
}
for(long long i=1; i<=n-1; i++) {
long long u,v,w;
cin>>u>>v>>w;
adde(u,v,w);
adde(v,u,w);
}
dfs(1,0);
cout<<dp[1][k];
return 0;
}