hdoj3586 (树形dp)
题目链接:https://vjudge.net/problem/HDU-3586
题意:一棵边权树,要删掉一些边使得每个叶子结点不能到达树根,且这些边的权值<=上限Max,且边权和小于m,求最小的上限ans,如果不满足则输出-1。
思路:
属于删边的树形dp。二分枚举上限Max,查找最小的满足要求的Max,用dp[u]表示结点u的子树中叶子结点不能到u所需删除的边的最小权值和,对于结点u,其子结点v,u->v的权值为w。那么:
如果w>Max: dp[u]+=dp[v]
如果w<=Max: dp[u]+=min(w,dp[v])
对叶子结点u,dp[u]初始化为inf,对于非叶子结点u,dp[u]初始化为0,inf设为m+1,计算dp[u]过程只要dp[u]>=inf,即可提前退出。对每次Max的检测,只用判断dp[1]<=m即可。
AC code:
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn=;
int n,m,cnt,head[maxn],inf,Max,dp[maxn]; struct node{
int v,w,nex;
}edge[maxn<<]; void adde(int u,int v,int w){
edge[++cnt].v=v;
edge[cnt].w=w;
edge[cnt].nex=head[u];
head[u]=cnt;
} void dfs(int u,int fa){
dp[u]=;
int flag=;
for(int i=head[u];i;i=edge[i].nex){
int v=edge[i].v,w=edge[i].w;
if(v==fa) continue;
flag=;
dfs(v,u);
if(w>Max)
dp[u]+=dp[v];
else
dp[u]+=min(w,dp[v]);
if(dp[u]>=inf){
dp[u]=inf;
break;
}
}
if(!flag)
dp[u]=inf;
} bool solve(int x){
Max=x;
dfs(,);
return dp[]<=m;
} int main(){
while(scanf("%d%d",&n,&m),n||m){
cnt=,inf=m+;
for(int i=;i<=n;++i)
head[i]=;
for(int i=;i<n;++i){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
adde(u,v,w);
adde(v,u,w);
}
int l=,r=,mid;
while(l<=r){
mid=(l+r)>>;
if(solve(mid)) r=mid-;
else l=mid+;
}
if(l==) printf("-1\n");
else printf("%d\n",l);
}
return ;
}
hdoj3586 (树形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 ...
随机推荐
- JSON格式数据
1. 基础知识 1. 什么是JSON格式? JSON格式是现在网站数据交互的标准数据格式,写入标准. 取代原来的XML:符合JS原生语法,可以被直接解析,不需要额外的解析文件. 书写简单,一目了然 2 ...
- 51nod 1060
反素数定义:对于任意正整数 $n$, 其约数个数记为 $f(n)$, 如果某个正整数 $n$ 满足 对于任意正整数 $i, (0 < i < n)$, 都有 $f(i) < f(n) ...
- AT3913 XOR Tree(巧妙转换+状压dp)
Step1:首先定义一个点的权值为与其相连边的异或和.那么修改一条路径,权值改变的只有两个端点.边权都为0和点权都为0实质相同. Step2:那么现在和树的结构就没有什么关系了.每次选两个点,然后同时 ...
- Ubuntu 16.04 下Redis Cluster集群搭建
实际操作如下: 准备工作 版本:4.0.2 下载地址:https://redis.io/download 离线版本:(链接: https://pan.baidu.com/s/1bpwDtOr 密码: ...
- centos7安装gitlab 支持带认证https,开启邮件功能 超级简单.
官方安装说明:https://about.gitlab.com/install/#centos-7 自定义yum源 自行搞定 下载gitlab 官方安装: curl -s https://packag ...
- centos7下用kubeadm安装k8s集群并使用ipvs做高可用方案
1.准备 1.1系统配置 在安装之前,需要先做如下准备.三台CentOS主机如下: 配置yum源(使用腾讯云的) 替换之前先备份旧配置 mv /etc/yum.repos.d/CentOS-Base. ...
- python 安装 pyHook
下载网站:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyhook 查看python版本 C:\Users\k\Desktop\file_trans> ...
- idea中,springboot的热部署
1.开启idea的自动编译(静态) 具体步骤:打开顶部工具栏File | Settings | Build, Execution, Deployment | Compiler 然后勾选 Build p ...
- vue的一些随笔
一.点击路由后的样式,可以在路由文件index.js中设置 再在样式里面设置active的类名对应的样式. ———————————————————————————————————————————— 二 ...
- 总结:Apache/Tomcat/JBOSS/Jetty/Nginx区别 .
总结:Apache/Tomcat/JBOSS/Nginx区别 .1.Apache是Web服务器,Tomcat是应用(Java)服务器.Tomcat在中小型系统和并发访问用户不是很多的场合下被普遍使用. ...