记录编号 590953 评测结果 AAAAAAAAAA
题目名称 [HAOI 2015]树上染色 最终得分 100
用户昵称 Gravatar袁书杰 是否通过 通过
代码语言 C++ 运行时间 0.531 s
提交时间 2024-07-13 21:58:36 内存使用 34.10 MiB
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. long long n,k,etot,head[2005],w[2005],size[2005],dp[2005][2005];
  4. struct Edge {
  5. long long u,v,w,nxt;
  6. } e[4005];
  7. void adde(long long u,long long v,long long w) {
  8. e[++etot] = (Edge) {u,v,w,head[u]},head[u] = etot;
  9. }
  10. void dfs(long long u,long long fa) {
  11. size[u]=1;
  12. dp[u][0]=dp[u][1]=0;
  13. for (long long i = head[u]; i; i = e[i].nxt) {
  14. long long v = e[i].v;
  15. if(v==fa) {
  16. continue;
  17. }
  18. dfs(v,u);
  19. size[u]+=size[v];
  20. for(long long j=min(k,size[u]); j>=0; j--) {
  21. if(dp[u][j]==-1e18) {
  22. for(long long k1=min(j,size[v]); k1>0; k1--) {
  23. if(dp[u][j-k1]!=-1e18) {
  24. long long tot=(k1*(k-k1)+(size[v]-k1)*(n-k-size[v]+k1))*e[i].w;
  25. dp[u][j]=max(dp[u][j],dp[v][k1]+dp[u][j-k1]+tot);
  26. }
  27. }
  28. } else {
  29. dp[u][j]+=(size[v]*e[i].w*(n-k-size[v])+dp[v][0]);
  30. for(long long k1=min(j,size[v]); k1>0; k1--) {
  31. if(dp[u][j-k1]!=-1e18) {
  32. long long tot=(k1*(k-k1)+(size[v]-k1)*(n-k-size[v]+k1))*e[i].w;
  33. dp[u][j]=max(dp[u][j],dp[v][k1]+dp[u][j-k1]+tot);
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }
  40. int main() {
  41. freopen("haoi2015_t1.in","r",stdin);
  42. freopen("haoi2015_t1.out","w",stdout);
  43. ios::sync_with_stdio(false);
  44. cin.tie(0),cout.tie(0);
  45. cin>>n>>k;
  46. if(n-k<k) {
  47. k=n-k;
  48. }
  49. for(long long i=1; i<=2000; i++) {
  50. for(long long j=1; j<=2000; j++) {
  51. dp[i][j]=-1e18;
  52. }
  53. }
  54. for(long long i=1; i<=n-1; i++) {
  55. long long u,v,w;
  56. cin>>u>>v>>w;
  57. adde(u,v,w);
  58. adde(v,u,w);
  59. }
  60. dfs(1,0);
  61. cout<<dp[1][k];
  62. return 0;
  63. }