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二分答案的更多相关文章

  1. HDU 3586 Information Disturbing 树形DP+二分

    Information Disturbing Problem Description   In the battlefield , an effective way to defeat enemies ...

  2. HDU 3586.Information Disturbing 树形dp 叶子和根不联通的最小代价

    Information Disturbing Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/ ...

  3. [hdu3586]Information Disturbing树形dp+二分

    题意:给出一棵带权无向树,以及给定节点1,总约束为$m$,找出切断与所有叶子节点联系每条边所需要的最小价值约束. 解题关键:二分答案,转化为判定性问题,然后用树形dp验证答案即可. dp数组需要开到l ...

  4. hdu3586 Information Disturbing 树形DP+二分

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3586 题目大意:给定n个敌方据点,编号1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值c ...

  5. HDU3585 Information Disturbing 树形dp+二分

    http://acm.split.hdu.edu.cn/showproblem.php?pid=3586   题意 : 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用 ...

  6. 【题解】hdu 3586 Information Disturbing 二分 树形dp

    题目描述 Information DisturbingTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java ...

  7. HDU 3586 Information Disturbing(二分+树形dp)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意: 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能超 ...

  8. hdu 3586 Information Disturbing(树形dp + 二分)

    本文出自   http://blog.csdn.net/shuangde800 题目链接:   hdu-3586 题意 给一棵n个节点的树,节点编号为1-n,根节点为1.每条边有权值,砍掉一条边要花费 ...

  9. BZOJ3420[POI2013]Triumphal arch&BZOJ5174[Jsoi2013]哈利波特与死亡圣器——树形DP+二分答案

    题目大意: 给一颗树,1号节点已经被染黑,其余是白的,两个人轮流操作,一开始B在1号节点,A选择k个点染黑,然后B走一步,如果B能走到A没染的节点则B胜,否则当A染完全部的点时,A胜.求能让A获胜的最 ...

随机推荐

  1. JavaScript设计模式(发布订阅模式)

    发布—订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在JavaScript开发中,我们一般用事件模型来替代传统的发布—订阅模式 ...

  2. 面试常考的js题目(三)

    1.查找两个节点的最近的一个共同父节点,可以包括节点自身 function commonParentNode(oNode1, oNode2) { if(oNode1.contains(oNode2)) ...

  3. 换发型app任性扣费?苹果app订阅任性扣费?怎么办?刚成功

    2019年9月18日17:09:27 什么黑猫举报没用 先关闭订阅 账户中心自助申请试试,不通过再进行下面这步 https://getsupport.apple.com/?caller=home&am ...

  4. WCF寄宿windows服务二

    如果有很多WCF服务需要寄宿,需要额外做一些工作:总体思路是:先把这些WCF服务的程序集打包,然后利用反射加载各个WCF服务的程序集,按顺序一个一个寄宿.先来看看我们需要寄宿的WCF服务: 实现步骤: ...

  5. JXOI 2018滚粗记

    --Update5.2 成绩出了,见后文 听说省选VAN写游记是传统,本蒟蒻也来发一篇吧. DAY 0 本来以为省选不在JKFZ举行的结果又是在JKFZ,本校作战感觉终究会是好一些吧,和jyh一起向教 ...

  6. docker之常见错误

    1. docker run -d --name showdoc -p 4999:80 -v /showdoc_data/html:/var/www/html/ star7th/showdoc WARN ...

  7. input 禁止输入特殊字符

    方式一:拿到value值以后 在你传递之前处理 function stripscript(value) { var pattern = new RegExp("[`~!@#$^&*( ...

  8. 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 ...

  9. LeetCode NO477.汉明距离总和

    两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量. 计算一个数组中,任意两个数之间汉明距离的总和. 示例: 输入: 4, 14, 2 输出: 6 解释: 在二进制表示中,4表示为010 ...

  10. RabbitMQ各种交换机类型Exchange Types介绍

    最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange.Fanout exchange.Topic exchange.Headers exchange. 一.Direct E ...