http://www.lydsy.com/JudgeOnline/problem.php?id=2097

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 417  Solved: 213
[Submit][Status][Discuss]

Description

Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑。这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径。简单的说来, 这些点的布局就是一棵树,且每条边等长,都为1。 对于给定的一个奶牛路径集合,精明的奶牛们会计算出任意点对路径的最大值, 我们称之为这个路径集合的直径。如果直径太大,奶牛们就会拒绝锻炼。 Farmer John把每个点标记为1..V (2 <= V <= 100,000)。为了获得更加短 的直径,他可以选择封锁一些已经存在的道路,这样就可以得到更多的路径集合, 从而减小一些路径集合的直径。 我们从一棵树开始,FJ可以选择封锁S (1 <= S <= V-1)条双向路,从而获得 S+1个路径集合。你要做的是计算出最佳的封锁方案,使得他得到的所有路径集合 直径的最大值尽可能小。 Farmer John告诉你所有V-1条双向道路,每条表述为:顶点A_i (1 <= A_i <= V) 和 B_i (1 <= B_i <= V; A_i!= B_i)连接。 我们来看看如下的例子:线性的路径集合(7个顶点的树) 1---2---3---4---5---6---7 如果FJ可以封锁两条道路,他可能的选择如下: 1---2 | 3---4 | 5---6---7 这样最长的直径是2,即是最优答案(当然不是唯一的)。

Input

* 第1行: 两个空格分隔的整数V和S * 第2...V行: 两个空格分隔的整数A_i和B_i

Output

* 第1行:一个整数,表示FJ可以获得的最大的直径。

Sample Input

7 2
6 7
3 4
6 5
1 2
3 2
4 5

Sample Output

2

HINT

 

Source

Gold

二分最小的直径

验证时,统计出每个节点所在链的长度,如果比当前ans大,就砍去、

  1. #include <algorithm>
  2. #include <cstring>
  3. #include <cstdio>
  4.  
  5. #define min(a,b) (a<b?a:b)
  6. inline void read(int &x)
  7. {
  8. x=; register char ch=getchar();
  9. for(; ch>''||ch<''; ) ch=getchar();
  10. for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
  11. }
  12.  
  13. const int N(1e5+);
  14. int n,p,u,v,s,t;
  15. int head[N],sumedge;
  16. struct Edge {
  17. int v,next;
  18. Edge(int v=,int next=):v(v),next(next){}
  19. }edge[N<<];
  20. inline void ins(int u,int v)
  21. {
  22. edge[++sumedge]=Edge(v,head[u]);
  23. head[u]=sumedge;
  24. edge[++sumedge]=Edge(u,head[v]);
  25. head[v]=sumedge;
  26. }
  27.  
  28. int l,r,mid,ans,tmp,cnt,td[N],dis[N];
  29. void DFS(int u,int fa,int num)
  30. {
  31. dis[u]=;
  32. for(int i=head[u]; i; i=edge[i].next)
  33. if(edge[i].v!=fa) DFS(edge[i].v,u,num);
  34. cnt=;
  35. for(int i=head[u]; i; i=edge[i].next)
  36. if(edge[i].v!=fa) td[++cnt]=dis[edge[i].v]+;
  37. std::sort(td+,td+cnt+);
  38. for(; cnt&&td[cnt]+td[cnt-]>num; ) cnt--,tmp++;
  39. dis[u]=td[cnt];
  40. }
  41. bool check(int x)
  42. {
  43. tmp=; DFS(,,x);
  44. return tmp<=p;
  45. }
  46.  
  47. int Presist()
  48. {
  49. // freopen("longnosee.in","r",stdin);
  50. // freopen("longnosee.out","w",stdout);
  51.  
  52. read(n); read(p);
  53. for(int u,v,i=; i<n; ++i)
  54. read(u),read(v),ins(u,v);
  55. for(l=,r=n; l<=r; )
  56. {
  57. mid=l+r>>;
  58. if(check(mid))
  59. {
  60. ans=mid;
  61. r=mid-;
  62. }
  63. else l=mid+;
  64. }
  65. printf("%d\n",ans);
  66. return ;
  67. }
  68.  
  69. int Aptal=Presist();
  70. int main(){;}

BZOJ——T 2097: [Usaco2010 Dec]Exercise 奶牛健美操的更多相关文章

  1. bzoj 2097: [Usaco2010 Dec]Exercise 奶牛健美操【二分+树形dp】

    二分答案,然后dp判断是否合法 具体方法是设f[u]为u点到其子树中的最长链,每次把所有儿子的f值取出来排序,如果某两条能组合出大于mid的链就断掉f较大的一条 a是全局数组!!所以要先dfs完子树才 ...

  2. BZOJ 2097 [Usaco2010 Dec]Exercise 奶牛健美操

    [题意] 给出一棵树.现在可以在树中删去m条边,使它变成m+1棵树.要求最小化树的直径的最大值. [题解] 二分答案.$Check$的时候用$DP$,记录当前节点每个儿子的直径$v[i]$,如果$v[ ...

  3. BZOJ 2097: [Usaco2010 Dec]Exercise 奶牛健美操 二分 + 贪心 + 树上问题

    Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...

  4. BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP

    BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的 ...

  5. [Usaco2010 Dec]Exercise 奶牛健美操

    [Usaco2010 Dec]Exercise 奶牛健美操 题目 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连 ...

  6. [bzoj2097][Usaco2010 Dec]Exercise 奶牛健美操_贪心_树形dp_二分

    Exercise bzoj-2097 Usaco-2010 Dec 题目大意:题目链接 注释:略. 想法:题目描述生怕你不知道这题在考二分. 关键是怎么验证?我们想到贪心的删边. 这样的策略是显然正确 ...

  7. 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心

    题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...

  8. BZOJ2097 [Usaco2010 Dec]Exercise 奶牛健美操 贪心

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2097 题解 显然二分一个 \(mid\) 表示每一块的直径长度的最大值,求最少需要多少连通块. ...

  9. BZOJ2097: [Usaco2010 Dec]Exercise 奶牛健美操 贪心+伪树dp+二分

    //论全局变量的杀伤力....QAQ#include<cstdio> #include<iostream> #include<cstdlib> #include&l ...

随机推荐

  1. PCB genesis SET取中心点--算法实现

    最新ICS工厂有一项incam脚本新需求,这里介绍5种解决方法解决 需求如下图所示:绿色所圈处是是需求出的中心点(图形间距一致归为一类并计算中心点坐标) 前题条件:1.一个SET里面可能有多个CAM, ...

  2. 9.12NOIP模拟题

    NOIP 2017 全假模拟冲刺                                               hkd 题目名称 Spfa 走楼梯缩小版 滑稽 题目类型 传统 传统 传统 ...

  3. Gym - 100162G 2012-2013 Petrozavodsk Winter Training Camp G. Lyndon Words 暴力枚举

    题面 题意:如果一个字符串的最小表示法是他自己,他就是一个Lyndon Word. 例如  aabcb 他的循环串有 abcba  bcbaa cbaab baabc 其中字典序最小的是他自己 现在给 ...

  4. 类型判断----小白讲解typeof,instanceof,Object.prototype.toString.call()

    1.typeof只能判断基本类型数据, 例子: typeof 1 // "number" typeof '1' // "string" typeof true ...

  5. $P5269 欧稳欧再次学车$

    \(problem\) 哇 看各位巨佬都来发\(T1\)的题解 我也来发一篇.(别的题目不会别瞎bb) 题目大意就是 \(T\) 秒 能走多少路程 第一行六个整数 \(T,N,L,R,X,K\) 接下 ...

  6. HDU 5306 吉司机线段树

    思路: 后面nlogn的部分是伪证... 大家可以构造数据证明是这是nlog^2n的啊~ 吉老司机翻车了 //By SiriusRen #include <cstdio> #include ...

  7. [转]linux之cut命令的用法

    转自:http://www.jb51.net/article/41872.htm cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整 ...

  8. 通过UDP建立TCP连接

    解释 通过UDP广播查询服务器的IP地址,然后再建立TCP点对点连接. 应用场景 在服务器IP未知时,并且已知服务器与客户端明确在一个局域网或者允许组播的子网下. 通过UDP发现服务器地址然后再进行T ...

  9. 笨拙而诡异的 Oracle(之二)

    有一张表,很多数据:   想取某个月的数据.初始的想法很简单,根据日期(RQ)形成条件即可:  符合条件的记录数是 129835,但耗时太长:14.515 秒(RQ字段是做过索引的)!直观的反应是 O ...

  10. spring编程框架

    spring boot, spring data, spring framework spring / spring boot @Profile('prod'|'dev'|'other')(伴随@Be ...