4033: [HAOI2015]树上染色

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 3269  Solved: 1413
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

5 2
1 2 3
1 5 1
2 3 1
2 4 2

Sample Output

17
【样例解释】
将点1,2染黑就能获得最大收益。

HINT

2017.9.12新加数据一组 By GXZlegend

Source

鸣谢bhiaibogf提供

#include<iostream>
#include<cstdio>
#include<cstring>#define N 2001using namespace std;
int n,m,k,ans,cnt;
int dis[N][N],e[N][N];
int p[N];void calc_dis()
{for(int k=1;k<=n;k++) for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)if(i!=j && j!=k) e[i][j]=min(e[i][j],e[i][k]+e[k][j]);         }
}void calc_ans()
{int tmp=0;for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++)if(p[i]==p[j]) tmp+=e[i][j];ans=max(ans,tmp);
}void dfs(int now,int c)
{if(now==n+1){if(c==k)calc_ans();return;}p[now]=0;dfs(now+1,c+1);p[now]=1;dfs(now+1,c);
}int main()
{int x,y,z;scanf("%d%d",&n,&k);memset(e,127/3,sizeof e);for(int i=1;i<=n;i++) e[i][i]=0;for(int i=1;i<n;i++){scanf("%d%d%d",&x,&y,&z);e[x][y]=e[y][x]=z;}calc_dis();dfs(1,0);printf("%d\n",ans);return 0;
}

30暴力

/*
开始状态设的是f[i][j][0/1]。
表示i为根的子树染j个黑点,i节点为黑/白的最大值。
发现当i与儿子异色时没法转移,需要知道子树内点的具体染色情况。
所以说这个状态貌似不大行。网上说“像这种题目其实是一个套路。在树上这种“两两之间”计算贡献和的问题,都拆开看每条边的贡献。”
我就很伤心,那不就说明我被套路了吗...改一下状态f[i][j]表示i为根染j个黑点对总答案的最大贡献。
这个贡献的定义是啥呢?就是子树内所有边的贡献。
对于这条边
子树下有j个黑点,那么在其他位置就有k - j个黑点,所以由于黑点这条边被走过j*(k-j)次。
子树下有size[x] - j个白点,其他位置有n - k - (size[x]-j)个白点
所以由于白点这条边被走过(size[x]-j)*(n-k-size[x]+j)次。*/
#include<iostream>
#include<cstdio>
#include<cstring>#define N 2001
#define ll long longusing namespace std;
int n,k,ans,cnt,S,T;
int head[N],siz[N];
ll f[N][N],tmp;
struct edge{int u,v,net;ll w;
}e[N<<1];inline int read()
{int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}inline void add(int u,int v,ll w)
{e[++cnt].v=v;e[cnt].w=w;e[cnt].net=head[u];head[u]=cnt;
}ll calc(ll val,int num,int x)//计算这条边的贡献
{val=val*x*(k-x)+val*(num-x)*(n-k-(num-x));return val;
}void dfs(int u)
{siz[u]=1;for(int i=head[u];i;i=e[i].net){int v=e[i].v;if(siz[v]) continue;dfs(v);for(int x=siz[u];x>=0;x--) for(int y=siz[v];y>=0;y--)//类似树上背包,枚举当前子树染黑个数
        {tmp=f[u][x]+f[v][y]+calc(e[i].w,siz[v],y);//f[u][x]其他子树内的点各自独立于当前子树内的点的贡献//f[v][y]当前子树内的点各自独立于其他子树内的点的贡献 f[u][x+y]=max(f[u][x+y],tmp);}siz[u]+=siz[v];}
}int main()
{int x,y,z;n=read();k=read();for(int i=1;i<n;i++){x=read();y=read();cin>>z;add(x,y,z);add(y,x,z);}dfs(1);printf("%lld\n",f[1][k]);return 0;
}

转载于:https://www.cnblogs.com/L-Memory/p/9768069.html

bzoj4033: [HAOI2015]树上染色(树形dp)相关推荐

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

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

  2. [BZOJ4033][HAOI2015]树上染色

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2108  Solved: 901 [Submit][Sta ...

  3. bzoj4033 [HAOI2015]树上染色

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4033 重要的思路:与其考虑每一个点对的贡献,不如考虑每条边的贡献(==被经过了几次)! 树形 ...

  4. bzoj4033:[HAOI2015]树上染色

    传送门 我一开始想的是考虑每个点的颜色 设的状态就是\(f[i][j]\)表示\(i\)子树里有\(j\)个黑点的\(i\)子树的收益最大值,后来发现无法转移 那么考虑答案的统计,可以对于边统计答案 ...

  5. bzoj 4033: [HAOI2015]树上染色(树形DP)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1786  Solved: 754 [Submit][Sta ...

  6. Luogu P3177 [HAOI2015] 树上染色(树上背包)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Luogu P3177 [HAOI2015] 树上染色 有一棵点数为 NNN 的树,树边有边权.给你一 ...

  7. 『树上匹配 树形dp』

    树上匹配 Description 懒惰的温温今天上班也在偷懒.盯着窗外发呆的温温发现,透过窗户正巧能看到一棵 n 个节点的树.一棵 n 个节点的树包含 n-1 条边,且 n 个节点是联通的.树上两点之 ...

  8. 【bzoj1304】[CQOI2009]叶子的染色 树形dp

    题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点( ...

  9. 【牛客每日一题】4.15 Treepath 题解(树上dfs/树形DP)

    题目链接:https://ac.nowcoder.com/acm/problem/14248 来源:牛客网 题目描述 给定一棵n个点的树,问其中有多少条长度为偶数的路径.路径的长度为经过的边的条数.x ...

最新文章

  1. 干货丨贝叶斯机器学习前沿进展
  2. 为备考二级C语言做的代码练习---辅导资料《C语言经典编程282例》--(1)
  3. NOJ37 回文字符串---整理一下都是各种回文类型啊,
  4. mahout贝叶斯分类器测试样例
  5. wps出现安装installer_为什么不能安装WPS
  6. VSCode 插件开发实例(WebView):微信读书 ^-^边撸代码边看小说^-^
  7. hibernate连接泄露_泄漏抽象,或如何正确地与Hibernate绑定Oracle DATE
  8. 國慶和中秋的學習成果
  9. memset()详解
  10. 免费报名 | DataFunCon:自然语言处理论坛
  11. 一个可能是世界上最全的 API 接口集合库开源项目
  12. 易语言获取链接的真实地址_ret2libc过地址随机化
  13. 微信小程序云开发教程-微信小程序的API入门-常用API
  14. ntko web firefox跨浏览器插件_Web浏览器如何使用进程和线程
  15. Regular Expression 正则表达式 语法规则及使用
  16. 所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
  17. 对不起,云计算又走错路了
  18. react动态添加背景图片/不同内容添加对应背景
  19. 聊聊cortex的Backoff
  20. Ehabs Last Corollary

热门文章

  1. Odoo10教程---模块化二:模型间关系,继承,计算字段等
  2. mysql物理删除索引_Oracle与MySQL删除字段时对索引和约束的处理
  3. 模板设计模式_C常用设计模式——模板方法模式
  4. django objects.filter().exists()
  5. the coons patch
  6. unity android so热更,惊鸿哥的港湾
  7. python 简历_用Python翻译我的简历
  8. c++ 打印条码_条码标签打印软件快捷键指南
  9. html字体颜色选择插件,css3改变选择文本背景颜色
  10. php中div重叠,div重叠问题