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. Elasticsearch数据库 | Elasticsearch-7.5.0应用搭建实战

    Elasticsearch 是一个可用于分布式以及符合RESTful 风格的搜索和数据分析引擎.-- Elastic Stack 官网 搭建Elasticsearch的"那些事儿" ...

  2. malloc,calloc,realloc三者的区别

    malloc,calloc,realloc三者都可以运用与动态分配数组. malloc:用malloc必须要自己初始化,可以用memset(arr,0,cnt*sizeof(int)) calloc: ...

  3. php 使用 phpword 操作 word 读取 word

    思路 1. 加载word文件.2. 循环判断加载出来的数据.( 数据下面有很多个节点 )( 节点是按照数据的类型分类的 例如 无样式的文本是RunText,换行是TextBreak,表格是table. ...

  4. C#练习题 if

    提示用户输入用户名,然后再提示输入密码,如果用户名是"admin"并且密码是"888888",则提示正确,否则,如果用户名不是admin还提示用户用户名不存在, ...

  5. 白话科普系列——最好用的浏览器 Chrome,你用了么?

    市面上的浏览器多种多样,而浏览器的王者--IE 浏览器,它在 2002 年市场份额高达 95.4%.直到后续 Firefox,Safari,Chrome 相继问世才动摇了 IE 浏览器的地位,其中 C ...

  6. C语言中宏的作用

    在C语言#define机制中包括了一个规定,与允许把参数替换到文本中,这种实现通常称为宏或宏定义.下面是宏的声明方式: #define      name(parameter-list)       ...

  7. css布局中的BFC

    1.BFC的区域会与float的元素区域重叠 2.计算BFC的高度时,浮动子元素也参与计算 3.BFC就是页面上的一个隔离的独立容器,容器里面的子元素是不会影响到外面的元素 4.BFC意为" ...

  8. 找回了当年一篇V4L2 linux 摄像头驱动的博客

    从csdn找回 , 无缘无故被封了..当时损失不少啊!!!!!!!!! linux 摄像头驱动 :核心数据结构:    /**     * struct fimc_dev - abstraction ...

  9. shell中数字、字符串、文件比较测试

    1.逻辑运算符:与&&     或||    非!  &&:双目操作符:与运算中:如果第一个数为假,结果一定为假   ==> 短路操作符 ||:双目操作符:或运算 ...

  10. cosbench使用方法

    前言 cosbench的功能很强大,但是配置起来可能就有点不是太清楚怎么配置了,本篇将梳理一下这个测试的配置过程,以及一些测试注意项目,以免无法完成自己配置模型的情况 安装 cosbench模式是一个 ...