JZOJ5944. 【NOIP2018模拟11.01】信标

12 篇文章 0 订阅
4 篇文章 0 订阅

题意:

数据范围:

对于前 20 20 20% 的数据, n ≤ 10 n \leq 10 n10;
对于前 45 45 45% 的数据, n ≤ 40 n \leq 40 n40, 树的形态随机;
对于前 70 70 70% 的数据, n ≤ 5000 n \leq 5000 n5000;
对于另 5 5 5% 的数据, 不存在一个村庄连接着 3 3 3 条或以上的道路;
对于 100 100 100% 的数据, 1 ≤ n ≤ 1000000 1 \leq n \leq 1000000 1n1000000, 1 ≤ u , v ≤ n 1 \leq u, v \leq n 1u,vn, 保证数据合法.

Analysis:

又得上一堆结论,考场就只个推出放叶子节点最优,还是赶紧收拾收拾滚回家吧,考什么NOIP。
首先假如以一个节点为根,放一个信标在上面,那么限制只会在相同深度之间,相当于给树分层了。
考虑怎么放最优,如果我把一个信标放在一个分叉的上面,我可以把这个信标拖到分叉处,使得更多的节点被覆盖,限制被解决,那么最后肯定会有一条链往下,我们可以把信标拖到叶子节点处,这样不会解决上下对称,答案不会更劣,所以放叶子节点最优。
对于一个节点,它会成为若干深度相同节点的LCA,若一个信标不放到这些节点对所处子树,那么他们就会不合法(先走到LCA然后往下走)。对于一个点,我们就可以发现,假如他有 c c c个儿子,那么我们就要放 c − 1 c-1 c1个信标在不同的儿子里,使得覆盖所有限制。
但这个策略需要枚举根,放信标在上面来分层,考虑在什么情况下不在根放信标成立。
发现只要根的度数大于等于 3 3 3即可。考虑深度不同的如何解决,若一对点处在同一子树,显然可以放一个信标在另一个子树解决限制。若处在不同子树,那么该对点按以上策略,肯定有一个点子树内有信标,我们贪心地将信标下放到了叶子节点,那么肯定可以将其区分开。
那么按照以上策略贪心即可。复杂度 O ( n ) O(n) O(n)

Code:

# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;
const int N = 1e6 + 5;
int st[N],to[N << 1],nx[N << 1];
int rd[N],sz[N];
int n,tot,rt,ans;
inline void add(int u,int v)
{
	to[++tot] = v,nx[tot] = st[u],st[u] = tot;
	to[++tot] = u,nx[tot] = st[v],st[v] = tot;
}
inline void dfs(int x,int fr)
{
	int cnt = 0;
	for (int i = st[x] ; i ; i = nx[i])
	if (to[i] != fr) dfs(to[i],x),++cnt;
	if (cnt > 1) sz[x] = 1;
	for (int i = st[x] ; i ; i = nx[i])
	if (to[i] != fr && sz[to[i]]) --cnt,sz[x] = 1;
	if (cnt) ans += cnt - 1;
}
int main()
{
	freopen("beacon.in","r",stdin);
	freopen("beacon.out","w",stdout);
	scanf("%d",&n);
	if (n == 1) { puts("0"); return 0; }
	for (int i = 1 ; i < n ; ++i)
	{
		int u,v; scanf("%d%d",&u,&v);
		add(u,v),++rd[u],++rd[v];
	}
	for (int i = 1 ; i <= n ; ++i) if (rd[i] > 2) rt = i;
	if (!rt) { puts("1"); return 0; }
	dfs(rt,0);
	printf("%d\n",ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值