emmm树形dp?好像是的

搬一个题解证明过来

由于在n>1时答案至少为1,我们枚举一个必须放的根, 所有深度不同的点就被区分开了.

设一个节点有c个儿子, 发现必须在其中至少c−1个儿子的子树中放置信标.

证明如下: 考虑如果不这样放, 对于两棵都没有放的子树, 他们汇集到lca上以后距离都是相等的, 所以lca外的信标无法区分, 而内部没有信标. 所以不能存在两颗子树都不放. 所以至少要放c-1个. 由于在根节点放置了信标, 可以只考虑深度相同的点. 由于深度相同, 所以他们的lca度数至少为2,那么一定有一个信标在lca包含这两个点的两支子树中. 那么另一侧的点肯定要走更远的路, 会被区分开. 所以放c−1个足够区分.

这样问题变成每个节点要有c−1棵子树放有信标, 求最小方案. 直接贪心即可.

由于枚举根所 以复杂度为O(n2), 可以获得70分.

如何做到O(n)?

我们先特判链的情况答案为1,然后找到任意一个度数大于2的节点,可以证明这个点一定不需要放置信标. 于是以这个点作根O(n)的贪心即可.

证明如下:

深度相同的点对证明同上,只考虑深度不同的点对.如果它们在一颗子树中,由于度数大于2所以一定有另一颗子树的一个信标把他们区分开.

如果在不同的子树中, 有两种情况:

一个在没放信标的子树中,一个在放了的子树中.显然还存在另一个子树放了信标,由于深度不同他们会被这个信标区分开.

两个都在放了信标的子树中. 如果根的度数大于3则同上. 度数等于3时, 如果他们没有被区分开,一定是他们先汇集到了一个节点上, 然后走到同一个信标上. 这个点一定是一条奇链的中点, 且 不是根 (由于深度不同), 是在两个子树之一中唯一的. 那么他们走到另一个信标就一定有一个点走 了冤枉路, 既另一个信标可以区分出他们.

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define rint register int
template <class T>inline void read(T &X)
{
X=;int W=;char ch=;
while(!isdigit(ch))W|=ch=='-',ch=getchar();
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
X=W?-X:X;return;
}
int n,head[],cnt=,count[],f[];
struct node{int to,next;}edge[]; void add(int u,int v)
{
edge[++cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt;
} void dfs(int now,int fa)
{
int num=,tot=;
for(rint i=head[now];i;i=edge[i].next)
{
int to=edge[i].to;
if(to==fa)continue;
dfs(to,now);
tot+=f[to];
if(!f[to])num++;
}
f[now]=tot;
if(num>)f[now]+=(num-);
return;
}
int main()
{
//freopen("beacon.in","r",stdin);
//freopen("beacon.out","w",stdout);
read(n);
if(n==){printf("0\n");return ;}
for(rint i=;i<n;++i)
{
int u,v;
read(u),read(v);
add(u,v),add(v,u);
++count[u],++count[v];
}
int sta=-;
for(rint i=;i<=n;++i)if(count[i]>=)sta=i;
if(sta==-){printf("1\n");return ;}
dfs(sta,-);
printf("%d\n",f[sta]);
return ;
}

<JZOJ5944>信标的更多相关文章

  1. 温故而知新 前端日志上传新姿势 navigator.sendBeacon(信标)

    原文地址:https://mp.weixin.qq.com/s/-moAfEZicrFmun4qfWLdOQ 简单示例js: var data = JSON.stringify({ name: 'Be ...

  2. ZeroMQ:云时代极速消息通信库

    ZeroMQ:云时代极速消息通信库(大规模|可扩展|低成本|高效率解决之道,大规模分布式|多线程应用程序|消息传递架构构建利器) [美]Pieter Hintjens(皮特.亨特金斯)著   卢涛 李 ...

  3. C++异常处理:try,catch,throw,finally的用法

    写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...

  4. 【转】zigbee终端无法重连的问题解决

    zigbee终端无法重连的问题解决 1.zigbee重连的原因 (1)zigbee由于各种原因的干扰导致信号太差而掉线. (2)协调器重启. 2.zigbee终端重连的处理 (1)zigbee掉线后会 ...

  5. C++异常处理: try,catch,throw,finally的用法

    写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...

  6. 【转】ZigBee是如何组网的?

    组网方案设计:组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点(路由器或终端)加入网络,其中节点加入网络又包括两个步骤:通过与协调器连接入网和通过已有父节点入网. 一.网络初始化:  ...

  7. C/C++ 笔试题

    /////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程 ...

  8. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

  9. javascript客户端与服务器端通信

    高性能的网络通信包括以下方面:选择正确的数据格式和与之匹配的传输技术. 一.数据格式 用于传输的数据格式有: 1)html,仅适用于特定场合,传输数据量大,不过它可以节省客户端的CPU周期, 2)XM ...

随机推荐

  1. h5-圆角的使用-案例安卓机器人

    1.圆角的使用 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  2. MobX 在 hook 中的使用

    关于 mobX 在 react 16.8.0 以上的用法 以下例子均取自官网文档 一般用法: import { observer, useLocalStore } from 'mobx-react'; ...

  3. 吴裕雄--天生自然 PHP开发学习:表单验证

    <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...

  4. 吴裕雄--天生自然 PYTHON3开发学习:列表

    list1 = ['Google', 'Runoob', 1997, 2000]; list2 = [1, 2, 3, 4, 5 ]; list3 = ["a", "b& ...

  5. flask web实战1.27

    1.在pycharm的terminal中输入 生成requirements.txt文件 pip freeze > requirements.txt 安装requirements.txt依赖 pi ...

  6. BZOJ4422[Cerc2015]Cow Confinement(扫描线+线段树)

    很容易发现一个O(n2)DP,f[i][j]=f[i][j+1]+f[i+1][j]-f[i+1][j+1].然后由于有栅栏,一些位置没办法走,然后就可以用类似差分的方法,f[i]表示当前行f[i+1 ...

  7. [Scoi2014]方伯伯的OJ(动态开点splay)

    开始没看数据范围差点以为是这题了:https://www.cnblogs.com/hfctf0210/p/10911340.html 然后看到n<=1e8,怎么这么大? 所以这题需要用动态开点线 ...

  8. ant design for vue select 数据回显问题

    例如: 想要回显id为1的温度, 结果直接在select框中显示了1,而不是选中了温度, 此时因为select中的value是string类型, 而我们设置的id是number类型, 对应不上, 所以 ...

  9. 7.学完linux系统运维到底可以做什么?

    linux运维到底可以做什么?(略有改动原文.排版) 运维,很容易从字面理解为运营.维护. 很多朋友认为,在互联网公司中linux系统运维的工作就是安装系统,部署服务.处理紧急故障,为公司里的开发人员 ...

  10. MySQL5.7源码安装

    一.获取MySQL5.7.20源码安装包,并上传至服务器   MySQL官网下载地址:https://dev.mysql.com/downloads/mysql/ 下载版本:mysql-boost-5 ...