【BZOJ3935】Rbtree 树形DP
【BZOJ3935】Rbtree
Description
Input
Output
Sample Input
1 0 0
1 2 2
2 3 2
Sample Output
HINT
题解:大神们写的都是单纯形?算了我只知道树形DP。
本题的思路和小奇挖矿相同。用f[x][a][b]表示在x的子树中放a个黑点,且距离x最近的黑点是b的最小花费(即有多少点从白点变成黑点)。转移时,对于a那维相当于树形背包,我们考虑b那维怎么转移。
如果我们想用f[y][..][c]来更新f[x][..][b],那么讨论:如果b==c,直接转移即可;如果c在y的子树中,那么用f[y][..][c]的最大值来更新f[x][..][b]即可;如果c不在y的子树中,那么我们将b换成c或者将c换成b一定不会变的更差,所以:不用转移!
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
int n,m,ans,cnt;
ll K;
int v[505],p[505],q[505],Q[505],siz[505],g[505][505],to[1010],next[1010],head[505];
int f[505][505][505];
ll dis[505][505],val[1010];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
inline void add(int a,int b,int c)
{
to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
}
void dfs1(int x,int fa,int y)
{
if(y==1) p[x]=++p[0],Q[p[0]]=x;
for(int i=head[x];i!=-1;i=next[i]) if(to[i]!=fa) dis[to[i]][y]=dis[x][y]+val[i],dfs1(to[i],x,y);
if(y==1) q[x]=p[0];
}
void dfs2(int x,int fa)
{
int i,y,j,k,a,mn;
siz[x]=1;
for(a=1;a<=n;a++) if(a!=x&&dis[a][x]<=K) f[x][0][a]=0;
f[x][1][x]=!v[x];
for(i=head[x];i!=-1;i=next[i]) if(to[i]!=fa)
{
y=to[i],dfs2(y,x);
memset(g,0x3f,sizeof(g));
for(j=0;j<=siz[x]&&j<=m;j++) for(k=0;k<=siz[y]&&j+k<=m;k++)
{
mn=0x3f3f3f3f;
for(a=p[y];a<=q[y];a++) mn=min(mn,f[y][k][Q[a]]);
for(a=1;a<=n;a++) g[j+k][a]=min(g[j+k][a],f[x][j][a]+f[y][k][a]);
for(a=1;a<p[y];a++) g[j+k][Q[a]]=min(g[j+k][Q[a]],f[x][j][Q[a]]+mn);
for(a=q[y]+1;a<=n;a++) g[j+k][Q[a]]=min(g[j+k][Q[a]],f[x][j][Q[a]]+mn);
}
siz[x]+=siz[y];
for(j=0;j<=siz[x]&&j<=m;j++) for(a=1;a<=n;a++) f[x][j][a]=g[j][a];
}
}
int main()
{
n=rd(),K=rd();
int i,a,b,c;
memset(head,-1,sizeof(head));
for(i=1;i<=n;i++) v[i]=rd(),m+=v[i];
for(i=1;i<n;i++) a=rd(),b=rd(),c=rd(),add(a,b,c),add(b,a,c);
for(i=1;i<=n;i++) dfs1(i,0,i);
memset(f,0x3f,sizeof(f));
dfs2(1,0);
ans=1<<30;
for(i=1;i<=n;i++) ans=min(ans,f[1][m][i]);
printf("%d",ans>n?-1:ans);
return 0;
}
【BZOJ3935】Rbtree 树形DP的更多相关文章
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- POJ2342 树形dp
原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...
- hdu1561 The more, The Better (树形dp+背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...
- bzoj2500: 幸福的道路(树形dp+单调队列)
好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...
随机推荐
- js学习笔记14----DOM概念及子节点类型
1.概念 DOM:Document Object Model---文档对象模型 文档:html页面 文档对象:页面中的元素 文档对象模型:是一种定义,为了能够让程序(js)去操作页面中的元素. DOM ...
- [oracle] oracle的三种密码验证机制以及在windows和linux下的不同启动过程
oracle数据库的密码验证机制: ① 操作系统验证 拥有SYSDBA和SYSOPER的用户用该方式验证此时数据库无需启动,也无需开启监听和实例服务. 要求:本地组ora_dba中有该操作系统的登录用 ...
- 有关JSP隐式对象,以下( )描述正确。
A.隐式对象是WEB容器加载的一组类的实例,可以直接在JSP页面使用 B.不能通过config对象获取ServletContext对象 C.response对象通过sendRedirect方法实现重定 ...
- e684. 以多种格式打印
A Book object is used when printing pages with different page formats. This example prints the first ...
- (转)I 帧和 IDR 帧的区别
I 帧和 IDR 帧的区别:http://blog.csdn.net/skygray/article/details/6223358 IDR 帧属于 I 帧.解码器收到 IDR frame 时,将所 ...
- (转)使用AfxGetMainWnd函数的一个心得
作者:朱金灿 来源:http://blog.csdn.net/clever101/ 使用AfxGetMainWnd函数获取MFC程序中的主框架类指针是一个常用作法.但是你会发现这一做法有时也会失灵.不 ...
- erlang在NotePad++下的高亮
转自:http://www.roberthorvick.com/2009/07/08/syntax-highlighing-for-erlang-in-notepad/ Syntax Highligh ...
- VNC轻松连接远程Linux桌面(1)
Linux平台安装VNCServer Windows平台使用VNC-Viewer 方法/步骤 在Linux平台安装VNCServer服务端软件包. #yum -y install vnc *v ...
- 配置OpenGL的开发环境
OpenGL库资源下载 http://pan.baidu.com/s/1ntVsReL 环境搭建 将下载好的文件进行解压,可以得到后缀为.h..lib..dll三类文件,对这三类文件作如下处理: 将所 ...
- 动态调用WCF不添加服务(svcutil.exe)
记录下 首先用svcutil.exe把指定wcf接口的信息下载下来. 生成代理类 比如说接口地址为 http://localhost:6666/Service1.svc 以管理员身份打开cmd 执形 ...