树洞 CH Round #72 - NOIP夏季划水赛

描述

在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树。更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2条路径与其相连。换句话讲,这些树和树之间的路径构成一张N个点、M条边的无向连通图,而度数大于2的点至多有1个。
近年以来,栖息地频繁收到人类的侵扰。兔子们联合起来召开了一场会议,决定在其中K棵树上建造树洞。当危险来临时,每只兔子均会同时前往距离它最近的树洞躲避,路程中花费的时间在数值上等于距离。为了在最短的时间内让所有兔子脱离危险,请你安排一种建造树洞的方式,使最后一只到达树洞的兔子所花费的时间尽量少。

输入格式

第一行有3个整数N,M,K,分别表示树(兔子)的个数、路径数、计划建造的树洞数。
接下来M行每行三个整数x,y,表示第x棵树和第y棵树之间有一条路径相连。1<=x,y<=N,x≠y,任意两棵树之间至多只有1条路径。

输出格式

一个整数,表示在最优方案下,最后一只到达树洞的兔子所花费的时间。

样例输入

5 5 2
1 2
2 3
3 1
1 4
4 5

样例输出

1

数据范围与约定

  • 对于20%的数据,1 ≤  n ≤ 10。
  • 对于另外30%的数据,每棵树至多与2条路径相连。
  • 对于另外30%的数据,保证存在一种最优解,使与3条或更多路径相连的树上一定建造了树洞。
  • 对于100%的数据,1 ≤ n ≤ 2000,n-1<=m<=n*(n-1)/2。​

一开始读错题

官方题解:

二分答案。
枚举距离特殊点最近的建造的树洞是哪一个,记为X。
在图中删除能够在二分的时间内到达该树洞X的所有点。
此时图变为若干条独立的链,直接求最少需要的树洞数。
在所有枚举的情况中取最小值,与K比较确定二分范围变化。

其实这就是一条链,只不过有一个点可能连出多条链或者连乘环

一条链的话,答案就是(n-t)/(2*t)上取整

很明显可以二分最大时间,也就是节点的最短距离

把特殊点设为root,枚举从能覆盖root的点中选一个建造树洞,

剩下的没vis的全成了链,每条链每2*mid+1必定放一个树洞

注意cnt要+1,一开始建了一个嘛

//
//  main.cpp
//  ch72c
//
//  Created by Candy on 26/10/2016.
//  Copyright © 2016 Candy. All rights reserved.
//

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
,INF=1e9;
inline int read(){
    ,f=;
    ; c=getchar();}
    +c-'; c=getchar();}
    return x*f;
}
int n,m,t,x,y;
struct edge{
    int v,ne;
}e[N<<];
;
void ins(int u,int v){
    cnt++;
    e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
    cnt++;
    e[cnt].v=u;e[cnt].ne=h[v];h[v]=cnt;
}
,de[N];
,tail=;
void bfs(int s){
    memset(d,-,sizeof(d));
    head=;tail=;
    q[++tail]=s;
    d[s]=;
    while(head<=tail){
        int u=q[head++];
        for(int i=h[u];i;i=e[i].ne){
            int v=e[i].v;
            ){
                d[v]=d[u]+;
                q[++tail]=v;
            }
        }
    }
}
int vis[N],len;
void dfs(int u){
    vis[u]=;len++;
    for(int i=h[u];i;i=e[i].ne){
        int v=e[i].v;
        if(vis[v]) continue;
        dfs(v);
    }
}
int solve(int dis){
    int ans=INF;
    ;x<=n;x++){
        bfs(x);
        ;
        if(d[root]>dis) continue;
        memset(vis,,sizeof(vis));
        ;i<=n;i++) ;
        ;i<=n;i++) if(!vis[i]){
            len=;
            dfs(i);
            cnt+=(len-)/(*dis+)+;
        }
        ans=min(ans,cnt+);//!!!cnt+1
    }
    return ans;
}
int main(int argc, const char * argv[]) {
    n=read();m=read();t=read();
    ;i<=m;i++){x=read();y=read();de[x]++;de[y]++;ins(x,y);}
    ;i<=n;i++) ) {root=i;break;}
    if(!root){
        printf()/(*t)+);
        ;
    }
    ;}
    ,r=n,ans=INF;
    while(l<=r){
        ;
        ;
        ;
    }
    printf("%d",ans);
    ;
}

CH Round #72树洞[二分答案 DFS&&BFS]的更多相关文章

  1. 【BZOJ4552】排序(线段树,二分答案)

    [BZOJ4552]排序(线段树,二分答案) 题面 BZOJ 题解 好神的题啊 直接排序我们做不到 怎么维护? 考虑一下,如果我们随便假设一个答案 怎么检验它是否成立? 把这个数设成\(1\),其他的 ...

  2. LOJ 2585 「APIO2018」新家 ——线段树分治+二分答案

    题目:https://loj.ac/problem/2585 算答案的时候要二分! 这样的话,就是对于询问位置 x ,二分出一个最小的 mid 使得 [ x-mid , x+mid ] 里包含所有种类 ...

  3. 洛谷P1084 疫情控制 [noip2012] 贪心+树论+二分答案 (还有个小bugQAQ

    正解:贪心+倍增+二分答案 解题报告: 正好想做noip的题目然后又想落实学长之前讲的题?于是就找上了这题 其实之前做过,70,然后实在细节太多太复杂就不了了之,现在再看一遍感觉又一脸懵了... 从标 ...

  4. BZOJ 1486: [HNOI2009]最小圈( 二分答案 + dfs判负圈 )

    二分答案m, 然后全部边权减掉m, 假如存在负圈, 那么说明有平均值更小的圈存在. 负圈用dfs判断. ------------------------------------------------ ...

  5. BZOJ4552 HEOI/TJOI2016 排序 线段树、二分答案

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4552 题意:给出一个$1$到$N$的全排列,对其进行$M$次排序,每次排序将区间$[l ...

  6. Luogu2839 Middle 主席树、二分答案

    题目传送门:https://www.luogu.org/problemnew/show/P2839 题目大意:给出一个长度为$N$的序列与$Q$次询问,每次询问左端点在$[a,b]$,右端点在$[c, ...

  7. BZOJ5142: [Usaco2017 Dec]Haybale Feast 线段树或二分答案

    Description Farmer John is preparing a delicious meal for his cows! In his barn, he has NN haybales ...

  8. [BZOJ 1486][HNOI2009]最小圈(二分答案+dfs写的spfa判负环)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1486 分析:容易想到先二分答案x,然后把所有边的权值-x,那么如果图中存在权值和为0的 ...

  9. CH Round #72 奇数码问题[逆序对 观察]

    描述 你一定玩过八数码游戏,它实际上是在一个3*3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3*3的网格中. 例如:5 2 81 3 _4 6 7 在游戏过程中,可以把空格与其上 ...

随机推荐

  1. Oracle并发与多版本控制

    1.什么是并发 2.事务隔离级别    2.1 READ UNCOMMITTED    2.2 READ COMMITTED    2.3 REPETABLE READ    2.4 SERIALIZ ...

  2. 文本框只读属性,disabled不能提交

    设置文本框和文本域只读的时候用到disabled="disabled",结果后台获取不到,后来想起这个不会提交,应该用readonly

  3. cnodejs社区论坛6--评论功能

  4. 常见HTTP状态基本解释

    本文摘自互联网,但是忘记了具体网址,请见谅 在网站建设的实际应用中,容易出现很多小小的失误,就像mysql当初优化不到位,影响整体网站的浏览效果一样,其实,网站的常规http状态码的表现也是一样,Go ...

  5. Saltstack数据系统Grains和Pillar(三)

    Saltstack数据系统 分为Grains和Pillar 一.Grains 静态数据,当Minion启动的时候收集的MInion本地的相关信息.(包含操作系统版本.内核版本.CPU.内存.硬盘.设备 ...

  6. MF-800U

    MF-800U 价格:200元左右 https://item.taobao.com/item.htm?spm=a230r.1.14.6.kfkqoY&id=4963072384&ns= ...

  7. RDBMS 数据库补丁集补丁号码高速參考-文档 ID 1577380.1

    保存此文,高速查询补丁号 Oracle Database - Enterprise Edition - 版本号 8.1.7.0 和更高版本号 本文档所含信息适用于全部平台 补丁集/PSU 补丁号码   ...

  8. Eclipse error:Access restriction

    报错:Access restriction: The method decodeBuffer(String) from the type CharacterDecoder is not accessi ...

  9. HDU 2602 Bone Collector - from lanshui_Yang

           题目大意:有n件物品,每件物品均有各自的价值和体积,给你一个容量为 V 的背包,问这个背包最多能装的物品的价值是多少?        解题思路:这是一道0 - 1 背包的简单模板题,也是 ...

  10. Android中ListView.getCount()与ListView.getChildCount()区别和OnScrollListener()各个参数的区别

    istView.getCount()(实际上是 AdapterView.getCount()) 返回的是其 Adapter.getCount() 返回的值.也就是“所包含的 Item 总个数”. Li ...