题目描述

有一棵点数为 N 的树,树边有边权。给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 。 将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间的距离的和的受益。问受益最大值是多少。

输入输出格式

输入格式:

第一行包含两个整数 N, K 。接下来 N-1 行每行三个正整数 fr, to, dis , 表示该树中存在一条长度为 dis 的边 (fr, to) 。输入保证所有点之间是联通的。

输出格式:

输出一个正整数,表示收益的最大值。

思路

设 \(f_{i,j}\) 为以 \(i\) 为根的子树选 \(j\) 个点染成黑色的贡献。考虑一条边的贡献,它被一条路径经过就会产生贡献,经过这个点的路径的数量显然是左边黑色节点个数和右边黑色节点个数的积。就可以得出一个节点 \(u\) 被 \((j-m) \times j + (size_u-j) \times (n-m-size_u+j)\),其中 \(j\) 为已经选了的黑色节点个数,\(size\) 为子树大小。直接转移就行了

/************************************************
*Author : lrj124
*Created Time : 2019.03.18.20:14
*Mail : 1584634848@qq.com
*Problem : luogu3177
************************************************/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2000 + 10;
struct Edge {
int to,val;
Edge(int v,int w) : to(v),val(w) {}
};
vector<Edge> edge[maxn];
long long f[maxn][maxn];
int n,K,size[maxn];
inline void dp(int now,int fa) {
size[now] = 1;
f[now][0] = f[now][1] = 0;
for (size_t i = 0;i < edge[now].size();i++)
if (edge[now][i].to ^ fa) {
dp(edge[now][i].to,now);
size[now] += size[edge[now][i].to];
}
for (size_t i = 0;i < edge[now].size();i++) if (edge[now][i].to ^ fa)
for (int j = min(K,size[now]);j >= 0;j--)
for (int k = 0;k <= min(j,size[edge[now][i].to]);k++)
if (f[now][j-k] >= 0) f[now][j] = max(f[now][j],f[now][j-k]+f[edge[now][i].to][k]+1ll*k*(K-k)*edge[now][i].val+1ll*(size[edge[now][i].to]-k)*(n-size[edge[now][i].to]-K+k)*edge[now][i].val);
}
int main() {
scanf("%d%d",&n,&K);
memset(f,128,sizeof(f));
for (int i = 1,u,v,w;i < n;i++) {
scanf("%d%d%d",&u,&v,&w);
edge[u].push_back(Edge(v,w));
edge[v].push_back(Edge(u,w));
}
dp(1,0);
printf("%lld",f[1][K]);
return 0;
}

【HAOI2015】树上染色 - 树形 DP的更多相关文章

  1. 洛谷 P3177 [HAOI2015]树上染色 树形DP

    洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...

  2. bzoj 4033: [HAOI2015]树上染色 [树形DP]

    4033: [HAOI2015]树上染色 我写的可是\(O(n^2)\)的树形背包! 注意j倒着枚举,而k要正着枚举,因为k可能从0开始,会使用自己更新一次 #include <iostream ...

  3. 【BZOJ4033】[HAOI2015]树上染色 树形DP

    [BZOJ4033][HAOI2015]树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染 ...

  4. [BZOJ4033][HAOI2015]树上染色(树形DP)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2437  Solved: 1034[Submit][Stat ...

  5. bzoj4033 [HAOI2015]树上染色——树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4033 树形DP,状态中加入 x 与父亲之间的边的贡献: 边权竟然是long long... ...

  6. BZOJ 4033 [HAOI2015]树上染色 ——树形DP

    可以去UOJ看出题人的题解. 这样的合并,每一个点对只在lca处被考虑到,复杂度$O(n^2)$ #include <map> #include <ctime> #includ ...

  7. 【HAOI2015】树上染色—树形dp

    [HAOI2015]树上染色 [题目描述]有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色.将所有点染色后,你会获得 ...

  8. 【BZOJ4033】【HAOI2015】树上染色 树形DP

    题目描述 给你一棵\(n\)个点的树,你要把其中\(k\)个点染成黑色,剩下\(n-k\)个点染成白色.要求黑点两两之间的距离加上白点两两之间距离的和最大.问你最大的和是多少. \(n\leq 200 ...

  9. BZOJ_4033_[HAOI2015]树上染色_树形DP

    BZOJ_4033_[HAOI2015]树上染色_树形DP Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的 ...

随机推荐

  1. 程序员肺被切掉一块还得去加班... 再谈“工作996,生病ICU”

    如题,为什么要说再谈“工作996,生病ICU”,因为996问题早已不是一个新问题,在我最近刚出版的新书<SOD框架“企业级”应用数据架构实战>写作期间,爆发了一次程序员“起义”,出现了一个 ...

  2. 转载 npm 安装vue出现的问题

    npm  安装 vue或者express  出现 npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATUREnpm ERR! errno UNABLE_TO_VERIF ...

  3. vue手脚架中使用jq

    下载jq npm install jquery; 找到build文件夹下的webpack.base.config.js 先在开始的地方引入webpack const webpack = require ...

  4. HTTP的实体数据

      数据类型表示实体数据的内容是什么,使用的是MIME    type,相关的头字段是Accept和Content-Type:  text:即文本格式的可读数据,我们最熟悉的应该就是text/html ...

  5. 前端学习(十六):JavaScript运算

    进击のpython ***** 前端学习--JavaScript运算 在这一节之前,应该做到的是对上一节的数据类型的相关方法都敲一遍,加深印象 这部分的知识的特点就是碎而且杂,所以一定要多练~练习起来 ...

  6. shell 十三问

    经典的Shell十三问 摘选整理自:http://bbs.chinaunix.net/thread-218853-1-1.htmlhttps://github.com/wzb56/13_questio ...

  7. goroutine调度源码阅读笔记

    以下为本人阅读goroutine调度源码随手记的笔记,现在还是一个个知识点的形式,暂时还没整理,先发到这里,一点点更新:   1). runq [256]guintptr P 的runable队列最大 ...

  8. Radiobutton基础语法

    .Radiobutton(root 主窗口,text 文本内容,value 值(可以通过set 和 get 获取到的值),variable 变量修改原来的StringVar) self.radio_m ...

  9. Spring异常总结

    1.  Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean o ...

  10. 笨办法学python3练习代码11-12:print()

    ex11.py print("How old are you? ",end = " ") #加入end = " ",则函数不再自动换行 ag ...