JZOJ 【NOIP2016提高A组集训第16场11.15】兔子

题目

Description

在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝。更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连。换句话讲,这些兔子窝之前的路径构成一张N个点、M条边的无向连通图,而度数大于2的点至多有1个。

兔子们决定把其中K个兔子窝扩建成临时避难所。当危险来临时,每只兔子均会同时前往距离它最近的避难所躲避,路程中花费的时间在数值上等于经过的路径条数。为了在最短的时间内让所有兔子脱离危险,请你安排一种建造避难所的方式,使最后一只到达避难所的兔子所花费的时间尽量少。

Input

第一行有3个整数N,M,K,分别表示兔子窝的个数、路径数、计划建造的避难所数。

接下来M行每行三个整数x,y,表示第x个兔子窝和第y个兔子窝之间有一条路径相连。任意两个兔子窝之间至多只有1条路径。

Output

一个整数,表示最后一只到达避难所的兔子花费的最短时间。

Sample Input

5 5 2

1 2

2 3

1 4

1 5

4 5

Sample Output

1

Data Constraint

对于30%的数据,N≤15,K≤4;

对于60%的数据,N≤100;

对于100%的数据,1≤K≤N≤1,000,1≤M≤1,500

Hint

在第2个和第5个兔子窝建造避难所,这样其它兔子窝的兔子最多只需要经过1条路径就可以到达某个避难所。

题解

图应该长成这样



就是一堆链和一堆环,中间那个点就是度数大于等于3的点

题目要求最优答案,想到二分

\(O(n)\)枚举一个必选的点,然后二分答案

从这个必选的点去搜索

把全部和必选点的距离小于当前的答案\(mid\)的全部打上标记

这是所有环都变成链,求出链长除以\(2*mid+1\)向上取整

最后判断,更新\(l,r\)

Code

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct node
{
int to,head,next;
}a[3001];
int n,m,k,x,y,tot,l,r,mid,ans,d[1001],dis[1001];
bool b[1001],bj[1001];
void add(int x,int y)
{
a[++tot].to=y;
a[tot].next=a[x].head;
a[x].head=tot;
}
int dfs(int now,int fa)
{
if (bj[now]) return -1;
if (b[now]) return 0;
int k=0;
bj[now]=true;
for (int i=a[now].head;i;i=a[i].next)
{
if (a[i].to==fa) continue;
int x=dfs(a[i].to,now);
k+=x+1;
}
return k;
}
bool judge(int one,int deep)
{
int sum=0,h=0,t=1;
memset(b,false,sizeof(b));
b[one]=true;
dis[one]=0;
d[1]=one;
while (h++<t)
for (int i=a[d[h]].head;i;i=a[i].next)
if (!b[a[i].to]&&dis[d[h]]<deep)
{
d[++t]=a[i].to;
b[a[i].to]=true;
dis[d[t]]=dis[d[h]]+1;
}
memset(bj,false,sizeof(bj));
for (int i=1;i<=n;++i)
if (!bj[i]&&!b[i])
{
int x=dfs(i,0);
if (x==-1) return false;
sum+=x/(2*deep+1);
if (x%(2*deep+1)) ++sum;
}
return sum<k;
}
int main()
{
freopen("rabbit.in","r",stdin);
freopen("rabbit.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for (int i=1;i<=m;++i)
{
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
ans=2147483647;
for (int i=1;i<=n;++i)
{
l=0;r=m;
while (l<=r)
{
mid=(l+r+1)>>1;
if (judge(i,mid)) ans=min(ans,mid),r=mid-1;
else l=mid+1;
}
}
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
return 0;
}

JZOJ 【NOIP2016提高A组集训第16场11.15】兔子的更多相关文章

  1. JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线

    JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ...

  2. 【JZOJ4895】【NOIP2016提高A组集训第16场11.15】三部曲

    =v= 因为外来的入侵,国王决定在某些城市加派士兵.所有城市初始士兵数量为0.当城市 被加派了k名士兵时.城市i的所有子城市需要被加派k+1名士兵.这些子城市的所有子城市需要被加派k+2名士兵.以此类 ...

  3. 【JZOJ4894】【NOIP2016提高A组集训第16场11.15】SJR的直线

    题目描述 数据范围 解法 考虑逐次加入每一条直线. 对于当前已加入的直线集合L,现在要新加入一条直线l. 那么它产生的贡献,与平行线有关. 对于任意三条直线,如果其中任意两条平行,那么将不做贡献. 所 ...

  4. 【JZOJ4896】【NOIP2016提高A组集训第16场11.15】兔子

    题目描述 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子窝之 ...

  5. 【JZOJ4898】【NOIP2016提高A组集训第17场11.16】人生的价值

    题目描述 NiroBC终于找到了人生的意义,可是她已经老了,在新世界,没有人认识她,她孤独地在病榻上回顾着自己平凡的一生,老泪纵横.NiroBC多么渴望再多活一会儿啊! 突然一个戴着黑色方框眼镜,方脸 ...

  6. 【JZOJ4899】【NOIP2016提高A组集训第17场11.16】雪之国度

    题目描述 雪之国度有N座城市,依次编号为1到N,又有M条道路连接了其中的城市,每一条道路都连接了不同的2个城市,任何两座不同的城市之间可能不止一条道路.雪之女王赋予了每一座城市不同的能量,其中第i座城 ...

  7. 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目描述 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 数据范围 40%的数据满足: ...

  8. 【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...

  9. 【NOIP2016提高A组集训第14场11.12】随机游走——期望+树形DP

    好久没有写过题解了--现在感觉以前的题解弱爆了,还有这么多访问量-- 没有考虑别人的感受,没有放描述.代码,题解也写得歪歪扭扭. 并且我要强烈谴责某些写题解的代码不打注释的人,像天书那样,不是写给普通 ...

随机推荐

  1. Python UnboundLocalError: local variable 'xxx' referenced before assignment 解决方法

    一.报错含义: val=9 def test(): print(val) val = 6 print(val) test() 翻译:本地变量xxx引用前没有定义. 二.报错原因 这是Python变量作 ...

  2. css 背景图片自适应分辨率大小 兼容

    拉伸,all浏览器兼容.bg{     background:url(http://wyz.67ge.com/wp-content/uploads/qzlogo.jpg);     filter:&q ...

  3. 19、Haystack

    Haystack 1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsear ...

  4. python爬虫构建代理ip池抓取数据库的示例代码

    爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...

  5. Jquery禁用DIV鼠标右键

    $("#mp4").bind("contextmenu", function (e) { return false; });

  6. layui系列学习第一天

    新开一个博客系列 记录下layui学习过程及感受 今天受到很大的打击  ...希望 自己能坚持做好  到1.12号可以完成这个博客 一.基础说明 layui css 命名规范:1.layui-模块名- ...

  7. C++ 基础 5:多态

    1 什么是多态 多态按字面的意思就是多种形态.当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态. C++ 多态意味着由继承而产生的相关的不同的类,调用重写函数时,会根据实际的对象类型来执 ...

  8. Vuex原理详解

    一.Vuex是什么 Vuex是专门为Vuejs应用程序设计的状态管理工具.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生改变.它集中于MVC模式中的Model层 ...

  9. python + appium 执行报错整理

    1.driver.find_element_by_id("com.taobao.taobao:id/searchEdit").send_keys("adidas" ...

  10. linux之HTTP服务

    1.基本的配置   httpd:俗称Apache (A pachey Server) /etc/httpd/conf/httpd.conf            #配置文件 /etc/httpd/co ...