hdu 3586 树形dp+二分

题目大意:给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵 树,每条边都有一个权值cost表示破坏这条边的费用,叶子节点为前线。现要切断前线和司令部的联系,每次切断边的费用不能超过上限limit,问切断所 有前线与司令部联系所花费的总费用少于m时的最小limit。1<=n<=1000,1<=m<=100万

题目要问的是最小的最大限制,必然二分答案
然后对于每一个值,树形DP判定是否可行
dp[i]表示要切断以i为根的其它所有子树的最小代价。
其中设定叶子结点的代价为无穷大
那么对于某一个非叶子结点,要切断一棵子树就有两种选择,切断以孩子为根的子树或者切断根与孩子的边。
如果根与孩子的边大于限制,那就取无穷大。
最后判断1号结点的总花费是否小于等于m
注意:无穷大不要取太大,否则会连续相加溢出

Sample Input

5 5

1 3 2

1 4 3

3 5 5

4 2 6

0 0

Sample Output

3

 1 /*
 2 HDU 3586
 3 树形DP+二分答案
 4 */
 5 #include<stdio.h>
 6 #include<string.h>
 7 #include<iostream>
 8 #include<algorithm>
 9 using namespace std;
10 const int MAXN=1010;
11 const int INF=1000010;//这里一定要设得合适,不能太大,不能太小
12
13 struct Node
14 {
15     int to;
16     int next;
17     int w;
18 }edge[MAXN*2];
19 int head[MAXN];
20 int tol;
21 int dp[MAXN];
22 void add(int a,int b,int w)
23 {
24     edge[tol].to=a;
25     edge[tol].next=head[b];
26     edge[tol].w=w;
27     head[b]=tol++;
28     edge[tol].to=b;
29     edge[tol].next=head[a];
30     edge[tol].w=w;
31     head[a]=tol++;
32 }
33
34 void init()
35 {
36     tol=0;
37     memset(head,-1,sizeof(head));
38 }
39
40 void dfs(int u,int pre,int limit)
41 {
42     int flag=false;//标记是不是叶子结点
43     dp[u]=0;
44     for(int i=head[u];i!=-1;i=edge[i].next)
45     {
46         int v=edge[i].to;
47         if(v==pre)continue;
48         flag=true;
49         dfs(v,u,limit);
50         if(edge[i].w<=limit)dp[u]+=min(dp[v],edge[i].w);
51         else dp[u]+=dp[v];
52     }
53     if(!flag)dp[u]=INF;//叶子结点无穷大
54 }
55 int main()
56 {
57     int n,m;
58     int a,b,w;
59     int l,r,mid;
60     while(scanf("%d%d",&n,&m)==2)
61     {
62         if(n==0&&m==0)break;
63         init();
64         r=0;
65         for(int i=1;i<n;i++)
66         {
67             scanf("%d%d%d",&a,&b,&w);
68             add(a,b,w);
69             if(w>r)r=w;
70         }
71         l=1;
72         int ans=-1;
73         while(l<=r)
74         {
75             mid=(l+r)/2;
76             dfs(1,-1,mid);
77             if(dp[1]<=m)
78             {
79                 ans=mid;
80                 r=mid-1;
81             }
82             else l=mid+1;
83         }
84         printf("%d\n",ans);
85     }
86     return 0;
87 }
时间: 2024-10-24 23:09:23

hdu 3586 树形dp+二分的相关文章

hdu3586 树形dp+二分求解

http://acm.hdu.edu.cn/showproblem.php?pid=3586 Problem Description In the battlefield , an effective way to defeat enemies is to break their communication system. The information department told you that there are n enemy soldiers and their network w

hdu 4123 树形DP+RMQ

http://acm.hdu.edu.cn/showproblem.php?pid=4123 Problem Description Bob wants to hold a race to encourage people to do sports. He has got trouble in choosing the route. There are N houses and N - 1 roads in his village. Each road connects two houses,

hdu 1250 树形DP

Anniversary party Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Appoint description:  System Crawler  (2014-07-27) Description There is going to be a party to celebrate the 80-th Anniversary of the Ural St

hdu 4276(树形dp)

题意:带权树上有起点终点每个点上有宝藏,一个人只有T分钟要从起点到重点,问你最多能收集多少宝藏. 思路:树形dp,首先判断能不能走到终点,然后把路径上的边权变为0时间减去所有边权.dp[v][j]表示从v出发回到v话费j分钟最多能收集到的宝藏. dp[v][j] = max(dp[v][j], dp[x][k] + dp[v][j-k-2*val]); 被G++卡了好长时间,换成c++就过了. 代码如下: 1 #include <stdio.h> 2 #include <string.h

hdu 5148 树形dp+分组背包问题

http://acm.hdu.edu.cn/showproblem.php?pid=5148 Problem Description Long long ago,there is a knight called JayYe.He lives in a small country.This country is made up of n cities connected by n-1 roads(that means it's a tree).The king wants to reward Ja

HDU 1520 树形dp裸题

1.HDU 1520  Anniversary party 2.总结:第一道树形dp,有点纠结 题意:公司聚会,员工与直接上司不能同时来,求最大权值和 #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #define max(a,b) a>b?a:b using nam

[hdu3586]Information Disturbing树形dp+二分

题意:给出一棵带权无向树,以及给定节点1,总约束为$m$,找出切断与所有叶子节点联系每条边所需要的最小价值约束. 解题关键:二分答案,转化为判定性问题,然后用树形dp验证答案即可. dp数组需要开到ll,如果用设inf的解法. 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=1e6+7; 5 const int inf=0x3f3f3f3f; 6 struct e

UvaLive 6534 Join two kingdoms 树形DP+二分

链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4545 题意:两个国家A,B,分别有N座城市和Q座城市(1 ≤ N, Q ≤ 4 × 10^4),每个国家里的城市都是树形结构,每条边的权值都是1.现在要随机从两个国家中各选择一个城市来将两个国家连接起来,问连接起来的大国家里面的最长路的期望是多少. 思路:首先用树形DP

HDU 1561 树形DP入门

The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6011    Accepted Submission(s): 3555 Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物