树洞 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. BZOJ 1486: [HNOI2009]最小圈( 二分答案 + dfs判负圈 )

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

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

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

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

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

  5. CH Round #52 还教室[线段树 方差]

    还教室 CH Round #52 - Thinking Bear #1 (NOIP模拟赛) [引子]还记得 NOIP 2012 提高组 Day2 中的借教室吗?时光飞逝,光阴荏苒,两年过去了,曾经借教 ...

  6. BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)

    BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...

  7. Codeforces Round #377 (Div. 2) D. Exams(二分答案)

    D. Exams Problem Description: Vasiliy has an exam period which will continue for n days. He has to p ...

  8. Codeforces Round #200 (Div. 1) D Water Tree 树链剖分 or dfs序

    Water Tree 给出一棵树,有三种操作: 1 x:把以x为子树的节点全部置为1 2 x:把x以及他的所有祖先全部置为0 3 x:询问节点x的值 分析: 昨晚看完题,马上想到直接树链剖分,在记录时 ...

  9. [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案

    考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...

随机推荐

  1. url和urn和uri

    1.需求 理清三者的关系 2.例子 3.说明 url是资源的位置(包含scheme),urn表示资源的名字.url是唯一的.urn不是. 他们2个都是uri的子集 参考资料:https://danie ...

  2. React 还是 Vue: 你应该选择哪一个Web前端框架?

    学还是要学的,用的多了,也就有更多的认识了,开发中遇到选择的时候也就简单起来了. 本文作者也做了总结: 如果你喜欢用(或希望能够用)模板搭建应用,请使用Vue    如果你喜欢简单和“能用就行”的东西 ...

  3. Javascript学习笔记:闭包题解(2)

    代码: var name='The Window'; var object={ name:'My Object', getNameFunc:function(){ return function(){ ...

  4. Sql Server 删除所有表(转)

    http://www.cnblogs.com/jys509/p/3589468.html  首先必须要清空所有表的外键 DECLARE c1 cursor for select 'alter tabl ...

  5. 边工作边刷题:70天一遍leetcode: day 1

    (今日完成:Two Sum, Add Two Numbers, Longest Substring Without Repeating Characters, Median of Two Sorted ...

  6. github上传

    创建全局的name和email 1.创建ssh(使用命令)$ssh-keygen -t rsa -C xxxxx@gmail.com(注册github时的email)2.在github中添加ssh 登 ...

  7. python操作excel表格(xlrd/xlwt)

    最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,而且不太能满足需求,不过经过一番对源码的"研究&q ...

  8. [ActionScript 3.0] AS3 Socket安全沙箱策略文件

    当与一个主机建立一个Socket连接时,Flash Player要遵守如下安全沙箱规则: 1.Flash的.swf文件和主机必须严格的在同一个域名,只有这样才可以成功建立连接: 2.一个从网上发布的. ...

  9. JSON对象和String之间的互转及处理

    如题,本文列举了一些在web前端开发中常用的转换及处理方式.使用JSON而不是字符串,主要是为了方便处理. JSON:JavaScript 对象表示法(JavaScript Object Notati ...

  10. python 调用 C++ code

    本文以实例code讲解python 调用 C++的方法. 1. 如果没有参数传递从python传递至C++,python调用C++的最简单方法是将函数声明为C可用函数,然后作为C code被pytho ...