题解:

树形DP

思路,考虑每条边的贡献,即这条边两边的黑点数量相乘+白点数量相乘再成边长

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=2009;
typedef long long Lint; int n,m; int cntedge=0;
int head[maxn]={0};
int to[maxn<<1],nex[maxn<<1],dist[maxn<<1];
void Addedge(int x,int y,int z){
nex[++cntedge]=head[x];
to[cntedge]=y;
dist[cntedge]=z;
head[x]=cntedge;
} Lint f[maxn][maxn];
Lint g[maxn];
int siz[maxn];
void Dp(int x,int fa){ for(int i=head[x];i;i=nex[i]){
int v=to[i];
if(to[i]==fa)continue;
Dp(v,x);
memset(g,0,sizeof(g));
for(int j=0;j<=siz[x];++j){
for(int k=0;k<=siz[v];++k){
Lint tm=max(f[v][k],k?f[v][k-1]:0)+f[x][j]+1LL*k*(m-k)*dist[i]+1LL*(siz[v]-k)*(n-m-siz[v]+k)*dist[i];
g[j+k]=max(g[j+k],tm);
}
}
siz[x]+=siz[v];
for(int j=0;j<=siz[x];++j)f[x][j]=g[j];
}
++siz[x];
} int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n-1;++i){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
Addedge(x,y,z);
Addedge(y,x,z);
} Dp(1,0);
cout<<max(f[1][m],f[1][m-1]);
cout<<endl;
return 0;
}

  

最新文章

  1. libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname)
  2. 关于DISTINCE的用法
  3. HDU 4627 The Unsolvable Problem 2013 Multi-University Training Contest 3
  4. nginx配置多个网址
  5. Tomcat &amp; Nginx
  6. php中浮点数计算问题
  7. WEB 开发所用的网站
  8. ASP.NET Core MVC 源码学习:MVC 启动流程详解
  9. Java可重入锁如何避免死锁
  10. ASP.NET Core 下的依赖注入(一)
  11. ubuntu中环境变量的几个问题思考
  12. Python学习基础笔记(全)
  13. company_credit
  14. Spring入门详细教程(三)
  15. HTTP协议 - 使用php模拟get/post请求
  16. 音乐app各部分笔记(二)
  17. 解析eBay BASE模式、去哪儿及蘑菇街分布式架构
  18. IE内核浏览器的404页面问题和IE自动缓存引发的问题
  19. python文件派生
  20. Java 8新特性之 并行和并行数组(八恶人-8)

热门文章

  1. 机器阅读理解(看各类QA模型与花式Attention)(转载)
  2. 我用Python帮朋友做了张猪肉数据分析图,结果。。。
  3. 036、Java中三目运算符的使用
  4. 008、MySQL日期时间格式化输出
  5. windows中的运行命令
  6. doc转docx
  7. Azure Container Registry-基于开源 Docker Registry 的专用 Docker 注册表服务
  8. (转) Spring 3 报org.aopalliance.intercept.MethodInterceptor问题解决方法
  9. Kylin笔记
  10. Open_CV 色彩空间