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=0; register char ch=getchar();
 9     for(; ch>'9'||ch<'0'; ) ch=getchar();
10     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
11 }
12
13 const int N(1e5+5);
14 int n,p,u,v,s,t;
15 int head[N],sumedge;
16 struct Edge {
17     int v,next;
18     Edge(int v=0,int next=0):v(v),next(next){}
19 }edge[N<<1];
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]=0;
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=0;
35     for(int i=head[u]; i; i=edge[i].next)
36         if(edge[i].v!=fa) td[++cnt]=dis[edge[i].v]+1;
37     std::sort(td+1,td+cnt+1);
38     for(; cnt&&td[cnt]+td[cnt-1]>num; ) cnt--,tmp++;
39     dis[u]=td[cnt];
40 }
41 bool check(int x)
42 {
43     tmp=0; DFS(1,0,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=1; i<n; ++i)
54         read(u),read(v),ins(u,v);
55     for(l=1,r=n; l<=r; )
56     {
57         mid=l+r>>1;
58         if(check(mid))
59         {
60             ans=mid;
61             r=mid-1;
62         }
63         else l=mid+1;
64     }
65     printf("%d\n",ans);
66     return 0;
67 }
68
69 int Aptal=Presist();
70 int main(){;}

转载于:https://www.cnblogs.com/Shy-key/p/7552943.html

BZOJ——T 2097: [Usaco2010 Dec]Exercise 奶牛健美操相关推荐

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

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

  2. 【BZOJ】2099: [Usaco2010 Dec]Letter 恐吓信

    [题意]给定长度为n和m的两个字符串S和T,要求在字符串S中取出若干段拼成T(可重复取),求最小段数,n,m<=50000. [算法]后缀自动机 || 后缀数组 [题解]对串S建SAM,然后在上 ...

  3. BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP

    [Usaco2010 Mar]gather 奶牛大集会 Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1 ...

  4. [Usaco2010 Mar]gather 奶牛大集会

    1827: [Usaco2010 Mar]gather 奶牛大集会 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1129  Solved: 525 [ ...

  5. bzoj2101【Usaco2010 Dec】Treasure Chest 藏宝箱

    2101: [Usaco2010 Dec]Treasure Chest 藏宝箱 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 418  Solved: ...

  6. BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP + 带权重心

    Description Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,0 ...

  7. BZOJ 1779. [Usaco2010 Hol]Cowwar 奶牛战争

    传送门 考虑构建网络流模型 把一个流量看成一只奶牛的攻击过程,那么答案就是最大流 因为每只奶牛只能操作一波,所以构造分层图,一层相当于一步 第一层就是初始状态,从 $S$ 向所有 $J$ 奶牛连一条流 ...

  8. 【BZOJ】1690: [Usaco2007 Dec]奶牛的旅行(分数规划+spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1690 第一题不是水题的题.. 分数规划.. T-T 百度吧..http://blog.csdn.ne ...

  9. bzoj 1827: [Usaco2010 Mar]gather 奶牛大集会【树形dp】

    不能用read会TLE!!不能用read会TLE!!不能用read会TLE!! 一开始以为要维护每个点,线段树写了好长(还T了-- 首先dfs一遍,求出点1为集会地点的答案,处理处val[u]为以1为 ...

最新文章

  1. java c++的区别_Java语言与C、C++之间的区别?
  2. vForum 2008系列之七:主题演讲:虚拟化的未来
  3. LinkedList插入元素一定比ArrayList快吗
  4. 程序设计方法的发展历程
  5. fpga运算服务器_一张图了解CPU、GPU、ASIC、FPGA性能、功耗效率、灵活性
  6. JDBC的批处理操作三种方式
  7. 单片机r6/r7c语言怎么用,关于单片机C51中c语言函数(-nop-())?
  8. 用英语用计算机造句,英语造句用It’s adj (for sb) to do sth 造句10个
  9. window 2008 搭建的DHCP服务器
  10. 计算机硬件只能做维修吗,关于计算机硬件维修的研究
  11. RxJava -- 从 create 开始 (一)
  12. 8.找出链表环的入口结点
  13. python数据驱动读取用例_【webdriver自动化】Python数据驱动工具DDT(示例代码)
  14. log4j2远程执行漏洞原理以及解决方案
  15. oracle commit_log,Oracle log file sync 等待事件 与 COMMIT_WAIT,COMMIT_LOGGING 参数说明
  16. 机器学习理论基础学习18---高斯过程回归(GPR)
  17. 超好用的ACM刷题网站,你用过几个?
  18. WordPress网站底部设置网站已运行时间
  19. CSS基础知识---三种选择器
  20. 组策略——软件限制策略(完全教程与规则示例)

热门文章

  1. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:移除默认的列表样式
  2. 学习设计模式 - 六大基本原则之接口隔离原则
  3. dubbo超时重试和异常处理
  4. Software Engineering at Google
  5. vim--之初学轻松几步走
  6. 影响u盘传输速度和使用寿命的几大因素
  7. hdu 4277 USACO ORZ
  8. 论面向对象方法与软件复用关系-z
  9. flex与java集成开发(基于eclipse)
  10. php获取目录中的所有文件名