【HAOI2015】树上染色
这题思路好神仙啊,首先显然是树形dp,f[i][j]表示在以i为根的子树中选j个黑点对答案的贡献(并不是当前子树最大值),dp时只考虑i与儿子连边的贡献。此时(i,son[i])产生的收益是(设子树大小为size[i])子树上的黑点个数(j)与子树外的黑点个数(m - j)的乘积乘上这条边的边权(w[i])加上子树上白点的个数(size[i] - j)乘以子树外白点的个数(n - m - size[i] + j)再乘以边权,这些贡献是在加入了根节点以后才产生的新的贡献,与子树上黑白点如何分配无关。
#include<iostream>
#include<cstring>
#include<cstdio>
#define int LL
#define LL long long
#define ma(x) memset(x,0,sizeof(x))
#define MAXN 3010
using namespace std;
struct edge
{
int u,v,w,nxt;
#define u(x) ed[x].u
#define v(x) ed[x].v
#define w(x) ed[x].w
#define n(x) ed[x].nxt
}ed[2000000];
int first[MAXN],num_e;
#define f(x) first[x]
int f[MAXN][MAXN],du[MAXN],root;
int n,nk,size[MAXN],tmp[MAXN];
void dfs(int x,int fa)
{
size[x]=1;
for(int i=f(x);i;i=n(i))
if(v(i)!=fa)dfs(v(i),x);
for(int i=f(x);i;i=n(i))
if(v(i)!=fa)
{
ma(tmp);
for(int j=0;j<=size[x]&&j<=nk;j++)
for(int k=0;k<=size[v(i)]&&k+j<=nk;k++)
{
tmp[j+k]=max(tmp[j+k],f[x][j]+f[v(i)][k]+k*(nk-k)*w(i)+(size[v(i)]-k)*(n-nk-size[v(i)]+k)*w(i));
}
for(int j=0;j<=nk;j++)
f[x][j]=tmp[j];
size[x]+=size[v(i)];
}
}
inline void add(int u,int v,int w);
signed main()
{
// freopen("in.txt","r",stdin);
// freopen("2.in","r",stdin); scanf("%lld%lld",&n,&nk);
int a,b,c;
for(int i=1;i<n;i++)
{
scanf("%lld%lld%lld",&a,&b,&c);
du[a]++;du[b]++;add(a,b,c);add(b,a,c);
}
for(int i=1;i<=n;i++)if(du[i]==1){root=i;break;}
dfs(root,0);
cout<<f[root][nk]<<endl;
}
inline void add(int u,int v,int w)
{
++num_e;
u(num_e)=u;
v(num_e)=v;
w(num_e)=w;
n(num_e)=f(u);
f(u)=num_e;
}
【HAOI2015】树上染色的更多相关文章
- bzoj 4033: [HAOI2015]树上染色 [树形DP]
4033: [HAOI2015]树上染色 我写的可是\(O(n^2)\)的树形背包! 注意j倒着枚举,而k要正着枚举,因为k可能从0开始,会使用自己更新一次 #include <iostream ...
- BZOJ4033: [HAOI2015]树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3461 Solved: 1473[Submit][Stat ...
- 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
[BZOJ4033][HAOI2015]树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染 ...
- BZOJ_4033_[HAOI2015]树上染色_树形DP
BZOJ_4033_[HAOI2015]树上染色_树形DP Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的 ...
- BZOJ 4033[HAOI2015] 树上染色(树形DP)
4033: [HAOI2015]树上染色 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3188 Solved: 1366[Submit][Stat ...
- [HAOI2015]树上染色(树形dp)
[HAOI2015]树上染色 题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所 ...
- [HAOI2015]树上染色(树上dp)
[HAOI2015]树上染色 这种要算点对之间路径的长度和的题,难以统计每个点的贡献.这个时候一般考虑算每一条边贡献了哪些点对. 知道这个套路以后,那么这题就很好做了. 状态:设\(dp[u][i]\ ...
- [HAOI2015]树上染色 树状背包 dp
#4033. [HAOI2015]树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-K个点染成白 ...
随机推荐
- Mysql千万级访问量架构
1.HTML 静态化 其实大家都知道,效率最高.消耗最小的就是纯静态化的html页面,所以我们尽可能是我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法.但是对于大量内容并且频 ...
- Scanner读取记事本文件内容为空的解决办法
原因:记事本txt文件中含有中文,windows记事本编码方式为gbk,但是eclipse中为utf-8,所以需要在Scanner中指定编码方式.
- 基于Kebernetes 构建.NET Core技术中台
原文:基于Kebernetes 构建.NET Core技术中台 我们为什么需要中台 我们现在处于企业信息化的新时代.为什么这样说呢? 过去企业信息化的主流重心是企业内部信息化.但现在以及未来的企业信息 ...
- iOS -NSOperation并发编程
http://www.cocoachina.com/game/20151201/14517.html http://blog.csdn.net/qinlicang/article/details/42 ...
- winform应用程序异常处理
对于winform应用程序补抓异常信息,我们经常用到得try catch. 如果代码中在某个地方执行异常,但是没有加try catch,这个时候就需要做一些全局异常捕捉. 怎么做到全局异常捕捉.win ...
- 解决git push、pull时总是需要你输入用户名和密码
git config --global credential.helper store之后再次执行git push 或者git pull这时候还需要输入用户名和密码 下次就不需要了
- DesktopLayer.exe专杀
这两天发现电脑卡慢. 同事电脑发现病毒,而后装上杀软后(一直在裸奔~~~),发现自己电脑也存在. DesktopLayer.exe 会有以下几个行为: 第一,会在C:\Program Files (x ...
- HR招聘_(三)_招聘方法论(招聘途径及流程)
1.招聘途径 网络招聘:企业官网,招聘网站,微信,论坛等. 校园招聘:学校信息栏海报,学校组织招聘会,校企业联合专场. 现场招聘会: 专场招聘会,人才市场招聘会. 猎头公司:猎头(年薪高于350K), ...
- arcgis地图窗口操作
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- CSS 连接后面加上"?"表示什么意思?
举例来说: <link rel="stylesheet" href="http://static.ak.facebook.com/css/actionspro.cs ...