[HAOI 2015]树上染色
Description
给出一棵 \(n\) 个节点的树,边有权值。让你将树上 \(k\) 个点染黑,剩余 \(n-k\) 个点染白。染色后记一种染色方案的价值为黑点间两两距离和以及白点间两两距离和。求最大价值。
\(0\leq k\leq n\leq 2000\)
Solution
定义状态 \(f_{u,i}\) 表示以 \(u\) 为根的子树中选出了 \(i\) 个黑点的子树中最大价值。
转移的话就是考虑当前节点和枚举的儿子间的边被计算了几次。
树上背包复杂为 \(O(n^2)\) 。
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2000+5;
int n, k, u, v, size[N]; ll f[N][N], c;
struct tt {int to, next; ll cost; }edge[N<<1];
int path[N], top;
void add(int u, int v, ll cost) {edge[++top] = (tt){v, path[u], cost}; path[u] = top; }
void dfs(int u, int fa) {
size[u] = 1; ll c = 0;
for (int i = path[u], v; i; i = edge[i].next) {
if ((v = edge[i].to) == fa) continue;
dfs(v, u); c = edge[i].cost;
for (int j = min(size[u], k); j >= 0; j--)
for (int p = min(k-j, size[v]); p >= 0; p--)
f[u][j+p] = max(f[u][j+p], f[u][j]+f[v][p]+1ll*p*(k-p)*c+1ll*(n-k-size[v]+p)*(size[v]-p)*c);
size[u] += size[v];
}
}
void work() {
scanf("%d%d", &n, &k);
for (int i = 1; i < n; i++) {
scanf("%d%d%lld", &u, &v, &c); add(u, v, c), add(v, u, c);
}
dfs(1, 0);
printf("%lld\n", f[1][k]);
}
int main() {work(); return 0; }
[HAOI 2015]树上染色的更多相关文章
- cogs 1963. [HAOI 2015] 树上操作 树链剖分+线段树
1963. [HAOI 2015] 树上操作 ★★★☆ 输入文件:haoi2015_t2.in 输出文件:haoi2015_t2.out 简单对比时间限制:1 s 内存限制:256 M ...
- [bzoj 4034][HAOI 2015]树上操作
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...
- 洛谷P3178[HAOI]2015 树上操作
题目 树剖裸题,这个题更可以深刻的理解树剖中把树上的节点转换为区间的思想. 要注意在区间上连续的节点,一定是在一棵子树中. #include <bits/stdc++.h> #define ...
- bzoj4033(树上染色)
树上染色 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加上白点两两 ...
- bzoj 4033: [HAOI2015]树上染色 [树形DP]
4033: [HAOI2015]树上染色 我写的可是\(O(n^2)\)的树形背包! 注意j倒着枚举,而k要正着枚举,因为k可能从0开始,会使用自己更新一次 #include <iostream ...
- 洛谷 P3177 树上染色 解题报告
P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...
- BZOJ4033: [HAOI2015]树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3461 Solved: 1473[Submit][Stat ...
- 【BZOJ】4033: [HAOI2015]树上染色 树上背包
[题目]#2124. 「HAOI2015」树上染色 [题意]给定n个点的带边权树,要求将k个点染成黑色,使得 [ 黑点的两两距离和+白点的两两距离和 ] 最大.n<=2000. [算法]树上背包 ...
- BZOJ4033 HAOI2015 树上染色 【树上背包】
BZOJ4033 HAOI2015 树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白 ...
随机推荐
- NLayerAppV3--.net Core2实现的DDD分层架构
虽然每天的工作都是CURD.还是使用着传统的三层架构.使用着.net Framework,但是这并不能影响我学习DDD和.net core. 总是希望软件在应对复杂多变的场景时能够游刃有余,在解决问题 ...
- 服务端JSON内容中有富文本时
问题背景 由于数据中存在复杂的富文本,包含各种引号和特殊字符,导致后端和前端通过JSON格式进行数据交互引发前端JSON解析出错. 解决方案 后端将富文本内容 ConvertToBase64Strin ...
- 阿里云ECS服务器windows环境下配置redis
一.下载解压redis github下载地址:https://github.com/MSOpenTech/redis/tags 下载的是Redis-x64-3.2.100版本,Redis-x64-3. ...
- 关于linq的几个小例子
private void button1_Click(object sender, EventArgs e) { ] { ,,,,,,}; var result0 = from num in numb ...
- 深入学习c++--左值引用和右值引用
#include <iostream> #include <string> #include <vector> using namespace std; int m ...
- 双向链表的实现——java
实现类: /** * Java 实现的双向链表. * 注:java自带的集合包中有实现双向链表,路径是:java.util.LinkedList * * @author skywang * @date ...
- jQuery Validation Plugin
使用方式很简单,简单测试代码如下: <html> <head> <script type="text/javascript" src="./ ...
- [JavaScript] 根据字符串宽度截取字符串
/** * 根据字符串宽度截取字符串 * @param desc 原始字符串 * @param width 该显示的宽度 * @param fontsize 字体大小 12px * @returns ...
- iOS-构建自己的代码块【提高编码效率-Xcode代码块】
前言 2018年3月1日 农历正月十四 星期四 不知怎么地,一大早上班就想写博客: Xcode代码块 开发中,都不想写过多代码,然后就会用这种方法,去简化代码,包括MVVM框架,它也体现出来了去简化C ...
- docker微服务部署之:七、Rancher进行微服务扩容和缩容
docker微服务部署之:六.Rancher管理部署微服务 Rancher有两个特色用起来很方便,那就是扩容和缩容. 一.扩容前的准备工作 为了能直观的查看效果,需要修改下demo_article项目 ...