题目链接

题目描述

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

题解

有点难想的dp 我果然太菜了

%%%__stdcall

\(f[i][j]\) 为以\(i\)为根的子树, 选了染了\(j\)个黑点的最大贡献

然后就是树形背包。。

siz[u]为以u为根的子树大小


for (int j = Min(K, siz[u]); j >= 0; j--)
for (int k = 0; k <= Min(j, siz[v]); k++)
if (f[u][j-k] >= 0) {
long long val = 1ll*k*(K-k)*g[i].w + 1ll*(siz[v]-k)*(n-K+k-siz[v])*g[i].w;
f[u][j] = Max(f[u][j], f[u][j-k] + f[v][k] + val);
}

贡献为子树贡献加上该边的贡献(子树黑点个数 * 其它黑点个数 * 边权 + 子树白点个数 * 其它白点个数 * 边权 )

Code


#include<bits/stdc++.h>
#define LL long long
#define RG register
using namespace std; inline int gi() {
int f = 1, s = 0;
char c = getchar();
while (c != '-' && (c < '0' || c > '9')) c = getchar();
if (c == '-') f = -1, c = getchar();
while (c >= '0' && c <= '9') s = s*10+c-'0', c = getchar();
return f == 1 ? s : -s;
} const int N = 2010; struct node {
int to, next, w;
}g[N<<1];
int last[N], gl;
inline void add(int z, int x, int y) {
g[++gl] = (node) {y, last[x], z};
last[x] = gl;
g[++gl] = (node) {x, last[y], z};
last[y] = gl;
return ;
} int siz[N], n, K;
long long f[N][N]; inline void init(int u, int fa) {
siz[u] = 1;
for (int i = last[u]; i; i = g[i].next) {
int v = g[i].to;
if (v == fa) continue;
init(v, u);
siz[u] += siz[v];
}
return ;
}
#define Min(x, y) ((x<y)?x:y)
#define Max(x, y) ((x>y)?x:y)
inline void dfs(int u, int fa) {
memset(f[u], 128, sizeof(f[u]));
f[u][0] = f[u][1] = 0;
for (int i = last[u]; i; i = g[i].next) {
int v = g[i].to;
if (v == fa) continue;
dfs(v, u);
for (int j = Min(K, siz[u]); j >= 0; j--)
for (int k = 0; k <= Min(j, siz[v]); k++)
if (f[u][j-k] >= 0) {
long long val = 1ll*k*(K-k)*g[i].w + 1ll*(siz[v]-k)*(n-K+k-siz[v])*g[i].w;
f[u][j] = Max(f[u][j], f[u][j-k] + f[v][k] + val);
}
}
return ;
} int main() {
n = gi(), K = gi();
for (int i = 1; i < n; i++)
add(gi(), gi(), gi());
init(1, 0);
dfs(1, 0);
printf("%lld\n", f[1][K]);
return 0;
}

洛谷 P3177 [HAOI2015]树上染色的更多相关文章

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

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

  2. 洛谷P3177 [HAOI2015]树上染色(树形dp)

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

  3. 洛谷P3177 [HAOI2015]树上染色(树上背包)

    题意 题目链接 Sol 比较套路吧,设\(f[i][j]\)表示以\(i\)为根的子树中选了\(j\)个黑点对答案的贡献 然后考虑每条边的贡献,边的两边的答案都是可以算出来的 转移的时候背包一下. # ...

  4. BZOJ4033或洛谷3177 [HAOI2015]树上染色

    BZOJ原题链接 洛谷原题链接 很明显的树形\(DP\). 因为记录每个点的贡献很难,所以我们可以统计每条边的贡献. 对于每一条边,设边一侧的黑点有\(B_x\)个,白点有\(W_x\),另一侧黑点有 ...

  5. 洛谷 3177 [HAOI2015] 树上染色

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

  6. 洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)

    P3178 [HAOI2015]树上操作 题目链接:https://www.luogu.org/problemnew/show/P3178 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边 ...

  7. 【洛谷】P3177 [HAOI2015]树上染色

    懒得复制题面了直接传送门吧 分析 直接求点与点之间的距离感觉不是很好求,所以我们考虑换一个求法. 瞄了一眼题解 距离跟路径上边的长度有关,所以我们直接来看每一条边的贡献吧(这谁想得到啊) 对于每一条边 ...

  8. Luogu P3177 [HAOI2015]树上染色

    一道有机结合了计数和贪心这一DP两大考点的神仙题,不得不说做法是很玄妙. 首先我们很容易想到DP,设\(f_{i,j}\)表示在以\(i\)为根节点的子树中选\(j\)个黑色节点的最大收益值. 然后我 ...

  9. P3177 [HAOI2015]树上染色

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

随机推荐

  1. 线程dump

    当应用程序运行变慢或者发生故障时,可能通过分析java的Thread Dumps得到分析他们得到阻塞和存在瓶颈的线程. 线程堆栈是虚拟机中线程(包括锁)状态的一个瞬间状态的快照,即系统在某一个时刻所有 ...

  2. 19、SOAP安装,运用与比对结果解释

    转载:http://www.dengfeilong.com/post/Soap2.html https://blog.csdn.net/zhu_si_tao/article/details/71108 ...

  3. django: rest-framework的 分页和过滤

    django: rest-framework的 分页和过滤 2018年06月28日 10:09:01 weixin_42359464 阅读数:136 标签: flaskrestframeworkdja ...

  4. Part8-不用内存怎么行_6410内存初始化lesson3

    1.6410地址空间 外设区:从0x70000000-0x7FFFFFFF有256MB 主存储区:从0x00000000-0x6FFFFFFF有1972MB 对于主存储区: 静态存储区可以接我们的NO ...

  5. Visual Studio OpenCV 开发环境配置

    因为VS配置OpenCV好多新手都很难一次配置成功,而且OpenCV库每新建一个项目都要配置很是麻烦,所以今天就给大家介绍一个“一劳永逸”的方法. 注:理论上只要VS和OpenCV是版本兼容的,该方法 ...

  6. Windows7下使用sphinx生成开源文档(原)

    作者这里以osgearth文档为例,感觉这种生成文档的方式比较好,生成的html文档是支持搜索的,感谢开源工作者的奉献.赞一个 1. 下载并安装python for windows:https://w ...

  7. Azure:Manage anonymous read access to containers and blobs

    Grant anonymous users permissions to containers and blobs By default, a container and any blobs with ...

  8. initWithFrame 和 initWithCoder 区别?

    当我们所写的程序里用代码创建控制视图内容,需要调用initWithFrame去初始化 - (id)initWithFrame:(CGRect)frame { if (self =[superinitW ...

  9. URAL 1748. The Most Complex Number(反素数)

    题目链接 题意 :给你一个n,让你找出小于等于n的数中因子个数最多的那个数,并且输出因子个数,如果有多个答案,输出数最小的那个 思路 : 官方题解 : (1)此题最容易想到的是穷举,但是肯定超时. ( ...

  10. centos7 安装pip

    首先安装 python3 安装过程1.安装相关依赖 1 sudo yum install openssl-devel -y 2 sudo yum install zlib-devel -y 2.安装s ...