HDU - 3586 Information Disturbing 树形dp二分答案
HDU - 3586 Information Disturbing
题目大意:从敌人司令部(1号节点)到前线(叶子节点)的通信路径是一个树形结构,切断每条边的联系都需要花费w权值,现在需要你切断前线和司令部的连接,(就是所有叶子节点都到不了根节点),并且总花费不能超过m。问能够实行的方案中,最大花费的最小值,否则输出-1.
树形dp的题还是很好意识到用树形dp的,但最好是画一画图进行理解和推导,就像现在我随手画的图(第一次发现可以传图片)。
(画得有点小丑,问题不大)
现在回到问题,就是我们需要切断1和4,5,6节点联系,那我们有几种选择呢,首先现在6节点,6节点只和3节点相连,3节点和1节点相连,那我们可以通过切断1和3的联系,或者是切断3和6的联系,来实现切断1和6的连接,很明显我们会选择3和6的联系,因为它们的权值较小。推理到左边,要切断1和4,5的联系就有,一.切断1和2的联系,二。切断2和3以及切断2和5的联系这两种,很明显我们会选择切断1和3的联系。我们可以发现如果我们把每个节点视为根节点的话,要切断它和叶子节点的关系无非有两种联系,切断它和它下一级的节点的联系,或者它下一级的节点切断和它所有节点的联系。我们用dp[i]来表示i节点切断它和它所有叶子节点的总花费最小值就有
(字也丑。。。)
但现在问题是要找到的是一个最大花费的最小值,如果我们直接树形dp跑一遍的话就只能找到一个方案,并且其中的最大值不一定就是最小的,所以我们需要二分一个答案,然后用这个答案作为一个限制去跑树形dp看该方案可不可行?那么怎么实现这个限制呢?我想到的是如果一条边的权值已经大于限制值了,那就让它等于m+1,这样的话如果没有其他能代替它的更小的边,最终总花费肯定是大于m的,也就是方案不可行。其他细节详情见代码如下
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
struct Side{
int v,ne,w;
}S[*N];
int sn,n,m,head[N],dp[N];
void add(int u,int v,int c)
{
S[sn].v=v;
S[sn].w=c;
S[sn].ne=head[u];
head[u]=sn++;
}
int dfs(int u,int f,int lim)
{
dp[u]=;
for(int i=head[u];i!=-;i=S[i].ne)
{
int v=S[i].v;
if(v!=f)
{
dfs(v,u,lim);
int cost=(S[i].w>lim ? m+ : S[i].w);//如果权值超过限制,设为m+1
dp[u]+=min(dp[v],cost);//子节点的花费以及相连的边权值中取个最小值
//当前节点加上所有子节点需要切断和叶子节点的花费
}
}
if(dp[u]==)//这个是用来判断它是不是叶子节点的
dp[u]=0x3f3f3f3f;//叶子节点的dp设个最大值,它的父节点只能切断和它相连的边
return dp[u];
}
int main()
{
int a,b,w;
while(scanf("%d%d",&n,&m)&&(n||m))
{
for(int i=;i<=n;i++)
head[i]=-;
int l=,r=;//l所有边中的最小值,r所有边中的最大值
sn=;
for(int i=;i<n;i++)
{
scanf("%d%d%d",&a,&b,&w);
add(a,b,w);
add(b,a,w);
l=min(l,w);
r=max(r,w);
}
int ans=-;
while(l<=r)
{
int mid=(l+r)>>;
if(dfs(,,mid)<=m)//判断这个答案是否可行
ans=mid,r=mid-;//可行的话,继续调小
else
l=mid+;
}
printf("%d\n",ans);
}
return ;
}
太君这边请~
HDU - 3586 Information Disturbing 树形dp二分答案的更多相关文章
- HDU 3586 Information Disturbing 树形DP+二分
Information Disturbing Problem Description In the battlefield , an effective way to defeat enemies ...
- HDU 3586.Information Disturbing 树形dp 叶子和根不联通的最小代价
Information Disturbing Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/ ...
- [hdu3586]Information Disturbing树形dp+二分
题意:给出一棵带权无向树,以及给定节点1,总约束为$m$,找出切断与所有叶子节点联系每条边所需要的最小价值约束. 解题关键:二分答案,转化为判定性问题,然后用树形dp验证答案即可. dp数组需要开到l ...
- hdu3586 Information Disturbing 树形DP+二分
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3586 题目大意:给定n个敌方据点,编号1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值c ...
- HDU3585 Information Disturbing 树形dp+二分
http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意 : 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用 ...
- 【题解】hdu 3586 Information Disturbing 二分 树形dp
题目描述 Information DisturbingTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java ...
- HDU 3586 Information Disturbing(二分+树形dp)
http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意: 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能超 ...
- hdu 3586 Information Disturbing(树形dp + 二分)
本文出自 http://blog.csdn.net/shuangde800 题目链接: hdu-3586 题意 给一棵n个节点的树,节点编号为1-n,根节点为1.每条边有权值,砍掉一条边要花费 ...
- BZOJ3420[POI2013]Triumphal arch&BZOJ5174[Jsoi2013]哈利波特与死亡圣器——树形DP+二分答案
题目大意: 给一颗树,1号节点已经被染黑,其余是白的,两个人轮流操作,一开始B在1号节点,A选择k个点染黑,然后B走一步,如果B能走到A没染的节点则B胜,否则当A染完全部的点时,A胜.求能让A获胜的最 ...
随机推荐
- JavaScript设计模式(发布订阅模式)
发布—订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在JavaScript开发中,我们一般用事件模型来替代传统的发布—订阅模式 ...
- 面试常考的js题目(三)
1.查找两个节点的最近的一个共同父节点,可以包括节点自身 function commonParentNode(oNode1, oNode2) { if(oNode1.contains(oNode2)) ...
- 换发型app任性扣费?苹果app订阅任性扣费?怎么办?刚成功
2019年9月18日17:09:27 什么黑猫举报没用 先关闭订阅 账户中心自助申请试试,不通过再进行下面这步 https://getsupport.apple.com/?caller=home&am ...
- WCF寄宿windows服务二
如果有很多WCF服务需要寄宿,需要额外做一些工作:总体思路是:先把这些WCF服务的程序集打包,然后利用反射加载各个WCF服务的程序集,按顺序一个一个寄宿.先来看看我们需要寄宿的WCF服务: 实现步骤: ...
- JXOI 2018滚粗记
--Update5.2 成绩出了,见后文 听说省选VAN写游记是传统,本蒟蒻也来发一篇吧. DAY 0 本来以为省选不在JKFZ举行的结果又是在JKFZ,本校作战感觉终究会是好一些吧,和jyh一起向教 ...
- docker之常见错误
1. docker run -d --name showdoc -p 4999:80 -v /showdoc_data/html:/var/www/html/ star7th/showdoc WARN ...
- input 禁止输入特殊字符
方式一:拿到value值以后 在你传递之前处理 function stripscript(value) { var pattern = new RegExp("[`~!@#$^&*( ...
- Active Directory participation features and security extensions
Participation in the Active Directory Samba 3.0 series, as well as the OS since Windows 2000, is pos ...
- LeetCode NO477.汉明距离总和
两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量. 计算一个数组中,任意两个数之间汉明距离的总和. 示例: 输入: 4, 14, 2 输出: 6 解释: 在二进制表示中,4表示为010 ...
- RabbitMQ各种交换机类型Exchange Types介绍
最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange.Fanout exchange.Topic exchange.Headers exchange. 一.Direct E ...