hdu3586(树形dp+二分)
来源:互联网 发布:广数928螺纹编程格式 编辑:程序博客网 时间:2024/06/05 19:04
链接:点击打开链接
题意:根节点为1的一棵树,删除一些边使叶子节点都不能到达根节点,并且边权和不能大于M,使删除边的最大值最小,并输出
代码:
#include <queue>#include <vector>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>using namespace std;const int INF=1100000;struct node{ int to,cost;};int n,m,dp[1005],used[1005];vector<node> G[1005];void dfs(int s,int cnt){ int i,j,tmp; used[s]=1; for(i=0;i<G[s].size();i++){ tmp=G[s][i].to; if(!used[tmp]){ dfs(tmp,cnt); if(G[s][i].cost>cnt) //大于限制直接取子节点的值 dp[s]+=dp[tmp]; else dp[s]+=min(dp[tmp],G[s][i].cost); } }}int judge(int mid){ int i; for(i=1;i<=n;i++){ //叶子节点为INF,INF不要过大否则加的时候后 if(G[i].size()==1&&i!=1) //超上限 dp[i]=INF; else dp[i]=0; } memset(used,0,sizeof(used)); dfs(1,mid); if(dp[1]<=m) return 1; return 0;}int main(){ int i,j,l,r,u,v,w,ans,mid; while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){ r=0; for(i=0;i<=n;i++) G[i].clear(); for(i=0;i<n-1;i++){ scanf("%d%d%d",&u,&v,&w); G[u].push_back((node){v,w}); G[v].push_back((node){u,w}); r=max(r,w); //二分上限 } l=1,ans=-1; //最大值最小因此进行二分 while(l<=r){ mid=(l+r)>>1; if(judge(mid)){ ans=mid; r=mid-1; } else l=mid+1; } printf("%d\n",ans); } return 0;}
0 0
- hdu3586,树形dp+二分
- hdu3586(树形dp+二分)
- hdu3586(二分+树形dp)
- hdu3586(树形DP+二分答案)
- hdu3586 树形dp+二分求解
- hdu3586(树形DP+二分,割边)
- 树形DP+二分(Information Disturbing HDU3586)
- HDU3586 Information Disturbing(二分+树形dp)
- 【树形DP+二分】HDU3586 Information Disturbing
- 【HDU3586】Information Disturbing-二分答案+树形DP
- hdu3586(树形dp)
- 【树形DP】 hdu3586 Information Disturbing
- hdu3586 Information Disturbing 树形DP
- hdu3586 Information Disturbing(树形dp)
- HDU3586 Information Disturbing 解题报告【树形DP】
- hdu3586 Information Disturbing(树状DP+二分查找)
- hdu 3586 树形dp +二分
- hdu 3586 二分+树形dp
- 课设二--显示字符到屏幕
- Jquery学习第一步
- Dialog源码分析
- Java类集笔记
- POJ-2513 Colored Sticks
- hdu3586(树形dp+二分)
- 关于one-hot编码引发相关问题的一点感想
- java编写了24小时制的时间加减
- adb启动activity
- 游戏底层逻辑,运动&&寻路(一)
- 匿名存储过程块学习
- leetcode刷题,总结,记录,备忘114
- POJ 1730 Perfect Pth Powers(素数筛选法)
- Java中&&和&以及||和|的区别