hdu3586 Information Disturbing[二分答案+树形DP]
Posted saigyouji-yuyuko
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu3586 Information Disturbing[二分答案+树形DP]相关的知识,希望对你有一定的参考价值。
给定 n 个节点的树,边有权值。1 号点是根,除了 1 号点外的度数为 1 的节点是叶子。
要求切断所有叶子和 1 号点之间的联系,切断一条边要花费这条边上权值对应的代价,要求总的代价不超过 m。
在满足这个前提下要求切断的边权的最大值最小,求出这个最小值。$n ≤ 10^5$
首先这个最大值肯定二分答案,然后树形DP限制割掉的边不能超过这个二分的边权,设$f[i]$表示在这个限制下该子树内所有叶子断绝与根的联系的最小代价。
于是$f[i]=max(w_father,\sum\limits_yf[y])$。也就是要不然割自己与父亲的边,要不然让所有儿子和自己都断掉。不合法的方案用INF来传递。
然后判一下是否$f[1]\le m$即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #define dbg(x) cerr << #x << " = " << x <<endl 7 using namespace std; 8 typedef long long ll; 9 typedef double db; 10 typedef pair<int,int> pii; 11 template<typename T>inline T _min(T A,T B)return A<B?A:B; 12 template<typename T>inline T _max(T A,T B)return A>B?A:B; 13 template<typename T>inline char MIN(T&A,T B)return A>B?(A=B,1):0; 14 template<typename T>inline char MAX(T&A,T B)return A<B?(A=B,1):0; 15 template<typename T>inline void _swap(T&A,T&B)A^=B^=A^=B; 16 template<typename T>inline T read(T&x) 17 x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c==‘-‘)f=1; 18 while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x; 19 20 const int N=1e5+7,INF=0x1f1f1f1f; 21 int n,mid,L,R,m; 22 struct STOthxORZint to,nxt,w;G[N<<1]; 23 int Head[N],tot; 24 inline void Addedge(int x,int y,int z) 25 G[++tot].to=y,G[tot].nxt=Head[x],Head[x]=tot,G[tot].w=z; 26 G[++tot].to=x,G[tot].nxt=Head[y],Head[y]=tot,G[tot].w=z; 27 28 int f[N]; 29 #define y G[j].to 30 inline void dp(int x,int fa,int val) 31 int ret=0; 32 for(register int j=Head[x];j;j=G[j].nxt)if(y^fa)dp(y,x,G[j].w),ret+=f[y],(ret>=INF)&&(ret=INF); 33 f[x]=_min((val>mid?INF:val),(ret?ret:INF)); 34 35 #undef y 36 int main()//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout); 37 while(read(n),read(m),n||m) 38 memset(Head,0,sizeof Head);tot=0;L=1;R=0; 39 for(register int i=1,x,y,z;i<n;++i)read(x),read(y),read(z),Addedge(x,y,z),MAX(R,z); 40 int tmp=++R; 41 while(L<R) 42 memset(f,0x1f,sizeof f); 43 mid=L+R>>1;dp(1,0,INF); 44 if(f[1]<=m)R=mid; 45 else L=mid+1; 46 47 printf("%d\n",L==tmp?-1:L); 48 49 return 0; 50
以上是关于hdu3586 Information Disturbing[二分答案+树形DP]的主要内容,如果未能解决你的问题,请参考以下文章
HDU 3586 Information Disturbing
hdu3586 Information Disturbing 树形dp
HDU 3586.Information Disturbing 树形dp
HDU 3586 Information Disturbing(二分+树形dp)