HDU 3586 Information Disturbing (树形DP,二分)
题意:
给定一个敌人的通信系统,是一棵树形,每个节点是一个敌人士兵,根节点是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,二分)相关推荐
- HDU3585 Information Disturbing 树形dp+二分
http://acm.split.hdu.edu.cn/showproblem.php?pid=3586 题意 : 给定一个带权无向树,要切断所有叶子节点和1号节点(总根)的联系,每次切断边的费用不能 ...
- 【题解】hdu 3586 Information Disturbing 二分 树形dp
题目描述 Information Disturbing Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Jav ...
- 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...
- HDU - 1520 Anniversary party [树形dp]
Anniversary party 时限:1000ms Problem Description There is going to be a party to celebrate the 80-th ...
- POJ 2342 | HDU 1520 Anniversary party 树形DP(入门题)
传送门:POJ 2342 题目大意: 有若干人参加一个聚会,如果两个人之间有直接的上下属关系,则只能去一个.每个人都有个高兴值,问高兴值之和最大是多少? 思路: 之前一直觉得树形DP比较难,现在发现树 ...
- HDU 3534 Tree (经典树形dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3534 题意: 给你一棵树,问你有多少对点的距离等于树的直径. 思路: dp[i][0]表示在i的子树中 ...
- D. Serval and Rooted Tree(思维+树形dp+二分辅助)
https://codeforces.com/problemset/problem/1153/D 思路:参考issue https://issue-is-vegetable.blog.csdn.net ...
- HDU 1011(星河战队 树形DP)
题意是说在一个洞穴中有许多房间,每个房间中有一些虫子和大脑,这些房间之间用隧道相连形成一棵树,士兵们杀虫子的能力有限,也可以直接杀死虫子而不消耗士兵战斗力,但这样就无法得到房间中的大脑,士兵们不能走回 ...
- hdu 4044 GeoDefense (树形dp | 多叉树转二叉树)
题目链接:hdu-4044 题意 这是一个塔防游戏,地图是一个n个编号为1-n的节点的树, 节点1是敌人的基地,其他叶子节点都是你的基地. 敌人的基地会源源不断地出来怪兽,为了防止敌人攻进你的基 ...
最新文章
- java架构师,必须掌握的几点技术?
- [转]实用至上!12个Vista服务可关闭
- Spark-1.4.0集群搭建
- MyBatisPlus_AR篇_入门试炼_06
- BZOJ 2597 剪刀石头布(最小费用最大流)(WC2007)
- 最新linux搭建gfs系统--iscsi+GFS实现网络存储
- break continue
- [USACO13FEB]Milk Scheduling【拓扑序】
- SHELL下如何去掉字串里的空格(或指定字符)
- cc2530设计性实验代码七
- flutter的PDF阅读器
- cam全称_在ADU高级参数(parameter)中,术语CAM全称是什么?
- Vmstat命令详解
- 景区分时实名预约系统
- 实时数据处理简单分析
- 《系统集成项目管理工程师》必背知识点
- 一线外包员工的生活经历
- R语言与机器学习学习笔记(分类算法)(1)K-近邻算法
- c语言算术运算的作用,C语言算术运算符和算术表达式
- 2021版《数据结构》课程学习指南