题目描述 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 Description

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

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

输出描述 Output Description

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

样例输入 Sample Input

7 2

6 7

3 4

6 5

1 2

3 2

4 5

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

对于50%的数据,满足V<=100;

对于100%的数据,满足V<=100000

/*二分答案+贪心记录以每个节点为根的子树的每条链的长度,如果最长链和次长链的和大于二分出的答案,就减去最长链。
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define N 100010
using namespace std;
int head[N],f[N],g[N],n,m,sum;
struct node
{int v,pre;
};node e[N*2];
void add(int i,int x,int y)
{e[i].v=y;e[i].pre=head[x];head[x]=i;
}
bool cmp(int s1,int s2)
{return s1>s2;
}
void dfs(int x,int fa,int mid)
{for(int i=head[x];i;i=e[i].pre)if(e[i].v!=fa)dfs(e[i].v,x,mid);int cnt=0;for(int i=head[x];i;i=e[i].pre)if(e[i].v!=fa)g[++cnt]=f[e[i].v]+1;sort(g+1,g+cnt+1,cmp);if(cnt==0){f[x]=0;return;}else if(cnt==1){if(g[1]<=mid)f[x]=g[1];else sum++,f[x]=0;return;}else{int i=2;for(;i<=cnt;i++)if(g[i-1]+g[i]<=mid)break;else sum++;if(i==cnt+1&&g[cnt]>mid)sum++;f[x]=g[i-1];return;}
}
bool check(int mid)
{memset(f,0,sizeof(f));memset(g,0,sizeof(g));sum=0;dfs(1,0,mid);if(sum>m)return false;return true;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);add(i*2-1,x,y);add(i*2,y,x);}int l=0,r=n-1,ans=n-1;while(l<=r){int mid=(l+r)>>1;if(check(mid)){r=mid-1;ans=mid;}else l=mid+1;}printf("%d",ans);return 0;
}

转载于:https://www.cnblogs.com/harden/p/6048919.html

奶牛健美操(codevs 3279)相关推荐

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=2097 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: ...

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

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

  3. Codevs 4246 奶牛的身高

    Codevs 传送门 题目描述 Description 奶牛们在FJ的养育下茁壮成长.这天,FJ给了奶牛Bessie一个任务,去看看每个奶牛场中若干只奶牛的身高,由于Bessie是只奶牛,无法直接看出 ...

  4. codevs 2703 奶牛代理商 XII

    codevs 2703 奶牛代理商 XII 题目描述 Description 小徐从美国回来后,成为了USACO中国区的奶牛销售代理商,专门出售质优价廉的"FJ"牌奶牛.上题中,小 ...

  5. [codevs 1298] 凸包周长 [codevs 3201] 奶牛代理商 XI

    题解: 今天开始学习计算几何. 这是一道计算几何求凸包周长的模板题,采用Andrew算法. 第二道题改下输出即可. 最后凸包周长的求法注意第一个点和最后一个点是同一个. 代码 100ms 3MB #i ...

  6. 【codevs 4246】奶牛的身高 差分约束

    用差分约束乱搞吧-- 在那次月赛里算个水题了-- 点击就送屠龙宝刀 #include <iostream> #include <cstdio> #include <alg ...

  7. POJ 3279(Fliptile)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...

  8. 2021-2027全球与中国奶牛冻精市场现状及未来发展趋势

    [报告类型]产业研究 [报告价格]¥4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了全球与中国奶牛冻精行业市场行业相关概述.全 ...

  9. [ CodeVS冲杯之路 ] P1116

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1116/ 数据很小,DFS可A,每层枚举颜色,判断相邻的点是否有重复的颜色,记得回溯时把颜色染回0,即无颜色 这里我使用 ...

最新文章

  1. Python基础知识(第四天)
  2. 前端学习(2610):vuex实现删除
  3. 我的Mac中毒了,病毒居然叫做MacPerformance
  4. php的json_encode第二个参数学习及应用
  5. ArcMAP问题集锦(一)
  6. dskinlite(uieasy mfc界面库)使用记录4:绘制动态元素(listbox)
  7. matlab u怎么求均方差,Matlab求方差,均值,均方差,協方差的函數
  8. 排序算法问题:稳定排序与不稳定排序
  9. android 平面图app_安卓app设计规范整理和Android APP设计篇
  10. Gartner2021年网络技术成熟度曲线
  11. Python解二元一次方程
  12. Revit中如何绘制轴线?CAD图纸转轴网操作
  13. N F G结合电商会碰撞怎么样的火花
  14. Power BI----M函数*
  15. 王帅:深入PHP内核(二)——SAPI探究
  16. c语言 什么时候需要malloc动态分配内存?
  17. PE结构、SEH相关知识学习笔记
  18. 【计算机操作系统】测试题:动态分区内存分配;调页系统;分页存储管理;快表是什么?计算指令操作数地址;有效存储访问时间,缺页次数,缺页率;
  19. LittleTools之批量替换工具
  20. 三路归并排序(附C++和Java代码)

热门文章

  1. [原创]2014年上半年测试书籍推荐
  2. 【黑金原创教程】【TimeQuest】【第二章】TimeQuest模型角色,网表概念,时序报告...
  3. 【转】SQL Server中行列转换 Pivot UnPivot
  4. C++资源库不完全版本
  5. vector赋值的常见错误
  6. java finalize方法的使用
  7. Linux Socket API Connect 函数详解
  8. 最大功率点跟踪_ADI公司推出集成最大功率点跟踪和I2C的80V降压升压电池充电控制器...
  9. c语言三个数从小到大排序/输出_我的c语言笔记(三)
  10. java.net.noroute,java.net.NoRouteToHostException: No route to host