hdu3586,树形dp+二分
2014-04-02 15:15
197 查看
切断根与叶子结点之间的联系,所有切断的边不能超过一个值k,切断边的总和不能超过m,如果不存在这样的一个k,输出-1,否则输出k。
二分得到k,找到满足条件的最小值
二分得到k,找到满足条件的最小值
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #define INF 1000001 int dp[1005],first[1005],next[2005],mid; struct edge { int u; int v; int w; }en[2005]; int min(int a,int b) { return a>b?b:a; } void add(int a,int b,int c,int p) { en[p].u=a; en[p].v=b; en[p].w=c; next[p]=first[a]; first[a]=p; } void getdp(int s,int fu) { int i,flag; //printf("a%d\n",mid); flag=0; for(i=first[s];i!=-1;i=next[i]) { if(en[i].v!=fu) { flag=1; getdp(en[i].v,s); if(en[i].w<=mid) { dp[s]+=min(dp[en[i].v],en[i].w); } else { dp[s]+=dp[en[i].v]; } } } if(flag==0) dp[s]=INF; } int main() { int n,m,i,j,k,l,le,ri,a,b,c,idx; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; memset(first,-1,sizeof(first)); memset(next,-1,sizeof(next)); for(i=1,idx=0;i<n;i++) { scanf("%d%d%d",&a,&b,&c); idx++; add(a,b,c,idx); idx++; add(b,a,c,idx); } le=0;ri=1000; while(ri>le) { mid=(ri+le)>>1; memset(dp,0,sizeof(dp)); getdp(1,-1); if(dp[1]<=m) ri=mid; else le=mid+1; /*for(i=1;i<=n;i++) printf("%d ",dp[i]); printf("\n");*/ } memset(dp,0,sizeof(dp)); mid=le; getdp(1,-1); if(dp[1]<=m) printf("%d\n",le); else printf("-1\n"); } return 0; }
相关文章推荐
- hdu3586 树形dp+二分求解
- hdu3586(树形DP+二分,割边)
- HDU3586 Information Disturbing(树形dp+二分)
- hdu3586(树形DP+二分答案)
- hdu3586(树形dp+二分)
- 【HDU3586】Information Disturbing-二分答案+树形DP
- hdu3586 Information Disturbing 树形DP+二分
- hdu3586(二分+树形dp)
- HDU3586 Information Disturbing(二分+树形dp)
- 【树形DP+二分】HDU3586 Information Disturbing
- HDU 3586 Information Disturbing (二分+树形dp)
- hdu 5682 zxa and leaf(树形DP+二分)
- hdu3586 Information Disturbing 树形DP
- HDU3586 Information Disturbing 解题报告【树形DP】
- hdu3586(树形dp)
- gym100796C(想法题/二分+树形dp)
- hdu 3586 Information Disturbing (树形dp+二分)
- HDU 3586 Information Disturbing (树形DP+二分)
- bzoj 2097: [Usaco2010 Dec]Exercise 奶牛健美操【二分+树形dp】
- [BZOJ2097][Usaco2010 Dec]Exercise 奶牛健美操(二分+树形dp+贪心)