BZOJ 2097 [Usaco2010 Dec]Exercise 奶牛健美操
【题意】
给出一棵树。现在可以在树中删去m条边,使它变成m+1棵树。要求最小化树的直径的最大值。
【题解】
二分答案。$Check$的时候用$DP$,记录当前节点每个儿子的直径$v[i]$,如果$v[i]+1>mid$,那么就断掉连向儿子的这条边。如果$v[i]+v[j]+2>mid$,那么在i与j中选择一个$v%值较大的断掉。
#include<cstdio>
#include<algorithm>
#define N 200010
#define rg register
using namespace std;
int n,m,tot,ans,cut,last[N],mid,f[N],a[N];
struct edge{
int to,pre;
}e[N];
inline int read(){
int k=0,f=1; char c=getchar();
while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
return k*f;
}
inline void add(int x,int y){
e[++tot]=(edge){y,last[x]};
last[x]=tot;
}
void dfs(int x,int fa){
f[x]=0;
for(rg int i=last[x],to;i;i=e[i].pre)
if((to=e[i].to)!=fa) dfs(to,x);
int cnt=0;
for(rg int i=last[x],to;i;i=e[i].pre)
if((to=e[i].to)!=fa) a[++cnt]=f[to]+1;
sort(a+1,a+cnt+1);
while(a[cnt]+a[cnt-1]>mid) cut++,cnt--;
f[x]=a[cnt];
}
bool check(){
cut=0;
dfs(1,0);
//printf("mid=%d cut=%d\n",mid,cut);
if(cut<=m) return 1;
return 0;
}
int main(){
n=read(); m=read();
for(rg int i=1,u,v;i<n;i++){
u=read(); v=read();
add(u,v); add(v,u);
}
int l=0,r=n-1;
while(l<r){
mid=(l+r)>>1;
if(check()) r=mid;
else l=mid+1;
}
printf("%d\n",l);
return 0;
}
BZOJ 2097 [Usaco2010 Dec]Exercise 奶牛健美操的更多相关文章
- bzoj 2097: [Usaco2010 Dec]Exercise 奶牛健美操【二分+树形dp】
二分答案,然后dp判断是否合法 具体方法是设f[u]为u点到其子树中的最长链,每次把所有儿子的f值取出来排序,如果某两条能组合出大于mid的链就断掉f较大的一条 a是全局数组!!所以要先dfs完子树才 ...
- BZOJ 2097: [Usaco2010 Dec]Exercise 奶牛健美操 二分 + 贪心 + 树上问题
Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...
- BZOJ——T 2097: [Usaco2010 Dec]Exercise 奶牛健美操
http://www.lydsy.com/JudgeOnline/problem.php?id=2097 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: ...
- BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP
BZOJ_2097_[Usaco2010 Dec]Exercise 奶牛健美操_二分答案+树形DP Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的 ...
- [Usaco2010 Dec]Exercise 奶牛健美操
[Usaco2010 Dec]Exercise 奶牛健美操 题目 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连 ...
- [bzoj2097][Usaco2010 Dec]Exercise 奶牛健美操_贪心_树形dp_二分
Exercise bzoj-2097 Usaco-2010 Dec 题目大意:题目链接 注释:略. 想法:题目描述生怕你不知道这题在考二分. 关键是怎么验证?我们想到贪心的删边. 这样的策略是显然正确 ...
- 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心
题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...
- BZOJ2097 [Usaco2010 Dec]Exercise 奶牛健美操 贪心
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2097 题解 显然二分一个 \(mid\) 表示每一块的直径长度的最大值,求最少需要多少连通块. ...
- BZOJ2097: [Usaco2010 Dec]Exercise 奶牛健美操 贪心+伪树dp+二分
//论全局变量的杀伤力....QAQ#include<cstdio> #include<iostream> #include<cstdlib> #include&l ...
随机推荐
- codeforces 920 EFG 题解合集 ( Educational Codeforces Round 37 )
E. Connected Components? time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- LIBTOOL is undefined 问题的解决方法
configure.ac:10: error: possibly undefined macro: AC_PROG_LIBTOOL If this token and others are legit ...
- IDEA Spark Streaming 操作(套接字流)-----make socket数据源
import java.io.PrintWriter import java.net.ServerSocket import scala.io.Source object DStream_makeSo ...
- Android.mk添加第三方jar包(转载)
转自:www.cnblogs.com/hopetribe/archive/2012/04/23/2467060.html LOCAL_PATH:= $(call my-dir)include $(CL ...
- JAVA基础(多线程Thread和Runnable的使用区别(转载)
转自:http://jinguo.iteye.com/blog/286772 Runnable是Thread的接口,在大多数情况下“推荐用接口的方式”生成线程,因为接口可以实现多继承,况且Runnab ...
- Linux 用户管理(1) (/etc/passwd)
Linux所有的用户都在/etc/passwd文件里面. 1.为什么需要用户 1)计算机及网络资源的合理分配 2)可以控制用户访问系统的权限.3)身份认证 4) 进程 以某个用户的身份来运行 2.用 ...
- struts表单验证xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC &quo ...
- quill支持json吗
RT quill目前的驱动(2.4.2版本)不支持json,等待作者更新版本吧
- $luogu2375[NOI2014]$
\(problem\) 其中,\(next[i],next[next[i]],next[next[next[i]]]......\)都是这个前缀串i的公共前后缀,而且只有它们是公共前后缀 那么,我们其 ...
- BZOJ 1129 exgcd+CRT+线段树
思路: 先copy一下百度百科 作为预备知识吧多重全排列定义:求r1个1,r2个2,…,rt个t的排列数,设r1+r2+…+rt=n,设此排列数称为多重全排列,表示为$P(n;r1,r2,…,rt)$ ...