【HDU3586】Information Disturbing-二分答案+树形DP
来源:互联网 发布:split赋值给数组 编辑:程序博客网 时间:2024/06/12 11:13
测试地址:Information Disturbing
题目大意:有
做法:本题需要用到二分答案+树形DP。
首先,很明显题目中的结构为一棵树。现在就是要切断所有叶子结点与根节点的联系,并满足一些要求。我们可以分析上限电力对答案的影响,分为三种情况:不存在切断联系的方案,存在切断联系的方案但不存在满足消耗不超过总电力的方案,存在同时满足切断联系并且消耗不超过总电力的方案。观察发现,出现这些情况的上限电力都是一段连续的区间,并且这些区间连续依次出现,这就说明答案满足单调性,可以二分答案。
于是问题转化为判定性问题:在满足切断线路消耗的电力不超过上限电力的情况下,存不存在同时满足切断联系并且消耗不超过总电力的方案。这个问题可以通过树形DP来解决。设
上述算法的总的时间复杂度为
以下是本人代码:
#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n,m,first[1010],f[1010],tot;int ans;struct edge {int v,d,next;} e[2010];void insert(int a,int b,int d){ e[++tot].v=b; e[tot].d=d; e[tot].next=first[a]; first[a]=tot;}void dp(int v,int fa,int x){ f[v]=-1; for(int i=first[v];i;i=e[i].next) if (e[i].v!=fa) { f[v]=max(f[v],0); dp(e[i].v,v,x); if (f[e[i].v]>=0) { if (e[i].d<=x) f[v]+=min(e[i].d,f[e[i].v]); else f[v]+=f[e[i].v]; } else { if (e[i].d<=x) f[v]+=e[i].d; else {f[v]=-1;break;} } }}bool check(int x){ dp(1,0,x); if (f[1]<0||f[1]>m) return 0; else return 1;}int main(){ while(scanf("%d%d",&n,&m)&&n&&m) { memset(first,0,sizeof(first)); tot=0;ans=-1; for(int i=1;i<n;i++) { int a,b,d; scanf("%d%d%d",&a,&b,&d); insert(a,b,d),insert(b,a,d); } int l=1,r=1000; while(l<r) { int mid=(l+r)>>1; if (check(mid)) ans=mid,r=mid; else l=mid+1; } printf("%d\n",ans); } return 0;}
- 【HDU3586】Information Disturbing-二分答案+树形DP
- 树形DP+二分(Information Disturbing HDU3586)
- HDU3586 Information Disturbing(二分+树形dp)
- 【树形DP+二分】HDU3586 Information Disturbing
- 【树形DP】 hdu3586 Information Disturbing
- hdu3586 Information Disturbing 树形DP
- hdu3586 Information Disturbing(树形dp)
- HDU3586 Information Disturbing 解题报告【树形DP】
- hdu3586(树形DP+二分答案)
- hdu3586 Information Disturbing(树状DP+二分查找)
- hdu 3586 Information Disturbing 树形dp+二分
- HDU 3586 Information Disturbing 二分+树形DP
- HDU 3586 Information Disturbing (树形DP+二分)
- HDU 3586 Information Disturbing 树形DP+二分
- hdu 3586 Information Disturbing 树形dp+二分
- HDU 3586 Information Disturbing(树形DP + 二分)
- 【HDU】3586 Information Disturbing 二分+树形dp
- HDU 4586 Information Disturbing 二分+树形dp
- memcached缓存失效get_miss
- StringBuilder和String的区别
- troubleshooting之解决各种序列化导致的报错
- HDU-2612 BFS
- SCUT Training 20170920 Problem E
- 【HDU3586】Information Disturbing-二分答案+树形DP
- c#中接口和类的有什么异同,c#中的委托是什么?事件是不是一种委托?事件和委托的关系
- LWC 50:679. 24 Game
- JavaScript函数,递归
- 数组与矩阵---不包含本位置值的累乘数组
- Gym
- ACM-9月21日周四周中训练心得
- Android中对话框Dialog的创建
- 线段树------贴海报