【BZOJ4033】【HAOI2015】树上染色
Description
有一棵点数为 N 的树,树边有边权。给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 。 将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间的距离的和的受益。问受益最大值是多少。
Input
第一行包含两个整数 N, K 。接下来 N-1 行每行三个正整数 fr, to, dis , 表示该树中存在一条长度为 dis 的边 (fr, to) 。输入保证所有点之间是联通的。
Output
输出一个正整数,表示收益的最大值。
Sample Input
3 1
1 2 1
1 3 2
Sample Output
3
Hint
对于 100% 的数据,\(0 \leq K \leq N \leq 2000\)
Solution
考虑树形DP,状态应为第i个点的子树内有j个黑色点对整棵树的贡献,问题就转换为了树形背包,对于一条边的贡献=两边的黑色点数之积+两边的白色点之积,利用这一点进行树形DP即可,每次枚举子树内黑色点个数,与当前子树内黑色点个数,进行统计答案即可,将上界改为子树大小,可以将时间复杂度优化至\(O(n^2)\).
Code
#include <stdio.h>
#include <string.h>
#define MN 2005
#define R register
#define ll long long
#define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);
#define end fclose(stdin);fclose(stdout)
inline int read(){
R int x; R bool f; R char c;
for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');
for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<3)+(x<<1)+c-'0');
return f?-x:x;
}
int n,k,to[MN<<1],nt[MN<<1],v[MN<<1],h[MN],sz[MN],en;ll f[MN][MN];
inline void ins(int x,int y,int vl){to[++en]=y,nt[en]=h[x],h[x]=en,v[en]=vl;}
inline int min(int a,int b){return a<b?a:b;}
inline ll max(ll a,ll b){return a>b?a:b;}
inline void dp(int u,int fa){
f[u][0]=f[u][1]=0;sz[u]=1;
for (R int i=h[u]; i; i=nt[i])
if (to[i]!=fa) dp(to[i],u),sz[u]+=sz[to[i]];
for (R int i=h[u]; i; i=nt[i])
if (to[i]!=fa)
for (R int j=min(k,sz[u]); j>=0; --j)
for (R int l=0; l<=min(j,sz[to[i]]); ++l)
if (~f[u][j-l]){
ll val=(1ll*l*(k-l)+(1ll*sz[to[i]]-l)*(1ll*n-k+l-sz[to[i]]))*v[i];
f[u][j]=max(f[u][j],f[u][j-l]+f[to[i]][l]+val);
}
}
int main(){
memset(f,-1,sizeof(f));
n=read(),k=read();
for (R int i=1; i<n; ++i){
R int x=read(),y=read(),v=read();
ins(x,y,v); ins(y,x,v);
}dp(1,0);printf("%lld\n",f[1][k]);
return 0;
}
【BZOJ4033】【HAOI2015】树上染色的更多相关文章
- BZOJ4033 HAOI2015 树上染色 【树上背包】
BZOJ4033 HAOI2015 树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白 ...
- [BZOJ4033][HAOI2015]树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2437 Solved: 1034[Submit][Stat ...
- BZOJ4033: [HAOI2015]树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3461 Solved: 1473[Submit][Stat ...
- [bzoj4033][HAOI2015]树上染色_树形dp
树上染色 bzoj-4033 HAOI-2015 题目大意:给定一棵n个点的树,让你在其中选出k个作为黑点,其余的是白点,收益为任意两个同色点之间距离的和.求最大收益. 注释:$1\le n\le 2 ...
- 【题解】 bzoj4033: [HAOI2015]树上染色* (动态规划)
bzoj4033,懒得复制,戳我戳我 Solution: 定义状态\(dp[i][j]\)表示\(i\)号节点为根节点的子树里面有\(j\)个黑色节点时最大的贡献值 然后我们要知道的就是子节点到根节点 ...
- 洛谷P3177||bzoj4033 [HAOI2015]树上染色
洛谷P3177 bzoj4033 根本不会做... 上网查了题解,发现只要在状态定义的时候就考虑每一条边全局的贡献就好了? 考虑边的贡献和修改状态定义我都想到了,然而并不能想到要结合起来 ans[i] ...
- 【树形背包】bzoj4033: [HAOI2015]树上染色
仔细思考后会发现和51nod1677 treecnt有异曲同工之妙 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 ...
- [BZOJ4033]:[HAOI2015]树上染色(树上DP)
题目传送门 题目描述 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加 ...
- BZOJ4033 [HAOI2015]树上染色 【树形dp】
题目 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间 ...
- BZOJ4033 [HAOI2015]树上染色
本来是考虑, $ f[x][i][0/1] $ 表示 $ x $ 子树中有$i$个黑点,且 $ x $ 是白点/黑点.但是这里的答案是要统计不同的子树的贡献的.所以就gg了. 看了题解. 应该是要设$ ...
随机推荐
- C语言第二次博客作业——分支结构
一.PTA实验作业 题目1:计算分段函数 1.实验代码 #include<stdio.h> #include<math.h> int main(void) { double x ...
- 转:运行page页面时的事件执行顺序及页面的回发与否深度了解
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...
- "一不小心就火了"团队采访
团队采访 一. 采访团队 团队:一不小心就火了 采访形式:线上问答 二.采访内容 你们是怎么合理地具体分配组员里的工作的?有些团队会出现个别组员代码任务很重,个别组员无所事事的情况,你们有什么有效的方 ...
- nyoj 苹果
苹果 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包.给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值. ...
- Ubuntu命令行连接WPA/WPA2无线网线
一,连接无加密无线网络zhang:sudo ip link set wlan0 up sudo iw dev wlan0 connect zhangsudo dhclient wlan0 二,连接WP ...
- php代码开启缓冲的使用方法
php可以开启缓冲区,就是将内容放到缓冲区,再决定什么时候发送给浏览器. 感谢:http://www.jb51.net/article/38964.htm 解析PHP中ob_start()函数的用法 ...
- ajax和jquery使用技巧
1.使用ajax的方法的时候可以使用u方法来获取连接,这样更加安全:alert弹窗的时候需要单引号双引号火狐浏览器会报错!
- c 语言的基本语法
1,c的令牌(Tokens) printf("Hello, World! \n"); 这五个令牌是: printf ( "Hello, World! \n" ) ...
- node请求下载接口时乱码
先说下问题 之前做的一个项目,三端同时开发(PC.WEB.APP),由于架构方面的原因,服务均不对外开放,接口地址自然也就不对外暴露了,所有请求都要经过node转发,此为背景.... 网站有个扫描二维 ...
- Angular组件——组件生命周期(二)
一.view钩子 view钩子有2个,ngAfterViewInit和ngAfterViewChecked钩子. 1.实现ngAfterViewInit和ngAfterViewChecked钩子时注意 ...