题意:  

  给定一个敌人的通信系统,是一棵树形,每个节点是一个敌人士兵,根节点是commander,叶子是前线,我们的目的是使得敌人的前线无法将消息传到commander,需要切断一些边,切断每条边需要一定的power,而我们有一台具有m点power的机器,问在使用此机器切断敌人通信系统的情况下,使得所切断边的最大边权达到最小是多少?(m<=100w,n<=1000)

思路:

  其实就是要求所切断的边的最小瓶颈边。由于m比较大,不好枚举或者DP。但是他们具有线性的关系,就是瓶颈边越大,肯定越容易有解。可以二分枚举一下这条边的power值mid,然后进行一次DFS判断在此power在小于等于mid的情况下,花费最小是多少。如果花费<=m,则可以继续二分枚举。

 1 //#include <bits/stdc++.h>
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <map>
 7 #include <algorithm>
 8 #include <vector>
 9 #include <iostream>
10 #define pii pair<int,int>
11 #define INF 0x3f3f3f3f
12 #define LL  long long
13 using namespace std;
14 const double PI  = acos(-1.0);
15 const int N=1010;
16
17 struct node
18 {
19     int from,to,cost,next;
20     node(){};
21     node(int from,int to,int cost,int next):from(from),to(to),cost(cost),next(next){};
22 }edge[N*2];
23 int head[N], n, m, edge_cnt;
24 void add_node(int from,int to,int cost)
25 {
26     edge[edge_cnt]=node(from,to,cost,head[from]);
27     head[from]=edge_cnt++;
28 }
29
30 int DFS(int t,int far,int mid)
31 {
32     node e;
33     int sum=0;
34     for(int i=head[t]; i!=-1; i=e.next)
35     {
36         e=edge[i];
37         if( e.to==far )   continue;
38         int tmp=DFS(e.to, t, mid);
39         if( tmp>0 )   //有满足要求的
40         {
41             if( e.cost<tmp && e.cost<=mid )    sum+=e.cost; //更优解
42             else                               sum+=tmp;
43         }
44         else                        //子树已经不满足要求,则必须在这一叉断开
45         {
46             if(e.cost>mid)  return 0;  //这叉都不能断开,则无解
47             else            sum+=e.cost;
48         }
49     }
50     return sum;         //只要sum就能使得t子树与叶子断开
51 }
52
53
54 int main()
55 {
56     //freopen("input.txt", "r", stdin);
57     int a, b, c;
58     while(scanf("%d%d",&n,&m), n+m)
59     {
60         edge_cnt=0;
61         memset(head, -1, sizeof(head));
62         for(int i=1; i<n; i++)
63         {
64             scanf("%d%d%d",&a,&b,&c);
65             add_node(a,b,c);
66             add_node(b,a,c);
67         }
68         int val=DFS(1,-1,1000); //试试最大值1000,若不行,则无解
69         if(n==1 || val>m){puts("-1");continue;} //无解
70
71         int L=1, R=1000;
72         while(L<R)      //二分求最小的瓶颈边
73         {
74             int mid=L+(R-L)/2;
75             int val=DFS(1,-1,mid);
76             if(val>0 && val<=m)  R=mid;  //满足要求
77             else                 L=mid+1;
78         }
79         printf("%d\n",R);
80     }
81     return 0;
82 }

AC代码

转载于:https://www.cnblogs.com/xcw0754/p/4836878.html

HDU 3586 Information Disturbing (树形DP,二分)相关推荐

  1. HDU3585 Information Disturbing 树形dp+二分

    http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意 : 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能 ...

  2. 【题解】hdu 3586 Information Disturbing 二分 树形dp

    题目描述 Information Disturbing Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Jav ...

  3. 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...

  4. HDU - 1520 Anniversary party [树形dp]

    Anniversary party 时限:1000ms Problem Description There is going to be a party to celebrate the 80-th ...

  5. POJ 2342 | HDU 1520 Anniversary party 树形DP(入门题)

    传送门:POJ 2342 题目大意: 有若干人参加一个聚会,如果两个人之间有直接的上下属关系,则只能去一个.每个人都有个高兴值,问高兴值之和最大是多少? 思路: 之前一直觉得树形DP比较难,现在发现树 ...

  6. HDU 3534 Tree (经典树形dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3534 题意: 给你一棵树,问你有多少对点的距离等于树的直径. 思路: dp[i][0]表示在i的子树中 ...

  7. D. Serval and Rooted Tree(思维+树形dp+二分辅助)

    https://codeforces.com/problemset/problem/1153/D 思路:参考issue https://issue-is-vegetable.blog.csdn.net ...

  8. HDU 1011(星河战队 树形DP)

    题意是说在一个洞穴中有许多房间,每个房间中有一些虫子和大脑,这些房间之间用隧道相连形成一棵树,士兵们杀虫子的能力有限,也可以直接杀死虫子而不消耗士兵战斗力,但这样就无法得到房间中的大脑,士兵们不能走回 ...

  9. hdu 4044 GeoDefense (树形dp | 多叉树转二叉树)

    题目链接:hdu-4044 题意 这是一个塔防游戏,地图是一个n个编号为1-n的节点的树, 节点1是敌人的基地,其他叶子节点都是你的基地.    敌人的基地会源源不断地出来怪兽,为了防止敌人攻进你的基 ...

最新文章

  1. java架构师,必须掌握的几点技术?
  2. [转]实用至上!12个Vista服务可关闭
  3. Spark-1.4.0集群搭建
  4. MyBatisPlus_AR篇_入门试炼_06
  5. BZOJ 2597 剪刀石头布(最小费用最大流)(WC2007)
  6. 最新linux搭建gfs系统--iscsi+GFS实现网络存储
  7. break continue
  8. [USACO13FEB]Milk Scheduling【拓扑序】
  9. SHELL下如何去掉字串里的空格(或指定字符)
  10. cc2530设计性实验代码七
  11. flutter的PDF阅读器
  12. cam全称_在ADU高级参数(parameter)中,术语CAM全称是什么?
  13. Vmstat命令详解
  14. 景区分时实名预约系统
  15. 实时数据处理简单分析
  16. 《系统集成项目管理工程师》必背知识点
  17. 一线外包员工的生活经历
  18. R语言与机器学习学习笔记(分类算法)(1)K-近邻算法
  19. c语言算术运算的作用,C语言算术运算符和算术表达式
  20. 2021版《数据结构》课程学习指南

热门文章

  1. docker 启动 停止容器
  2. python regex应用
  3. neo4j 删 delete
  4. 华为手机设置页面黑色_华为手机设置里面的这些功能你都知道吗?
  5. VMware ESXi版本回退
  6. 关于升级Vmware ESXI6.7 主机挂在ISCSI共享存储的方法
  7. Windows ESXI 5.5 升級到 VCSA 6.5
  8. 消息中间件学习总结(21)——RocketMQ 消息丢失场景分析及如何解决!
  9. Java基础学习总结(104)——多线程、并发、工具类相关的面试题
  10. Maven学习总结(20)——Maven pom.xml配置再体会