<JZOJ5944>信标
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>信标的更多相关文章
- 温故而知新 前端日志上传新姿势 navigator.sendBeacon(信标)
原文地址:https://mp.weixin.qq.com/s/-moAfEZicrFmun4qfWLdOQ 简单示例js: var data = JSON.stringify({ name: 'Be ...
- ZeroMQ:云时代极速消息通信库
ZeroMQ:云时代极速消息通信库(大规模|可扩展|低成本|高效率解决之道,大规模分布式|多线程应用程序|消息传递架构构建利器) [美]Pieter Hintjens(皮特.亨特金斯)著 卢涛 李 ...
- C++异常处理:try,catch,throw,finally的用法
写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...
- 【转】zigbee终端无法重连的问题解决
zigbee终端无法重连的问题解决 1.zigbee重连的原因 (1)zigbee由于各种原因的干扰导致信号太差而掉线. (2)协调器重启. 2.zigbee终端重连的处理 (1)zigbee掉线后会 ...
- C++异常处理: try,catch,throw,finally的用法
写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...
- 【转】ZigBee是如何组网的?
组网方案设计:组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点(路由器或终端)加入网络,其中节点加入网络又包括两个步骤:通过与协调器连接入网和通过已有父节点入网. 一.网络初始化: ...
- C/C++ 笔试题
/////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程 ...
- windows核心编程 - 线程同步机制
线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...
- javascript客户端与服务器端通信
高性能的网络通信包括以下方面:选择正确的数据格式和与之匹配的传输技术. 一.数据格式 用于传输的数据格式有: 1)html,仅适用于特定场合,传输数据量大,不过它可以节省客户端的CPU周期, 2)XM ...
随机推荐
- web前端学习 roadmap
<tag attribute="value">content</tag>
- 一文彻底搞懂Cookie、Session、Token到底是什么
> 笔者文笔功力尚浅,如有不妥,请慷慨指出,必定感激不尽 Cookie 洛:大爷,楼上322住的是马冬梅家吧? 大爷:马都什么? 夏洛:马冬梅. 大爷:什么都没啊? 夏洛:马冬梅啊. 大爷:马什 ...
- 吴裕雄--天生自然ShellX学习笔记:Shell 输入/输出重定向
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令通常将其输出写入到标准输出,默 ...
- Maven--Maven 安装最佳实践
1.设置 MAVEN_OPTS 环境变量 运行 mvn 命令实际上是执行了 Java 命令,既然是运行 Java,那么运行 Java 命令可用的参数当然也应该在运行 mvn 命令时使用.这个时候,MA ...
- python,pandas常用函数
一.rename,更改df的列名和行索引 df=pd.DataFrame(np.arange(,).reshape(,)) print(df) print(type(df)) 结果为: <cla ...
- nips2014下载
nips2014下载 wget http://papers.nips.cc/book/advances-in-neural-information-processing-systems-27-2014 ...
- 01 语言基础+高级:1-7 异常与多线程_day07 【线程池、Lambda表达式】
day07[线程池.Lambda表达式] 主要内容 等待与唤醒案例 线程池 Lambda表达式 教学目标 -[ ] 能够理解线程通信概念-[ ] 能够理解等待唤醒机制-[ ] 能够描述Java中线程池 ...
- 01 语言基础+高级:1-7 异常与多线程_day06 【线程、同步】
day06 [线程.同步] 主要内容 线程 同步 线程状态 一.学习目标 1. 能够描述Java中多线程运行原理 2. 能够使用继承类的方式创建多线程 3. 能够使用实现接口的方式创建多线程 4. 能 ...
- RSAUtils加密解密
import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; import javax.cr ...
- Java/Oracle/mySQL 日期格式
Java: yyyy-MM-dd HH:mm:ss.SSS Oracel: yyyy-MM-dd HH24:mi:ss select * from to_pub_report where report ...